总结:处理域中实体重复数据删除的常见做法是什么?
背景信息:我试图通过实施玩具项目来学习域驱动设计。这意味着,除其他外,我无法访问域专家。
多个远程系统发布现实世界实体的视图。我的系统的职责之一是合并同一实体的多个视图。换句话说,我试图创建一个包含远程系统发布的实体联合的存储库。
在快乐的道路上,现实世界中有一些X;系统A发布A(X),我的系统看到这个并通过在我的存储库中创建实体(X)来响应。后来,当远程系统B发布B(X),"系统"自动识别B(X)是实体(X)的另一种表示,因此不需要创建新实体。
快乐路径
- 在现实世界中发现的X
- A发布event.A = A.EntityDiscovered(A.Id(X),A.Value(X))
- 系统S观察event.A
- S搜索匹配S.Value的实体(A.Value(X))
- S创建S(X)=实体(S.Id(X),S.Value(A.Value(X))
- S缓存引用(A.Id(X) - > S(X))供以后使用
- B发布event.B = B.EntityDiscovered(B.Id(X),B.Value(X))
- 系统S观察event.B
- S搜索与X.Value匹配的实体(B.Value(X))
- S缓存引用(B.Id(X) - > S.Id(X))供以后使用。
醇>
但是,远程系统使用不同的数据格式,并且有自己的错误来源。不同的远程系统没有共享的共同身份。
例外路径
- 在现实世界中发现的X
- A发布event.A = A.EntityDiscovered(A.Id(X),A.Value(X))
- 系统S观察event.A
- S搜索匹配S.Value的实体(A.Value(X))
- S创建S(X)=实体(S.Id(X),S.Value(A.Value(X))
- S缓存引用(A.Id(X) - > S(X))供以后使用
- B发布event.B = B.EntityDiscovered(B.Id(X),B.Value(X))
- 系统S观察event.B
- S搜索与X.Value匹配的实体(B.Value(X))
- 未找到匹配项,因为B.Value(X)与A.Value(X)不够相似
- S缓存引用(B.Id(X) - > S(X))供以后使用。
- S创建S(X')=实体(S.Id(X'),S.Value(B.Value(X))
- S缓存引用(B.Id(X) - > S.Id(X'))供以后使用
醇>
此时,我的域名出错,因为它有两个不同的实体[S(X),S(X')]代表真实世界实体X.
使事情复杂化 - 基于我迄今为止创建的设计,这些实体似乎是聚合根。当系统使用这些实体时,它们的ID将被复制到其他对象中。
简而言之,我有很多历史代表现实世界实体X两种不同的方式(两种不同的ID),我需要了解如何响应重复发现的事件(假设事件描述了哪个id是被弃用以支持另一方。)
我的每个应用程序根都需要实现一些processCorrection方法,基本上实现一个replaceAll()?是否应该在实体存储库前面有一个知道如何翻译已弃用的ID?