【问题标题】:Help determining aggregate roots帮助确定聚合根
【发布时间】:2011-09-08 22:32:41
【问题描述】:

我陷入了分析瘫痪的漩涡,试图将 DDD 应用于各种 我过去开发或计划在未来开发的应用程序。

让我们以一个简单的垒球联赛为例。我们有联赛,球队 属于一个联赛(只有一个),以及属于一个团队的球员。我知道 这些规则可能会有所不同,但让我们假装吧。

在我看来,如果没有联赛,一支球队就无法存在,如果你删除了一个 联盟你删除了所有属于它的球队(以及球员),所以我有 这里有一个聚合,根是联赛。现在团队也很重要 概念,那么这是否意味着一个团队也可以是它自己的聚合根?埃文斯 声明当您删除聚合根时,其所有内部结构也会删除, 所以这会让一支球队没有父联赛。

如果有人能提供一些启发,我将不胜感激。

谢谢

【问题讨论】:

    标签: .net design-patterns domain-driven-design dns


    【解决方案1】:

    你问的question 至少three times 非常相似。领域始终相同:运动队、联赛和球员,但您提供的详细信息总是不同的,这就是您得到和接受不同答案的原因。你显然处于分析瘫痪的状态。您第一次想出完美模型的机会很小。开始编写代码和测试,您将立即获得反馈。寻找代码异味,重构和更好的模型就会出现。

    关于这个版本的问题。聚合definition

    被视为一个单元的一组关联对象 数据变更的目的。外部参考仅限于一个 Aggregate 的成员,指定为根。一组一致性 规则适用于聚合的边界内。

    经典示例是 Order as Aggregate root 和 Order Lines as Entities,它们是 Order Aggregate 的一部分。请注意,订单行在订单之外没有意义。

    在您的情况下,“没有联赛就不能存在球队”的规则是不同的。仅仅宣布 Team 是 League Aggregate 的一部分是不够的。它类似于“没有客户就不能存在订单”。这并不意味着客户是订单集合的一部分。客户是它自己的聚合体,它本身就有意义。就像团队本身就有意义一样,它有自己的历史、粉丝等。

    这个问题也可以从“数据交换”的角度来解决。在 Evan 的示例中,整个 Order 被锁定,以便可以强制执行内部不变量。如果您对联赛进行更改,您是否也希望所有球队和球员也被锁定?

    因此,根据您这次提供的信息,您需要两个聚合:联赛和团队。请记住,聚合可以相互引用。

    【讨论】:

    • 谢谢你,我会听取你的建议,开始编码和测试!它只是我读得越多,我就越困惑。例如,现在我已经阅读了类方法中的订单行应该是一个值对象!这让我大吃一惊。
    猜你喜欢
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多