MediatR 程序內的訊息通訊框架

2021-09-25 12:38:59 字數 2123 閱讀 8223

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新增到容器將會很方便:

services.addmediatr(typeof(program).assembly);
如果是多個程式集,如果是多個程式集:

services.addmediatr(typeof(program).assembly, typeof(helloworld).assembly);
mediatr有兩種訊息處理模式:

使用起來很簡單,首先定義request訊息,方法如下:

public class ping : irequest
然後,定義它的處理程式:

public class pinghandler : irequesthandler}
這樣就可以了,我們在控制台傳送ping訊息:

var response = await mediator.send(new ping());console.writeline(response);
當處理訊息不需要返回值時,我們應該使用如下方式定義訊息:

public class ping : irequest
對應的訊息處理程式如下:

public class pinghandler: asyncrequesthandler}
預設情況下訊息的處理都是非同步的(返回值為task物件),如果你想要同步執行訊息,需要按下面的方式定義訊息處理程式:

public class pinghandler : requesthandler}
這種模式符合cqrs中command的處理方式,乙個command只能有乙個handler,因此,在使用cqrs時可以參考。

notification模式將訊息發布給多個處理程式,訊息的處理沒有返回值。

訊息的定義:

public class helloworld : inotification{}
多個處理程式:

public class cnreply : inotificationhandler}public class usreply : inotificationhandler}
然後通過publish方法發布訊息:

await mediator.publish(helloworld);
預設情況下,mediatr的訊息發布是乙個乙個執行的,即便是返回task的情況,也是使用await等待上乙個執行完成後才進行下乙個的呼叫。如果需要使用並行的方法進行呼叫,可以進行定製,具體可參考官方示例:mediatr.examples.publishstrategies

mediatr訊息處理程式是支援逆變的,例如我們可以定義乙個訊息監聽程式,監聽所有發布的notification:

public class messagelistener : inotificationhandler");        return task.completedtask;    }}
對於irequest型別的訊息,此種方式未驗證成功。如果可以的話,倒是可以做乙個無處理程式的訊息的監聽,也是挺好玩的。

對於mediatr來說,無論是傳送irequest型別訊息,還是發布inotification型別訊息,都是非同步的。這裡需要特別留意,即使你使用的是同步的訊息處理程式,對於訊息發布來說,都是非同步的,與你的處理程式是同步或非同步無關。

MediatR 程序內的訊息通訊框架

mediatr是一款程序內的訊息訂閱 發布框架,提供了send方法用於發布到單個處理程式 publish方法發布到多個處理程式,使用起來非常方便。目前支援 net framework4.5 net stardand1.3 net stardand2.0等版本,可跨平台使用。要在專案中使用mediat...

MediatR 程序內的訊息通訊框架

mediatr是一款程序內的訊息訂閱 發布框架,提供了send方法用於發布到單個處理程式 publish方法發布到多個處理程式,使用起來非常方便。目前支援 net framework4.5 net stardand1.3 net stardand2.0等版本,可跨平台使用。要在專案中使用mediat...

程序的通訊 訊息佇列

multiprocessing queue 在記憶體中開闢乙個佇列模型,用來存放訊息,任何擁有佇列物件的程序都可以進行訊息的存放和取出。queue 建立乙個訊息佇列物件引數 maxsize,預設為0,表示訊息佇列可以存放的訊息由系統自動分配的空間而定 0 正整數,表示佇列中最多存放多少條訊息 返回值...