在 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
需要一个标识 - 无论是显式还是隐式 - 因为不能再仅通过查看其值来比较它。 因此,它现在是一个实体。
请注意,您无需将其与之前的值对象区别对待 - 保持实体不可变是个好主意,例如,因为这仍然是自然界的概念。 所以将它变成一个实体应该不是很大的一步。
我正在做一个项目,在该项目中我在聚合中有一个值对象(称为 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
需要一个标识 - 无论是显式还是隐式 - 因为不能再仅通过查看其值来比较它。 因此,它现在是一个实体。
请注意,您无需将其与之前的值对象区别对待 - 保持实体不可变是个好主意,例如,因为这仍然是自然界的概念。 所以将它变成一个实体应该不是很大的一步。