G
N
I
D
A
O
L

MediatR是一个在.NET应用程序中实现“中介者模式”的开源库

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

 

使用MediatR的示例通常涉及以下步骤:
  1. 安装MediatR:
    使用NuGet包管理器在你的项目中安装MediatR。在Visual Studio中,你可以右键单击项目 -> 选择“管理NuGet程序包” -> 搜索“MediatR” -> 点击“安装”。
  2. 定义命令和查询:
    在应用程序中定义你的命令和查询对象。这些通常作为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方法用于发布通知(不期望响应)。

posted @ 2024-05-08 21:03  firespeed  阅读(84)  评论(0编辑  收藏  举报