Ray 的记录站

日常开发实践记录

0%

MediatR 使用教程--如何实现清晰的消息通信

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

MediatR 简介

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

中介者(Mediator)模式如下图所示:

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

更多有关 MediatR 的内容, 详见这个系列教程.

使用 MediatR 库实现对象间通信

过程如下所示:

  1. 在工程中引入 MediatR 库 MediatR.Extensions.Microsoft.DependencyInjection.

  2. 新建类, 用于向上提供获取 Activity List 的服务. 实现 Request 和 Handler 配套方法如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 注入到依赖管理容器:

1
2
// 注入 MediatR 服务.
services.AddMediatR(typeof(ActivityList).Assembly);

其中参数是所有 Handler 存放的 Assembly, 一般都把这些 Handler 类存放到业务逻辑层中, 组织方式上也很灵活, 像上面那样就是包裹在一个类里面, 避免开发者抓破脑袋想名字…

(传入 ActivityList 类只是为了方便定位 Application 层工程对应的 Assembly, 实际上传入其中随便一个类都可以.)