如何区分实体和ValueObject?

时间:2018-05-21 08:11:24

标签: domain-driven-design

如何区分实体 ValueObject

对于我最近使用DDD的项目,我经常对两者感到困惑。

  1. 什么是实体和VO?
  2. 责任
  3. 实体和VO是否应包含任何逻辑,例如日期解析,按字段返回bool?

1 个答案:

答案 0 :(得分:0)

我还希望这是一种简单的经验法则,用于确定您的新模型是Entity还是ValueObject

我个人使用以下问题:

  • 我的模型中是否有任何属性,它的历史变化很重要?

    • 如果是,则我的模型更可能是Entity
    • 如果不是那么我的模型更可能是ValueObject

因此,在示例中使用它,Person模型取决于我们的域(逻辑/商务),它的历史FirstName属性可能重要或不重要。如果是,则PersonEntity

另一方面,我们必须能够为updatable = false属性设置ValueObject。当需要更新时,我们只需删除以前的记录并插入新记录[1]。

关于你的其他问题,我认为关于DDD最大的一点就是将逻辑隔离到域/模型层。 "易于测试的简单POJO"。因此,您可以轻松地将任何逻辑添加到您的域/模型中,只需单元测试即可。

我希望我的答案有一些用处,如果你找到更方便区分这两个人的话,请告诉我! :^)

[1]如果ValueObject位于关系的多方面,那么我们需要检查是否所有(单方)引用都需要更新。如果没有,那么我们按原样保留当前记录,然后插入新记录(对于那些需要更新的引用)。