为DDD中的实体生成标识
编辑
为了进一步澄清我最初的问题,我用更多的’DDD’ – 终点,常见模式和讨论论点重写了这个问题。 可以在修订版本中找到原始版本。
在正确应用DDD时,在域内生成实体 / 聚合根的身份的位置和方式?
我需要在创建或持久化时为我的实体分配唯一标识。 这些身份可以有多种风格
- 计算(基于实体的特征,因此基于业务要求)
- 自然的(基于一组规则,因此基于业务逻辑)
- 代理(基于随机生成的值,没有商业意义)
有许多方法可以生成和分配身份,从使用工厂创建身份,使用ORM授权到基础设施或数据库生成等。但是,如果正确应用DDD,身份应该在何处以及如何生成,考虑到我们不希望贫血领域模型和服务注入实体 ?
要求如上所述
- 没有贫血领域模型
- 没有dependency injection服务到实体
可能的方法
- 工厂
- 双重调度( 这可以用于身份生成吗? )
- 在repositiories内生成
- 在基础设施内生成(例如ORM或数据库)
- 注入服务到实体
我会把它放在一个工厂里。 在我看来,生成id不应该是域逻辑的一部分,因为它确实是一个基础设施问题。 您可以从DB获取id或使用uuid或其他任何方式生成它。 这是一个细节。 还要记住,只有工厂的接口属于域层,而不是它的实现。
关于您对工厂的疑虑,如果您使用工厂创建实体,那么您应该在任何地方使用它。 我就是这样做的。
Vaughn Vernon实施域驱动设计的作者主张在这样的存储库中创建唯一的ID:
public TenantId nextIdentity() { return new TenantId(UUID.randomUUID().toString().toUpperCase()); }
TenantId
是一个包装实体标识的值对象。