能否在不使用CQRS的情况下,借助MediatR实现.NET 7瘦控制器?
可以脱离CQRS单独使用MediatR实现瘦控制器
MediatR本身只是中介者模式的实现,核心作用是解耦请求的发送方和处理方,CQRS只是它的主流应用场景之一,完全不需要强制绑定。你的小型应用完全可以跳过命令/查询的分离设计,直接用MediatR来实现瘦控制器的目标。
简单实现示例
这里给一个不用CQRS的极简实现:
- 定义普通请求类(无需区分Command或Query):
public class GetUserRequest : IRequest<UserDto> { public int UserId { get; set; } }
- 编写对应的请求处理程序,封装业务逻辑:
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}" }; } }
- 控制器中仅注入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
相关产品推荐
相关产品推荐

