EventBus主要是幹嘛使的,直接翻譯叫事件匯流排。 是觀察者模型的實現,利用它你既可以實現觀察者模型的業務場景,還可以基於它的事件驅動機制來實現應用程式內組件之間的解耦與通信。 我們來看看有EventBus的匯流排結構圖,如下: Rafy中的EventBus使用入口是基於上圖中Composer組件組 ...
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 指定了要發佈的事件類型,所有監聽此事件的監聽者
都會執行此自動的動作。