我和我的大学正在讨论域驱动设计中的价值对象和实体。这有点理论,所以也许不容易回答。
第一个问题:聚合根可以作为价值对象吗?
第二个问题: 在下图中,您可以看到域模型。它包含聚合根和相关的值对象,其中包含聚合根的ID。
它们是实体还是价值对象?
他们有哪种身份概念?
聚合成员具有哪种身份概念?
链接到文章:https://www.mirkosertic.de/blog/2013/04/domain-driven-design-example/
感谢您的帮助
答案 0 :(得分:3)
值对象和实体之间的区别在于,您不关心值对象标识。无论你是在一个还是另一个价值对象上操作都没关系,因为,嗯......它们存在的整个目的只是为你提供价值。然而,实体在其他实体之间是有区别的,无论您是指一个实体还是其他实体,即使它们具有相同的值,它也很重要。
例如,您可以拥有以下值对象
PersonalData
{
string Firstname;
string Lastname;
}
和这样的实体
Person
{
PersonalData personData;
}
如果您使用的是值对象的一个实例或其他实例,则无关紧要,因为您关心的所有内容都是值本身。另一方面,你会关心你在哪个人。即使两个对象具有相同的Firstname
和Lastname
值,它们也可以是完全不同的实体!
所以,回答你的问题 - 价值对象没有必要成为聚合根,因为聚合是通过唯一ID来区分的,而价值对象根本不关心身份。请记住,我不是在讨论技术ID(例如用于在某些持久性存储中存储值对象),而是关于某些与域相关的ID。
至于你的第二个问题,提供这样的价值对象有助于你在你的代码中更密切地关注你的领域专家故事,因为他(或她)不会说通过他的id得到客户端,这是一些字符串,但很可能会说通过客户端ID 获取客户端。 DDD的全部目的是代码是它支持的域的近似表示。