在我的情况下,我有两个主要概念:用户(系统的主要公民)和组。 集团有两个子集:排名和角色。没有一个团队,等级和角色没有意义。 当用户被分配到集团时,我们还必须选择1个角色和1个等级,并将它们分配给用户和集团之间的这种关系。
问题:
我在这里有多少聚合根?从用户方面来说,它显然是一个用户(系统的主要概念),但它与群组的关系呢? AFAIK禁止DDD规则引用聚合根之外的实体。
答案 0 :(得分:0)
AFAIK禁止DDD规则引用聚合根之外的实体。
好吧,我不会说它被DDD的规则所禁止" ...有时候你别无选择。我必须考虑"实体的大小'收集"与根的聚合关联。有时你可以在同一个聚合中维护关联并使用某种"延迟加载"避免资源消耗。 Vernon的iDDD书籍[1]对这一具体案例有一些建议和用例。看看他的博客文章[2]
[1] https://www.amazon.com.br/Implementing-Domain-Driven-Design-Vaughn-Vernon/dp/0321834577 [2] https://vaughnvernon.co/?p=838
答案 1 :(得分:0)
您至少有以下选项,具体取决于有关一致性的业务要求:
您有5个聚合根:用户,组,等级,角色和用户分配。最后一个必须保护不变量"我们还必须选择1个角色和1个等级"。对于终身管理,您可以使用AR之间的最终一致性。例如,当您删除某个组时,您还必须删除孤立的Ranks,Roles和UserAssignments。
您拥有User(具有UserAssignment作为嵌套实体)和Group(具有Role和Rank作为嵌套实体)。您在AR内部具有很强的一致性(当您删除用户的所有其签名也被删除时)以及用户和组之间的最终一致性。
你应该用什么?只有你可以决定。例如,如果您选择第一个选项并删除用户,那么在其分配也被删除之前可能会有几秒/分钟/小时的延迟。
应该使用强大的一致性来保护真正的业务不变量,因为它不便宜。
P.S。如果你需要从另一个AR持有对嵌套实体的引用,那么你应该重新考虑你的聚合根边界,因为你的设计最有可能是错误的。
答案 2 :(得分:0)
我要改变一些词,我们会看看它是否有帮助(假设):
我有
Order
和Product
。当我向Product
添加Order
时,我必须选择Store
和Colour
。
你会如何塑造这个?
Colour
很可能是值对象,但Store
不是。我会选择OrderItem
值对象,其中包含Colour
值对象和StoreId
值来捕获关系。 Order
将包含OrderItem
条目列表。
删除Colour
条目很好,因为我们已将该位非规范化为OrderItem
。我们可能有另一个值对象代表Store
但通常我们不会删除商店或有一些处理来处理删除,或者更典型的是,使用参照完整性约束来防止删除使用Store
。
如果您考虑删除Order
,则只会删除OrderItem
关联。
在您的情况下,User
和Group
可能是聚合根,我添加UserGroup
(或UserAssignment
使用Constantin)。 UserGroup
包含关联和相关位。您必须确定真正的域结构。