正在生成DDD中实体的标识

本文关键字:实体 标识 DDD | 更新日期: 2023-09-27 18:21:15

编辑

为了进一步澄清我最初的问题,我用更多的"DDD"术语、常见模式和讨论论点改写了这个问题。原始版本可在修订版下找到。


当正确应用DDD时,在域内生成实体/聚合根的身份在哪里以及如何生成?

我需要为我的实体分配唯一的身份,无论是在创建还是持久化时。这些身份可以有几种风格

  • 计算(基于实体的特征,因此基于业务需求)
  • 自然(基于一组特定的规则,因此基于业务逻辑)
  • 代孕者(基于随机生成的没有商业意义的值)

生成和分配标识的任务有很多方法,从使用工厂创建标识,到使用ORM数据库生成委派到基础设施等等。然而,如果正确应用DDD,应在何处以及如何生成标识,考虑到我们不希望贫血的域模型将服务注入实体

如上所述的要求

  • 无贫血区域模型
  • 没有向实体中注入服务的依赖项

可能的方法

  • 工厂
  • 双重调度(这可以用于身份生成吗?
  • 内部重新定位的生成
  • 基础设施内部生成(例如ORM或数据库)
  • 向实体注入服务

正在生成DDD中实体的标识

Vaughn Vernon《实现域驱动设计》一书的作者主张在这样的存储库中创建独特的id:

   public TenantId nextIdentity() {
        return new TenantId(UUID.randomUUID().toString().toUpperCase());
    }

TenantId是一个值对象,用于包装实体的标识。

我会把它放在工厂里。在我看来,生成id不应该是域逻辑的一部分,因为这实际上是一个基础设施问题。您可以从DB中获取id,也可以使用uuid或其他方式生成id。这是一个细节。还要记住,只有工厂的接口属于域层,而不是它的实现。

关于你对工厂的怀疑,如果你用工厂来创建实体,那么你应该到处使用它。我就是这么做的。