域驱动设计可以将聚合根作为值对象吗

Domain Driven Design can an Aggragate Root be an Value Object

我和我的大学正在讨论域驱动设计上下文中的值对象和实体。这有点理论性,所以可能不太容易回答。

第一个问题:聚合根可以是值对象吗?

第二个问题: 在下图中,您可以看到一个域模型。它包含聚合根和包含聚合根 ID 的相关值对象。

Link to image

它们是实体还是值对象?

他们有什么身份概念?

聚合体的成员有哪些身份概念?

Link 转至文章:https://www.mirkosertic.de/blog/2013/04/domain-driven-design-example/

感谢您的帮助

值对象和实体之间的区别在于,您不关心值对象的身份。你是在一个还是另一个价值对象上操作真的并不重要,因为,好吧……它们存在的全部目的就是为你服务。然而,实体在其他实体之间是有区别的,无论您指的是一个实体还是另一个实体,即使它们的属性具有相同的值也很重要。

例如,您可以拥有以下值对象

PersonalData
{
    string Firstname;
    string Lastname;
}

和这样的实体

Person
{
    PersonalData personData;
}

使用值对象的一个​​实例还是另一个都没有关系,因为您关心的一切都是值本身。另一方面,你会关心你在给谁做手术。即使两个对象具有相同的 FirstnameLastname 值,它们也可以是完全不同的实体!

因此,回答您的问题 - 值对象作为聚合根是没有意义的,因为聚合通过唯一 ID 在它们之间进行区分,而值对象根本不关心身份。请记住,我不是在谈论技术 ID(例如用于在某些持久性存储中存储值对象),而是一些与域相关的 ID。

关于你的第二个问题,提供这样的值对象可以帮助你在代码中更密切地关注你的领域专家的故事,因为他(或她)不会说 get client by his id 这是一些string,但很可能会说 get client by client id。 DDD 的全部目的是您的代码是它支持的域的近似表示。