MediatR在Clean Architecture中的应用:CQRS模式的完美实践
【免费下载链接】CleanArchitecture 项目地址: https://gitcode.com/gh_mirrors/clea/CleanArchitecture
MediatR是一个轻量级的.NET中介者模式实现库,它在Clean Architecture中扮演着至关重要的角色,完美实现了CQRS(命令查询职责分离)模式。本文将深入探讨MediatR如何帮助开发者构建清晰、可维护的Clean Architecture应用程序。
🎯 什么是MediatR和CQRS模式?
MediatR是一个简单的中介者模式实现,它通过IRequest和IRequestHandler接口来解耦请求和处理器。CQRS模式则将应用程序的操作分为两类:命令(写操作)和查询(读操作),这种分离使得系统更加清晰和可维护。
在Clean Architecture中,MediatR作为Application层的核心组件,负责协调领域对象之间的交互,同时保持各层之间的松耦合。
🏗️ MediatR在Clean Architecture中的配置
在src/Application/DependencyInjection.cs中,我们可以看到MediatR的配置:
services.AddMediatR(cfg => {
cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly());
cfg.AddBehavior(typeof(IPipelineBehavior<,>), typeof(UnhandledExceptionBehaviour<,>));
cfg.AddBehavior(typeof(IPipelineBehavior<,>), typeof(ValidationBehaviour<,>));
cfg.AddBehavior(typeof(IPipelineBehavior<,>), typeof(PerformanceBehaviour<,>));
});
这种配置方式自动注册了所有实现了IRequestHandler的类,并添加了异常处理、验证和性能监控等管道行为。
📝 命令和查询的实现模式
命令示例:创建待办事项
在src/Application/TodoItems/Commands/CreateTodoItem/CreateTodoItem.cs中:
public record CreateTodoItemCommand : IRequest<int>
{
public int ListId { get; init; }
public string? Title { get; init; }
}
public class CreateTodoItemCommandHandler : IRequestHandler<CreateTodoItemCommand, int>
{
public async Task<int> Handle(CreateTodoItemCommand request, CancellationToken cancellationToken)
{
// 业务逻辑实现
return entity.Id;
}
}
查询示例:分页获取待办事项
在src/Application/TodoItems/Queries/GetTodoItemsWithPagination/GetTodoItemsWithPagination.cs中:
public record GetTodoItemsWithPaginationQuery : IRequest<PaginatedList<TodoItemBriefDto>>
{
public int ListId { get; init; }
public int PageNumber { get; init; } = 1;
public int PageSize { get; init; } = 10;
}
public class GetTodoItemsWithPaginationQueryHandler
: IRequestHandler<GetTodoItemsWithPaginationQuery, PaginatedList<TodoItemBriefDto>>
{
public async Task<PaginatedList<TodoItemBriefDto>> Handle(
GetTodoItemsWithPaginationQuery request, CancellationToken cancellationToken)
{
// 查询逻辑实现
return await result;
}
}
🔧 管道行为和横切关注点
MediatR的管道行为(Behaviours)是其实力的体现,可以优雅地处理横切关注点:
日志记录行为
在src/Application/Common/Behaviours/LoggingBehaviour.cs中:
public class LoggingBehaviour<TRequest> : IRequestPreProcessor<TRequest>
where TRequest : notnull
{
public async Task Process(TRequest request, CancellationToken cancellationToken)
{
_logger.LogInformation("CleanArchitecture Request: {Name} {@UserId} {@UserName} {@Request}",
requestName, userId, userName, request);
}
}
验证行为
验证行为自动处理FluentValidation验证规则,确保所有请求在进入业务逻辑前都经过验证。
🚀 在Web层使用MediatR
在Web层的端点中,通过依赖注入获取MediatR实例并发送命令或查询:
[HttpPost]
public async Task<ActionResult<int>> Create(CreateTodoItemCommand command)
{
return await Mediator.Send(command);
}
[HttpGet]
public async Task<ActionResult<PaginatedList<TodoItemBriefDto>>> GetWithPagination(
[FromQuery] GetTodoItemsWithPaginationQuery query)
{
return await Mediator.Send(query);
}
💡 最佳实践和优势
- 单一职责原则:每个处理器只负责一个特定的命令或查询
- 易于测试:命令和查询处理器可以独立进行单元测试
- 可扩展性:通过管道行为轻松添加新功能
- 清晰的项目结构:按功能组织代码,提高可维护性
- 异步支持:天然支持异步操作,提高系统性能
🎉 总结
MediatR在Clean Architecture中的应用提供了一个优雅的解决方案来实现CQRS模式。通过命令和查询的明确分离,管道行为的强大功能,以及清晰的代码组织结构,开发者可以构建出高度可维护、可测试和可扩展的应用程序。
无论是小型项目还是大型企业级应用,MediatR和Clean Architecture的组合都能为你的.NET开发带来显著的提升。开始尝试这种模式,你会发现代码质量和工作效率都有质的飞跃!
【免费下载链接】CleanArchitecture 项目地址: https://gitcode.com/gh_mirrors/clea/CleanArchitecture
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



