[译]ASP.NET Core中使用MediatR实现命令和中介者模式

在本文中,我将解释命令模式,以及如何利用基于命令模式的第三方库来实现它们,以及如何在ASP.NET Core中使用它来解决我们的问题并使代码简洁。因此,我们将通过下面的主题来进行相关的讲解。

  • 什么是命令模式?

  • 命令模式的简单实例以及中介者模式的简单描述

  • MVC中的瘦控制器是什么?我们是如何实现使控制器变瘦的?

  • 我们如何在我们的.NET Core应用程序中使用MediatR

  • 使用命令和事件的实例

命令模式及其简单实例

从根本上讲,命令模式是一种数据驱动的设计模式,属于行为模式的范畴。命令是我们可以执行的某种操作或行为,它可以是活动的一部分。一个活动可以有一个或多个命令和实现。

我们可以这样来说,请求以命令的形式包裹在对象中,并传给调用对象。调用者(代理)对象查找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令 。

一个简单的例子是多种类型的消息。Message类包含SendEmail()和SendSms()等属性和方法。使用两种类型的命令,并且需要一个接口,它应该由实现了EmailMessageCommand和SMSMessageCommand的类类继承。还使用代理类来调用特定类型的消息类来处理操作。

640?wx_fmt=png

Main class

640?wx_fmt=png

消息类

640?wx_fmt=png

接口和代理类

640?wx_fmt=png

命令

640?wx_fmt=png

输出

640?wx_fmt=jpeg

什么是瘦控制器,我们为什么需要它?什么是MediatR?

当我们开始使用MVC框架进行开发时,逻辑是用控制器的动作方法编写的;就像我们有一个简单的电子商务应用程序,其中用户应该会下订单。我们有一个控制器,OrderController,用来管理订单。当用户下订单时,我们应该在数据库中保存记录。
在此之前,我们有一个简化的代码。然而,经过一段时间后,我们意识到还有一个确认电子邮件的业务需求。现在,第二步是发送确认电子邮件给客户。后来,我们意识到,在这个步骤之后,我们还需要执行另一个操作,即,记录信息等。最后,我们还需要将用户的信息保存到CRM中。关键是它会增长控制器的大小。现在,我们可以称之为“臃肿控制器”。
基于命令的体系结构允许我们发送命令来执行某些操作,并且我们有单独的命令处理程序,使关注点分离和提高单一职责。为了实现这个架构,我们可以使用第三方库,比如MediatR(Mediator.),它为我们做了很多基础工作。中介模式定义了一个对象,该对象封装了一组对象是如何交互的。

中介模式的优势及MediatR如何帮助我们实现中介模式

  • 中介模式定义了一个对象,该对象封装了一组对象是如何交互的(如维基百科定义的)。

  • 它通过保持对象彼此明确地相互引用来促进松散耦合。

  • 它通过允许通信被卸载到一个只处理这类的类来促进单一责任原则。

MediatR库如何帮助我们

MediatR允许我们通过让控制器Action向处理程序发送请求消息来将控制器与业务逻辑解耦。MediatR库支持两种类型的操作。

  • 命令(预期输出结果)

  • 事件(请求者不关心接下来发生了什么,不期待结果)

我们已经介绍了命令模式,因此是时候定义一些命令并使用MediatR发出命令了。

在ASP.NET Core中安装

我们需要从NuGet安装MediatR和MediatR.Extensions.Microsoft.DependencyInjection包。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

当这两个软件包安装完毕后,我们需要添加services.AddMediatR(); 到startup.cs文件。看起来像这样。

640?wx_fmt=jpeg

现在,我们可以使用.NET Core 项目中的MediatR了。

实例

第一个示例演示了使用MediatR使用请求/响应类型的操作。它期望对请求做出一些反应。
第二个示例将向您展示一个事件,其中多个处理程序执行它们的工作,调用者并不关心接下来会发生什么,也不期望任何结果/响应。

第一个例子

在这种场景下,我们希望注册用户并期望对请求做出一些响应。如果响应返回true,我们可以像登录用户一样进行进一步的操作。
首先,我们需要创建一个继承自IRequest的类。

640?wx_fmt=png

现在我们有了命令和它的处理程序,我们可以调用MediatR在我们的控制器中做一些操作。
这些是Home控制器的动作方法。

640?wx_fmt=png

第一个例子的结论

注册操作方法使用了[HttpPost]属性进行修饰,并接受新的用户注册请求。然后,它请求MediatR 进行处理。它期望来自请求的结果/响应,如果结果是真的,则将用户重定向到登录页面。
这里,我们有简洁的代码,大部分的工作是在控制器外部完成的。这实现了对不同操作的处理的关注点分离(SoC)和单一责任的分离。
在第二个示例中,我们将演示使用多个处理程序对命令执行不同操作的场景。

