ABP源碼分析二十五:EventBus

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

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容器。this

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

 

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

 

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

 

 

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

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源碼分析系列文章目錄

相關文章
相關標籤/搜索