DDD:每个聚合一个事务

时间:2016-04-08 05:01:38

标签: domain-driven-design

在以下question中有答案

  

在您的示例中,它非常简单:当客户放置时   订购100个项目,生成并发布域事件。然后   你有一个处理程序,它将检查订单是否符合   客户促销规则,如果是,则发出命令   将具有将客户端状态更改为VIP

的结果

我认为客户存在是否明确,但如果客户将以相同的操作(订单提交)创建,该怎么办?

2 个答案:

答案 0 :(得分:1)

在您的标题中,您已撤销规则:“每次交易一次汇总”。也就是说,您通过一次更新一个聚合来更改域。

您所做的更新,可能是任意复杂的。

  

我认为客户是否存在是明确的,但如果客户将以相同的操作(订单提交)创建,该怎么办?

因此,您使用VIP属性集创建Customer。它仍然是一个聚合(客户),因此允许在处理单个命令时进行多次更改。

也就是说,一切都取决于正确建模聚合。在DDD中,状态(VIP标志),依赖于该标志的规则以及允许您更改该标志的规则;所有这些应该是同一聚合的一部分。因此,请盯着该原则,与您的领域专家讨论这些要求,并探讨正确的模型是否在Customer聚合上设置标志,而不是将CustomerId添加到 LoyaltyProgram 聚合中的集合。

  

真实案例:以访客身份订购。结果我们应该下订单和客户。 2 AR将参与其中。这意味着创建客户然后将customerId传递给订单创建,然后创建订单,然后需要更新客户标志......

正确 - 因此如果此模型正确,则有三个命令要运行。每个命令都写入一个聚合。您可以使用域事件来发布需要成为链中下一个命令一部分的写入结果。

如果要自动执行该过程,则可以使用process manager替换发出命令的人工操作员。基本上,进程管理器是一个状态机;域事件是触发器,异步命令是操作。

答案 1 :(得分:0)

创建两个事件。一个用于创建用户,一个用于订单本身。我想代码明智,无论如何你将调用你的createUser例程,然后抛出第一个事件。