EventBus主要是干嘛使的,直接翻译叫事件总线。

是观察者模型的实现,利用它你既可以实现观察者模型的业务场景,还可以基于它的事件驱动机制来实现应用程序内组件之间的解耦与通信。

我们来看看有EventBus的总线结构图,如下:

Rafy中的EventBus使用入口是基于上图中Composer组件组合器,使用的时候都是

通过 操作 Composer.EventBus 来控制事件的注册与发布。

所以Composer起到了桥梁的作用,通过它外界可以操作EventBus,那么EventBus是什么呢

原来当我们调用Composer.EventBus的时候,Composer只是给我们返回了一个IEventBus接口的实现,如果IOC容器里面有这样的实现,就找出来返给调用者,如果没有的话,就返回Rafy内部默认的IEventBus的实现。

先让我们来看下,IEventBus内部都提供了什么接口

/// <summary>
/// 事件总线
/// </summary>
public interface IEventBus
{
/// <summary>
/// 向总线发布一个指定的事件。
/// </summary>
/// <param name="eventModel"></param>
void Publish(object eventModel); /// <summary>
/// 向总线发布一个指定的事件。
/// </summary>
/// <typeparam name="TEvent"></typeparam>
/// <param name="eventModel"></param>
void Publish<TEvent>(TEvent eventModel); /// <summary>
/// 向总线订阅一个指定的事件。
/// </summary>
/// <typeparam name="TEvent">事件类型。</typeparam>
/// <param name="owner">事件的监听者。</param>
/// <param name="handler">监听函数。</param>
void Subscribe<TEvent>(object owner, Action<TEvent> handler); /// <summary>
/// 向总线取消一个指定的事件的订阅。
/// </summary>
/// <typeparam name="TEvent">事件类型。</typeparam>
/// <param name="owner">事件的监听者。</param>
void Unsubscribe<TEvent>(object owner); /// <summary>
/// 获取指定事件的所有监听者。
/// </summary>
/// <typeparam name="TEvent">指定的事件类型。</typeparam>
/// <returns></returns>
IEventSubscribers GetSubscribers<TEvent>();
}

IEventBus这个接口提供了四个功能

  1. 发布事件
  2. 订阅事件
  3. 取消订阅事件
  4. 查询事件的监听者

看完这个接口,如果我们想要实现自己的EventBus的放,应该怎么做呢?

前几天我们看到Rafy内部的IOC实现,Composer.ObjectContainer,对外提供了IOC容器

通过查询IOC容器接口:

我们只需要,添加自己的实例,然后通过IObjectCcontainer的RegisterInstance方法,把我们的IEventBus实现,注册进容器,当用户调用Composer.EventBus 系统会优先返给它我们实现的IEventBus对象。

那么接下,让我们看看,Rafy提供的IEventBus默认实例是怎么实现的

EventBus订议了一个私有的变量_SubScribers 字典,key 为对象类型,值为实现了IEventSubscribers接口的对象

    /// <summary>
/// 某个事件的处理者列表。
/// </summary>
public interface IEventSubscribers
{
/// <summary>
/// 对应的事件类型。
/// </summary>
Type EventType { get; } /// <summary>
/// 返回当前已有的监听者个数。
/// </summary>
int Count { get; } /// <summary>
/// 直接向所有监听者发布该事件。
/// </summary>
/// <param name="eventModel"></param>
void Publish(object eventModel);
}

当我们通过 Subscribe方法来订阅事件的时候,查看原码

发现方法内部,把订阅者和回调函数都存在了订阅者列表里面.

当调用者发布指定类型事件的时候,发布方法(Publish)会通知订阅者列表里面的每一个监听者.

订阅发布我们都知道了,用户怎么使用事件总线呢?

其中订阅方法SubScribe里面

EventBusArgs就是指事件订阅类型

This指当前订阅对象

E对应的回调函数,就是此类事件发布时要执行的动作

Publish new EventBusArgs 指定了要发布的事件类型,所有监听此事件的监听者

都会执行此自动的动作。

