为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是一个包装实体标识的值对象。