第二个实例

在这种情况下,我们使NewUser 继承了INotification

public class NewUser : INotification  {  public string Username { get; set; }  public string Password { get; set; }  
}  

现在,有三个处理程序逐个执行,以完成他们的工作。这些都是从INotificationHandler继承下来的。

640?wx_fmt=png

第二个处理程序在下面的代码中定义。

640?wx_fmt=png

然后,我们控制器中的代码像下面这样

640?wx_fmt=png

二个例子的结论

此应用程序的输出如下:
当用户注册后,三个处理程序逐个执行——分别是NewUserHandler、EmailHandler和LogHandler,并执行它们的操作。

这里,我们使用了Publish 方法,而不是Send 函数。发布将调用订阅了NewUser 类的所有处理程序。这只是一个示例,我们可以根据命令进行思考,然后按照我们在命令模式中讨论的方式相应地执行一些操作。

Mediatr是如何提供帮助的?

它可以用来隐藏实现的细节,用来使控制器代码更加干净和可维护,可以重用多个处理程序,并且每个处理程序都有自己的责任,因此易于管理和维护。

在我的下一篇文章中,我将尝试解释CQRS架构模式及其优点以及如何使用MediatR来实现CQRS。

原文地址:https://www.c-sharpcorner.com/article/command-mediator-pattern-in-asp-net-core-using-mediatr2/

相关文章:

  • MEDIATR 一个低调的中介者类库

  • 【翻译】asp.net core中使用MediatR

原文地址https://www.cnblogs.com/yilezhu/p/9866068.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

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

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

相关文章

【贪心】数据备份(P6320)

正题 P6320 题目大意 有n个点,相邻的点不能同时选,问你选k个的最小代价 解题思路 考虑贪心取每个点,取了一个点后设置一个撤回点,就是把该点的选择取反,同时选择左右,这样直接用堆维护即可 code #inclu…

codeforces1451 D. Circle Game

D. Circle Game 看到博弈题,直接打表不过并不能发现什么规律gg 后手每次按照先手对称进行移动,如果先手向右则向上,先手向上则向右,然后考虑最后一步即可。 对称技巧!!! #define IO ios::syn…

2020-10-03

Flowers 题目描述 Recently Jack becomes much more romantic. He would like to prepare several bunches of flowers. Each bunch of flowers must have exactly M flowers. As Jack does not want to be boring, he hopes that flowers in the same bunch are all differ…

P4770-[NOI2018]你的名字【SAM,线段树合并】

正题 题目链接:https://www.luogu.com.cn/problem/P4770 题目大意 给出一个长度为nnn的字符串SSS。qqq次询问给出一个串TTT和一个区间[L,R][L,R][L,R],求TTT有多少个本质不同的子串不是SL∼RS_{L\sim R}SL∼R​的子串。 1≤n≤5105,1≤Q≤105,∑∣T∣≤1061\leq n…

.NET in Browser - Blazor

什么是BlazorBlazor 是一个实验性的. NET web 框架, 使用 C# 和 HTML 在任何浏览器中不需要插件即可运行 WebAssembly 程序集。什么是WebAssemblyWebAssembly是一种新的适合于编译到Web的,可移植的,大小和加载时间高效的格式,是一种新的字节码…

【数论】【杜教筛】选数(P3172)

