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

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

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

Rafy中的EventBus-LMLPHP

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

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

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

Rafy中的EventBus-LMLPHP

原来当我们调用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容器接口:

Rafy中的EventBus-LMLPHP

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

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

Rafy中的EventBus-LMLPHP

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方法来订阅事件的时候,查看原码

Rafy中的EventBus-LMLPHP

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

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

Rafy中的EventBus-LMLPHP

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

Rafy中的EventBus-LMLPHP

其中订阅方法SubScribe里面

EventBusArgs就是指事件订阅类型

This指当前订阅对象

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

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

都会执行此自动的动作。

05-08 15:34