【问题标题】:Is there any concept in DDD about shared value objectsDDD中有没有关于共享值对象的概念
【发布时间】:2014-08-24 04:59:02
【问题描述】:

我需要知道如何在 DDD Eg 中使用共享值对象?

如果我有两个聚合根,称为 Registration 和 Admission, 这两个聚合都消耗一个名为 Address 的值对象。即使我的通用语言不同(录取地址和注册地址),此地址对象的模型也是相同的(我的意思是它具有共同的属性)。所以我决定将此值对象从这两个聚合根移动到我的上下文中的公共位置(Say SharedValuess)。我想知道这种做法很好,或者有什么成熟的方法可以处理这种情况。

注意:这篇文章可能违反堆栈溢出规则,因为它的答案是基于意见的,但我没有找到任何其他活跃的论坛来问这个问题。

【问题讨论】:

    标签: asp.net domain-driven-design aggregateroot ddd-service


    【解决方案1】:

    有一种模式叫做“共享内核”。它有助于避免代码重复,通常用于有界上下文集成。但我建议尽可能少地保留它,以避免从有界上下文中泄漏逻辑。 我认为在您的情况下,保持共享将是一个正确的决定,除非您需要在每个有界上下文的地址模型中存在一些差异。

    【讨论】:

    • 共享内核的维护成本很高,通常不值得。不要对 DRY 视而不见 - 让您的模型自主成长。
    • @JefClaes,同意这一点。特别是当您需要在不同的独立系统之间分发 dll 时。经验法则 - 是否将类放入共享内核中 - 应该很少更改该类。如果一个类具有动态变化的 API - 它不应该包含在共享内核中。因此,像地址这样的值对象可能是共享内核的理想选择。
    • 我不明白如何共享 VO,因为它是不可变的。在对该 VO 进行任何更改时,您都必须将其显式分配给共享它的所有对象,那么这样做有什么好处吗?
    • @RafałŁużyński 的“共享”并不意味着在运行时,它们暗示共享代码。更多关于重用它/DRY
    • 但 imo OP 谈论的是共享价值,而不是代码。
    【解决方案2】:

    您遇到这样的困境可能表明模型 (UL) 有问题。我会考虑在两个聚合根之一中维护地址,并从另一个聚合根中“按身份”引用这个聚合根。

    Aggregates in Domain Driven Design

    【讨论】:

      猜你喜欢
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      相关资源
      最近更新 更多