MediatR在Clean Architecture中的应用:CQRS模式的完美实践

MediatR在Clean Architecture中的应用:CQRS模式的完美实践

【免费下载链接】CleanArchitecture 【免费下载链接】CleanArchitecture 项目地址: https://gitcode.com/gh_mirrors/clea/CleanArchitecture

MediatR是一个轻量级的.NET中介者模式实现库,它在Clean Architecture中扮演着至关重要的角色,完美实现了CQRS(命令查询职责分离)模式。本文将深入探讨MediatR如何帮助开发者构建清晰、可维护的Clean Architecture应用程序。

🎯 什么是MediatR和CQRS模式?

MediatR是一个简单的中介者模式实现,它通过IRequestIRequestHandler接口来解耦请求和处理器。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);
}

💡 最佳实践和优势

  1. 单一职责原则:每个处理器只负责一个特定的命令或查询
  2. 易于测试:命令和查询处理器可以独立进行单元测试
  3. 可扩展性:通过管道行为轻松添加新功能
  4. 清晰的项目结构:按功能组织代码,提高可维护性
  5. 异步支持:天然支持异步操作,提高系统性能

🎉 总结

MediatR在Clean Architecture中的应用提供了一个优雅的解决方案来实现CQRS模式。通过命令和查询的明确分离,管道行为的强大功能,以及清晰的代码组织结构,开发者可以构建出高度可维护、可测试和可扩展的应用程序。

无论是小型项目还是大型企业级应用,MediatR和Clean Architecture的组合都能为你的.NET开发带来显著的提升。开始尝试这种模式,你会发现代码质量和工作效率都有质的飞跃!

【免费下载链接】CleanArchitecture 【免费下载链接】CleanArchitecture 项目地址: https://gitcode.com/gh_mirrors/clea/CleanArchitecture

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值