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

Php DDD-如何管理聚合之间的共享实体?,php,domain-driven-design,Php,Domain Driven Design,我目前正在PHP项目中研究DDD体系结构 但我在聚合方面遇到了一个问题,我有一个实体用户有一个“默认货币”。 因此,我创建了一个实体货币,并将我的用户链接到一种货币 但我有另一个域“Transaction”,它也将有一个货币链接,我不想在Transaction域中再次创建实体货币 所以我的问题是:在这种情况下,货币实体应该放在哪里 感谢领域驱动设计最重要的概念之一是泛在语言,它代表了在同一子域内有效并被接受的业务语言。不同子域中的业务人员使用的业务实体可以有相同的名称,尽管它们在这些子域中代表不

我目前正在PHP项目中研究DDD体系结构

但我在聚合方面遇到了一个问题,我有一个实体用户有一个“默认货币”。 因此,我创建了一个实体货币,并将我的用户链接到一种货币

但我有另一个域“Transaction”,它也将有一个货币链接,我不想在Transaction域中再次创建实体货币

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


感谢

领域驱动设计最重要的概念之一是泛在语言,它代表了在同一子域内有效并被接受的业务语言。不同子域中的业务人员使用的业务实体可以有相同的名称,尽管它们在这些子域中代表不同的事物

例如,在医疗中心的域中,在预约安排和计费上下文中都可以有患者实体。但是,当负责预约安排的员工指的是患者时,他们想到的是另一种模式,而不是计费部门的员工。患者实体由相同的人引用,但在这些不同的子域中具有不同的特征。例如,账单域中的患者需要预约计划域中不需要的信用卡信息

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

但是要注意集成和协调工作以及使用这种共享代码库在子域之间增加的代码依赖性,特别是当您与不同的团队和/或分布式体系结构(例如使用微服务)合作时。因此,根据您的用例,在不同的子域中进行一些货币复制也可以,以使您的有界上下文代码更加自治

在这种情况下,货币实体放在哪里

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

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

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


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

谢谢,最后我创建了一个共享部分:)+1。此外,正如@VoiceOfUnreason所指出的,在您的案例中,
Currency
作为值对象似乎更好。如果货币的数据(名称、符号等)用作其标识,则它是一个值对象。这种区别不仅仅是迂腐的;您的持久性机制将需要根据您是否有实体或值对象而不同地工作。