.NET 的 CQRS 模式 API - 将请求对象与 command/query 分开
CQRS Pattern with .NET API - Separating the request object from the command/query
关于在 .NET 中使用 CQRS 模式 API 我见过一些示例,其中请求被直接反序列化到 command/query 然后发送出去进行处理,就像这样:
[HttpPost]
public async Task<IActionResult> CreateOrder(CreateOrderCommand command)
{
var result = await _mediator.Send(command);
return Ok(result);
}
在其他示例中,改为使用某种 dto 或请求对象,然后将其输入到 command/query 的构造函数中,如下所示:
[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);
}
第一种方法看起来更吸引我,因为它的模型和代码行更少。您是否有理由使用第二种方法并将请求对象与命令对象分开?
Is there a reason why you might use the second approach and separate the request object from the command object?
是 - 领域模型的变化节奏比您面向公众的界面更快。
CreateOrderDto
是请求负载的内存表示;其架构是为客户使用而记录的内容。对其进行 "breaking" 更改很难,因为它会影响所有消费者。
CreateOrderCommand
是用于在您的应用程序和领域模型之间进行通信的数据的内存表示。两个关注点之间的距离大大缩短,因此更容易协调对话两端的变化。
关于在 .NET 中使用 CQRS 模式 API 我见过一些示例,其中请求被直接反序列化到 command/query 然后发送出去进行处理,就像这样:
[HttpPost]
public async Task<IActionResult> CreateOrder(CreateOrderCommand command)
{
var result = await _mediator.Send(command);
return Ok(result);
}
在其他示例中,改为使用某种 dto 或请求对象,然后将其输入到 command/query 的构造函数中,如下所示:
[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);
}
第一种方法看起来更吸引我,因为它的模型和代码行更少。您是否有理由使用第二种方法并将请求对象与命令对象分开?
Is there a reason why you might use the second approach and separate the request object from the command object?
是 - 领域模型的变化节奏比您面向公众的界面更快。
CreateOrderDto
是请求负载的内存表示;其架构是为客户使用而记录的内容。对其进行 "breaking" 更改很难,因为它会影响所有消费者。
CreateOrderCommand
是用于在您的应用程序和领域模型之间进行通信的数据的内存表示。两个关注点之间的距离大大缩短,因此更容易协调对话两端的变化。