1

建议每个聚合有一个存储库。

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

  1. 从数据存储A中获取(远程和只读)
  2. 呈现给用户进行验证
  3. 验证时,导入数据存储B(本地和读写)
  4. 它可以从数据存储B中获取和修改

显然(或不是),我不能为此拥有一个唯一的聚合存储库 - 在某些时候我需要知道从哪个数据存储中获取对象。

鉴于域层应该忽略基础设施,我的特殊情况以某种方式打破了我对存储库模式和一般 DDD 应该如何正确实现的理解。

我是不是搞错了什么?

4

1 回答 1

4

我是不是搞错了什么?

在我看来,您错在为相同的数据设置两个数据存储。

如果这种冗余确实有充分的理由,那么这两个聚合在某种程度上肯定是不同的,这可能证明将它们视为单独的聚合并拥有两个存储库是合理的。

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

编辑:

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

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

这种情况也有一些你需要考虑的风险。一旦你在本地保存了一些东西,你就有了相同数据的两个版本,它们会不同步。如果在您更改本地后,对远程具有写访问权限的人更改了它,您会怎么做?

于 2011-03-14T11:22:42.847 回答