领域驱动设计中实体的每个 属性 都是值对象吗?
Is every property of an Entity in domain driven design a value object?
我正在阅读 "Patterns, Principles, and Practices of Domain-Driven Design"。该书建议 Entity
的属性应该是值对象,以便为领域的无处不在的语言建模。我见过很多像 EmailAddress
或 Age
这样的例子,它们只有一个字段来模拟领域概念。我对此感到困惑。 Entity
的每个 属性 都是值对象吗?当我们可以使用普通语言提供的属性数据类型时,您能提供示例吗?
我认为您真正的问题是:每个值对象都是 Class 吗?
因为您可以认为对于 Age 一个 Java 整数就足够了,这是事实。所以你在你的实体 Person 中有一个 Integer 类型的值对象 Age,不需要年龄类型。
OOP也说对象是状态+行为。在你的 Age 案例中,我假设它没有任何行为,所以一个简单的原语或包装器 class 就可以做到这一点,事实上我会选择这个选项,因为它更简单。
我的建议是,使用 primitive/wrapper class,如果您声明该值对象需要某些行为,请创建 class/type.
不,并非 实体 的每个 属性 都是 值对象。
实体的属性是以下之一:
- 如您所知,值对象。值对象表示没有标识的简单值。
- 基元。实际上,从 DDD 的角度来看,这些只是值对象。原语可以在 DDD 中使用,但要注意不要成为 Primitive Obsession.
的牺牲品
- 实体。一个实体可以包含其他实体。在它们之间具有直接(可导航)引用的所有实体都是同一 Aggregate 的一部分。聚合中的 "top-most" 实体称为 聚合根 。只有根具有全局身份,内部实体只有本地身份。
- 对其他聚合实体的引用。切勿直接引用这些,使用 ID。 ID 本身又可以建模为值对象。
我正在阅读 "Patterns, Principles, and Practices of Domain-Driven Design"。该书建议 Entity
的属性应该是值对象,以便为领域的无处不在的语言建模。我见过很多像 EmailAddress
或 Age
这样的例子,它们只有一个字段来模拟领域概念。我对此感到困惑。 Entity
的每个 属性 都是值对象吗?当我们可以使用普通语言提供的属性数据类型时,您能提供示例吗?
我认为您真正的问题是:每个值对象都是 Class 吗? 因为您可以认为对于 Age 一个 Java 整数就足够了,这是事实。所以你在你的实体 Person 中有一个 Integer 类型的值对象 Age,不需要年龄类型。
OOP也说对象是状态+行为。在你的 Age 案例中,我假设它没有任何行为,所以一个简单的原语或包装器 class 就可以做到这一点,事实上我会选择这个选项,因为它更简单。
我的建议是,使用 primitive/wrapper class,如果您声明该值对象需要某些行为,请创建 class/type.
不,并非 实体 的每个 属性 都是 值对象。
实体的属性是以下之一:
- 如您所知,值对象。值对象表示没有标识的简单值。
- 基元。实际上,从 DDD 的角度来看,这些只是值对象。原语可以在 DDD 中使用,但要注意不要成为 Primitive Obsession. 的牺牲品
- 实体。一个实体可以包含其他实体。在它们之间具有直接(可导航)引用的所有实体都是同一 Aggregate 的一部分。聚合中的 "top-most" 实体称为 聚合根 。只有根具有全局身份,内部实体只有本地身份。
- 对其他聚合实体的引用。切勿直接引用这些,使用 ID。 ID 本身又可以建模为值对象。