正在生成DDD中实体的标识
本文关键字:实体 标识 DDD | 更新日期: 2023-09-27 18:21:15
编辑
为了进一步澄清我最初的问题,我用更多的"DDD"术语、常见模式和讨论论点改写了这个问题。原始版本可在修订版下找到。
当正确应用DDD时,在域内生成实体/聚合根的身份在哪里以及如何生成?
我需要为我的实体分配唯一的身份,无论是在创建还是持久化时。这些身份可以有几种风格
- 计算(基于实体的特征,因此基于业务需求)
- 自然(基于一组特定的规则,因此基于业务逻辑)
- 代孕者(基于随机生成的没有商业意义的值)
生成和分配标识的任务有很多方法,从使用工厂创建标识,到使用ORM或数据库生成委派到基础设施等等。然而,如果正确应用DDD,应在何处以及如何生成标识,考虑到我们不希望贫血的域模型和将服务注入实体?
如上所述的要求
- 无贫血区域模型
- 没有向实体中注入服务的依赖项
可能的方法
- 工厂
- 双重调度(这可以用于身份生成吗?)
- 内部重新定位的生成
- 基础设施内部生成(例如ORM或数据库)
- 向实体注入服务
Vaughn Vernon《实现域驱动设计》一书的作者主张在这样的存储库中创建独特的id:
public TenantId nextIdentity() {
return new TenantId(UUID.randomUUID().toString().toUpperCase());
}
TenantId
是一个值对象,用于包装实体的标识。
我会把它放在工厂里。在我看来,生成id不应该是域逻辑的一部分,因为这实际上是一个基础设施问题。您可以从DB中获取id,也可以使用uuid或其他方式生成id。这是一个细节。还要记住,只有工厂的接口属于域层,而不是它的实现。
关于你对工厂的怀疑,如果你用工厂来创建实体,那么你应该到处使用它。我就是这么做的。