【转】ABP源码分析二十五:EventBus
IEventData/EventData: 封裝了EventData信息,觸發(fā)event的源對象和時間
IEventBus/EventBus: 定義和實現(xiàn)了了一系列注冊,注銷和觸發(fā)事件處理函數(shù)的方法。EventBus定義了一個Dictionary容器來存放事件和處理該事件的對象(其實不是對象而是Factory,暫且這樣理解無妨)。其key是Type:在ABP使用Type表示不同的事件,具體而言這個type是EventData派生類的類型。EventData在ABP中有兩個作用:第一用于封裝事件數(shù)據(jù),第二,就是使用其本身CLR類型信息來代表不同的事件。Dictionary容器的value是List<IEventHandlerFactory>而不是直接存放處理該事件的對象,首先這是個集合,也就是是說一個事件可以有多個事件處理函數(shù), 第二,IEventHandlerFactory是什么?后文有解釋,簡單理解就是一個工廠,根據(jù)其封裝事件處理函數(shù)的類型生成實例
?
EventBusInstaller:實現(xiàn)了IWindsorInstaller接口。第一,Register IEventBus和EventBus到依賴注入框架中,并且resolve IEventBus以得到EventBus的實例。第二,將所有實現(xiàn)了IEventHandler<in TEventData>的類都會添加到Eventbus的_handlerFactories這個集合中。通過EventBusInstaller是一種添加事件處理對象到EventBus的方式。 另一種方式是直接通過EventBus的register方法。
?
?
EntityEventData:定義了一個以entity為參數(shù)的構(gòu)造函數(shù),用以將entity實例作為EventData的一部分。
以下這些派生自EntityEventData的類都是空的派生類(既沒有重寫父類中的方法,也沒有自定義新的成員或方法。)。這些類只起到標(biāo)注的作用,也就是通過類的名字來區(qū)分不同的事件。本質(zhì)上來說,EventBus是通過EventData的派生類的類型來區(qū)分不同事件類型的,因為其用于存放事件處理函數(shù)的_handlerFactories是一個以EventData派生類的類型為key的Dictionary容器。
EntityChangedEventData,EntityChangingEventData,EntityCreatedEventData,EntityCreatingEventData,EntityDeletedEventData,EntityDeletingEventData,EntityUpdatedEventData,EntityUpdatingEventData:都用于存放事件數(shù)據(jù),但更重要的是他們通過其自生的類型表示不同的事件類型。
?
IEntityChangeEventHelper/EntityChangeEventHelper:用于觸發(fā)entity change(create,delete, update)相關(guān)的事件.
?
Abp中只有兩處引用了IEntityChangeEventHelper,分別是AbpDbContext和AbpNHibernateInterceptor。在save方法的時候會通過IEntityChangeEventHelper實例觸發(fā)相應(yīng)的事件。
?
?
ExceptionData:用以標(biāo)識這個事件用于處理Exception的
AbpHandledExceptionData:用以標(biāo)識這個事件處理Exception的,并且這個事件有ABP底層框架來處理。筆者在Abp框架中沒有發(fā)現(xiàn)有處理這種事件的事件處理對象。
?
IEventHandler/IEventHandler<in TEventData>:?所有事件處理器EventHandler的接口,定義了HandleEvent方法。我們可以實現(xiàn)IEventHandler<in TEventData>接口,以實現(xiàn)自定義的事件處理器。比如下面的例子就定義了一個處理AbpHandledExceptionData事件的事件處理器:
?
ActionEventHandler:內(nèi)部類,起到適配器的作用,將一個Action適配成一個事件處理器EventHandler。
IEventHandlerFactory:事件處理器EventHandler的工廠接口,用于創(chuàng)建,獲取和注銷事件處理器EventHandler。
SingleInstanceHandlerFactory:用于創(chuàng)建單例EventHandler的工廠。
TransientEventHandlerFactory:該工廠每次都會創(chuàng)建一個新的EventHandler的實例。
IocHandlerFactory:通過容器生成EventHandler的實例。在Eventbus這個模塊在被初始化的時候,所有實現(xiàn)了IEventHandler<in TEventData>的類都會被注冊到Eventbus的_handlerFactories這個集合中。
?
FactoryUnregistrar:實現(xiàn)了IDisposable接口,用于注銷factory.
?
IEventDataWithInheritableGenericArgument:如果你的evendata繼承了這個接口。就可以按照繼承層次往上逐個觸發(fā)事件。下面是個例子,來自代碼中的注釋
For example;
Assume that Student inherits From Person. When trigger an EntityCreatedEventData{Student}, EntityCreatedEventData{Person} is also triggered if EntityCreatedEventData implements
this interface.
?
返回ABP源碼分析系列文章目錄
?
?
#1樓?2016-05-16 21:20?angtianqiang
樓主你這個UML圖是VS里生成的么?
支持(0)?反對(0)
??
#2樓?[樓主]?2016-05-16 21:49?ZHK的博客
@?angtianqiang
是的
支持(0)?反對(0)
??
#3樓?2016-05-19 21:11?藍色夢想
樓主,請教一上,注冊EventBus到Ioc容器的兩種方式有什么區(qū)別?
我的理解是一種是通過靜態(tài)對象注冊,一種通過實例對象注冊,但注冊到Ioc容器后都是通過單例訪問的。為什么要區(qū)分開來呢?
支持(0)?反對(0)
??
#4樓?[樓主]?2016-05-20 22:15?ZHK的博客
@?藍色夢想
不一樣,前一個通過FactoryMethod生成實例,后一個通過Ioc容器生成實例。注意留意EventBus類中的Logger屬性,通過前一種方式生成的實例的Logger屬性是NullLogger。而通過后一種通過Ioc容器生成實例的Logger屬性則是注冊到Ioc容器中的Logger實例。
支持(1)?反對(0)
??
#5樓?2016-05-28 09:22?無根,所以只能隨風(fēng)飄蕩
能否把消息登記到第三方消息中間件?
支持(0)?反對(0)
??
#6樓?[樓主]?2016-05-28 17:45?ZHK的博客
@?無根,所以只能隨風(fēng)飄蕩
可以通過實現(xiàn)IEventBus等接口,創(chuàng)建支持第三方消息中間件的Module。
支持(0)?反對(0)
??
#7樓?2016-05-30 18:45?海~~D
樓主,我注意到它的事件處理工廠IEventHandlerFactory有兩個實現(xiàn),分別是SingleInstanceHandlerFactory和TransientEventHandlerFactory。
SingleInstanceHandlerFactory單例模式的ReleaseHandler為空,說明它不需要去釋放。
TransientEventHandlerFactory它的ReleaseHandler會釋放所有實現(xiàn)IDisposable的IEventHandler。
我想問的是EventBus的Register方法會返回IDisposable接口,它是FactoryUnregistrar對象,它定義了Dispose方法會Unregister解除綁定。
但我始終沒有找到地方,會調(diào)用這個Dispose方法,還請樓主解惑!
支持(0)?反對(0)
??
#8樓?[樓主]?2016-05-30 20:31?ZHK的博客
@?海~~D
這個Dispose方法要你去調(diào)用的。測試項目中有用例的。
支持(0)?反對(0)
??
#9樓?2016-05-30 22:12?海~~D
@?ZHK的博客
是不是說,一般情況下,不需要手動調(diào)用,只有在特殊的場景和需求時,才需要手動調(diào)用?
支持(0)?反對(0)
??
#10樓?[樓主]?2016-05-30 22:57?ZHK的博客
@?海~~D
這樣回答你的問題,如何使用看業(yè)務(wù)場景嘍:
EventBus的Register一個IEventHandlerFactory,而Dispose方法則是Unregister一個IEventHandlerFactory。
總結(jié)
以上是生活随笔為你收集整理的【转】ABP源码分析二十五:EventBus的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个人银行存款要交个人所得税吗
- 下一篇: Sharepoin学习笔记—架构系列--