为DDD中的实体生成标识

时间:2014-09-09 10:48:57

标签: c# design-patterns domain-driven-design repository-pattern n-tier-architecture

修改

为了进一步澄清我最初的问题,我用更多的DDD' -termini,常见模式和讨论论点重写了这个问题。原始版本可以在revisions下找到。


  

正确应用DDD时,在域内生成实体 / 聚合根的身份的位置和方式是什么?

我需要在创建或持久时为我的实体分配唯一标识。这些身份可以有多种风格

  • 计算(基于实体的特征,因此基于业务要求)
  • 自然(基于某些规则,因此基于业务逻辑)
  • 代理(基于随机生成的值,没有商业意义)

生成和分配身份的任务有很多方法,从使用工厂创建身份,使用 ORM 数据库生成委派给基础架构等。但是,如果正确应用DDD,应该在何处以及如何生成身份,考虑到我们不希望贫血域模型将服务注入实体< /强>

要求如上所述

  • 没有贫血领域模型
  • 没有服务依赖注入实体

可能的方法

  • 工厂
  • 双重调度(可以用于身份生成吗?
  • 在repositiories内生成
  • 在基础架构内生成(例如ORM或数据库)
  • 将实体注入服务

2 个答案:

答案 0 :(得分:6)

Vaughn Vernon实施领域驱动设计的作者主张在repositories创建独特的ID,如下所示:

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

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

答案 1 :(得分:4)

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

关于您对工厂的疑虑,如果您使用工厂创建实体,那么您应该在任何地方使用它。我就是这样做的。