具有复合关系的域的DDD

时间:2018-06-04 04:56:22

标签: domain-driven-design

假设我有两个聚合,例如DocumentBinderDocument可以是独立的,因此我们将其建模为聚合,并且我们以类似的方式将Binder建模为聚合。现在问题是Document也可以在Binder内,现在如何建模这个场景。如果Document位于BinderDocument,我们可能必须检查与Binder相关的某些不变量,然后才允许用户使用Document }。

我能想到的一种方法是拥有两个模型

  1. Document(聚合)
  2. BoundedDocumentBinder聚合内的实体)
  3. 是否有更好的方法来模拟这种情况。

1 个答案:

答案 0 :(得分:1)

根据我的理解,您应该有两个单独的聚合DocumentBinder,并使用Saga(进程管理器)最终使整个系统处于有效状态。换句话说,您应该将绑定文档的修改建模为业务流程。

这个Saga将以关于文档修改的所有信息(即文档中的所有修改属性)开始,然后它会向Binder发送一个命令,它将检查自己的不变量,如果一切正常,那么它将更新命令发送到Document聚合。它还应该对可能导致系统处于无效状态的所有事件做出反应,即Binder Aggregate生成的事件,因为Binder Aggregate突变可能导致绑定器中的文档进入无效状态。 p>

不同的体系结构是将更新命令直接发送到Document Aggregate,而不检查不变量。然后,Saga将通过向Binder Aggregate发送命令来对文档更新事件做出反应。如果Binder说它不合适,那么Saga会向绑定文档发送补偿命令。这种设计对于无效文档会更宽松,但更简单。

这两个设计最终都会使系统处于有效状态,但第一个设计会以增加复杂性为代价来最小化无效文档的存在时间,因为Saga需要启动并存储文档修改信息。 / p>

另一种方法是在Binder Aggregate中创建一个新的嵌套实体,即BindedDocument,但这个实体似乎在概念上与文档聚合不同。这可以通过您将拥有的代码重复来体现。