域驱动设计中的实体的每个属性都是值对象吗?

时间:2015-10-26 18:46:02

标签: domain-driven-design

我正在阅读"领域驱动设计的模式,原则和实践"。该书建议Entity的属性应该是值对象,以便模拟域的普遍性语言。我见过很多例如EmailAddressAge的例子,只有一个字段来模拟域概念。我很困惑。 Entity的每个属性都是值对象吗?当我们可以使用普通语言为属性提供数据类型时,您能提供示例吗?

2 个答案:

答案 0 :(得分:6)

不,实体的每个属性都不是值对象。

实体的属性是以下之一:

  • 如您所知,值对象。值对象表示没有标识的简单值。
  • 基元即可。实际上,这些只是DDD视角下的值对象。原始数据可以在DDD中使用,但要注意不要成为Primitive Obsession的受害者。
  • 实体即可。实体可以包含其他实体。所有在它们之间具有直接(可导航)引用的实体都是同一聚合的一部分。 "最顶级"聚合中的实体称为聚合根。只有根具有全局标识,内部实体才具有本地标识。
  • 引用其他聚合的实体。永远不要直接引用这些,使用ID。 ID本身又可以建模为值对象。

答案 1 :(得分:2)

我认为你真正的问题是:每个价值对象都是一个类吗? 因为你可以认为对于Age来说,Java Integer就足够了,这是真的。所以你在你的实体Person中有一个值对象Age类型为Integer,不需要年龄类型。

OOP还说对象是状态+行为。在你的Age情况下,我认为它没有行为,所以一个简单的原语或包装类就可以做到这一点,事实上我会选择这个因为更简单。

我的建议是,使用原始/包装类,如果你宣传该值对象需要某些行为,请创建一个类/类型。