天天看點

.NET Core開發實戰(第35課:MediatR:讓領域事件處理更加優雅)--學習筆記

核心對象

IMediator

INotification

INotificationHandler

這兩個與之前的 Request 的行為是不一樣的,接下來看一下代碼

之前 mediator 使用了 Send 的方式來處理 Command,它還有一個方法 Publish,這個方法的入參是一個 INotification

啟動程式,輸出如下:

與之前的 IRequest 不同的是,INotification 是可以注冊多個 Handler 的,它是一個一對多的關系,借助它就可以對領域事件定義多個處理器來處理

接着看一下之前雲服務的代碼

之前在 IUnitOfWork 定義的時候講過一個發送領域事件的方法 DispatchDomainEventsAsync,看一下這個方法的定義

可以看到這裡是将所有的實體内的領域事件全部都查找出來,然後通過 mediator 的 Publish 發送領域事件,具體的領域事件的處理注冊在 mediator 裡面,這裡定義了一個 OrderCreatedDomainEventHandler

它繼承自 IDomainEventHandler,而 IDomainEventHandler 繼承自 INotificationHandler

這也就是為什麼 IDomainEventHandler 會識别到 DomainEvent 并且進行處理,同樣的在定義 DomainEvent 的時候,也需要辨別它是一個 DomainEvent

而 DomainEvent 實際上也是繼承自 INotification

這也就意味着 EventHandler 可以正确的識别到對應的 Event 并且進行處理,這都是 MediatR 的核心能力

領域事件都是定義在 event 目錄下,與領域模型定義在一起,所有的領域事件都繼承 DomainEvent,分布于這個目錄

領域事件的處理 Handler 都定義在 Application 應用層的 Application 下面的 DomainEventHandlers 目錄下面

這樣的好處是事件的定義與事件的處理是分開的,并且非常的明确知道有哪些領域事件,有哪些領域事件的處理程式

關于 MediatR 再補充一部分内容,在 TransactionBehavior 内可以看到這個類實際上繼承自 IPipelineBehavior

這個接口的作用是在指令或者事件處理的之前或者之後插入邏輯,它的執行的方式有點像中間件的方式,在 Handler 的入參裡面有一個 next 的參數,就是指 CommandHandler 或者 EventHandler 的執行的邏輯,在這裡就可以決定 Handler 的具體執行之前或者之後,插入一些邏輯

這裡實作裡在執行指令之前判斷事務是否開啟,如果事務開啟的話繼續執行後面的邏輯,如果事務沒有開啟,先開啟事務,再執行後面的邏輯

GitHub源碼連結:

https://github.com/MINGSON666/Personal-Learning-Library/tree/main/DotNetCoreDevelopmentActualCombat/MediatorDemo

https://github.com/witskeeper/geektime

.NET Core開發實戰(第35課:MediatR:讓領域事件處理更加優雅)--學習筆記
.NET Core開發實戰(第35課:MediatR:讓領域事件處理更加優雅)--學習筆記
.NET Core開發實戰(第35課:MediatR:讓領域事件處理更加優雅)--學習筆記

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協定進行許可。

歡迎轉載、使用、重新釋出,但務必保留文章署名 鄭子銘 (包含連結: http://www.cnblogs.com/MingsonZheng/ ),不得用于商業目的,基于本文修改後的作品務必以相同的許可釋出。

如有任何疑問,請與我聯系 ([email protected]) 。