MediatR 使用教程--如何实现清晰的消息通信
本文最后更新于 2021年5月17日 晚上
MediatR 是.NET 中的简单中介者模式实现,一种进程内消息传递机制(无其他外部依赖)。 支持以同步或异步的形式进行请求/响应,命令,查询,通知和事件的消息传递,并通过 C#泛型支持消息的智能调度。
MediatR 简介
MediatR 是.NET 中的简单中介者模式实现,一种进程内消息传递机制(无其他外部依赖)。 支持以同步或异步的形式进行请求/响应,命令,查询,通知和事件的消息传递,并通过 C#泛型支持消息的智能调度。
中介者(Mediator)模式如下图所示:
通过中介者模式, 可以将以前杂乱无章的对象间通信进行整合:
更多有关 MediatR 的内容, 详见这个系列教程.
使用 MediatR 库实现对象间通信
过程如下所示:
在工程中引入 MediatR 库
MediatR.Extensions.Microsoft.DependencyInjection
.新建类, 用于向上提供获取 Activity List 的服务. 实现 Request 和 Handler 配套方法如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19public class ActivityList
{
public class Query : IRequest<List<Activity>> {}
public class Handler : IRequestHandler<Query, List<Activity>>
{
private readonly DataContext _context;
public Handler(DataContext context)
{
_context = context;
}
public async Task<List<Activity>> Handle(Query request, CancellationToken cancellationToken)
{
var list = await _context.Activities.ToListAsync();
return list;
}
}
}
通过上述代码就封装了一个获取 Activity List 的功能类了. 外部向 MediatR 发送对应请求, MediatR 将请求转发给这个类, 然后获取结果.
创建发送请求的 API 控制器
有了 MediatR, 可以把请求发送者和处理者之间进行解耦, 二者不直接通信, 且以强类型方式的处理沟通过程.
在使用者端非常简单, 以一个 API 控制器代码为例, 如下所示:
1 |
|
别忘了将 MediatR 注入到依赖管理容器:
1 |
|
其中参数是所有 Handler 存放的 Assembly, 一般都把这些 Handler 类存放到业务逻辑层中, 组织方式上也很灵活, 像上面那样就是包裹在一个类里面, 避免开发者抓破脑袋想名字…
(传入 ActivityList
类只是为了方便定位 Application 层工程对应的 Assembly, 实际上传入其中随便一个类都可以.)