DDD:选择聚合根

时间:2017-05-05 14:48:27

标签: domain-driven-design aggregate

在我的情况下,我有两个主要概念:用户(系统的主要公民)和组。 集团有两个子集:排名和角色。没有一个团队,等级和角色没有意义。 当用户被分配到集团时,我们还必须选择1个角色和1个等级,并将它们分配给用户和集团之间的这种关系。

redirected

问题:

我在这里有多少聚合根?从用户方面来说,它显然是一个用户(系统的主要概念),但它与群组的关系呢? AFAIK禁止DDD规则引用聚合根之外的实体。

3 个答案:

答案 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)

您至少有以下选项,具体取决于有关一致性的业务要求:

  1. 您有5个聚合根:用户,组,等级,角色和用户分配。最后一个必须保护不变量"我们还必须选择1个角色和1个等级"。对于终身管理,您可以使用AR之间的最终一致性。例如,当您删除某个组时,您还必须删除孤立的Ranks,Roles和UserAssignments。

  2. 您拥有User(具有UserAssignment作为嵌套实体)和Group(具有Role和Rank作为嵌套实体)。您在AR内部具有很强的一致性(当您删除用户的所有其签名也被删除时)以及用户和组之间的最终一致性。

  3. 你应该用什么?只有你可以决定。例如,如果您选择第一个选项并删除用户,那么在其分配也被删除之前可能会有几秒/分钟/小时的延迟。

    应该使用强大的一致性来保护真正的业务不变量,因为它不便宜。

    P.S。如果你需要从另一个AR持有对嵌套实体的引用,那么你应该重新考虑你的聚合根边界,因为你的设计最有可能是错误的。

答案 2 :(得分:0)

我要改变一些词,我们会看看它是否有帮助(假设):

  

我有OrderProduct。当我向Product添加Order时,我必须选择StoreColour

你会如何塑造这个?

Colour很可能是值对象,但Store不是。我会选择OrderItem值对象,其中包含Colour值对象和StoreId值来捕获关系。 Order将包含OrderItem条目列表。

删除Colour条目很好,因为我们已将该位非规范化为OrderItem。我们可能有另一个值对象代表Store但通常我们不会删除商店或有一些处理来处理删除,或者更典型的是,使用参照完整性约束来防止删除使用Store

如果您考虑删除Order,则只会删除OrderItem关联。

在您的情况下,UserGroup可能是聚合根,我添加UserGroup(或UserAssignment使用Constantin)。 UserGroup包含关联和相关位。您必须确定真正的域结构。