日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MEDIATR 一个低调的中介者类库

發布時間:2023/12/4 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MEDIATR 一个低调的中介者类库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

微軟官方的開源項目eShopOnContainers中,用到了一個實現中介者模式的類庫:MediatR。這個類庫的作者叫Jimmy Bogard,在其gtihub主頁上可以看到,注明的對象映射組件AutoMapper?就是他寫的。其博客上的自我介紹是這么寫的:

Headspring的首席架構師,《MVC in Action》的作者,國際演說家,高產的開源軟件開發者。擅長分布式系統,REST,消息,領域驅動設計和CQRS。

回到MediatR這個組件,他是一個低調的類庫,致力于解決一個簡單的問題:解耦進程內消息的發送與處理。跨平臺,支持.NET4.5和netstandard1.1。

中介者模式

在繼續研究MediatR之前,先回顧下“中介者設計模式(Mediator)”,中介者模式的定義為:用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互應用,從而使其耦合松散,而且可以獨立地改變他們之間的交互。其結構圖如下:

以下是一個具體的中介者模式demo:

/// <summary> /// 抽象中介者 /// </summary> public abstract class AbstractMediator {public abstract void SendMessage(string msg, AbstractColleague colleague); }/// <summary> /// 抽象同事類 /// </summary> public abstract class AbstractColleague {public string Name { get; set; }protected AbstractMediator Mediator;protected AbstractColleague(AbstractMediator mediator){Mediator = mediator;}public abstract void PrintMsg(string msg); }/// <summary> /// 具體中介者,負責同事類之間的交互,他必須清楚的知道需要交互的所有同事類的細節。 /// </summary> public class Mediator : AbstractMediator {public AbstractColleague ColleagueA;public AbstractColleague ColleagueB;public override void SendMessage(string msg, AbstractColleague colleague){if (colleague == ColleagueA){ColleagueB.PrintMsg(msg);}else if (colleague == ColleagueB){ColleagueA.PrintMsg(msg);}} }/// <summary> /// 具體同事類A,他是不知道其他具體同事類的存在的。他與其他同事類的交互,是通過中介者來實現的。 /// </summary> public class ConcreteColleagueA : AbstractColleague {public ConcreteColleagueA(AbstractMediator mediator) : base(mediator){}public void SendMessage(string msg){Mediator.SendMessage(msg,this);}public override void PrintMsg(string msg){Console.WriteLine($"A收到消息:{msg}");} }public class ConcreteColleagueB : AbstractColleague {public ConcreteColleagueB(AbstractMediator mediator) : base(mediator){}public void SendMessage(string msg){Mediator.SendMessage(msg, this);}public override void PrintMsg(string msg){Console.WriteLine($"B收到消息:{msg}");} }class Program {/// <summary>/// 客戶端調用/// </summary>/// <param name="args"></param>static void Main(string[] args){var mediator = new Mediator();var colleagueA = new ConcreteColleagueA(mediator);var colleagueB = new ConcreteColleagueB(mediator);mediator.ColleagueA = colleagueA;mediator.ColleagueB = colleagueB;colleagueA.SendMessage("你好B,中午一起飯吧?");colleagueB.SendMessage("你好A,好的。");Console.ReadLine();} }

程序輸出如下:

B收到消息:你好B,中午一起飯吧? A收到消息:你好A,好的。

中介者類把不同的同事類之間的交互提升到其內部,這樣同事類之間的交互變得簡單了,同事類不需要知道其他同事類的存在,通過中介者類來完成與其他同事類的交互。另一方面,中介者類本身復雜性增加,中介者類需要知道所有的同事類,例如調用他們的公共方法。

MediatR

MediatR可以與很多依賴注入組件一起工作,其github文檔有詳細說明。以下是我結合Autofac組件的代碼研究。

新建ASP.NET Core Console程序,添加MediatR和Autofac依賴包。然后配置Autofac:

var builder = new ContainerBuilder(); // 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();//builder.RegisterType<PingHandler>().AsImplementedInterfaces().InstancePerDependency(); builder.RegisterAssemblyTypes(typeof(Program).GetTypeInfo().Assembly).AsImplementedInterfaces();var mediator = builder.Build().Resolve<IMediator>(); Test(mediator);

MediatR可以支持幾種模式,有請求/響應模式,發布模式。

請求/響應模式,也可以叫做命令模式,主要適用于命令和查詢場景。一個請求只能被一個處理者捕獲,如果存在多個處理者,那么只有最后一個處理者會被激活。

以下代碼聲明消息,然后定義處理者:

/*注意:請求/響應接口適用于命令和查詢場景。*都只能有一個Handler,如果注冊多個,只有最后一個會生效。*/ public class Ping : IRequest<string> {public int MsgId { get; set; } }public class PingHandler : IRequestHandler<Ping, string> {public Task<string> Handle(Ping request, CancellationToken cancellationToken){return Task.FromResult($"MsgID={request.MsgId},Pong");} }/// <summary> /// 為了方便,不需要CancellationToken的Handler,可以繼承AsyncRequestHandler類 /// </summary> public class AsyncNoCancellation : AsyncRequestHandler<Ping, string> {protected override Task<string> HandleCore(Ping request){return Task.FromResult("Pong");} }/// <summary> /// 如果Handler是完全同步的,可以繼承RequestHandler類 /// </summary> public class SyncHandler : RequestHandler<Ping, string> {protected override string HandleCore(Ping request){return $"SyncHandler Pong";} }

