MediatR - 使用命令/查询作为控制器操作的参数

问题描述 投票:0回答:1

我正在使用 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();
    }
c# asp.net mediator mediatr
1个回答
3
投票

我认为你应该首先了解

ViewModel
DTO
之间的区别。在大多数情况下,命名是错误的。从技术上讲,此上下文中的命令是
DTO
。但它也代表了在业务领域具有特殊含义的东西 - 将会发生的事情,即系统中要执行的命令。

阅读这篇文章以更好地理解: 视图模型和数据传输对象有什么区别?

但是关于你的主要问题当你使用

Mediatr
时。 事实上,你的
controller
仅充当用户和程序逻辑之间的接口或桥梁, 只需要建立这个连接,因此它接收到想要的命令或者
Dto
,验证操作是 您的
command
handler
的责任。在这种情况下,如果您以不同的方式接收数据并将其映射到命令, 它实际上没有用,并且被认为是超时,因为您不会在控制器上进行任何验证。

所以这是一个更好的选择

[HttpPost]
public async Task<IActionResult> Login(LoginUserCommand loginUserCommand)
{
    var User = await _meditr.Send(loginUserCommand);
    return View();
}   

如果您正在寻找一个很好的示例,我推荐这个存储库:

https://github.com/jasontaylordev/CleanArchitecture

© www.soinside.com 2019 - 2024. All rights reserved.