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的应用
今天在项目中遇到的一个需求: 在一个选项卡功能的页面,出现的问题是,当点击选项卡的某个选项时,会同时加载整个选项卡的数据,本身产品就很大,数据很多,所以这个问题无法忽略: 仔细研究下发现,当刚进入页面 ...
随机推荐
- Jmeter非GUI运行,生成html报告
一.JMete执行方式 JMeter执行方式有2种,一种是GUI模式,一种是非GUI模式.GUI模式就是界面模式,非GUI模式就是命令行模式.界面模式主要用来编写和调试脚本用的,项目的真正执行最好是采 ...
- rpm 安装卸载
安装命令 rpm -i example.rpm 安装 example.rpm 包: rpm -iv example.rpm 安装 example.rpm 包并在安装过程中显示正在安装的文件信息: rp ...
- Java常见错误及解决方案
1.类定义未找到:java.lang.NoClassDefFoundError java类文件没有上传:上传了,服务器没找到,建议将JSP页面重新更新或重启服务器. 2.
- 火狐浏览器下,td 直接使用position:relative;和background:;产生的边框消失问题
消失示例: td{ width:40px; height:28px; position:relative; background:#ccc; } 出现问题 问题原因: 我的理解是各个浏览器之间对于ba ...
- Es6 类class的关键 super、static、constructor、new.target
ES6引入了Class(类)这个概念,作为对象的模板,通过class关键字,可以定义类.基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对 ...
- eclipse如何设置UTF-8
一.Eclipse设置utf-8编码包括两个方面,一方面可以设置workspace工作间编码,另一方面可以设置Android Project项目编码,设置步骤: 1)设置workspace工作间编码: ...
- Codeforces Round #555 (Div. 3) E. Minimum Array 【数据结构 + 贪心】
一 题面 E. Minimum Array 二 分析 注意前提条件:$0 \le a_{i} \lt n$ 并且 $0 \le b_{i} \lt n$.那么,我们可以在$a_{i}$中任取一个数 ...
- 全面解析C#中参数传递
一.引言 对于一些初学者(包括工作几年的人在内)来说,有时候对于方法之间的参数传递的问题感觉比较困惑的,因为之前在面试的过程也经常遇到参数传递的基础面试题,这样的面试题主要考察的开发人员基础是否扎实, ...
- C#面试:委托
面试常见题: 1.委托是什么?★☆ 2.为什么需要委托?★☆ 3.委托能用来做什么?★☆ 4.如何自定义委托★☆ 5..NET默认的委托类型有哪几种?★☆ 6.怎样使用委托?★★★ 7.多播委托是什么 ...
- 【Eclipse】在Project Explore中隐藏不需要显示的文件
右击项目->Resource->Resource Filters->AddFilter type: Exclude allApplies to : Files (All childr ...