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部落格_分散式事件匯流排

Tags: