【问题标题】:DDD correct the identity of an EntityDDD 更正实体的身份
【发布时间】:2021-04-10 08:46:54
【问题描述】:

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

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

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

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

这种情况下的错误在哪里?

【问题讨论】:

    标签: domain-driven-design entity identity misspelling


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      使用 natural keys / identity 代替 GUID 的示例。

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

      向银行账户汇款时,此 IBAN 会经过验证,因此很容易检测到错误。这样一来,一个人就无法将钱汇到一个不存在的银行账户,从而仅仅因为打错字而丢失它们。

      【讨论】:

      • 就我而言,我想我们可以使用 UUID / GUID 策略。此外,自从提出这个问题后,我发现一篇文章(我无法取回 ATM)说“自然键”在任何情况下都不应该用作主要标识符。我现在问自己什么时候这样做是合适的……鉴于我们总是可以使用 GUID?使用它们并仅使用“自然键”进行匹配不是更好吗?使用 GUID 会使设计/系统的某些部分复杂化的例子有哪些?
      • 我已经用一个例子更新了我的答案。有许多这样的系统具有特殊机制,可确保“自然密钥”是健壮的,因此您可以安全地使用它。这些特殊生成的自然键用于识别实体,这就是它们的目的。有些域的安全性很差,而另一些域则内置得如此之好,以至于不可能搞砸。当赌注很高时,聪明的人会谨慎行事。
      • 谢谢你的例子!即使这是我们都经常使用的东西,我对此并不强硬。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-10
      • 2021-04-07
      • 2012-05-09
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多