存储库模式:每个聚合或每个基础数据存储的存储库?

时间:2011-03-14 10:56:22

标签: language-agnostic architecture domain-driven-design repository-pattern ddd-repositories

recommended 每个聚合都有一个存储库。

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

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

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

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

    我弄错了什么?

1 个答案:

答案 0 :(得分:4)

  

我弄错了什么?

对我来说,你错了的是为同一数据提供了两个数据存储。

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

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

编辑:

在注释中说明的情况中,一个数据存储区是只读的,另一个是本地可修改的副本,实际上有两个数据存储区强制在您身上。您的存储库需要知道两个数据存储区,并且只有在本地未找到某些内容时才使用远程只读存储区。一旦从遥控器中检索到某些东西,它应立即将其保存到本地,然后使用本地副本。

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

这种情况也有一些您需要考虑的风险。一旦你在本地保存了一些东西,就会有两个版本的相同数据,这些版本会不同步。如果在您更改本地后,对遥控器具有写入权限的用户更改了该怎么办?