如何在 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,一经查实,立即删除!

相关文章

pythonjson数据提取_python爬虫学习笔记(十)-数据提取之JsonPath的使用

1. JSON与JsonPATHJSON(JavaScript Object Notation) 是一种轻量级的数据交换格式&#xff0c;它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景&#xff0c;比如网站前台与后台之间的数据交互。JSON和XML的比较可谓不相上下。Pyt…

全球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;同时在日常的工作中起着基础性的作用。…

微信小程序android错误,app安卓端 跳转到微信小程序失败

详细问题描述(DCloud产品不会有明显的bug&#xff0c;所以你遇到的问题大都是在特定环境下才能重现的问题&#xff0c;请仔细描述你的环境和重现方式&#xff0c;否则DCloud很难排查解决你的问题)[内容] app安卓端跳转到微信小程序失败重现步骤 一直失败[步骤] 微信小程序关联了…

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

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

openlayers地图旋转_OpenLayers的使用---- 一个完全免费开源的地图JS库

OpenLayers很容易的在网站里放置动态地图。它能显示展开图及从资源中加载地图标记及矢量数据。它被开发出尽可能的使用所有的地图信息。并且它是完全免费及开源的.详细了解可去它的官网&#xff1a;http://openlayers.org/简单使用&#xff0c;如展示一个块地图.mymap {height:…

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

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

android.mk 翻译,翻译ANDROID-MK.TXT

Android.mk编译文件是用来向Android NDK描述你的C,C源代码文件的&#xff0c;这篇文档描述了它的语法。在阅读下面的内容之前&#xff0c;假定你已经阅读了docs/OVERVIEW.TXT文件&#xff0c;了解了它们的脚色和用途。概述:一个Android.mk file用来向编译系统描述你的源代码。具…

我为什么对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…

eeprom stm8l 擦除 读写_[STM8L]EEPROM操作读与写

原标题&#xff1a;[STM8L]EEPROM操作读与写带有片上EEPROM&#xff0c;常用来保存参数&#xff0c;事实上STM8L整个程序存储区都可以用于作为EEPROM&#xff0c;只是默认情况下被闭了。不同型号的STM8L器件其内部默认划分的EEPROM区域都是从0x1000地址开始&#xff0c;以下为S…

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;帮助你更加…

tableau三轴合并_《Tableau数据可视化实战》——1.12节合并不同数据源-阿里云开发者社区...

本节书摘来自华章社区《Tableau数据可视化实战》一书中的第1章&#xff0c;第1.12节合并不同数据源&#xff0c;作者(美)Ashutosh Nandeshwar&#xff0c;更多章节内容可以访问云栖社区“华章社区”公众号查看1.12 合并不同数据源通常&#xff0c;我们的数据以不同格式或者不同…