ABP源碼分析二十五:EventBus


IEventData/EventData: 封裝了EventData信息,觸發event的源對象和時間

IEventBus/EventBus: 定義和實現了了一系列注冊,注銷和觸發事件處理函數的方法。EventBus定義了一個Dictionary容器來存放事件和處理該事件的對象(其實不是對象而是Factory,暫且這樣理解無妨)。其key是Type:在ABP使用Type表示不同的事件,具體而言這個type是EventData派生類的類型。EventData在ABP中有兩個作用:第一用於封裝事件數據,第二,就是使用其本身CLR類型信息來代表不同的事件。Dictionary容器的value是List<IEventHandlerFactory>而不是直接存放處理該事件的對象,首先這是個集合,也就是是說一個事件可以有多個事件處理函數, 第二,IEventHandlerFactory是什么?后文有解釋,簡單理解就是一個工廠,根據其封裝事件處理函數的類型生成實例

 

EventBusInstaller:實現了IWindsorInstaller接口。第一,Register IEventBus和EventBus到依賴注入框架中,並且resolve IEventBus以得到EventBus的實例。第二,將所有實現了IEventHandler<in TEventData>的類都會添加到Eventbus的_handlerFactories這個集合中。通過EventBusInstaller是一種添加事件處理對象到EventBus的方式。 另一種方式是直接通過EventBus的register方法。

 

 

EntityEventData:定義了一個以entity為參數的構造函數,用以將entity實例作為EventData的一部分。

以下這些派生自EntityEventData的類都是空的派生類(既沒有重寫父類中的方法,也沒有自定義新的成員或方法。)。這些類只起到標注的作用,也就是通過類的名字來區分不同的事件。本質上來說,EventBus是通過EventData的派生類的類型來區分不同事件類型的,因為其用於存放事件處理函數的_handlerFactories是一個以EventData派生類的類型為key的Dictionary容器。

EntityChangedEventDataEntityChangingEventDataEntityCreatedEventDataEntityCreatingEventDataEntityDeletedEventDataEntityDeletingEventDataEntityUpdatedEventDataEntityUpdatingEventData:都用於存放事件數據,但更重要的是他們通過其自生的類型表示不同的事件類型。

 

IEntityChangeEventHelper/EntityChangeEventHelper:用於觸發entity change(create,delete, update)相關的事件.

 

Abp中只有兩處引用了IEntityChangeEventHelper,分別是AbpDbContextAbpNHibernateInterceptor。在save方法的時候會通過IEntityChangeEventHelper實例觸發相應的事件。

 

 

ExceptionData:用以標識這個事件用於處理Exception的

AbpHandledExceptionData:用以標識這個事件處理Exception的,並且這個事件有ABP底層框架來處理。筆者在Abp框架中沒有發現有處理這種事件的事件處理對象。

 

IEventHandler/IEventHandler<in TEventData>: 所有事件處理器EventHandler的接口,定義了HandleEvent方法。我們可以實現IEventHandler<in TEventData>接口,以實現自定義的事件處理器。比如下面的例子就定義了一個處理AbpHandledExceptionData事件的事件處理器:

 

ActionEventHandler:內部類,起到適配器的作用,將一個Action適配成一個事件處理器EventHandler。

IEventHandlerFactory:事件處理器EventHandler的工廠接口,用於創建,獲取和注銷事件處理器EventHandler。

SingleInstanceHandlerFactory:用於創建單例EventHandler的工廠。

TransientEventHandlerFactory:該工廠每次都會創建一個新的EventHandler的實例。

IocHandlerFactory:通過容器生成EventHandler的實例。在Eventbus這個模塊在被初始化的時候,所有實現了IEventHandler<in TEventData>的類都會被注冊到Eventbus的_handlerFactories這個集合中。

 

FactoryUnregistrar:實現了IDisposable接口,用於注銷factory.

 

IEventDataWithInheritableGenericArgument:如果你的evendata繼承了這個接口。就可以按照繼承層次往上逐個觸發事件。下面是個例子,來自代碼中的注釋

For example;

Assume that Student inherits From Person. When trigger an EntityCreatedEventData{Student}, EntityCreatedEventData{Person} is also triggered if EntityCreatedEventData implements

this interface.

 

返回ABP源碼分析系列文章目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM