recommended 每个聚合都有一个存储库。
但是,我有一种情况,可以从2个异构数据存储中获取相同的聚合对象。对于背景,该对象是:
显然(或不是),我不能拥有一个唯一的聚合存储库 - 在某些时候我需要知道从哪个数据存储获取对象。
鉴于域层应该忽略基础架构,我的特定情况以某种方式打破了我对如何正确实现存储库模式和DDD的理解。
我弄错了什么?
答案 0 :(得分:4)
我弄错了什么?
对我来说,你错了的是为同一数据提供了两个数据存储。
如果确实存在这种冗余的充分理由,那么这两个聚合在某种程度上必须是不同的,这可能有理由将它们视为单独的聚合并具有两个存储库。
如果您希望将它们视为单个聚合,则单个存储库应该知道如何消除歧义并处理正确的数据存储,但是将数据存储的知识封装在您的域模型之外。
编辑:
在注释中说明的情况中,一个数据存储区是只读的,另一个是本地可修改的副本,实际上有两个数据存储区强制在您身上。您的存储库需要知道两个数据存储区,并且只有在本地未找到某些内容时才使用远程只读存储区。一旦从遥控器中检索到某些东西,它应立即将其保存到本地,然后使用本地副本。
这种逻辑是一种缓存代理,但不完全是,因为远程是只读的,本地是读写的。它可能包含足够的逻辑以提取到存储库使用的服务,但不应该暴露给域。
这种情况也有一些您需要考虑的风险。一旦你在本地保存了一些东西,就会有两个版本的相同数据,这些版本会不同步。如果在您更改本地后,对遥控器具有写入权限的用户更改了该怎么办?