我正在一个项目中,在集合中有一个值对象(称为SkillProfile)。聚合根是User实体,并且UserSkillProfile具有单向一对一关联。在业务中有一个用例,可以将SkillProfile与另一个User共享,但总是作为副本共享(因此,修改一个配置文件不会更改任何其他用户配置文件)。到目前为止,一切都很好。

现在,企业有了新的要求,即应该可以在报告中看到哪些用户共享相同的技能档案。通过技能档案上的equals方法无法满足此要求,因为有些技能档案恰好具有相同的值,但就明确地做到这一点并非“共享”。当然,技能配置必须不可改变的旧要求仍然有效。

所以这是我的问题:在SkillProfile类上发明一个新字段“Id”或“SharingCode”并因此为其赋予某种身份是一个好主意,尽管它仍然是值对象而不是实体,因为它没有状态或生命周期?

最佳答案

第一,

因此,修改一个配置文件不会更改任何其他用户配置文件

如果SkillProfile确实是一个值对象,则应该不可能修改它!当然可以在User中替换它。 (只是在讨论您的问题之前先弄清楚这一点)

在新的要求下,SkillProfile需要一个标识(无论是显式的还是隐式的),因为不再只能通过查看其值来对其进行比较。 因此,它现在是一个实体。

请注意,您不需要像对待价值对象之前那样对待它-保持实体不变是一个好主意,例如,因为这仍然是概念的本质。 因此,使其成为一个实体应该不是很大的一步。

10-04 18:55