为了进一步澄清我最初的问题,我用更多的DDD' -termini,常见模式和讨论论点重写了这个问题。原始版本可以在revisions下找到。
正确应用DDD时,在域内生成实体 / 聚合根的身份的位置和方式是什么?
我需要在创建或持久时为我的实体分配唯一标识。这些身份可以有多种风格
生成和分配身份的任务有很多方法,从使用工厂创建身份,使用 ORM 或数据库生成委派给基础架构等。但是,如果正确应用DDD,应该在何处以及如何生成身份,考虑到我们不希望贫血域模型和将服务注入实体< /强>
答案 0 :(得分:6)
Vaughn Vernon实施领域驱动设计的作者主张在repositories创建独特的ID,如下所示:
public TenantId nextIdentity() {
return new TenantId(UUID.randomUUID().toString().toUpperCase());
}
TenantId
是一个包装实体标识的值对象。
答案 1 :(得分:4)
我会把它放在工厂里。在我看来,生成id不应该是域逻辑的一部分,因为它确实是一个基础设施问题。您可以从DB获取id或使用uuid或其他任何内容生成id。这是一个细节。还要记住,只有工厂的接口属于域层,而不是它的实现。
关于您对工厂的疑虑,如果您使用工厂创建实体,那么您应该在任何地方使用它。我就是这样做的。