DDD 更正实体的身份

DDD correct the identity of an Entity

在 DDD 中,实体有一个唯一标识它们的值,即 identity。有时这个标识是由服务器生成的,有时是从另一个 BC 获得的,有时是由用户提供的,等等。假设我们在 用户提供身份 .

的场景中工作

让我们假设有一个专门在纸上完成的业务流程,不会很快迁移到计算机,流程所有者在其中决定称为资源的事物的新名称。该名称始终遵循 PROD-<today's date>-<short random string> 等固定架构,并且始终在非常重要的团队成员之间进行验证。选择并验证的名称是 PROD-2021-01-04-KAH14564YUDO,最后一个字符是“O”(字母)而不是“0”(数字)。

假设操作员在系统中注册了这个新资源,提供了给定的身份,但错误地将最后一个字符拼写为 ,这可能是因为笔迹错误。实体被插入,一些其他实体通过其身份链接到它,然后有人检测到身份中的错误。现在应该怎么办?

我们知道实体的身份应该是唯一且不可变的,但在这里我们似乎需要更正(并因此更改)它。引入代理身份来避免这种错误的插入问题是不正确的,因为 PO 提供并由非常重要的团队成员验证的身份实际上是唯一的并且不会更改,它只是在管理系统中插入时出现错误;此外,在业务中没有与资源相关的代理身份的概念。

这个场景哪里出错了?

有趣的情况。我假设您无法向 Identity 添加验证,因为它只是用户输入的随机字符串。

让我们从问题这个场景的错误在哪里?开始。在您所在的 Domain 中,这是一种容易出错的机制或工作流程。当您为特定领域构建系统时,您将不得不处理来自该领域的讨厌的东西。您只需要尽早捕捉到这些令人讨厌的规则或机制,并以处理它们的方式设计系统。

让我们看看您如何处理这种情况。

您可以做的一件事是使用系统使用的另一个 ID(例如自动生成的 GUID),对用户隐藏。你可以用它来 link 其他实体到这个。这样,如果检测到用户输入的 Identity 有错误,您就不必更新整个系统,因为 Identity 不会在其他任何地方使用。如果您需要从系统的另一部分获得它,您应该只进行包含 GUID 的查询以获取 Identity。这将不确定 ID 是否确实是不可变的。根据系统的不同,它可能是一个很好的解决方案,也可能会使它的某些部分复杂化,而且它并不总是一个可行的解决方案。

如果不能选择仅供系统使用的另一个 ID,那么您只需要设计一种方式来处理这些情况。您必须将来自用户的 Identity 更新作为用例包括在内。从使用此 Identity 的系统的每个部分添加对 Identity 更新的处理。在某些情况下,这些错误会带来严重的后果。一个例子是,如果这个 Identity 通过电子邮件发送给另一个系统或一个人,并且已经在您的系统无法控制的其他地方使用。在这种情况下,这不是系统故障,而是 Domain 和使用它的人。解决此问题的唯一方法是更改​​ Domain 中的规则和机制。这在大多数情况下是不可能的,但有时您可以提出这个问题,并且可以实施更强大的机制。这是一个令人讨厌的情况,但这就是生活。

使用 natural keys / identity 而不是 GUID 的示例。

如果您有一个使用 natural keys 运行的系统网络,并且它们的生成功能强大,您可以使用它们。例如,银行系统使用国际银行帐号 (IBAN)。这些数字是由一个强大的特殊模式生成的。它们不仅仅是用户输入的一些随机字符串。在这种情况下,Domain 有一个强大的机制来确保这些 natural keys 是有效的。在这种情况下,几乎不可能将 GUID 发送到另一个银行系统以换取 IBAN。

向银行账户汇款时,此 IBAN 已验证,因此很容易检测到错误。这样,一个人就不能将钱汇到一个不存在的银行账户,从而仅仅因为输入错误而丢失它们。

如果您无法修复数据库,请修复论文并确保它不再发生,例如仅使用十六进制字符。