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

C# DDD:如何处理存储在多个存储系统中的一个实体?,c#,domain-driven-design,entity,C#,Domain Driven Design,Entity,我目前正在将遗留应用程序迁移到域驱动设计模型的过程中,遇到了以下问题: 该应用程序用于实时管理大量联系人,包括检查重复联系人。每当有人保存新联系人时,它必须通过第三方软件的重复检查(基本上是一个相似性搜索软件)。如果通过检查,将在SQL中创建联系人,并且联系人的一小部分(与重复检查相关的一些核心字段)必须存储在第三方软件的数据库中。 因此实体“contact”存在于两个(同步的)存储系统中,但一个系统只有一小部分字段,而SQL有50多个字段用于contact 现在我在想,是否可以为“联系人”创建

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

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

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

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

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


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

您所说的“下层”和“上层”是什么意思?较低级别是在域层中定义的存储库接口的具体实现吗?@Malkier抱歉,我扩展了我的答案。在较低级别下,我指的是数据访问,而较高级别指的是业务逻辑和GUI。较低级别将有两个存储库,但您将通过服务访问它们。只有seService将知道如何使用两个存储库来操作数据,因此您可以在域层中隐藏存储库。这就是我的看法,因为这是错误的。@Malkier这是一个合理的说法。请记住,您将在整个系统中使用同一个存储库。因此,任何访问基础结构的人都可以使用与外部数据库相关的附加检查: