Domain driven design 如何在域层中使用外部值对象库

Domain driven design 如何在域层中使用外部值对象库,domain-driven-design,value-objects,Domain Driven Design,Value Objects,我希望有一个或多个基本上是值对象的可重用类库,例如Address、PhoneNumber、EmailAddress,其中大部分包含属性和一些支持方法。我的域层如何使用它们而不打破域层不应包含外部引用的规则,并且不将它们定义为域层中的接口/抽象类 。。。不违反域层不应包含外部引用的规则 我认为你对“外部参照”的定义需要重新评估。很难想象一个域层不引用任何内容。在C#和Java中,您将至少引用基本的数字类型、日期和字符串。我也不认为引用像Noda/Joda time这样的外部库有什么害处。另一方面,

我希望有一个或多个基本上是值对象的可重用类库,例如Address、PhoneNumber、EmailAddress,其中大部分包含属性和一些支持方法。我的域层如何使用它们而不打破域层不应包含外部引用的规则,并且不将它们定义为域层中的接口/抽象类

。。。不违反域层不应包含外部引用的规则

我认为你对“外部参照”的定义需要重新评估。很难想象一个域层不引用任何内容。在C#和Java中,您将至少引用基本的数字类型、日期和字符串。我也不认为引用像Noda/Joda time这样的外部库有什么害处。另一方面,您当然不想引用任何繁重的技术库,如持久性、通信、UI等

所以我想说,您可以构建自己的可重用库,从域中引用,但它需要非常仔细的考虑,并且通常不值得它创建的耦合。我将对每种类型使用以下标准:

  • 应该与上下文无关。例如,EmailAddress相对独立于使用它的上下文。另一方面,地址可能具有不同的含义,这取决于有界上下文
  • 应稳定(不经常变化)
  • 不应隐藏任何进程外通信(数据库、网络等)
  • 不应有任何依赖项(标准Java/C除外)

    • 我认为您所指的是共享内核

      共享内核–这是两个团队共享部分内核的地方 域模型。在没有其他团队参与的情况下,不应该改变这一点 咨询

      虽然这一点一开始看起来很好,但由于我们被训练为不重复自己,因此要注意以下陷阱:

      • 这些概念在任何上下文中都应该具有相同的含义。这些概念中的一些根据上下文有细微的差别。请咨询您的领域专家
      • 改变更昂贵;复制这几个类,以便您可以自己更改它们,这可能比在某些内容发生更改时必须咨询多个团队要便宜

      稳定性是双向的。如果您将一个实体拉入每个域,那么任何更改都必须跨多个项目执行。如果不这样做,则必须跨多个域协调更改。前者的后勤工作比后者容易,但后者所涉及的工作量可能更大。无论哪种方式,您都必须在每个平台上测试更改

      除非实体成熟并具有相对良好的定义语义,否则我的经验是几乎所有东西都会发生变化。因此,稳定性很好,但可能有点像转移视线


      话虽如此,我喜欢(和+1)@Dmitry.

      1+作为第一个要点。我见过很多次为了重用而断章取义地使用实体。这也与你的第二个要点有关,因为在n个上下文中使用一个实体会给它n个改变的理由,可能意味着它会改变n次。我认为其中一些可能是抽象类,其中自定义上下文可以由客户端域添加。你也可以使用包含来添加语义,而不是继承。Java和C#不允许多重继承,所以有时候包容是您唯一的选择。包容允许您重新定义接口,以匹配不同域的需求。