如何在 ASP.Net Core 中使用 MediatR

MediatR 是一个 中介者模式 的.NET开源实现, 中介者模式 管控了一组对象之间的相互通讯并有效的减少了对象之间错综复杂的相互依赖,在 中介者模式 中,一个对象不需要直接和另一个对象进行通讯,而是通过 中介者 进行转达,这篇文章将会讨论如何在 ASP.Net Core 中使用 MediatR 。

安装 MediatR

在 ASP.Net Core 中使用 MediatR 非常简单,你只需要通过 Nuget 安装如下两个包即可。

  • MediatR

  • MediatR.Extensions.Microsoft.DependencyInjection

当前最新的版本为 9.0.0,如下图所示:

配置 MediatR

一旦上面的两个 Nuget 包安装到项目之后,接下来就可以在 Startup 类中进行 MediatR 的配置了,做法就是在 ConfigureServices() 方法中将 MediaR 注入到 IServiceCollection 容器中,如下代码所示:

// This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services){services.AddMediatR(typeof(Startup));services.AddControllers();}

使用 MediaR 处理 通知事件

MediatR 支持两种消息模式。

  • Request / Response 模式

  • Notification 模式

这篇文章我们将会讨论 Notification,接下来创建一个实现 INotification 接口的类,如下代码所示:

public class LogEvent : INotification{public string message;public LogEvent(string message){this.message = message;}}

为了能够处理 LogEvent 事件,还需再创建一个实现 INotificationHandler 接口的类,如下代码所示:

public class FileNotificationHandler : INotificationHandler<LogEvent>{public Task Handle(LogEvent notification, CancellationToken cancellationToken){string message = notification.message;Log(message);return Task.FromResult(0);}private void Log(string message){//Write code here to log message(s) to a text fileDebug.WriteLine("Write code here to log message(s) to a text file");}}public class DBNotificationHandler : INotificationHandler<LogEvent>{public Task Handle(LogEvent notification, CancellationToken cancellationToken){string message = notification.message;Log(message);return Task.FromResult(0);}private void Log(string message){//Write code here to log message(s) to the databaseDebug.WriteLine("Write code here to log message(s) to the database");}}

依赖注入 IMediator

刚才我已经为了 LogEvent 创建了两个处理 handler 类,接下来就可以通过 依赖注入 的方式将其注入到 Controller 中,如下代码所示:

[ApiController][Route("[controller]")]public class WeatherForecastController : ControllerBase{private readonly ILogger<WeatherForecastController> _logger;private readonly IMediator _mediator;public WeatherForecastController(IMediator mediator, ILogger<WeatherForecastController> logger){this._mediator = mediator;this._logger = logger;}}

最后我们可以在 Action 中通过 publish 发布消息,如下代码所示:

[HttpGet]public IEnumerable<WeatherForecast> Get(){_mediator.Publish(new LogEvent("Hello World"));}

值得注意的是,执行程序后将会调用上面的 publish 方法,继而触发 DBNotificationHandler 和 FileNotificationHandler 的 Handle 方法,如下图所示:

中介者模式 是一种行为式的设计模式,它可以有效地管控多个对象之间的交互方式并有效的减少交互双方的依赖关系,刚好 MediatR 就是这样一款成品的 中介者模式 的实现,关于 MediatR 的 request/response 模式,我会在后面的文章中和大家细说。

译文链接:https://www.infoworld.com/article/3393974/how-to-use-mediatr-in-aspnet-core.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304298.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全球100款大数据工具汇总(前50款)

01 Talend Open Studio是第一家针对的数据集成工具市场的ETL(数据的提取Extract、传输Transform、载入Load)开源软件供应商。Talend的下载量已超过200万人次&#xff0c;其开源软件提供了数据整合功能。其用户包括美国国际集团&#xff08;AIG&#xff09;、康卡斯特、电子港湾…

NLP快速入门:手把手教你用HanLP做中文分词

导读&#xff1a;随着自然语言处理(Natural Language Processing, NLP)技术日趋成熟&#xff0c;实现中文分词的工具也越来越多。中文分词技术作为中文自然语言处理的第一项核心技术&#xff0c;是众多上层任务的首要基础工作&#xff0c;同时在日常的工作中起着基础性的作用。…

动态内存(Dynamic Memory),微软的内存过量分配技术?

Hyper-V不支持Memory Overcommitment&#xff0c;一直为VMware和其他虚拟化厂商所诟病。当然&#xff0c;微软一直不承认这是他们的软肋&#xff0c;认为为了保证生产环境VM的性能&#xff0c;过量分配内存是不合时宜的。但是&#xff0c;微软的态度似乎突然转变&#xff0c;3月…

程序员上帝视角解读“旅行青蛙”,你的呱真的在旅行嘛?

来源&#xff1a;知乎作者&#xff1a;黄小秋原文链接&#xff1a;https://www.zhihu.com/question/68733553/answer/305463907导语&#xff1a;知乎有位程序员大佬&#xff0c;为了让老母亲老父亲们理解自己的呱究竟在干什么&#xff0c;于是花了五个晚上逆向游戏程序逻辑&…

我为什么对TypeScript由黑转粉?

喜欢就关注我们吧&#xff01;一名曾仅使用 JavaScript 的开发者解释自己为何从反对 TypeScript 到转变为 TypeScript 粉丝。Chirag Swadia 自称曾是 Anti-TypeScript 的 JavaScript 开发者。谈及反对的原因&#xff0c;他以前一直认为给函数/变量添加类型以满足 TypeScript 编…

谈谈关于MVP模式中V-P交互问题

在差不多两年的时间内&#xff0c;我们项目组几十来号人都扑在一个项目上面。这是一个基于微软SCSF&#xff08;Smart Client Software Factory&#xff09;的项目&#xff0c;客户端是墨尔本一家事业单位。前两周&#xff0c;我奉命负责对某个模块进行Code Review工作&#xf…

ofdm解调算法_OFDM系统中固定频偏算法

加入固定频偏&#xff1a;function berMatrix freqOffsetOFDM(BPS,NS,M,SNR,ifftsize,carriers,N,ep)%标准OFDM系统input_bit_stream sign(randn(1,BPS*NS));input_bit_stream(input_bit_stream -1)0;parallel_data StoP(input_bit_stream ,M);% 串并转换%QAM调制modulated_d…

重磅!阿里开源AI核心技术,95%算法工程师受用

你是否曾有过这样的疑虑&#xff1a;人工智能大热&#xff0c;作为一名传统程序员&#xff0c;该如何转型或学习&#xff1f;网上AI教程、书籍&#xff0c;质量参差不齐&#xff0c;如何找到真正专业的资源&#xff1f;AI理论遍地皆是&#xff0c;但几乎都在纸上谈兵。我们该从…

android 换机 iphone8,最好的换机之选?iPhone8 PLUS众测体验

最好的换机之选&#xff1f;iPhone8 PLUS众测体验2017-11-11 14:29:0034点赞1收藏0评论文章前面说一下&#xff0c;自己水平有限文笔不好&#xff0c;没有相机&#xff0c;开箱图这些都是手头的iPhone6和本次众测的的产品拍摄&#xff0c;再加上最近白天都没空拍照&#xff0c;…

阿里开始招聘.NET,要求WPF!

说到WPF、上位机&#xff0c;很多.NET开发者可能只是听过并不了解&#xff0c;然而随着工业4.0的火爆大势&#xff0c;当下.NET开发者又多了一个高薪选型&#xff0c;在各大招聘网站上都能找到5年经验25k左右的岗位&#xff0c;强烈推荐大家关注一波。这里借用了下阿里影业对.N…

JavaWeb中的Session、SessionListener、在线人数统计

2019独角兽企业重金招聘Python工程师标准>>> JavaWeb中的Session 在JavaWeb中使用HttpSession&#xff08;以下简称session&#xff09;对象来表示一个会话。正在装载数据…… Session的创建&#xff08;代表会话周期的开始&#xff09;&#xff1a;第一次调用reque…

全球100款大数据工具汇总(51~100款)

上篇&#xff08;戳标题即可跳转&#xff09;&#xff1a;全球100款大数据工具汇总&#xff08;前50款&#xff09;51、Redis是一个高性能的key-value存储系统&#xff0c;和Memcached类似&#xff0c;它支持存储的value类型相对更多&#xff0c;包括string&#xff08;字符串&…

Android手机投屏后没有声音,乐播投屏电视没有声音怎么办_乐播投屏电视没有声音手机有声音解决办法_3DM手游...

乐播投屏是一个非常不错的投屏软件&#xff0c;操作使用简单&#xff0c;最近不少小伙伴都在用。但是在使用乐播投屏的时候&#xff0c;有很多小伙伴出现了电视没有声音手机有声音的情况&#xff0c;这是怎么回事呢&#xff1f;我们一起来看看乐播投屏电视没有声音的解决办法吧…

如何容器化你的 ASP.Net Core

Docker 相比 虚拟机 具有更轻量级&#xff0c;更便捷的特性&#xff0c;为什么这么说呢&#xff1f;虚拟机通常打包了完整的操作系统&#xff0c;而容器只仅仅打包了你的应用程序&#xff0c;运行环境及相关依赖库&#xff0c;Docker 是一种开源的工具包&#xff0c;帮助你更加…

2018年大数据趋势

作者 | Keith D. Foote翻译 | 品觉笔记本电脑、智能手机、传感器&#xff0c;都为物联网带来了大量数据。这是获得竞争优势&#xff08;或者保持竞争力&#xff09;的重大机遇&#xff0c;前提是企业足够灵活&#xff0c;可以管理好数据并把数据变成有用的商业智能。人脑能高效…

关于商品分类 商品表和属性表的设计

以前有这样的一个需求,不考虑像京东或者淘宝这样分类下有子分类的情况,只考虑一层分类的情况下,可以随便添加分类,可以任意给商品添加属性,而不需要更 改表的结构. 于是设计了一个这样的结构,实现还是可以实现,一直在用,但是在操作上比较麻烦,大家讨论下有没有更好的方式. ----…

Redis五种数据结构

1、String这是最简单的Redis类型。如果只使用这种类型&#xff0c;Redis就像一个可持久化的Memcached服务器。2、ListRedis的List是基于双向链表实现的&#xff0c;可以支持反向查找和遍历。常用案例&#xff1a;聊天系统、社交网络中获取用户最新发表的帖子、简单的消息队列、…

C# NUnit的安装

前言&#xff1a;NUnit是什么&#xff1f;NUnit 是一个单元测试框架&#xff0c;专门针对于.NET来写的。NUnit是xUnit家族种的第4个主打产品&#xff0c;完全由C#语言来编写&#xff0c;并且编写时充分利用了许多.NET的特性,比如反射,客户属性等等。最重要的一点是它适合于所有…

中国癌症大数据出来了!每年126万例癌症死亡本可避免

01 中国本土大样本数据&#xff1a;癌症真的可预防&#xff01;2017年&#xff0c;由全国肿瘤登记中心副主任陈万青教授、美国癌症协会Farhad Islami教授牵头的生活方式和感染对中国癌症发病和死亡影响的研究&#xff0c;发表在Annals of Oncology上[1,2]。该研究由美国癌症研究…

android 设置folder类型,正确配置你的 Android 项目

简评&#xff1a;优秀的 Android 项目从配置开始。: )作者在这里介绍了一个 Android 项目应该有的配置&#xff0c;文中讲到的内容大家都可以运用在自己的 Android 模板项目中。gitignore当你新建 Android 项目时&#xff0c;默认会生成 gitignore 文件&#xff0c;但并没有包含…