DDD:如何处理存储在多个存储系统中的一个实体

本文关键字:存储系统 实体 一个 存储 何处理 DDD 处理 | 更新日期: 2023-09-27 17:58:53

我目前正在将遗留应用程序迁移到域驱动的设计模型中,遇到了这个问题:该应用程序是关于实时管理大量联系人,包括检查重复联系人。每当有人保存一个新联系人时,它都必须通过第三方软件(基本上是一个相似性搜索软件)的重复检查。如果通过检查,联系人将在SQL中创建,联系人的一小部分(与重复检查相关的一些核心字段)必须存储在第三方软件的数据库中。因此,实体"联系人"位于两个(同步的)存储系统中,但一个系统只有一小部分字段,而SQL为联系人提供了50多个字段。

现在我在想是否可以创建两种类型的"联系人"(contact和ContactShort)。因此,我还必须为这些实体创建两个存储库,并在域服务中使用这些存储库,域服务最终用于执行我需要重复检查软件的操作(如保存/插入方法)。

对于如何处理这种情况,有一个很好的经验法则吗?

编辑:我还没有找到一个明确的解决方案,但我想了更多:在这种情况下,将重复检查存储系统与SQL数据库分离可能是错误的。事实上,我认为公开第三方软件的方法是错误的。这是纯粹的基础设施。由于保存操作必须在没有重复检查的情况下执行,我认为对第三方软件的调用应该在SQLRepository内部。它永远不能离开基础结构层,因为它永远不能返回联系人的有效实体。你觉得怎么样?

DDD:如何处理存储在多个存储系统中的一个实体

对我来说,你建议的解决方案听起来不错。在较低级别(数据访问层),您应该有两个独立的对象来包装对两个不同数据库的访问(两个存储库,因为您需要不同的连接字符串。如果您使用相同的数据库引擎,这可以是同一XXXRepository的两个实例,也可以是不同的存储库XXXRepository和YYYRepository来访问两个不同的数据库引擎)。

然而,在上层(域层和GUI),您不应该为这些数据的去向而烦恼。正如您所说,您有一个服务,它将填充分离,这样应用程序域和上层(如GUI)就不会看到下面(数据访问层)发生的事情。