2

假设我的域中有一个“项目”实体,它有一个生成的唯一 ID(在正常数字 ID 之上),每个项目由 2 个字母 + 4 个数字组成。此 ID 在所有项目中必须是唯一的。

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

我确定它不属于应用服务,我不确定它是否是任何业务层关注的领域服务,将其作为基础服务感觉很奇怪,但它确实需要检查是否有其他项目是否存在随机生成的[LL]-[DDDD]类似代码。

即使我将此代码放在 repository.save 周围,它仍然必须从某个地方调用某些东西,所以问题是,我应该在哪里放置一个可以给我这样的免费随机 Id 的服务?

4

3 回答 3

2

属于域的 ID 应由域生成。

如果域没有定义任何 id,你也不应该在域中公开它们(严格来说,但无论哪种方式都可能更容易包含它们)。

于 2013-06-14T13:10:18.507 回答
2

您的问题提到了“普通 ID”。我假设这是您的数据库的主键,并且您要在此处生成的 ID 是供人类使用的(尽管为什么人类会使用 2 位字母 + 4 位数字的标识符超出了我的理解,但我见过更糟的情况)。在这种情况下,密钥的生成是一项业务功能,确保其唯一性是一项业务规则。这两件事都是领域对象的责任。鉴于您的对象名称、项目和您在问题中使用的语言,我建议也许 Projects 对象应该提供此服务。这样做的原因是只有 Projects 对象才能查看您创建的所有项目对象以检查唯一性。

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

于 2013-06-15T01:29:51.673 回答
1

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

于 2013-06-12T16:54:44.883 回答