【问题标题】:How to enforce no-cycle constraint in domain-driven-design?如何在领域驱动设计中强制执行无周期约束?
【发布时间】:2021-05-01 17:25:14
【问题描述】:

我还是 DDD 的新手。在域模型中,我有一个 Component 的聚合,它可以由子组件组成,也可以是另一个父 Component 的子组件。换句话说,我有一个组件层次结构。

需要两个操作:AddSubComponent()AddToParent()。在执行这两个动作时,如何强制执行层次结构中不存在循环的不变量?是否应该通过域事件强制执行?或者只是在聚合中引用父级和子级,然后在聚合本身内递归检查嵌套组件是否会创建循环?

注意:我使用 C# 并使用 EF Core 持久化域模型。

编辑 我通过将每个组件视为一个集合来解决这个问题。每个都有对其父母和孩子的引用。

AddSubComponent(Component c) 检查c 是否已经是子组件,并在检查组件的父级和c 的子级后返回或仅添加c 作为子组件。然后触发由应用层处理的域事件,以验证整个图不包含循环,并调用c.AddToParent()

AddToParent(Component c) 执行与上述操作相同的逻辑,但仅添加到父级并触发在应用程序层处理的域事件,也仅调用parent.AddSubComponent()

这种调用任何方法的方式将确保仅针对聚合的原子一致性,而整个层次结构的最终一致性由应用程序层确保。此外,上述所有这些操作都包含在事务中。所以。最终只保留有效的层次结构。

【问题讨论】:

    标签: domain-driven-design


    【解决方案1】:

    在这种情况下,我宁愿实现单向关系。使用事件时,就像您提到的那样,这将是微不足道的,因为您可以在执行 AddSubComponent 后发出事件,因此 AddToParent 将作为反应异步发生。但是,在仅保持状态的系统中生成事件并非易事,因为您必须避免使用发件箱或 CDC 进行不可靠的两阶段提交。

    如果您只维护父母的孩子列表,则没有必要。当然,它可能不适合您的上下文,因为在模型本身内部不可能确保组件只有一个父级,并且需要域服务,该服务会查询组件父级以查看有多少父级。

    【讨论】:

      【解决方案2】:

      您可以在方法本身中强制执行它。

      添加子组件

      在 Add SubComponent 方法期间,检查您要添加的组件是否已作为子组件或子组件的子组件存在。

      AddToParent

      调用父级本身的“AddSubComponent”,检查将如上所述完成。

      【讨论】:

        猜你喜欢
        • 2011-10-06
        • 2014-09-21
        • 1970-01-01
        • 2011-09-07
        • 2015-09-21
        • 2012-12-05
        • 2015-12-13
        • 2011-05-29
        • 1970-01-01
        相关资源
        最近更新 更多