然后就是發送請求了:

var response = await mediator.Send(new Ping(){MsgId = 100}); Console.WriteLine(response); // "SyncHandler Pong"

另外,請求/響應模式還支持不帶任何返回值的處理者:

public class OneWay:IRequest {public int MsgId { get; set; } }public class OneWayHandler : IRequestHandler<OneWay> {public Task Handle(OneWay request, CancellationToken cancellationToken){Console.WriteLine($"{request.MsgId},OneWayHandler");return Task.CompletedTask;} }

發布模式,一般用于發布一個事件,通知訂閱者某件事情已經發生,對此事感興趣的訂閱者可以采取行動了。一般是一個發布這,多個訂閱者。

public class Hello : INotification {public int MsgId { get; set; } }public class Hello1 : INotificationHandler<Hello> {public async Task Handle(Hello notification, CancellationToken cancellationToken){await Task.Delay(3000);Console.WriteLine($"{notification.MsgId},{Thread.CurrentThread.ManagedThreadId}");} }public class Hello2 : INotificationHandler<Hello> {public async Task Handle(Hello notification, CancellationToken cancellationToken){await Task.Delay(3000);Console.WriteLine($"{notification.MsgId},{Thread.CurrentThread.ManagedThreadId}");} }

像這樣發布消息:

  • await mediator.Publish(new Hello() {MsgId = 300});

  • 程序輸出如下:

    300,4 300,5 Main 5

    這里可以看到,2個訂閱者都被激活了。另外,可以看到不同的訂閱者所處的線程ID不一樣,他們是異步執行的。

    原文地址?:http://coderyu.com/2018/04/02/mediatr-%E4%B8%AD%E4%BB%8B%E8%80%85/

    .NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com

    總結

    以上是生活随笔為你收集整理的MEDIATR 一个低调的中介者类库的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 97精品人妻麻豆一区二区 | 小泽玛利亚在线 | 欧美作爱视频 | 中文在线不卡 | 四虎com| 少妇网站在线观看 | 国产a一区 | 狠狠干欧美 | 成人乱人乱一区二区三区 | 日本成人久久 | 影音先锋中文字幕一区二区 | 久久久久网 | 欧美高清视频一区二区 | 国产人妻人伦精品1国产盗摄 | 精品二区在线 | 黑人巨大精品欧美黑白配亚洲 | av簧片| 夜色综合 | 在线观看aa | 日本黄色录像 | 久久久久国产精品人妻 | 成年人看的羞羞网站 | 日日夜夜狠狠 | 国产精品亚洲欧美 | 日本天堂免费a | 久久99精品国产.久久久久 | 999精品| 美女裸体网站久久久 | a视频免费看| 高潮网 | 欧洲人妻丰满av无码久久不卡 | 色婷婷激情av | 狼人色综合 | √天堂资源在线 | 99久久精品国产成人一区二区 | 日韩欧美中文在线 | 国产aⅴ无码片毛片一级一区2 | 国产97色在线 | 日韩 | 热99在线| 国产视频观看 | 色老头综合网 | 亚洲一区二区三区四区五区xx | 国产又粗又黄又爽又硬 | 国产一区二区三区在线视频 | 韩国伦理在线视频 | 亚洲图片小说视频 | 欧洲色区 | 最新av在线 | 老熟妇高潮一区二区三区 | 国产色宗合| 亚洲欧洲中文 | 黄色一节片 | 欧美少妇视频 | www一区 | 国产成人无码精品久久 | 动漫美女被吸乳奶动漫视频 | 久久va | 97在线观看免费视频 | www一区二区三区 | 久久av网| 无法忍受在线观看 | 国产调教在线 | 美女诱惑一区二区 | 亚洲一区二区福利视频 | 国产在线观看免费视频软件 | 天堂视频网 | 亚洲jizzjizz| 狂野欧美性猛交xxxxhd | 欧美区亚洲区 | 欧美高清一区二区 | 欧美日韩精品免费 | 女人做爰全过程免费观看美女 | 国产日韩精品一区二区三区 | 亚洲成人久久久 | 国产精品老牛影院99av | 日韩欧美第一区 | 国产精品久久久久国产a级 国产一区二区在线播放 | 奇米二区| 成人中文字幕+乱码+中文字幕 | 蜜桃视频在线观看一区 | 新疆毛片| 免费黄色网址观看 | 亚洲无在线观看 | 成人在线短视频 | 亚洲aⅴ| 婷婷激情丁香 | 日韩无 | 五月天激情影院 | 亚洲精品一线二线三线 | 丁香八月婷婷 | 成人一区二区免费视频 | av污 | 日本xxxxwww | 国产极品美女在线 | 韩国无码av片在线观看网站 | 懂色中文一区二区在线播放 | 91夫妻视频 | 久久久久久久91 | 国产一区二区三区在线视频观看 |