MediatR是一个在.NET应用程序中实现“中介者模式”的开源库
MediatR是一个在.NET应用程序中实现“中介者模式”的开源库。该库通过一种进程内消息传递机制(无其他外部依赖),进行请求/响应、命令、查询、通知和事件的消息传递,并通过泛型来支持消息的智能调度。
中介者模式是一种行为设计模式,它允许对象之间通过一个中介者对象进行交互,而不是直接相互依赖和交互。MediatR通过将请求和处理程序解耦,使应用程序的不同组件之间的通信更加简单和灵活。具体而言,它将请求封装在一个对象中,然后将该对象传递给中介者,中介者将选择正确的处理程序来处理该请求。
MediatR还提供了一些功能,如管道处理程序(Pipeline Behaviors)、日志记录、异常处理等,以增强中介者模式的功能和灵活性。在消息传递方式上,MediatR支持单播(请求/响应消息,分派给单个处理程序)和多播(通知消息,分派给多个处理程序)。
中介者模式是一种行为设计模式,它允许对象之间通过一个中介者对象进行交互,而不是直接相互依赖和交互。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方法用于发布通知(不期望响应)。

浙公网安备 33010602011771号