在C#中,我們可以在一個類中定義自己的事件,而其他的類可以訂閱該事件,當某些事情發生時,可以通知到該類。這對于桌面應用或者獨立的windows服務來說是非常有用的。但對于一個web應用來說是有點問題的,因為對象都是在web請求中建立的,而且這些對象生命周期都很短,因而注冊某些類的事件是很困難的。此外,注冊其他類的事件會使得類緊耦合。事件總線便可以用來解耦并重複利用應用中的邏輯。
好處比較明顯,就是獨立出一個<code>釋出訂閱子產品</code>,調用者可以通過使用這個子產品,屏蔽一些線程切換問題,簡單地實作釋出訂閱功能。
壞處可能比較隐晦,但這些需要足夠引起我們的重視
大量的濫用,将導緻邏輯的分散,出現問題後很難定位。
沒辦法實作強類型,在編譯的時候就發現問題。
代碼可讀性有些問題,IDE無法識别這些協定,對IDE不友好。
總得來說,如果項目裡面有大量的事件互動,那麼還是可以通過<code>EventBus</code>來實作,否則還是推薦自己在子產品内部實作<code>觀察者模式。</code>
是以今天介紹一個簡單的事件總線,它是事件釋出訂閱模式的實作,讓我們能在領域驅動設計(DDD)中以事件的弱引用本質對我們的子產品和領域邊界很好的解耦設計。
程式目錄結構如下:

事件總線是被所有觸發并處理事件的其他類共享的單例對象。要使用事件總線,首先應該獲得它的一個引用。下面有兩種方法來處理:
觸發事件之前,應該先要定義該事件。EventBus為我們提供了Subscribe 方法來訂閱事件:
<a></a>
是以的事件都內建自IEvent,該類包含了類處理事件需要的屬性。
對于事件源,則可以通過Publish 方法釋出事件。觸發一個事件很簡單,如下所示:
下面是釋出事件的調用:
要處理一個事件,應該要實作IEventHandler接口,如下所示:
在一個單一的處理句柄中,可以處理多個事件。這時,你應該為每個事件實作IEventHandler。比如:
以上,就把事件總線介紹完了,完整的代碼,請到github 上下載下傳,這個隻是EventBus 的簡單實作,各位可以根據自己的實際場景和需求,優化修改。
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接。如有問題,可以微信:18618243664 聯系我,非常感謝。
掃下面的二維碼關注我的微信公衆号。