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

时间:2015-03-17 19:54:09

标签: c# http asp.net-web-api cqrs

这个问题可能是要求过多的整合细节,但我希望它能够达到目的。

在我的简单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",
}

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

  • UpdateProductDescription
  • UpdateProductWarningDescription
  • UpdateProductDangerDescription

这实际上是您在CQRS方面所期望的适当行为还是宁愿拥有UpdateProductDetails命令?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

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

注意,在CQRS中,命令可能导致目标聚合根“全部或全部”方式中的多个事件,因为事件不会失败。但命令可以。

所以“导致多个特定事件的一个通用命令”是一个更好的选择,然后尝试“在一个调用中组合多个特定命令”

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

所以你的逻辑就像这样:

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

请参阅,即使您的业务需要更多的粒度,您的命令也可以保持通用,除非另有要求。