在DDD架构中,唯一ID生成在哪里?

时间:2013-06-12 16:24:59

标签: oop service domain-driven-design

假设我的域中有一个“项目”实体,它有一个唯一的ID(在普通数字ID之上),每个项目有2个字母+4个数字。这个id必须在所有项目中都是唯一的。

我很难放置此功能,感觉就像在第一次保存项目时,它几乎只应放在存储库中。

我确信它不属于Application服务,我不确定它是否是域服务所涉及的任何业务层,将它作为基础结构服务感觉很奇怪,但确实需要检查是否存在随机生成[LL]-[DDDD]代码的任何其他项目。

即使我将此代码放在repository.save周围,它仍然需要从某个地方调用某些东西,所以问题是,我应该在哪里提供一个给我一个免费随机ID的服务呢?

3 个答案:

答案 0 :(得分:2)

属于域的ID应该由域生成。

如果域名没有定义任何ID,您也不应该在域中公开它们(严格来说,但可能更容易将它们包括在内)。

答案 1 :(得分:2)

您的问题提到“正常ID”。我假设这是你的数据库的主键,你想在这里生成的ID是为了人类(虽然为什么人类会使用2个字母+ 4位数的标识符超出我,但我看到更糟)。在这种情况下,密钥的生成是业务功能,并且确保它是唯一的是业务规则。这两件事都是域对象的责任。鉴于您的对象名称,项目以及您在问题中使用的语言,我建议可能Projects项目应提供此服务。这样做的原因是只有Projects对象可以查看您创建的所有项目对象以检查唯一性。

当然,您可以使用算法生成此字段,以确保唯一性,而无需检查所有项目(一个好主意,顺便说一句)。在这种情况下,您可能允许项目在其生命周期中的适当时间生成自己的ID(可能在创建时)。

答案 2 :(得分:0)

“免费随机ID”或ID生成是基础架构而非业务域的一部分,因此我将该逻辑添加到持久层并从我的存储库中调用它。例如ProjectRepository。假设Project实体在任何情况下都有一个'id'字段。您可以在Project实体中强制执行验证,以便id格式为2个字母和4个数字,但只有在项目ID与应用程序中的其他实体ID不同时才执行此操作