Rafy中的EventBus
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这个接口提供了四个功能
- 发布事件
- 订阅事件
- 取消订阅事件
- 查询事件的监听者
看完这个接口,如果我们想要实现自己的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的更多相关文章
- 项目中应用eventbus解决的问题
在项目开发过程中,往往有些功能表面看起来简单,但实际开发的结果非常复杂,仔细分析下原因发现很多都是因为附加了许多的额外功能. 真的简单吗? 比如我们对一个电商平台的商品数据做修改的功能来讲,其实非常简 ...
- Rafy中的IOC
Rafy是什么可以通过下面博客来了解 Rafy 领域实体框架演示(3) - 快速使用 C/S 架构部署 - BloodyAngel - 博客园 以下是看源码中的一点记录,供以后学习使用 主要是Rafy ...
- Rafy 中的 Linq 查询支持(根据聚合子条件查询聚合父)
为了提高开发者的易用性,Rafy 领域实体框架在很早开始就已经支持使用 Linq 语法来查询实体了.但是只支持了一些简单的.常用的条件查询,支持的力度很有限.特别是遇到对聚合对象的查询时,就不能再使用 ...
- Android中的eventBus传值
第一步:在build.gradle中添加依赖dependencies { compile 'org.greenrobot:eventbus:3.0.0'} 第二步:创建一个 Event类: 注意:en ...
- vue中的eventBus
在vue2中,父子组件传递数据,父组件可以直接传递数据进子组件,而子组件通过调用父组件传递进来的方法,将自己的数据传递回去. 那兄弟组件之间,或者是兄弟组件的子组件之间如何传递呢? 当然vuex是一种 ...
- Android中的EventBus
1.分析 EventBus是一个针对Android的事件发布和订阅的框架,主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传 ...
- 8.源码分析---从设计模式中看SOFARPC中的EventBus?
我们在前面分析客户端引用的时候会看到如下这段代码: // 产生开始调用事件 if (EventBus.isEnable(ClientStartInvokeEvent.class)) { EventBu ...
- vue中的$EventBus.$emit、$on 遇到的问题
今天在项目中遇到的一个需求: 在一个选项卡功能的页面,出现的问题是,当点击选项卡的某个选项时,会同时加载整个选项卡的数据,本身产品就很大,数据很多,所以这个问题无法忽略: 仔细研究下发现,当刚进入页面 ...
- vue中的$EventBus.$emit、$on的应用
今天在项目中遇到的一个需求: 在一个选项卡功能的页面,出现的问题是,当点击选项卡的某个选项时,会同时加载整个选项卡的数据,本身产品就很大,数据很多,所以这个问题无法忽略: 仔细研究下发现,当刚进入页面 ...
随机推荐
- [php审计实战篇]BlueCms v1.6 Union注入
非常基础的代码审计练习,适合有php基础的审计新手练习 本文作者:Aedoo 来源:i春秋社区 0×01 代码跟踪 首先,进入首页代码 :index.php 包含了php文件:/include/com ...
- HTML实例(四)
实例一:有序列表,无序列表,<dl>,<dt>,<dd>,div块级标签等,实现上面的效果. <!DOCTYPE html> <html lang ...
- Python 魔法方法查询表 -- 总结篇
据说,Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Python 的一切. 他们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个, ...
- ansible api2.0 多进程执行不同的playbook
自动化运维工具:ansible 多进程调用ansible api的应用场景: 应用系统检查 一个应用系统可能具有20—50台服务器的集群,初步的系统层面检查可以用一个统一的playbook来检查, ...
- 图的基础---关键路径理解和实现(Java)
引言 之前所说的拓扑排序是为了解决一个工程能否顺利进行的问题.但在生活中,我们还会经常遇到如何解决工程完成需要的最短时间问题. 举个例子,我们需要制作一台汽车,我们需要先造各种各样的零件,然后 ...
- @ModelAttribute注解和POJO传参过程
1.@ModelAttribute注解 @ModelAttribute主要有三个用途,对方法进行注解,对参数进行注解,还有@ModelAttribute和@RequestMapping一起对方法进行注 ...
- SCOI2019 游记
写在前面 其实冬令营之后就有一些想说的内容,由于心情原因没有写出来.PKUWC 失误频频,唯一可能还有点价值的就是 Day2T3 计算几何推了 76 分出来.NOIWC 更是无心再谈,感觉是被提答送走 ...
- E - Guess the Root 拉格朗日差值法+交互
题目传送门 题意:告诉你存在一个未知项系数最高为10的$f(x)$,你最多可以有50次询问,每次询问给出一个$x'$,系统会返回你$f(x')$的值,你需要猜一个$x''$,使得$f(x'')=0$, ...
- axiso 生产环境跨域配置(可用)
1.npm install axios 后 在main.js中import import Axios from 'axios'Vue.prototype.$http = Axios 2.请求配置 th ...
- Python使用浏览器模拟访问页面之使用ip代理
最近需要使用浏览器模拟访问页面,同时需要使用不同的ip访问,这个时候就考虑到在使用浏览器的同时加上ip代理. 本篇工作环境为win10,python3.6. Chorme 使用Chrome浏览器模拟访 ...