在 DDD 中的值对象上具有 id 字段

Having id-field on a value object in DDD

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

现在企业有了新的要求,即应该可以在报告中看到哪些用户具有相同的技能概况。技能配置文件上的 equals 方法无法满足此要求,因为有些技能配置文件巧合地具有相同的值,但就明确执行而言并不是 "shared"。当然,技能配置文件必须不可变的旧要求仍然有效。

所以这是我的问题:在 SkillProfile class 上发明一个新字段 "Id" 或 "SharingCode" 是个好主意,因此给它一些identity 虽然它仍然是一个值对象而不是一个实体,因为它没有状态或生命周期?

首先,

so modifying one of the profile won't change any of the other users profile

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


根据新要求,SkillProfile 需要一个标识 - 无论是显式还是隐式 - 因为不能再仅通过查看其值来比较它。 因此,它现在是一个实体。

请注意,您无需将其与之前的值对象区别对待 - 保持实体不可变是个好主意,例如,因为这仍然是自然界的概念。 所以将它变成一个实体应该不是很大的一步。