重复实体的补救

时间:2015-10-01 01:11:31

标签: domain-driven-design

总结:处理域中实体重复数据删除的常见做法是什么?

背景信息:我试图通过实施玩具项目来学习域驱动设计。这意味着,除其他外,我无法访问域专家。

多个远程系统发布现实世界实体的视图。我的系统的职责之一是合并同一实体的多个视图。换句话说,我试图创建一个包含远程系统发布的实体联合的存储库。

在快乐的道路上,现实世界中有一些X;系统A发布A(X),我的系统看到这个并通过在我的存储库中创建实体(X)来响应。后来,当远程系统B发布B(X),"系统"自动识别B(X)是实体(X)的另一种表示,因此不需要创建新实体。

快乐路径

  1. 在现实世界中发现的X
  2. A发布event.A = A.EntityDiscovered(A.Id(X),A.Value(X))
  3. 系统S观察event.A
  4. S搜索匹配S.Value的实体(A.Value(X))
    • 找不到匹配项
  5. S创建S(X)=实体(S.Id(X),S.Value(A.Value(X))
  6. S缓存引用(A.Id(X) - > S(X))供以后使用
  7. B发布event.B = B.EntityDiscovered(B.Id(X),B.Value(X))
  8. 系统S观察event.B
  9. S搜索与X.Value匹配的实体(B.Value(X))
    • S找到S(X)
  10. S缓存引用(B.Id(X) - > S.Id(X))供以后使用。
  11. 但是,远程系统使用不同的数据格式,并且有自己的错误来源。不同的远程系统没有共享的共同身份。

    例外路径

    1. 在现实世界中发现的X
    2. A发布event.A = A.EntityDiscovered(A.Id(X),A.Value(X))
    3. 系统S观察event.A
    4. S搜索匹配S.Value的实体(A.Value(X))
      • 找不到匹配项
    5. S创建S(X)=实体(S.Id(X),S.Value(A.Value(X))
    6. S缓存引用(A.Id(X) - > S(X))供以后使用
    7. B发布event.B = B.EntityDiscovered(B.Id(X),B.Value(X))
    8. 系统S观察event.B
    9. S搜索与X.Value匹配的实体(B.Value(X))
      • 未找到匹配项,因为B.Value(X)与A.Value(X)不够相似
    10. S缓存引用(B.Id(X) - > S(X))供以后使用。
    11. S创建S(X')=实体(S.Id(X'),S.Value(B.Value(X))
    12. S缓存引用(B.Id(X) - > S.Id(X'))供以后使用
    13. 此时,我的域名出错,因为它有两个不同的实体[S(X),S(X')]代表真实世界实体X.

      使事情复杂化 - 基于我迄今为止创建的设计,这些实体似乎是聚合根。当系统使用这些实体时,它们的ID将被复制到其他对象中。

      简而言之,我有很多历史代表现实世界实体X两种不同的方式(两种不同的ID),我需要了解如何响应重复发现的事件(假设事件描述了哪个id是被弃用以支持另一方。)

      我的每个应用程序根都需要实现一些processCorrection方法,基本上实现一个replaceAll()?是否应该在实体存储库前面有一个知道如何翻译已弃用的ID?

0 个答案:

没有答案