【翻译】asp.net core中使用MediatR
这篇文章来自:https://ardalis.com/using-mediatr-in-aspnet-core-apps
本文作为翻译,有一些单词翻译成中文可能会有一些误解(对于读者)或者错误(对于作者)的地方,所以在文章中你可以看到一些单词没有进行翻译。如果有不对的地方,请指出,谢谢。
在Asp.net core中使用MediatR
我已经开始考虑使用MediatR作为我的领域事件实现。为了达到这个目的,我用asp.net core创建了一个示例程序,总的来说是非常容易的,如果你之前没有使用过MediatR,或者你正在找一个使用它的示例程序,那么就继续阅读吧。
安装MediatR
假设你使用的是Visual studio,你可以通过nuget的ui来安装下面这两个包:

不是用visual studio的话自己找办法安装吧。
在Startup类中配置MediatR
下一步,在Startup类中,在ConfigureServices方法中添加如下代码:
services.AddMediatR(); // if you have handlers/events in other assemblies
// services.AddMediatR(typeof(SomeHandler).Assembly,
// typeof(SomeOtherHandler).Assembly);
在我的示例项目中因为我只有一个工程/程序集,所以没有必要添加其他的。如果你有不只一个程序集需要被配置MediatR,那么你可以按照上面代码中注释掉的那样来配置。
注意:起初我用了Steve Gordon’s helpful article to register my types这个指引,但是MediatR.Extensions.Microsoft.DependencyInjection包得到了更好的支持和更健壮的成长(更别说更少的代码)。我建议使用这个包。
MediatR 实战
当然,如果你想要确认MediatR在你的asp.net core项目中运作,最高的办法是创建一些简单的类型并验证是否能达到预期的效果。MediatR支持两种消息类型:Request/Response和Notification。我使用它的大多数情况是Notification这种模式。因为我希望用它来做模型的领域事件(如果你对于领域事件不熟悉的话,先了解一下它再回来)。要想使用notifications所期望得到的行为,你需要定义一些实现了INotification的类型,和一些实现了INotificationHandler<sometype>的handler。当你要发布一个notification,每一个handler都会在response中。你可以使用下面的代码来实践一下并能看到最终的结果,如果你正在搞一个新项目,你可以把它放到Home Controller中。
public class SomeEvent : INotification {
    public SomeEvent(string message)
    {
        Message = message;
    }
    public string Message { get; }
}
public class Handler1 : INotificationHandler<SomeEvent>
{
    private readonly ILogger<Handler1> _logger;
    public Handler1(ILogger<Handler1> logger)
    {
        _logger = logger;
    }
    public void Handle(SomeEvent notification)
    {
        _logger.LogWarning($"Handled: {notification.Message}");
    }
}
public class Handler2 : INotificationHandler<SomeEvent>
{
    private readonly ILogger<Handler2> _logger;
    public Handler2(ILogger<Handler2> logger)
    {
        _logger = logger;
    }
    public void Handle(SomeEvent notification)
    {
        _logger.LogWarning($"Handled: {notification.Message}");
    }
}
public class HomeController : Controller
{
    private readonly IMediator _mediator;
    public HomeController(IMediator mediator)
    {
        this._mediator = mediator;
    }
    public async Task<IActionResult> Index()
    {
        await _mediator.Publish(new SomeEvent("Hello World"));
        return View();
    }
// more code omitted
}
上面的代码撸完后,使用kestrel运行你的应用(你可以在项目的根目录下面进入cmd然后输入dotnet run来启动一个控制台面板,或者在visual studio中改变启动方式,不过一般情况下我直接进到项目的properties目录下面找到lauchSettings.json,吧IIS相关的东西都删除了。)然后查看你的控制台面板的输出,你应该能看到输出的日志:

如果你只是想用MediatR来发布事件,上面的就是了。如果你想要看看怎么用它来做request/response,你需要在实现几个类:
public class Ping:IRequest<string>{}
public class PingHandler : IRequestHandler<Ping, string>
{
    public string Handle(Ping request)
    {
        return "Pong";
    }
}
// optional to show what happens with multiple handlers
public class Ping2Handler : IRequestHandler<Ping, string>
{
    public string Handle(Ping request)
    {
        return "Pong2";
    }
}
上面的代码定义了一个request以及它的返回类型(string,IRequest<string>).handlers必须实现一个Handle方法,这个方法会返回期望的响应。当你发送一个请求,只有一个handler会被调用并且会返回一个带有合适类型的响应。
(作者在这里说明了一个问题,他给这个包的作者发了一个pull request要求如果有注册了多个handler,那么应该调用注册的第一个,因为只有第一个被添加到了DI系统中)。
当前的版本也不会抛出什么异常,但是即便在将来的版本中会抛出异常,也不会让我感到惊讶什么的。
无论以何种方式,要使用上面定义的内容,你只需要在About 方法中添加如下代码:
public async Task<IActionResult> About()
{
// example of request/response messages
var result = await _mediator.Send(new Ping());
ViewData["Message"] = $"Your application description page: {result}"; return View();
}
从浏览器中浏览/About页面,你能看到调用的结果。目前版本已经更正了结果,你将看到的是注册的第一个(按照你编码的从上到下的顺序,PingHandler是算第一个注册的)handler的返回的结果。
上面就是你要开始研究MediatR的一个很好的开端了。我已经迫不及待的想要将他运用在我的eShopContainer(微软示例项目,讲微服务的)项目当中了。查看这里 Microsoft’s architecture learning hub去获取更多微软的相关技术的书书籍吧。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | publicclassPing:IRequest<string>{} publicclassPingHandler:IRequestHandler<Ping,string> {     publicstringHandle(Ping request)     {         return"Pong";     } } // optional to show what happens with multiple handlers publicclassPing2Handler:IRequestHandler<Ping,string> {     publicstringHandle(Ping request)     {         return"Pong2";     } } | 
【翻译】asp.net core中使用MediatR的更多相关文章
- [译]ASP.NET Core中使用MediatR实现命令和中介者模式
		作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9866068.html 在本文中,我将解释命令模式,以及如何利用基于命令模式的第三方库来实现它们,以及如何 ... 
- [翻译] 如何在 ASP.Net Core 中使用 Consul 来存储配置
		[翻译] 如何在 ASP.Net Core 中使用 Consul 来存储配置 原文: USING CONSUL FOR STORING THE CONFIGURATION IN ASP.NET COR ... 
- 【翻译】介绍 ASP.NET Core 中的 Razor Pages
		介绍 ASP.NET Core 中的 Razor Pages 原文地址:Introduction to Razor Pages in ASP.NET Core 译文地址:介绍 asp. ... 
- 【翻译】asp.net core中使用FluentValidation来进行模型验证
		asp.net core中使用FluentValidation FluentValidation 可以集成到asp.net core中.一旦启用,MVC会在通过模型绑定将参数传入控制器的方法上时使用F ... 
- ASP.NET Core 中的那些认证中间件及一些重要知识点
		前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ... 
- ASP.NET Core 中文文档目录
		翻译计划 五月中旬 .NET Core RC2 如期发布,我们遂决定翻译 ASP.NET Core 文档.我们在 何镇汐先生. 悲梦先生. 张仁建先生和 雷欧纳德先生的群中发布了翻译计划招募信息,并召 ... 
- ASP.NET Core中的依赖注入(1):控制反转(IoC)
		ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化&qu ... 
- ASP.NET Core 中文文档 第二章 指南(4.6)Controller 方法与视图
		原文:Controller methods and views 作者:Rick Anderson 翻译:谢炀(Kiler) 校对:孟帅洋(书缘) .张仁建(第二年.夏) .许登洋(Seay) .姚阿勇 ... 
- ASP.NET Core 中文文档 第三章 原理(1)应用程序启动
		原文:Application Startup 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay) ASP.NET Core 为你的应用程 ... 
随机推荐
- jQuery中关于全选、全不选和反选
			1.首先我们要获取当前点击的对象,然后得到点击事件, 判断他的状态如果是checked的话就把该第二行的选中, 否则就取消选中. 2.当第二列功能小项没有全部选中时,该行第一列的复选款也要取消 ... 
- python之编码与解码
			编码 字符串被当作url提交时会被自动进行url编码处理,在python里也有个urllib.urlencode的方法,可以很方便的把字典形式的参数进行url编码.当url地址含有中文或者“/”的时候 ... 
- 网络最大流算法—EK算法
			前言 EK算法是求网络最大流的最基础的算法,也是比较好理解的一种算法,利用它可以解决绝大多数最大流问题. 但是受到时间复杂度的限制,这种算法常常有TLE的风险 思想 还记得我们在介绍最大流的时候提到的 ... 
- 0.react学习笔记-环境搭建与脚手架
			0.环境搭建 笔者使用的是deepin/mac两种系统,因为两个电脑经常切换用.环境搭建没什么区别. 0.1 node安装 按照node官网叙述安装 # Using Debian, as root c ... 
- asp.net/wingtip/显示数据和详细信息
			前边我们的工作处于wingtip工程基础建设阶段,先是建立了“数据访问层”,然后设计建设了“UI和导航”的框架,接下来要充实工程的内容,显示“数据和详细信息”. 一. 添加数据控件(Data Cont ... 
- android中的相对路径
			转载请标明出处:https://www.cnblogs.com/tangZH/p/9939655.html 1.同个文件夹访问 D:\Java\main\A.java D:\Java\main\B. ... 
- window下 mongodb快速安装
			下载地址 https://www.mongodb.org/dl/win32/x86_64-2008plus-ssl 建立文件夹和文件 #数据库路径 dbpath=G:\mongodb3.4.12\da ... 
- Win7 64位下安装64bit MS SQL Server2005时安装不了Reporting Services的处理办法
			警告截图: 解决办法: 在cmd窗口运行如下脚本即可: "cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/A ... 
- 拉勾网爬取全国python职位并数据分析薪资,工作经验,学历等信息
			首先前往拉勾网“爬虫”职位相关页面 确定网页的加载方式是JavaScript加载 通过谷歌浏览器开发者工具分析和寻找网页的真实请求,确定真实数据在position.Ajax开头的链接里,请求方式是PO ... 
- qt 打包发布 获取dll
			发布前,获取所有qt dll包命令 生成的程序运行正常之后,找到项目的生成目录,比如 项目源码路径: C:\QtPros\hellomw\它的项目生成目录是C:\QtPros\build-hellom ... 
