繁体   English   中英

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",
}

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

  • UpdateProductDescription
  • UpdateProductWarningDescription
  • UpdateProductDangerDescription

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

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

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

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

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

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

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

所以你的逻辑是这样的:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM