DDD - 如何管理聚合之间的共享实体?

DDD - How to manage shared entity between aggregates?

我目前在我的 PHP 项目中研究 DDD 架构。

但是我遇到了聚合问题,我有一个实体用户 'default currency'。 所以我创建了一个实体货币和 link 我的用户到一种货币。

但我有另一个域 'Transaction' 也将有一个货币 linked,我不想在交易域中再次创建一个实体货币。

所以我的问题是:在这种情况下,将货币实体放在哪里?

谢谢

Domain-driven设计最重要的概念之一是无处不在的语言,它代表有效的业务语言并在同一 sub-domain 内接受。不同 sub-domain 中的业务人员可以使用相同的业务实体名称,尽管它们在这些 sub-domain 中代表不同的事物。

例如,在医疗中心的域中,Patient 实体在 Appointment Scheduling计费 限界上下文。但是,当从事预约安排工作的员工指的是 Patient 时,他们想到的模型与在计费部门工作的人员不同。患者实体在这些不同的 sub-domain 中被相同但具有不同的特征。例如,计费域中的患者需要预约安排域中不需要的信用卡信息。

所以首先你应该确定你的 Currency 模型在你的 sub-domains。如果它是一个非常重要的流行概念,并且在您的所有 sub-domain 中都具有相同的含义(假设它是您业务核心领域的一部分),那么您可以在所谓的 Shared KernelEric Evans 介绍。它代表一些共享的核心代码库,其中包含在有界上下文之间重叠的整个域模型的核心部分,并且允许重用域模型的关键部分,这些部分确实需要在有界上下文之间保持一致。

但请注意 集成和协调工作 以及您的 sub-domain 之间添加的代码依赖性使用这样的共享 code-base 尤其是当您与不同的团队一起工作时 and/or 分布式架构(例如使用微服务)。因此,根据您的用例,Currencyduplication 在您不同的 sub-domain 中也可以允许您的有界上下文代码更加自主。

In this case, where to place the currency entity ?

在这种情况下,您可能根本不需要实体。

当您拥有将以某种方式更改该实体的域逻辑时,实体才有意义。我不认为用户或交易会改变 currency.

更常见的是,你拥有的是一个标识符,用于表示用户与某种货币之间的关系,或者交易与某种货币之间的关系。该引用可以有很多不同的形式,但在每种情况下您可能会拥有一个 货币代码 来表示用户或交易上下文中的货币概念。

用户聚合或交易聚合中货币代码的表示可能表示 值对象 模式,而不是 实体 模式。