我正在使用 C# MediatR 库来实现中介者模式,以从我的控制器发送命令和查询。由于我是这种模式的新手,所以我一直在观看一些在线教程,在这些教程中我看到在某些情况下,Mediator
Query
或 Command
类已作为参数传递给控制器操作方法,并按原样转发给 MediatR,而在一些教程中,有一个单独的视图模型传递到控制器操作方法中,该模型首先映射到命令或查询类,然后转发到 MediatR。命令被传递到控制器操作参数中
[HttpPost]
public async Task<IActionResult> Login(LoginUserCommand loginUserCommand)
{
var User = await _meditr.Send(loginUserCommand);
return View();
}
controlleraction参数中使用的ViewModel
[HttpPost]
public async Task<IActionResult> Login(LoginViewModel loginViewModel)
{
var authenticateUserCommand = _mapper.Map<LoginUserCommand>(loginViewModel);
var User = await _meditr.Send(authenticateUserCommand);
return View();
}
我认为你应该首先了解
ViewModel
和DTO
之间的区别。在大多数情况下,命名是错误的。从技术上讲,此上下文中的命令是 DTO
。但它也代表了在业务领域具有特殊含义的东西 - 将会发生的事情,即系统中要执行的命令。
阅读这篇文章以更好地理解: 视图模型和数据传输对象有什么区别?
但是关于你的主要问题当你使用
Mediatr
时。
事实上,你的controller
仅充当用户和程序逻辑之间的接口或桥梁,
只需要建立这个连接,因此它接收到想要的命令或者Dto
,验证操作是
您的 command
和 handler
的责任。在这种情况下,如果您以不同的方式接收数据并将其映射到命令,
它实际上没有用,并且被认为是超时,因为您不会在控制器上进行任何验证。
所以这是一个更好的选择
[HttpPost]
public async Task<IActionResult> Login(LoginUserCommand loginUserCommand)
{
var User = await _meditr.Send(loginUserCommand);
return View();
}
如果您正在寻找一个很好的示例,我推荐这个存储库: