EventBus主要是干吗使的,直接翻译叫事件总线。函数
是观察者模型的实现,利用它你既能够实现观察者模型的业务场景,还能够基于它的事件驱动机制来实现应用程序内组件之间的解耦与通讯。spa
咱们来看看有EventBus的总线结构图,以下:翻译
Rafy中的EventBus使用入口是基于上图中Composer组件组合器,使用的时候都是code
经过 操做 Composer.EventBus 来控制事件的注册与发布。对象
因此Composer起到了桥梁的做用,经过它外界能够操做EventBus,那么EventBus是什么呢blog
原来当咱们调用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这个接口提供了四个功能get
看完这个接口,若是咱们想要实现本身的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 指定了要发布的事件类型,全部监听此事件的监听者
都会执行此自动的动做。