
MediatR 是一个轻量级的库,用于实现应用程序中的中介者模式【实现命令查询职责分离 (CQRS) 模式和面向消息的架构】。通过将请求(命令或查询)与处理程序解耦,简化了应用程序的逻辑分层和扩展。
dotnet add package MediatR注册中间件
// 注册 MediatR
//builder.Services.AddMediatR(typeof(Startup)); // 或者指定包含请求处理程序的类类型
// 注册 MediatR
//builder.Services.AddMediatR(typeof(Program).Assembly);
builder.Services.AddMediatR(cfg =>
{
cfg.RegisterServicesFromAssembly(typeof(Program).Assembly);
});MediatR 提供了以下主要接口和类型:
// 命令类
public class AddUserCommand : IRequest<bool>
{
public string Username { get; set; }
public string Email { get; set; }
}// 处理程序类
using MediatR;
using MediatRDemoApi;
using Newtonsoft.Json;
publicclassAddUserCommandHandler : IRequestHandler<AddUserCommand, bool>
{
//private readonly IUserRepository _userRepository;
//public AddUserCommandHandler(IUserRepository userRepository)
//{
// _userRepository = userRepository;
//}
public async Task<bool> Handle(AddUserCommand request, CancellationToken cancellationToken)
{
Console.WriteLine("收到需要处理的" + JsonConvert.SerializeObject(request));
//var user = new User(request.Username, request.Email);
//return await _userRepository.AddUserAsync(user);
//模拟添加成功,返回true
returntrue;
}
}3.在服务或控制器中发送命令:
public classUserController : ControllerBase
{
privatereadonly IMediator _mediator;
public UserController(IMediator mediator)
{
_mediator = mediator;
}
[HttpPost("add")]
public async Task<IActionResult> AddUser([FromBody] AddUserCommand command)
{
var result = await _mediator.Send(command);
return Ok(result);
}
}不要忘记注册中间件


INotification 是用于事件消息的接口,通常不需要返回数据,
public class UserCreatedEvent : INotification
{
public string UserName { get; set; }
public DateTime CreatedAt { get; set; }
public UserCreatedEvent(string userName, DateTime createdAt)
{
UserName = userName;
CreatedAt = createdAt;
}
}
public class UserCreatedEventHandler : INotificationHandler<UserCreatedEvent>
{
public Task Handle(UserCreatedEvent notification, CancellationToken cancellationToken)
{
// 处理事件,比如发送欢迎邮件
Console.WriteLine($"User created: {notification.UserName}, Time: {notification.CreatedAt}");
return Task.CompletedTask;
}
}public classUserService
{
privatereadonly IMediator _mediator;
public UserService(IMediator mediator)
{
_mediator = mediator;
}
public async Task CreateUser(string userName)
{
// 创建用户的逻辑(例如数据库操作等)
// 发布事件
var userCreatedEvent = new UserCreatedEvent(userName, DateTime.Now);
await _mediator.Publish(userCreatedEvent);
}
}
MediatR 支持在处理请求之前或之后执行额外的行为。例如,添加日志记录行为:
public classLoggingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
{
privatereadonly ILogger _logger;
public LoggingBehavior(ILogger logger)
{
_logger = logger;
}
public async Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TResponse> next, CancellationToken cancellationToken)
{
_logger.LogInformation($"Handling {typeof(TRequest).Name}");
var response = await next();
_logger.LogInformation($"Handled {typeof(TRequest).Name}");
return response;
}
}注册管道行为:
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>));类似地,可以创建查询类及其处理程序。例如,查询用户列表:
// 查询类
publicclassGetUserListQuery : IRequest<List<User>>
{
}
// 处理程序类
publicclassGetUserListQueryHandler : IRequestHandler<GetUserListQuery, List<User>>
{
privatereadonly IUserRepository _userRepository;
public GetUserListQueryHandler(IUserRepository userRepository)
{
_userRepository = userRepository;
}
publicasync Task<List<User>> Handle(GetUserListQuery request, CancellationToken cancellationToken)
{
returnawait _userRepository.GetUserListAsync();
}
}CancellationToken 中止请求。MediatR 通过命令查询职责分离模式和面向消息的架构,帮助构建更加模块化、可维护的应用程序。其丰富的特性和灵活的扩展机制使得它成为现代开发中的有力工具。