我第一次尝试 DDD,但我遇到了聚合设计的问题。
我的应用程序包含 3 个实体;图、节点、链接。这些实体中的每一个都有一个可以由用户修改的名称属性(我认为这使得“名称”不适合作为实体 ID)。图表包含节点的集合,节点具有传出链接的集合(出于此问题的目的,忽略传入链接是安全的)。每个节点一次只能与一个图关联(但可以在图之间移动),同样,每个链接在任何给定时间只能与一个节点关联(但可以移动)。
我试图强制执行的不变量是所有实体名称在其父集合中都是唯一的。使用上述架构,不变量在实际集合上,所以我决定集合所有者(图和节点)都应该是聚合根。
我遇到的问题是我现在如何在 Node 上强制执行名称不变?在 Link 上很容易,因为它隐藏在 Node AR 中,因此 Node 可以确认所有 Link 重命名/移动都不会破坏这个不变量。但据我所知,没有什么可以阻止直接重命名 Node 可能会破坏不变量。最终一致性在这里不是可接受的选择,这必须是真正的系统不变量。
我正在考虑的方法是让 Node.Rename() 实际上强制执行不变量,但我担心这涉及查看其父 Graph 以检查重命名是否有效。这“感觉”不太对 - 感觉 Graph 应该是强制执行此命名空间约束的那个,而 Node 应该对此一无所知。
我希望这是有道理的,我期待听到人们的想法。
编辑:上面介绍的域模型是整个域的简化子集。太复杂了,所有实体都无法在单个 AR 中保存......