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

问题描述 投票:0回答:1

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

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

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

Domain model diagram

它们是实体还是值对象?

他们有什么身份概念?

集合的成员有什么身份概念?

文章链接:https://www.mirkosertic.de/blog/2013/04/domain-driven-design-example/

感谢您的帮助

entity domain-driven-design aggregateroot value-objects
1个回答
5
投票

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

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

PersonalData
{
    string Firstname;
    string Lastname;
}

和这样的实体

Person
{
    PersonalData personData;
}

您使用的是值对象的一个实例还是另一个实例并不重要,因为您关心的一切都是值本身。另一方面,你会关心你为谁做手术。即使两个对象具有相同的

Firstname
Lastname
值,它们也可以是完全不同的实体!

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

至于你的第二个问题,提供这样的值对象可以帮助你在代码中更密切地关注领域专家的故事,因为他(或她)不会说“通过他的 id 获取客户,这是一些字符串”,但很可能会说类似于 通过 客户 ID 获取客户。 DDD 的全部目的是让您的代码紧密代表它所支持的域。

© www.soinside.com 2019 - 2024. All rights reserved.