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