Object DDD:对实体/值对象进行分类

Object DDD:对实体/值对象进行分类,object,dns,domain-driven-design,entity,Object,Dns,Domain Driven Design,Entity,我刚刚开始学习领域驱动设计,其中最让我困惑的是如何确定哪一个应该是实体,哪一个应该是价值对象 我知道要确定实体/值对象,我们需要基于域上下文,在一个上下文中,一个域对象可以是实体,在另一个上下文中,它可以是值对象,但仍有一些情况我无法确定 .例如。地址 -在客户管理应用程序的上下文中(比方说管理客户、添加/删除/更改客户状态等的应用程序),地址显然是一个价值对象,因为这里我们不需要区分一个地址和另一个地址,两个客户可以有相同的地址 -另一方面,在在线预订应用程序的上下文中,我可以说地址是一个实体

我刚刚开始学习领域驱动设计,其中最让我困惑的是如何确定哪一个应该是实体,哪一个应该是价值对象

我知道要确定实体/值对象,我们需要基于域上下文,在一个上下文中,一个域对象可以是实体,在另一个上下文中,它可以是值对象,但仍有一些情况我无法确定

.例如。地址 -在客户管理应用程序的上下文中(比方说管理客户、添加/删除/更改客户状态等的应用程序),地址显然是一个价值对象,因为这里我们不需要区分一个地址和另一个地址,两个客户可以有相同的地址 -另一方面,在在线预订应用程序的上下文中,我可以说地址是一个实体吗?因为现在我们需要根据客户的账单地址来区分客户(暂时忽略具有相同地址的案例2客户)

对我来说,地址本身是唯一的,所以它肯定已经有了身份。所以域对象的标识不会决定它是实体还是值对象,如果是,那么选择的关键因素是什么

另一个例子是,我有一个应用程序,它列出了一个国家的多个地区,用户可以选择一个地区,并在该地区找到符合搜索条件的所有餐馆。在这种情况下,区域是值对象还是实体?目前我认为这更多的是一个实体,但仍然不是很确定。每个地区也是独一无二的


我不确定我的问题是否清楚,我现在尽力解释我的想法

我想你的一些困难可能是这些术语的微妙含义。例如,你提到“对我来说,地址本身是唯一的,所以它肯定有身份”。就大多数人在领域驱动设计中如何使用“身份”而言,您的陈述可能是不正确的

值对象的属性集是它的定义。如果你改变了它的任何方面,你就拥有了一个完全不同的对象。以你的地址为例,如果你改变了它的任何部分,你会得到一个完全不同的地址。它是不是同一个地址,但它的某些方面发生了变化。您的客户移动到新地址;他们没有改变同一地址的某些方面

但是,如果您是一个映射应用程序,并且地址本身发生了更改,那么在这里,地址将是一个实体。在这种情况下,城市规划者可能希望对街道上的房屋重新编号。在这种情况下,将修改相同的地址。在这种情况下,我们需要更新实体,而不是值对象

关于账单地址示例,账单地址可能仍然是一个值实体(至少是它的物理地址部分)。支付方法(例如信用卡)可以是该示例中的实体,并且它可以包括其他价值对象(例如账单地址、信用卡号等)

您可能会发现查看此问题及其答案很有帮助:


希望这有帮助。祝你好运

非常感谢你,你的解释就是我要找的,现在一切都清楚了,谢谢你,Phuong,很高兴它能帮上忙。