Language agnostic 存储库模式:每个聚合还是每个基础数据存储库?

Language agnostic 存储库模式:每个聚合还是每个基础数据存储库?,language-agnostic,architecture,domain-driven-design,repository-pattern,ddd-repositories,Language Agnostic,Architecture,Domain Driven Design,Repository Pattern,Ddd Repositories,每个聚合有一个存储库是非常重要的 但是,我有一个例子,可以从2个异构数据存储中获取相同的聚合对象。对于背景,该对象是: 从数据存储A获取(远程只读(&D) 提交给用户进行验证 验证时,导入数据存储B(本地和读写) 它可以从数据存储B中提取和修改 很明显(或不是),我不能为此拥有一个唯一的聚合存储库——在某个时候,我需要知道从哪个数据存储中获取对象 考虑到域层应该忽略基础设施,我的特定案例在某种程度上打破了我对如何正确实现存储库模式和DDD的理解 我做错什么了吗 我做错什么了吗 在我看来,你错的地

每个聚合有一个存储库是非常重要的

但是,我有一个例子,可以从2个异构数据存储中获取相同的聚合对象。对于背景,该对象是:

  • 从数据存储A获取(远程只读(&D)
  • 提交给用户进行验证
  • 验证时,导入数据存储B(本地和读写)
  • 它可以从数据存储B中提取和修改
  • 很明显(或不是),我不能为此拥有一个唯一的聚合存储库——在某个时候,我需要知道从哪个数据存储中获取对象

    考虑到域层应该忽略基础设施,我的特定案例在某种程度上打破了我对如何正确实现存储库模式和DDD的理解

    我做错什么了吗

    我做错什么了吗

    在我看来,你错的地方在于为同一数据存储两个数据

    如果这种冗余确实有很好的理由,那么这两个聚合必须在某种程度上有所不同,这可能会证明将它们视为单独的聚合并拥有两个存储库是合理的

    如果希望将它们视为单个聚合,那么单个存储库应该知道如何消除歧义并处理正确的数据存储,但要将数据存储的知识封装在域模型之外

    编辑:

    在注释中解释的情况下,一个数据存储是只读的,另一个是本地可修改的副本,拥有两个数据存储实际上是强加给您的。您的存储库需要了解这两个数据存储,并且只有在本地找不到内容时才使用远程只读存储。从远程检索内容后,应立即将其保存到本地,然后使用本地副本

    这种逻辑有点像缓存代理,但不完全是这样,因为远程是只读的,本地是读写的。它可能包含足够的逻辑以提取到存储库使用的服务,但不应向域公开

    这种情况也有一些你需要考虑的风险。一旦您在本地保存了某些内容,您就有了相同数据的两个版本,这将失去同步。如果在您更改本地服务器后,远程服务器上具有写访问权限的人更改了它,您会怎么做

    我做错什么了吗

    在我看来,你错的地方在于为同一数据存储两个数据

    如果这种冗余确实有很好的理由,那么这两个聚合必须在某种程度上有所不同,这可能会证明将它们视为单独的聚合并拥有两个存储库是合理的

    如果希望将它们视为单个聚合,那么单个存储库应该知道如何消除歧义并处理正确的数据存储,但要将数据存储的知识封装在域模型之外

    编辑:

    在注释中解释的情况下,一个数据存储是只读的,另一个是本地可修改的副本,拥有两个数据存储实际上是强加给您的。您的存储库需要了解这两个数据存储,并且只有在本地找不到内容时才使用远程只读存储。从远程检索内容后,应立即将其保存到本地,然后使用本地副本

    这种逻辑有点像缓存代理,但不完全是这样,因为远程是只读的,本地是读写的。它可能包含足够的逻辑以提取到存储库使用的服务,但不应向域公开


    这种情况也有一些你需要考虑的风险。一旦您在本地保存了某些内容,您就有了相同数据的两个版本,这将失去同步。如果在您更改本地数据后,远程有写权限的人更改了它,您会怎么办?

    @Don:“在我看来,您错的地方在于为同一数据设置了两个数据存储”->数据存储A是一个远程引用,我没有写权限。出于性能原因和可能的修改,我需要在本地数据存储B中表示该数据。@Maxim Gueivandov:为此,我将使用单个存储库,并隐藏存储库中哪个数据存储的决定,以免知识污染域。@Don:“如果你想将它们视为单个聚合,那么单个存储库应该知道如何消除歧义并处理正确的数据存储”:这是如何实现的?@Maxim:请参阅我的更新。评论有点太长了。@Don:谢谢你的澄清。但是,要求#2(导入前必须将对象呈现给用户进行验证)禁止我以静默方式同步这两个数据存储。我需要一种方法来区分这两个数据源到表示层。我相信您的建议是有两个不同的存储库,因此有两个不同的存储库(但结构相同)聚合对象最适合这个要求。你不同意吗?@Don:“在我看来,你错的地方在于为同一个数据存储两个数据"->数据存储A是一个远程引用,我没有写入权限。出于性能原因和可能的修改,我需要在本地数据存储B中表示该数据。@Maxim Gueivandov:为此,我将使用单个存储库,并在存储库中隐藏对哪个数据存储的决定,以免轮询用知识定义域。@Don:“如果你想将它们视为一个聚合,那么单个存储库应该知道如何消除歧义并处理正确的数据存储”:这是如何实现的?@Maxim:请参阅我的更新。评论有点太长。@Don:谢谢你的澄清。但是,要求#2(导入前必须将对象提供给用户进行验证)禁止我以静默方式同步这两个数据存储。我需要一种方法来区分这两个数据存储