使用 .NET API 的 CQRS 模式 - 将请求对象与命令/查询分离

Kyl*_*avy 3 .net c# api cqrs mediatr

关于在 .NET API 中使用 CQRS 模式,我见过一些示例,其中请求直接反序列化为命令/查询,然后发送出去进行处理,如下所示:

[HttpPost]
public async Task<IActionResult> CreateOrder(CreateOrderCommand command)
{
    var result = await _mediator.Send(command);
    return Ok(result);
}
Run Code Online (Sandbox Code Playgroud)

在其他示例中,使用某种 dto 或请求对象,然后将其输入到命令/查询的构造函数中,如下所示:

[HttpPost]
public async Task<IActionResult> CreateOrder(CreateOrderDto model)
{
    var command = new CreateOrderCommand(model.orderNumber, model.firstName...);
    var result = await _mediator.Send(command);
    return Ok(result);
}
Run Code Online (Sandbox Code Playgroud)

第一种方法对我来说看起来更有吸引力,因为它减少了模型和代码行。您是否有理由使用第二种方法并将请求对象与命令对象分开?

Voi*_*son 5

您是否有理由使用第二种方法并将请求对象与命令对象分开?

是的 - 域模型的变化速度比面向公众的界面更快。

CreateOrderDto是请求有效负载的内存表示;其架构是记录下来供客户端使用的。对其进行“突破性”更改很困难,因为它会影响所有消费者。

CreateOrderCommand是用于在应用程序和域模型之间通信的数据的内存表示形式。两个关注点之间的距离大大缩短,因此协调对话两端的更改变得更加容易。