MediatR 是.NET 中的简单中介者模式实现,一种进程内消息传递机制(无其他外部依赖)。 支持以同步或异步的形式进行请求/响应,命令,查询,通知和事件的消息传递,并通过 C#泛型支持消息的智能调度。
MediatR 简介
MediatR 是.NET 中的简单中介者模式实现,一种进程内消息传递机制(无其他外部依赖)。 支持以同步或异步的形式进行请求/响应,命令,查询,通知和事件的消息传递,并通过 C#泛型支持消息的智能调度。
中介者(Mediator)模式如下图所示:

通过中介者模式, 可以将以前杂乱无章的对象间通信进行整合:

更多有关 MediatR 的内容, 详见这个系列教程.
使用 MediatR 库实现对象间通信
过程如下所示:
-
在工程中引入 MediatR 库
MediatR.Extensions.Microsoft.DependencyInjection. -
新建类, 用于向上提供获取 Activity List 的服务. 实现 Request 和 Handler 配套方法如下所示:
cspublic 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 控制器代码为例, 如下所示:
public class ActivitiesController : BaseAPIController { private readonly IMediator _mediator; public ActivitiesController(IMediator mediator) { // 注入 MediatR 对象 _mediator = mediator; } [HttpGet] public async Task<ActionResult<List<Activity>>> List() { // 使用者只需要发送对应的请求并等待结果即可. 由 mediator 对请求进行转发. return await _mediator.Send(new ActivityList.Query()); } }
别忘了将 MediatR 注入到依赖管理容器:
// 注入 MediatR 服务. services.AddMediatR(typeof(ActivityList).Assembly);
其中参数是所有 Handler 存放的 Assembly, 一般都把这些 Handler 类存放到业务逻辑层中, 组织方式上也很灵活, 像上面那样就是包裹在一个类里面, 避免开发者抓破脑袋想名字…
(传入 ActivityList 类只是为了方便定位 Application 层工程对应的 Assembly, 实际上传入其中随便一个类都可以.)