You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在不使用CQRS的情况下,借助MediatR实现.NET 7瘦控制器?

可以脱离CQRS单独使用MediatR实现瘦控制器

MediatR本身只是中介者模式的实现,核心作用是解耦请求的发送方和处理方,CQRS只是它的主流应用场景之一,完全不需要强制绑定。你的小型应用完全可以跳过命令/查询的分离设计,直接用MediatR来实现瘦控制器的目标。

简单实现示例

这里给一个不用CQRS的极简实现:

  1. 定义普通请求类(无需区分Command或Query):
public class GetUserRequest : IRequest<UserDto>
{
    public int UserId { get; set; }
}
  1. 编写对应的请求处理程序,封装业务逻辑:
public class GetUserHandler : IRequestHandler<GetUserRequest, UserDto>
{
    private readonly IUserRepository _userRepository;

    public GetUserHandler(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    public async Task<UserDto> Handle(GetUserRequest request, CancellationToken cancellationToken)
    {
        var user = await _userRepository.GetByIdAsync(request.UserId, cancellationToken);
        return new UserDto { Id = user.Id, FullName = $"{user.FirstName} {user.LastName}" };
    }
}
  1. 控制器中仅注入MediatR并调用Send方法,彻底简化控制器逻辑:
[Route("users")]
public class UsersController : Controller
{
    private readonly IMediator _mediator;

    public UsersController(IMediator mediator)
    {
        _mediator = mediator;
    }

    [HttpGet("{id}")]
    public async Task<IActionResult> Details(int id)
    {
        var userDto = await _mediator.Send(new GetUserRequest { UserId = id });
        return View(userDto); // Razor视图场景
        // 后续切换为API时只需改为 return Ok(userDto);
    }
}

这种方式的优势

  • 控制器仅负责请求接收与响应返回,完全剥离业务逻辑,符合瘦控制器的设计原则。
  • 业务逻辑都封装在MediatR的处理程序中,后续切换到Web API+前端架构时,这些处理程序可以直接复用,无需修改核心业务代码。
  • 针对小型应用,无需为了CQRS的规范强行拆分命令和查询,避免不必要的代码冗余,保持代码结构简洁。

内容的提问来源于stack exchange,提问作者Dario

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 02:03:21