MediatR是一款程序内的消息訂閱、釋出架構,提供了Send方法用于釋出到單個處理程式、Publish方法釋出到多個處理程式,使用起來非常友善。目前支援 .NET Framework4.5、.NET Stardand1.3、.NET Stardand2.0等版本,可跨平台使用。
要在項目中使用MediatR,首先要添加引用:nuget install MediatR
在使用MediatR的時候,需要設定一個容器來執行個體化所有的Handler,是以我們需要與依賴注入架構結合使用,MediatR支援目前主流的依賴注入架構,例如Autofac等,也可以直接使用 .NET Core 的依賴注入架構。
如果使用 .net core的依賴注入,将MediatR添加到容器将會很友善:
如果是多個程式集,如果是多個程式集:
MediatR有兩種消息處理模式:
Request/Response模式:Message将被單個Handler處理,可以有傳回值
Notifictaion模式:Message可以被多個Handler處理,無傳回值
使用起來很簡單,首先定義Request消息,方法如下:
然後,定義它的處理程式:
這樣就可以了,我們在控制台發送Ping消息:
當處理消息不需要傳回值時,我們應該使用如下方式定義消息:
對應的消息處理程式如下:
預設情況下消息的處理都是異步的(傳回值為Task對象),如果你想要同步執行消息,需要按下面的方式定義消息處理程式:
這種模式符合CQRS中Command的處理方式,一個Command隻能有一個Handler,是以,在使用CQRS時可以參考。
Notification模式将消息釋出給多個處理程式,消息的處理沒有傳回值。
消息的定義:
多個處理程式:
然後通過Publish方法釋出消息:
預設情況下,MediatR的消息釋出是一個一個執行的,即便是傳回Task的情況,也是使用await等待上一個執行完成後才進行下一個的調用。如果需要使用并行的方法進行調用,可以進行定制,具體可參考官方示例:MediatR.Examples.PublishStrategies
MediatR消息處理程式是支援逆變的,例如我們可以定義一個消息監聽程式,監聽所有釋出的Notification:
對于IRequest類型的消息,此種方式未驗證成功。如果可以的話,倒是可以做一個無處理程式的消息的監聽,也是挺好玩的。
對于MediatR來說,無論是發送IRequest類型消息,還是釋出INotification類型消息,都是異步的。這裡需要特别留意,即使你使用的是同步的消息處理程式,對于消息釋出來說,都是異步的,與你的處理程式是同步或異步無關。
MediatR官方文檔
2021年9月 北京、西安兩地,高薪誠聘 .NET工程師,請私信聯系!
如果認為此文對您有幫助,别忘了支援一下哦!
聲明:本部落格原創文字隻代表本人工作中在某一時間内總結的觀點或結論,與本人所在機關沒有直接利益關系。轉載時請在文章頁面明顯位置給出原文連結。