MediatR是什么?2019-09-25

https://www.cnblogs.com/tanmingchao/p/9681975.html
本文轉自

1.MediatR 是什么?

[
復制代碼

](javascript:void(0); "復制代碼")

<pre>微軟官方eshopOnContainer開源項目中使用到了該工具,

mediatR 是一種中介工具,解耦了消息處理器和消息之間耦合的類庫,支持跨平臺 .net Standard和.net framework

https://github.com/jbogard/MediatR/wiki 這里是原文地址。其作者就是Automapper的作者。
功能要是簡述的話就倆方面:

request/response 請求響應

pub/sub 發布訂閱</pre>

[
復制代碼

](javascript:void(0); "復制代碼")

2.****使用

<pre>nuget: install-package MediatR

MediatR沒有其他的依賴項,您需要配置一個工廠委托,用來實例化所有處理程序、管道的行為,和前/后處理器。</pre>

3.Autofac完整的IOC注入示例:

[
復制代碼

](javascript:void(0); "復制代碼")

<pre>// uncomment to enable polymorphic dispatching of requests, but note that // this will conflict with generic pipeline behaviors // builder.RegisterSource(new ContravariantRegistrationSource()); // mediator itself
builder
.RegisterType<Mediator>()
.As<IMediator>()
.InstancePerLifetimeScope(); // request handlers
builder
.Register<SingleInstanceFactory>(ctx => { var c = ctx.Resolve<IComponentContext>(); return t => c.TryResolve(t, out var o) ? o : null;
})
.InstancePerLifetimeScope(); // notification handlers
builder
.Register<MultiInstanceFactory>(ctx => { var c = ctx.Resolve<IComponentContext>(); return t => (IEnumerable<object>)c.Resolve(typeof(IEnumerable<>).MakeGenericType(t));
})
.InstancePerLifetimeScope(); // finally register our custom code (individually, or via assembly scanning) // - requests & handlers as transient, i.e. InstancePerDependency() // - pre/post-processors as scoped/per-request, i.e. InstancePerLifetimeScope() // - behaviors as transient, i.e. InstancePerDependency()
builder.RegisterAssemblyTypes(typeof(MyType).GetTypeInfo().Assembly).AsImplementedInterfaces(); // via assembly scan //builder.RegisterType<MyHandler>().AsImplementedInterfaces().InstancePerDependency(); // or individually</pre>

[
復制代碼

](javascript:void(0); "復制代碼")

4.ASP.NET CORE 使用 IOC注入:

[
復制代碼

](javascript:void(0); "復制代碼")

<pre>引用 MediatR nuget:install-package MediatR

引用IOC擴展 nuget:installpackage MediatR.Extensions.Microsoft.DependencyInjection

使用方式:

services.AddMediatR(typeof(MyHandler));

services.AddMediatR(typeof(Startup).GetTypeInfo().Assembly);

目的是為了掃描Handler的實現對象并添加到IOC的容器中</pre>

[
復制代碼

](javascript:void(0); "復制代碼")

5.參考示例

5.1 請求響應(request/response),三步:

[
復制代碼

](javascript:void(0); "復制代碼")

<pre>步驟一:創建一個消息對象,需要實現IRequest,或IRequest<>接口,表明該對象是處理器的一個對象 public class Ping : IRequest<string> { }

步驟二:創建一個處理器對象 public class PingHandler : IRequestHandler<Ping, string> { public Task<string> Handle(Ping request, CancellationToken cancellationToken) { return Task.FromResult("Pong"); } }

步驟三:最后,通過mediator發送一個消息 var response = await mediator.Send(new Ping()); Debug.WriteLine(response); // "Pong"</pre>

[
復制代碼

](javascript:void(0); "復制代碼")

說明:如果某些情況下,如果你的消息發送不需要返回響應結果的話,可以使用AsyncRequestHandler<TRequest>

參考實現:

<pre>public class OneWay : IRequest { } public class OneWayHandlerWithBaseClass : AsyncRequestHandler<OneWay> { protected override Task Handle(OneWay request, CancellationToken cancellationToken) { // Twiddle thumbs } }</pre>

或者需要異步實現可以使用 RequestHandler

參考實現:

<pre>public class SyncHandler : RequestHandler<Ping, string> { protected override string Handle(Ping request) { return "Pong"; } }</pre>

5.1.1 Request的類型說明,比較幼稚了,,

[
復制代碼

](javascript:void(0); "復制代碼")

<pre>IRequest<T> 有返回值

IRequest 無返回值

IRequestHandler<T> 該對象的實現對象返回一個 Task 對象

AsyncRequestHandler<T> 該對象的子對象(繼承)返回一個 Task 對象

RequestHandler<T> 該對象的子對象(繼承) 無返回值

IRequestHandler<T,U> 該對象的實現對象返回一個 Task<U> 對象

RequestHandler<T,U> 該對象的子對象(繼承)返回一個 U 對象</pre>

[
復制代碼

](javascript:void(0); "復制代碼")

5.2 Publishing,依舊三步走

[
復制代碼

](javascript:void(0); "復制代碼")

<pre>步驟一:創建一個用于通知的消息對象,實現INotification接口 public class Ping : INotification { }

步驟二:創建通知的處理器對象 public class Pong1 : INotificationHandler<Ping> {

public Task Handle(Ping notification, CancellationToken cancellationToken) { Debug.WriteLine("Pong 1"); return Task.CompletedTask; } }

public class Pong2 : INotificationHandler<Ping> { public Task Handle(Ping notification, CancellationToken cancellationToken) { Debug.WriteLine("Pong 2"); return Task.CompletedTask; } }

三步驟:最終使用mediator發布你的消息 await mediator.Publish(new Ping());</pre>

[
復制代碼

](javascript:void(0); "復制代碼")

5.3 其他:見github作者wiki參考示例

分類: .NET

標簽: .NET, MediatR, 開發記錄

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容

  • 一. Java基礎部分.................................................
    wy_sure閱讀 3,826評論 0 11
  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,483評論 0 17
  • Swift1> Swift和OC的區別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,121評論 1 32
  • 23種設計模式總結 1.單例模式(Singleton Pattern) 定義:Ensure a class has...
    Mo_ham_med閱讀 285評論 0 0
  • 2017的大事情在原先既定的軌道上行進,希望接下來的置換也希望順順當當的....
    mo清夜無塵閱讀 219評論 0 0