正题 P3172 题目大意 在 [L,R] 选n个数,问gcdk的方案数 解题思路 因为gcdk,那么所选的数都是k的倍数,那么可以让L,R整除k,那么有 ∑a1LR∑a2LR...∑anLR[gcd(a1,a2...an)1]\sum_{a_1L}^R\sum_{a_2L}^R...\sum_{a_nL}^R[gcd(a_1…

【模板】吉老师线段树

ACM模板 目录区间取最值区间取最值 Gorgeous Sequence 区间最值操作往往采用以下办法 线段树维护: 区间最大值mx\text{mx}mx区间严格次大值smx\text {smx}smx区间和sum\text{sum}sum区间最大值个数cnt\text{cnt}cnt区间最值懒标记lazy\text{lazy}lazy 实现区间…

2020牛客国庆集训派对day4 Digits Are Not Just Characters

Digits Are Not Just Characters 题意: 比较大小,如果比目标字符串大输出“”,相等也输出“”,小则输出“-”: 比较规则: 字母大于数字 两个字母比较按照ASCII码 当被解释为十进制数时,两个数…

CF453C-Little Pony and Summer Sun Celebration【构造】

正题 题目链接:https://www.luogu.com.cn/problem/CF453C 题目大意 nnn个点mmm条边的一张无向图,每个节点有一个wiw_iwi​表示该点需要经过奇数/偶数次。 求一条满足条件的长度不超过4n4n4n的路径 1≤n,m≤1051\leq n,m\leq 10^51≤n,m≤105 解题思路 一个结论就…

在碰撞中成长 - 北京银行的DevOps实践之路

2018年10/27日,在上海召开的微软年度最大规模的技术盛会—微软2018技术暨生态大会上,北京银行渠道系统负责人&敏捷团队负责人周兵女士和大家一起分享了北京银行的DevOps 实践转型经验,得到了大会听众的热烈评价和共鸣,会后众多…

【笛卡尔树】【线段树】meetings 会议(P5044)

正题 P5044 题目大意 给出一个序列a,设 dist(x,y)max⁡ixyaidist(x,y)\max_{ix}^ya_idist(x,y)maxixy​ai​,有m个询问,对于每个询问,给出 l,r,让你找一个点x(l≤x≤r)(l\leq x\leq r)(l≤x≤r),使得 ∑i…

codeforces438 D. The Child and Sequence

2020威海区域赛G. Caesar Cipher就用到了此思想&#xff08; 今天碰到模板题了还是再写一遍吧 D. The Child and Sequence 区间取模操作模板题 有一个公式 x%p<x2(x>p)x\%p<\frac{x}{2}(x>p)x%p<2x​(x>p) 由此对于每一个数最多模log次&#xff0c;如果我们…

2020牛客国庆集训派对day4 Emergency Evacuation

Emergency Evacuation 题意&#xff1a; 有n个人在不同的位置上&#xff0c;在最后面有一个出口exit&#xff0c;所有人都要逃离出去&#xff08;走出出口&#xff09;&#xff0c;且每个格子最多容纳一个人&#xff0c;当有人挡在前面时&#xff0c;后面的人必须停留&#x…

P3170-[CQOI2015]标识设计【插头dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3170 题目大意 给出n∗mn*mn∗m的网格上有一些障碍&#xff0c;要求用三个LLL形&#xff08;高宽随意&#xff0c;不能退化成线段/点&#xff09;覆盖格子且LLL形之间不能重叠。 求覆盖方案&#xff08;每个LLL形相同&…

【活动(广州)】MonkeyFest2018 微软最有价值专家讲座

MonkeyFest2018微软最有价值专家讲座Monkey Fest 是一个一年一度由全球Microsoft Xamarin跨平台开发者发起的全球性社区活动&#xff0c;主要是推广在云、人工智能、大数据、移动开发等技术。本次活动同时在新加坡&#xff0c;美国&#xff0c;日本&#xff0c;加拿大&#xff…

【数学】Natasha, Sasha and the Prefix Sums(CF1204E)

正题 luogu CF1204E 题目大意 给出序列a&#xff0c;由n个1和m个-1组成&#xff0c;设 f 为最大前缀和和0的最大值&#xff0c;问全排列的 f 之和 解题思路 可以问题转换到平面图上&#xff0c;把1看作往上走&#xff0c;-1看作往下走 那么问题就变成了求 (0,0) 到 (nm,n-m…

codeforces1454 F. Array Partition

这周忙死&#xff0c;一直没机会吧补一下题&#xff0c;周二晚上打的div3&#xff0c;过了A~E&#xff0c;F就看了下题目就没时间了&#xff0c;无聊的时候想应该会用到ST表&#xff0c;然后想要维护指针&#xff0c;后来写的时候发现维护不了&#xff0c;然后就歇菜了。。。 …

2020牛客国庆集训派对day4 Arithmetic Progressions

Arithmetic Progressions 链接&#xff1a;https://ac.nowcoder.com/acm/contest/7831/B 来源&#xff1a;牛客网 题目描述 An arithmetic progression is a sequence of numbers a1, a2, ..., ak where the difference of consecutive members ai1−ai is a constant (1 ≤ …

P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】

正题 题目链接:https://www.luogu.com.cn/problem/P4457 题目大意 开始一个人最大生命值为nnn&#xff0c;剩余hphphp点生命&#xff0c;然后每个时刻如果生命值没有满那么有1m1\frac{1}{m1}m11​的概率回复一点生命&#xff0c;然后敌人攻击kkk次&#xff0c;每次有1m1\frac…

互联网公司为什么普遍996而不是666

根据skinshoe wu的遭遇&#xff0c;解释一下互联网行业的12小时工作制以及996。题目说的有点绝对&#xff0c;这里先澄清一下&#xff1a;有的公司是10106&#xff0c;9106&#xff0c;10126&#xff0c;995&#xff0c;甚至955&#xff0c;007的都有&#xff0c;我只说大多数&…