假设我有两个聚合,例如Document
和Binder
。 Document
可以是独立的,因此我们将其建模为聚合,并且我们以类似的方式将Binder建模为聚合。现在问题是Document
也可以在Binder
内,现在如何建模这个场景。如果Document
位于Binder
内Document
,我们可能必须检查与Binder
相关的某些不变量,然后才允许用户使用Document
}。
我能想到的一种方法是拥有两个模型
Document
(聚合)BoundedDocument
(Binder
聚合内的实体)是否有更好的方法来模拟这种情况。
答案 0 :(得分:1)
根据我的理解,您应该有两个单独的聚合Document
和Binder
,并使用Saga(进程管理器)最终使整个系统处于有效状态。换句话说,您应该将绑定文档的修改建模为业务流程。
这个Saga将以关于文档修改的所有信息(即文档中的所有修改属性)开始,然后它会向Binder发送一个命令,它将检查自己的不变量,如果一切正常,那么它将更新命令发送到Document聚合。它还应该对可能导致系统处于无效状态的所有事件做出反应,即Binder Aggregate生成的事件,因为Binder Aggregate突变可能导致绑定器中的文档进入无效状态。 p>
不同的体系结构是将更新命令直接发送到Document Aggregate,而不检查不变量。然后,Saga将通过向Binder Aggregate发送命令来对文档更新事件做出反应。如果Binder说它不合适,那么Saga会向绑定文档发送补偿命令。这种设计对于无效文档会更宽松,但更简单。
这两个设计最终都会使系统处于有效状态,但第一个设计会以增加复杂性为代价来最小化无效文档的存在时间,因为Saga需要启动并存储文档修改信息。 / p>
另一种方法是在Binder Aggregate中创建一个新的嵌套实体,即BindedDocument
,但这个实体似乎在概念上与文档聚合不同。这可以通过您将拥有的代码重复来体现。