Asp.Net Core 使用 MediatR

项目中使用了CQRS读写分离,增删改 的地方使用了 MediatR ,将进程内消息的发送和处理进行解耦。于是便有了这篇文章,整理并记录一下自己的学习。遇到问题,解决问题,记录问题,成长就是一步一步走出来的。

MediatR 是什么?

是的,不管你怎么翻译都查不到该词,好多人都猜测说是作者将Mediator笔误写成MediatR了,哈哈哈,该问题暂且不论。

作者说这是一个野心很小的库,试图解决一个问题———解耦进程内消息的发送与处理。

一、下载Nuget包

Asp.Net Core 我们可以使用扩展了 Microsoft.Extensions.DependencyInjection 的 MediatR 的扩展包 MediatR.Extensions.Microsoft.DependencyInjection,方便直接注册服务。

安装该Nuget包,会自动安装MediatR。写文档时使用的版本:v7.0.0

Package Manager : Install-Package MediatR.Extensions.Microsoft.DependencyInjection
或
CLI : dotnet add package MediatR.Extensions.Microsoft.DependencyInjection

二、注册服务

v7.0.0版本

services.AddMediatR(typeof(MyHandler));
或
services.AddMediatR(typeof(Startup).GetTypeInfo().Assembly);
//这里用的Startup,其实Hanler所在的项目中的任何一个文件都可

如果使用的是 v6.0.1 版本时 只需要 services.AddMediatR() 即可。

三、基本使用

MediatR 有两种方式的消息发送方式:

  • Request/Response (请求/响应消息),指派到 一个 处理程序
  • Notification (广播消息),指派到 多个 处理程序

请求和响应(消息单播)

也就是一个消息对应一个消息处理。

请求和响应接口处理命令和查询场景,首先,创建一个消息:

    public class CreateUserCommand : IRequest<string>
{
public string Name { get; set; }
}

然后创建一个处理器:

    public class CreateUserHandler : IRequestHandler<CreateUserCommand, string>
{
public async Task<string> Handle(CreateUserCommand request, CancellationToken cancellationToken)
{
return await Task.FromResult($"New name is {request.Name}");
}
}

最后,通过 mediator 发送消息:

    [HttpPost("User")]
public async Task<string> CreateUserAsync([FromQuery] string name)
{
var response = await _mediator.Send(new CreateUserCommand { Name = name});
return response;
}

如果你的消息不需要返回响应消息,可以使用 AsyncRequestHandler<TRequest> 基础类:

    //消息
public class NoResponseCommand : IRequest { } //处理器
public class NoResponseHandler : AsyncRequestHandler<NoResponseCommand>
{
protected override async Task Handle(NoResponseCommand request, CancellationToken cancellationToken)
{
//handle the logic
}
} //接口
[HttpPost("NoResponse")]
public async Task NoResponseAsync()
{
await _mediator.Send(new NoResponseCommand());
}

请求类型

在 MediatR 中有两种请求类型。一种有返回值,一种没有返回值。

  • IRequest<T>:该请求会返回一个值
  • IRequest:该请求没有返回值

为了简化执行管道,IRequest 继承了IRequest<Unit> 接口,其中 Unit 代表了一个终端或可忽略的返回类型。

每个请求类型都有属于自己对应的处理器接口:

  • IRequestHandler<T,U>:实现它,并返回 Task<U>.
  • RequestHandler<T,U>:继承它,并返回 Task<U>.

然后是对于那些没有返回值的请求的处理器接口:

  • IRequestHandler<T>:实现它,并返回 Task<Unit>.
  • AsyncRequestHandler<T>:继承它,并返回 Task.
  • RequestHandler<T>:继承它,什么也不用返回 ( void )

发布(消息多播)

也就是发布一个消息,会有多个消息处理器进行消息处理。

对于广播,首先要创建你的广播消息:

    public class MyNotificationCommand: INotification
{
/// <summary>
/// 广播的内容
/// </summary>
public string Message { get; set; }
}

接下来创建0个或多个处理器来处理广播:

    public class FirstMyNotificationHandler : INotificationHandler<MyNotificationCommand>
{
public async Task Handle(MyNotificationCommand notification, CancellationToken cancellationToken)
{
//针对广播的内容做进一步处理
Debug.WriteLineIf(!string.IsNullOrEmpty(notification.Message), $"First notification handler:{notification.Message}");
}
} public class SecondMyNotificationHandler : INotificationHandler<MyNotificationCommand>
{
public async Task Handle(MyNotificationCommand notification, CancellationToken cancellationToken)
{
//针对广播的内容做进一步处理
Debug.WriteLineIf(!string.IsNullOrEmpty(notification.Message), $"Second notification handler:{notification.Message}");
}
}

最后通过 mediator 发布消息。

    [HttpPost("Publish")]
public async Task PublishNotificationAsync([FromQuery] string name)
{
await _mediator.Publish(new MyNotificationCommand {Message = name });
}

以上代码会在输出栏打印 First和Second 两次的内容。

异步

Send/Publish在 IMediatR 端都是异步的,只要你的工作是可以等待的,你的处理器就可以使用Async或await关键字

不为写博客而写博客。记录,一方面梳理和整理自己的所学和思路,另一方面在以后遇到同样问题时,而不必再花费不必要的时间。

Asp.Net Core 使用 MediatR的更多相关文章

  1. Asp.net core使用MediatR进程内发布/订阅

    1.背景 最近,一个工作了一个月的同事离职了,所做的东西怼了过来.一看代码,惨不忍睹,一个方法六七百行,啥也不说了吧,实在没法儿说.介绍下业务场景吧,一个公共操作A,业务中各个地方都会做A操作,正常人 ...

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

    这篇文章来自:https://ardalis.com/using-mediatr-in-aspnet-core-apps 本文作为翻译,有一些单词翻译成中文可能会有一些误解(对于读者)或者错误(对于作 ...

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

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9866068.html 在本文中,我将解释命令模式,以及如何利用基于命令模式的第三方库来实现它们,以及如何 ...

  4. 在 ASP.NET Core 项目中使用 MediatR 实现中介者模式

    一.前言  最近有在看 DDD 的相关资料以及微软的 eShopOnContainers 这个项目中基于 DDD 的架构设计,在 Ordering 这个示例服务中,可以看到各层之间的代码调用与我们之前 ...

  5. ASP.NET Core MVC 入门到精通 - 3. 使用MediatR

    ASP.NET Core MVC 入门到精通 - 3. 使用MediatR 环境: .NET 5 ASP.NET Core MVC (project) 1. MediatR MediatR .NET中 ...

  6. ASP.NET Core开发者成长路线图

    目录 ASP.NET Core开发者路线图RoadMap 免责声明 请给一个星星! ⭐ 路线图 资源 总结 贡献 许可协议 ASP.NET Core开发者路线图RoadMap 来源: MoienTaj ...

  7. ASP.NET Core微服务实战系列

    希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,码字辛苦,如果你吃了蛋觉得味道不错,希望点个赞,谢谢关注. 前言 这里记录的是个人奋斗和成长的地方,该篇只是一个系列目录和构想 ...

  8. ASP.NET Core开发者指南

    ASP.NET Core开发者指南 2019年ASP.NET Core开发者指南: 你可以在下面找到一张图,该图展示了你可以选取的路径及你想学习的库,从而成为一名 ASP.NET Core 开发者.“ ...

  9. 我的asp.net core目录

    推荐 Asp.NETCore轻松学系列阅读指引目录(asp.net core 2.2) 官方文档翻译 http://www.cnblogs.com/dotNETCoreSG/p/aspnetcore- ...

随机推荐

  1. Windows使用telnet验证服务端口是否通

    使用telnet指令时,Windows需要开启Telnet服务. telnet不通的情况: a.端口对应的服务没启动,或者启动了服务端口不是对应的测试端口. b.端口受限不能访问. 以下内容转自:ht ...

  2. nice -n 10 bash 和 chrt 10 bash 和 echo -17 > /proc/PID/oom_score_adj

    进程优先级起作用的方式从发明以来基本没有什么变化,无论是只有一个cpu的时代,还是多核cpu时代,都是通过控制进程占用cpu时间的长短来实现的. 就是说在同一个调度周期中,优先级高的进程占用的时间长些 ...

  3. for(auto i : v)遍历容器元素

    c++11的新特性,v是一个可遍历的容器或流,比如vector类型,i就用来在遍历过程中获得容器里的每一个元素. for(auto i:v) for(auto &i:v) 代码1:#inclu ...

  4. java类型 jdbcType类型 mysql类型关系

    java类型 jdbcType类型 mysql类型关系 Java类型 JdbcType Mysql类型 备注 String VARCHAR VARCHAR 变长字符串 String LONGVARCH ...

  5. OpenBLAS编译 Debug x64 Win10 vs2015

    OpenBLAS编译  Debug x64  Win10  vs2015 >------ 已启动生成: 项目: ZERO_CHECK, 配置: Debug x64 ------ > Che ...

  6. 内存检测工具valgrind的安装和简单使用

    1. 安装 .tar.bz2 cd valgrind- sudo ./configure sudo make sudo make install 2. 简单使用 #include <stdio. ...

  7. F5负载均衡 MIBs bigip oid

    F5 MIBs       分组bigip-ltmpool-stat           oid=".1.3.6.1.4.1.3375.2.2.5.2.3.1.1" name=&q ...

  8. 【pip升级导致错误】 多个pip导致明明已经安装了包但是报no module错误

    原来一直用apt install 默认安装的pip 8.01版本,今天因为一些原因,将pip升级到了19.01.升级后就导致了错误. 直接pip installl --upgrade pip,发现报权 ...

  9. http post 自动变成了options 怎么设置

  10. CentOS7为docker-ce配置阿里云镜像加速器

    一.找加速地址 https://promotion.aliyun.com/ntms/act/kubernetes.html 控制台 二.添加daemon.json 文件 vim /etc/docker ...