CQRS 实现中每个 HTTP 请求的多个命令

Multiple commands per HTTP request in CQRS implementation

这个问题可能问了太多集成细节,但我希望它是切中要害的。

在我的简单 CQRS 应用程序中,我有一个 HTTP PUT 请求,如下所示,它应该更新产品的详细信息:

PUT http://localhost/products/088c1cb1-7e74-40b1-9900-4b9722f1dd85/details HTTP/1.1
Content-Type: application/json
Host: localhost

{
    description: "foo bar",
    warningDescription: "foo bar",
    dangerDescription: "foo bar",
}

当我收到这个请求时,我想生成三个命令而不是立即更新它:

这实际上是您在 CQRS 方面期望的适当行为,还是您更愿意使用 UpdateProductDetails 命令?

我认为这取决于您如何在您的域或环境中定位 "Product" 及其 "Description"。如果仅更新描述会对您的上下文产生业务影响,我将使用 UpdateProductDescription 命令并处理该命令。

但是如果更新描述就像更新产品的其他属性一样,UpdateProductDetail 命令就可以了。

您应该为每个 http 请求提出多个命令吗?也许你不应该。如果某些命令成功但其他命令失败怎么办?您是否在一个工作单元中处理多个命令?即使你这样做了,这是正确的命令用法吗?我对此表示怀疑。您愿意在您的 http 处理程序中实现回滚逻辑吗?

注意,在 CQRS 中,一个命令可能会导致目标聚合根 "all or none" 中出现多个事件,因为事件不会失败。但是命令可以。

所以 "one generic command that results in multiple specific events" 是比 "combine multiple specific commands in one call" 更好的选择。

您的聚合根应决定通用命令在特定事件中的表达方式。

所以你的逻辑应该是这样的:

UpdateGenericProductDescription -> (CommandHandler) -> AggregateRoot -> [ProductDescriptionUpdated, ProductWarningDescriptionUpdated, ProductDangerDescriptionUpdated]

看,即使您的业务需要那么细粒度,您的命令仍然可以保持通用,除非另有要求。