日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转】ABP源码分析二十五:EventBus

發(fā)布時間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】ABP源码分析二十五:EventBus 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的【转】ABP源码分析二十五:EventBus的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。