【问题标题】:Effective aggregate root design in DDD (Vernon's explanations)DDD 中的有效聚合根设计(弗农的解释)
【发布时间】:2017-11-14 03:21:38
【问题描述】:

我有一个关于聚合设计的问题,正如 Vernon 在他在 DDD 社区 (Effective Aggregate Design, Part 3) 的文章和他的书(实施领域驱动设计)中提出的那样。

在那里,他在设计BacklogItemTask 时探索了两种可能的方法。其中一个任务不是它自己的聚合根,因为它运行“使真正的不变量不受保护的风险”,聚合根是BacklogItem

但是,设计聚合根的其他准则之一是只能通过根本身来访问实体。这意味着,为了在这种方法中访问Task,现在必须找到它所属的BacklogItem 并询问积压项目。通常,虽然人们只想看到分配给Tasks,而不是积压项目。

在这种情况下,我们需要直接访问实体,而不是通过 Backlog 项。这与提议的设计有何关系? (我知道这可能只是一个教育演示,但如果这是现实生活,人们怎么会这么想呢?)

提前感谢您的任何回答

【问题讨论】:

    标签: domain-driven-design aggregateroot


    【解决方案1】:

    在这种情况下,我们需要直接访问实体,而不是通过 Backlog 项。这与提议的设计有何关系?

    这取决于:“直接访问”未指定。

    Bertrand Mayer 的 command query separation 语言在此有所帮助。查询保持模型不变;命令更新模型。

    这里的关键思想:聚合根的唯一关注点是命令;对聚合状态的任何更改都是通过向根实体发送命令来实现的,根实体可以自行决定将更改状态的责任委托给其他实体。

    因此,如果您正在访问任务以查询其当前状态,那很好。但是获取任务以便您可以直接向它发送命令?这违反了规则。聚合根拥有对聚合内所有实体的命令的独占访问权限。

    这意味着你永远不会直接调用Task.estimateRemainingHours();您将改为在聚合根上调用一些类似的方法。 BacklogItem.logEstimateFromTeamMember(),也许会决定哪些任务需要更新。

    【讨论】:

    • 感谢您的回答。可以肯定的是,建议您可以查看“任务”,但如果您想稍后更改它,那么您可以从“任务”中检索“BacklogItem”的 ID,获取“” BacklogItem'' 然后通过 ''BacklogItem'' 更改 ''Task'' ?
    猜你喜欢
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 2017-07-10
    • 2018-04-06
    相关资源
    最近更新 更多