这个问题可能是要求过多的整合细节,但我希望它能够达到目的。
在我的简单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
命令?
答案 0 :(得分:3)
我认为这取决于您如何在您的域或上下文中定位“产品”及其“描述”。如果仅更新描述会对您的上下文产生业务影响,我将使用 UpdateProductDescription 命令并处理该命令。
但是,如果更新描述就像更新产品的其他属性一样, UpdateProductDetail 命令就可以了。
答案 1 :(得分:3)
你应该为每个http请求引发多个命令吗?可能你不应该。如果某些命令成功但其他命令不成功怎么办?您是在一个工作单元中处理多个命令吗?即使你这样做,是否正确使用指挥?我对此表示怀疑。您是否愿意在http处理程序中实现回滚逻辑?
注意,在CQRS中,命令可能导致目标聚合根“全部或全部”方式中的多个事件,因为事件不会失败。但命令可以。
所以“导致多个特定事件的一个通用命令”是一个更好的选择,然后尝试“在一个调用中组合多个特定命令”。
您的聚合根应决定在特定事件中如何表达该通用命令。
所以你的逻辑就像这样:
UpdateGenericProductDescription -> (CommandHandler) -> AggregateRoot -> [ProductDescriptionUpdated, ProductWarningDescriptionUpdated, ProductDangerDescriptionUpdated]
请参阅,即使您的业务需要更多的粒度,您的命令也可以保持通用,除非另有要求。