【问题标题】:DDD Value Object shared by multiple entities多个实体共享的 DDD 值对象
【发布时间】:2019-07-30 09:16:10
【问题描述】:

我一直在研究 DDD,并且对值对象有一些疑问。 我为电子邮件、电话和地址创建了值对象,然后使用它们的构造函数为它们添加了验证。到目前为止,一切都很好。 问题是对于不同的聚合根,我需要相同的值对象。假设我有 3 个聚合根需要相同的值对象(客户、医生、接待员)

我见过一个例子,它为每个聚合根创建了一个地址,但我不想重复代码,因为这些 ValueObjects 也包含验证。 我可以在聚合根之间共享它们吗?如果是这样,您如何构建它?

【问题讨论】:

    标签: c# domain-driven-design


    【解决方案1】:

    电子邮件、电话和地址是不属于您的领域的概念,我猜它与医院或类似的东西有关。

    它们将属于我们可以称为“人”或类似名称的另一个域,您可以在其中定义联系信息概念,例如您提到的那些(电子邮件、电话、地址)。

    如何与该域集成?好吧,由于它们是在许多情况下经常使用的概念,您可以将它们放在共享内核中。

    所以关于结构的问题,我猜你指的是文件夹,把它们放在你的“医院”有界上下文的结构之外。

    使用名为 person/contact 的文件夹创建一个共享内核(由多个域共享的概念),并将您的电子邮件、电话和地址值对象放在那里。共享内核就像您使用的库。

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      一般来说,在多种类型的实体或聚合根下重用值对象类型并没有错。你只是避免代码重复。

      实例并非如此。两个实体(相同或不同类型)永远不应该共享一个值对象的同一个实例。这对于内存对象和持久数据都是如此。

      如果您有多个有界上下文,则诸如电子邮件/电话/地址之类的值对象是共享内核的理想选择。它们小而独立,成为知道/做太多的“神物”的可能性很小。

      在代码中,您可以将值对象表示为不可变的struct。这将强化 DDD 中值对象的特性。

      在关系数据库中,像地址这样的对象可以由地址表表示,具有唯一的键列。表示实体的表可以具有地址表的外键(一对一关系)。在一对多关系中,当实体有地址集合时,可以引入多对多关系表,每个包含实体一个关系表。

      在文档数据库中,值对象通常可以嵌入到包含实体的文档中。

      当然,这些只是一般考虑,这些决定取决于您的具体情况。

      【讨论】:

      • 我该如何构建它?我的意思是,我只需要将这些值对象放在 Domain 中的某个位置,以便所有需要它的实体/聚合根都可以引用它?使用 DDD 是否有正确的方法/结构?
      猜你喜欢
      • 1970-01-01
      • 2010-10-04
      • 2012-07-08
      • 2012-04-01
      • 2020-01-30
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多