Rafy中的EventBus的更多相关文章

  1. 项目中应用eventbus解决的问题

    在项目开发过程中,往往有些功能表面看起来简单,但实际开发的结果非常复杂,仔细分析下原因发现很多都是因为附加了许多的额外功能. 真的简单吗? 比如我们对一个电商平台的商品数据做修改的功能来讲,其实非常简 ...

  2. Rafy中的IOC

    Rafy是什么可以通过下面博客来了解 Rafy 领域实体框架演示(3) - 快速使用 C/S 架构部署 - BloodyAngel - 博客园 以下是看源码中的一点记录,供以后学习使用 主要是Rafy ...

  3. Rafy 中的 Linq 查询支持(根据聚合子条件查询聚合父)

    为了提高开发者的易用性,Rafy 领域实体框架在很早开始就已经支持使用 Linq 语法来查询实体了.但是只支持了一些简单的.常用的条件查询,支持的力度很有限.特别是遇到对聚合对象的查询时,就不能再使用 ...

  4. Android中的eventBus传值

    第一步:在build.gradle中添加依赖dependencies { compile 'org.greenrobot:eventbus:3.0.0'} 第二步:创建一个 Event类: 注意:en ...

  5. vue中的eventBus

    在vue2中,父子组件传递数据,父组件可以直接传递数据进子组件,而子组件通过调用父组件传递进来的方法,将自己的数据传递回去. 那兄弟组件之间,或者是兄弟组件的子组件之间如何传递呢? 当然vuex是一种 ...

  6. Android中的EventBus

    1.分析 EventBus是一个针对Android的事件发布和订阅的框架,主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传 ...

  7. 8.源码分析---从设计模式中看SOFARPC中的EventBus?

    我们在前面分析客户端引用的时候会看到如下这段代码: // 产生开始调用事件 if (EventBus.isEnable(ClientStartInvokeEvent.class)) { EventBu ...

  8. vue中的$EventBus.$emit、$on 遇到的问题

    今天在项目中遇到的一个需求: 在一个选项卡功能的页面,出现的问题是,当点击选项卡的某个选项时,会同时加载整个选项卡的数据,本身产品就很大,数据很多,所以这个问题无法忽略: 仔细研究下发现,当刚进入页面 ...

  9. vue中的$EventBus.$emit、$on的应用

    今天在项目中遇到的一个需求: 在一个选项卡功能的页面,出现的问题是,当点击选项卡的某个选项时,会同时加载整个选项卡的数据,本身产品就很大,数据很多,所以这个问题无法忽略: 仔细研究下发现,当刚进入页面 ...

随机推荐

  1. Weblogic wls-wsat组件反序列化漏洞(CVE-2017-10271)

    CVE编号: CVE-2017-10271 漏洞描述: Weblogic wls-wsat组件反序列化漏洞 利用脚本: https://github.com/hanc00l/weblogic_wls_ ...

  2. mysql 添加索引 mysql 如何创建索引

    1.添加PRIMARY KEY(主键索引) mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE(唯一索引 ...

  3. Ubuntu下实现socks代理转http代理

    代理(英语:Proxy),也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接.一些网关.路由器等网络设备具备网络代理功能. ...

  4. Laravel 的核心概念

    工欲善其事,必先利其器.在开发Xblog的过程中,稍微领悟了一点Laravel的思想.确实如此,这篇文章读完你可能并不能从无到有写出一个博客,但知道Laravel的核心概念之后,当你再次写起Larav ...

  5. clang命令理解程序

    Xcode 创建一个mac OS   command Line Tool程序 步骤打开终端  cd + 工程路径(绝对路径)(注:拖拽main.m文件到终端) input —preprocessor— ...

  6. Python中的匿名函数lambda的用法

    一.lambda函数的简介  对lambda函数,它其实是一个类似于def的函数,只不过lambda是一个不需要定义函数名的匿名函数.当我们在有些时候,需要做一些简单的数学计算时,如果定义一个def函 ...

  7. C++类的构造函数及定义

    定义一个普通的类时,一定要定义它自己的构造函数.原因有三:第一个原因是编译器只有在发现类不包含任何构造函数的情况下才会替我们生成一个默认的构造函数,一旦我们定义了一些其他的构造函数,那么除非我们再定义 ...

  8. HDU - 6133 启发式合并

    题意:给出一棵树共\(n\)个顶点,每个顶点有一个权值\(val_i\),你需要对每个节点统计一个最优解 每个节点的解按照一定规则产生:取出该节点的子树下所有的顶点,把顶点任意排序成一个序列,设为\( ...

  9. js img转换base64

    方法一:canvas <script type="text/javascript"> function getBase64Image(img) { var canvas ...

  10. Flutter框架概览

    前言:进入新框架的开发前,有必要整体了解框架设计及特点,对该框架初步认识,此文对Flutter框架进行浅显梳理,以备查阅: Flutter框架   从该架构图可知,Flutter框架可分为Framew ...