MediatR是一个在.NET应用程序中实现“中介者模式”的开源库。该库通过一种进程内消息传递机制(无其他外部依赖),进行请求/响应、命令、查询、通知和事件的消息传递,并通过泛型来支持消息的智能调度。
中介者模式是一种行为设计模式,它允许对象之间通过一个中介者对象进行交互,而不是直接相互依赖和交互。MediatR通过将请求和处理程序解耦,使应用程序的不同组件之间的通信更加简单和灵活。具体而言,它将请求封装在一个对象中,然后将该对象传递给中介者,中介者将选择正确的处理程序来处理该请求。
MediatR还提供了一些功能,如管道处理程序(Pipeline Behaviors)、日志记录、异常处理等,以增强中介者模式的功能和灵活性。在消息传递方式上,MediatR支持单播(请求/响应消息,分派给单个处理程序)和多播(通知消息,分派给多个处理程序)。
使用MediatR的示例通常涉及以下步骤:
- 安装MediatR:
使用NuGet包管理器在你的项目中安装MediatR。在Visual Studio中,你可以右键单击项目 -> 选择“管理NuGet程序包” -> 搜索“MediatR” -> 点击“安装”。 - 定义命令和查询:
在应用程序中定义你的命令和查询对象。这些通常作为C#类实现,并可能包含一些接口或特定的基类。例如,一个创建用户的命令可能如下:
public class CreateUserCommand : IRequest<User>
{
public string Username { get; set; }
public string Email { get; set; }
// 其他必要的属性
}
其中IRequest<TResponse>
是MediatR提供的一个接口,表示一个请求,并期望一个响应。
3.创建处理程序:
对于每个命令和查询,你需要创建一个或多个处理程序。这些处理程序实现了MediatR的接口,并定义了如何响应特定的请求。
public class CreateUserCommandHandler : IRequestHandler<CreateUserCommand, User>
{
private readonly IUserService _userService; // 假设你有一个用户服务
public CreateUserCommandHandler(IUserService userService)
{
_userService = userService;
}
public async Task<User> Handle(CreateUserCommand request, CancellationToken cancellationToken)
{
// 使用请求中的信息来创建用户
var user = await _userService.CreateAsync(request.Username, request.Email);
return user;
}
}
在这个例子中,IRequestHandler<TRequest, TResponse>
是MediatR的接口,表示一个能够处理特定请求并返回响应的处理程序。
4.在Startup类中注册服务:
在ASP.NET Core应用程序的Startup类中,你需要注册你的命令和查询处理程序,以及MediatR本身。
public void ConfigureServices(IServiceCollection services)
{
// ...其他服务注册...
services.AddMediatR(typeof(Startup).GetTypeInfo().Assembly); // 注册当前程序集中的所有处理程序
// 如果你想注册特定程序集中的处理程序,可以传递该程序集的Type
// services.AddMediatR(typeof(CreateUserCommandHandler).GetTypeInfo().Assembly);
// ...其他服务注册...
}
5.发送命令或查询:
在你的应用程序代码中,你可以使用MediatR的IMediator接口来发送命令或查询。
public class SomeClass
{
private readonly IMediator _mediator;
public SomeClass(IMediator mediator)
{
_mediator = mediator;
}
public async Task CreateUserAsync(string username, string email)
{
var createUserCommand = new CreateUserCommand { Username = username, Email = email };
var user = await _mediator.Send(createUserCommand); // 发送命令并等待响应
// 处理响应...
}
}
在这个示例中,IMediator
接口用于发送命令和查询。Send
方法用于发送命令(期望一个响应),而Publish
方法用于发布通知(不期望响应)。