[译]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,一经查实,立即删除!

相关文章

.NET in Browser - Blazor

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

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

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

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

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

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

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

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

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

IdentityServer4之JWT签名(RSA加密证书)及验签

一、前言在IdentityServer4中有两种令牌,一个是JWT和Reference Token,在IDS4中默认用的是JWT,那么这两者有什么区别呢?二、JWT与Reference Token的区别1、JWT(不可撤回)  JWT是一个非常轻巧的规范,一般被用来在身份提…

.NET Core使用IO合并技巧轻松实现千万级消息推送

之前讲述过多路复用实现单服百万级别RPS吞吐,但在文中有一点是没有说的就是消息IO合并,如果缺少了消息IO合并即使怎样多路复用也很难达到百万级别的请求响毕竟所有应用层面的网络IO读写都是非常损耗性能的(需要硬件配置很高的服务器)。这一章…

天气情况图像分类练习赛 第三阶段(赛中感)

第三阶段也是实战阶段,不同于前两个阶段的填空而是实打实的预测分析 题目会给出8000张照片数据,其中6000作为训练集而另外2000张作位测试集,通过对6000张的训练来预测2000的结果,并将结果输出到csv文件中,提交检验成功…

一码阻塞,万码等待:ASP.NET Core 同步方法调用异步方法“死锁”的真相

在我们 2015 年开始的从 .NET Framework 向 .NET Core 迁移的工程中,遇到的最大的坑就是标题中所说的——同步方法中调用异步方法发生”死锁”。虽然在 .NET Framework 时代就知道不能在同步方法中调用异步方法,但我们却明知路有坑,偏向此路行…

take

take 题解参考 题目描述 Kanade has n boxes , the i-th box has p[i] probability to have an diamond of d[i] size. At the beginning , Kanade has a diamond of 0 size. She will open the boxes from 1-st to n-th. When she open a box,if there is a diamond in it an…

将传统 ASP.NET 应用迁移到 .NET Core

点击蓝字关注我现在越来越多的人在谈论. NET Core。诚然,.NET Core 是未来, 但是.NET Framework 仍在支持, 因为大量的应用程序无法在短时间内迁移。.NET Core 和 .NET Framework 就像电动汽车和汽油动力汽车。汽油车是成熟的,你可以毫无任何问题驾驶它&…

[翻译] 初看 ASP.NET Core 3.0 即将到来的变化

原文: A first look at changes coming in ASP.NET Core 3.0在我们努力完成下一个 minor 版本的 ASP.NET Core 的同时,我们也在对下一个 major 版本进行更新,其中包括如何使用框架组合项目、更紧密的 .NET Core 集成以及第三方开源集成,所有这…

aspnet core 2.1中使用jwt从原理到精通二

在aspnet core中,自定义jwt管道验证有了上一节的内容作为基础,那这点也是非常容易的,关键点在中间件,只是把上一级在测试类中的自定义验证放到中间件中来即可,不过需要注意:中间件 的位置很重要&#xff0c…

CentOS开发ASP.NET Core入门教程

因为之前一直没怎么玩过CentOS,大多数时间都是使用Win10进行开发,然后程序都部署在Window Server2008或者Window Server2012上!因此想尝试下Linux系统。最后经过选型选了比较流行的CentOS系统。正好,今晚要加班,所以在…

工厂参观记:.NET Core 中 HttpClientFactory 如何解决 HttpClient 臭名昭著的问题

在 .NET Framework 与 .NET Core 中 HttpClient 有个臭名昭著的问题,HttpClient 实现了 IDispose 接口,但当你 Dispose 它时,它不会立即关闭所使用的 tcp 连接,而是将 tcp 连接置为 TIME_WAIT 状态,240秒(4…

ASP.NET Core2读写InfluxDB时序数据库

在我们很多应用中会遇到有一种基于一系列时间的数据需要处理,通过时间的顺序可以将这些数据点连成线,再通过数据统计后可以做成多纬度的报表,也可通过机器学习来实现数据的预测告警。而时序数据库就是用于存放管理这种有着时间顺序数据的&…

Nature 新研究发布,GPT 驱动的机器人化学家能够自行设计和进行实验,这对科研意味着什么?

文章目录 前言揭秘Coscientist不到四分钟,设计并改进了程序能力越大,责任越大 前言 有消息称,AI 大模型 “化学家” 登 Nature 能够自制阿司匹林、对乙酰氨基酚、布洛芬,甚至连复杂的钯催化交叉偶联反应,也能完成。 …

SmartCode 常见问题

SmartCode 能干什么?SmartCode IDataSource -> IBuildTask -> IOutput > Build EverythingSmartCode的执行流是 数据源->构建任务->输出,也就是说应用场景非常广泛。从DB读取数据结构,最终生成整个解决方案代码生成器&#x…

全面支持开源,微软加速 Visual Studio 和 Azure DevOps 云升级

在 2018 微软技术暨生态大会(Microsoft Tech Summit)上,微软宣布围绕 Visual Studio 和 Visual Studio Code 开发平台提供一系列新功能与服务,并对 Azure DevOps 研发云进行整合升级,通过 Visual Studio 开发平台与微软…

HttpClient参观记:.net core 2.2 对HttpClient到底做了什么?

.net core 于 10月17日发布了 ASP.NET Core 2.2.0 -preview3,在这个版本中,我看到了一个很让我惊喜的新特性:HTTP Client Performance Improvements ,而且在Linux上性能提升了60% !之前就一直苦于 HttpClient 的糟糕特性&#xff…