Abp Vnext源碼解析系列文章01—EventBus
一、簡介
BP vNext 封裝了兩種事件匯流排結構,第一種是 ABP vNext 自己實現的本地事件匯流排,這種事件匯流排無法跨項目發布和訂閱。第二種則是分散式事件匯流排,ABP vNext 自己封裝了一個抽象層進行定義,並使用 RabbitMQ編寫了一個基本實現。
在使用方式上,兩種事件匯流排的作用基本相同。
事件匯流排分布在兩個模組,在 Volo.Abp.EventBus
模組內部,定義了事件匯流排的抽象介面,以及本地事件匯流排 (ILocalEventBus) 的實現。分散式事件匯流排的具體實現,是在 Volo.Abp.EventBus.RabbitMQ
模組內部進行定義,從項目名稱可以看出來,這個模組是基於 RabbitMQ 消息隊列實現的。
二、源碼分析
1、註冊事件處理器
首先從一個項目的模組開始,Volo.Abp.EventBus
庫的模組 AbpEventBusModule
只幹了一件事情。在組件註冊的時候,根據組件的實現介面 (ILocalEventHandler
或 IDistributedEventHandler
) 不同,將其賦值給 AbpLocalEventBusOptions
與 AbpDistributedEventBusOptions
的 Handlers
屬性。
也就是說,開發人員定義的事件處理程式 (Handler
) 都會在依賴注入的時候,都會將其類型 (Type
) 添加到事件匯流排的配置類當中,方便後續進行使用。
2、發布事件
項目中調用發布事件:
1)類中注入
private readonly ILocalEventBus _localEventBus;
2)方法中調用
await _localEventBus.PublishAsync(eto);
可見,是調用介面ILocalEventBus的實現類中的PublishAsync方法
現在進入ILocalEventBus介面看看
3、ILocalEventBus介面
該介面中並沒有PublishAsync方法,可見在其基介面IEventBus中
進入IEventBus介面中找到了PublishAsync方法定義
該介面的實現在EventBusBase中,進入PublishAsync方法後又調用了PublishToEventBusAsync方法,該方法為一個抽像方法,肯定在他的子類中會去實現這個方法
我們先看本地事件匯流排中是如何實現PublishToEventBusAsync這個方法的
4、LocalEventBus中查看PublishToEventBusAsync方法的重寫
在此方法中最後會去調用TriggerHandlersAsync方法,而此方法是來自於父類EventBusBase
可以看到真正的觸發行為是在 TriggerHandlersAsync
內部進行實現的。
在TriggerHandlersAsync
方法中,前面一段的兩個foreach循環中第一個foreach是獲取所有事件處理器的工廠,第二個foreach是為了獲取所有所有的處理器,並執行TriggerHandlerAsync方法,並最終執行我們自己定義處理器的HandleEventAsync方法
後面一段if語句中的程式碼主要做的事件是發布一個父類事件
5、讓我們來看看真正事件處理器的執行是走的哪個方法吧
參考文摘:
(18條消息) [Abp vNext 源碼分析] – 13. 本地事件匯流排與分散式事件匯流排 (Rabbit MQ)_風神修羅使的部落格-CSDN部落格_分散式事件匯流排