在聚合根/实体中注入存储库是否被认为是不良设计?

dee*_* zg 0 domain-driven-design

我试图了解有关域驱动设计的详细信息,而我遇到了这个问题。我发现了很多例子:

  1. 在域内定义存储库接口
  2. 在其他地方定义存储库实现
  3. 将存储库接口注入聚合根

另一方面,有一些示例完全违背它,并从服务中处理所有与存储库相关的工作。

我找不到权威的答案和解释:这被认为是不好的做法吗?如果是,为什么?

Voi*_*son 5

我找不到权威的答案和解释:这被认为是不好的做法吗?如果是,为什么?

是的,主要是因为许多不同的问题变得困惑。

聚合定义一致性边界;状态的任何更改都应限于所有属于同一集合的相关实体的集合。因此,一旦您查找了第一个实体(“根”实体),就应该能够实现更改,而无需检查此域实体图和已传递的参数以外的任何数据。

换句话说,Repository管道问题,而不是领域问题。您的域实体负责表达您的域,而不会混淆基础结构问题。

例如,要具有将使用IRepository接口进行保存的Aggregate.Save()方法。

Aggregate.Save()肯定表示有问题。好吧,确切地说,有两个问题:Save可能不是您普遍使用的语言的一部分,就此而言,可能Aggregate也不是。

Save不是域问题,而是持久性问题-它只是将数据从内存中的表示形式(易失性存储)复制到持久性表示形式(稳定的存储)。您的域模型不需要对此有所了解。

您发现“很多例子”的原因之一是很难正确地分离这些问题;这意味着您确实需要对问题进行深入思考以将他们分开。大多数示例都没有,因为在将所有内容始终部署在一起时,将事情分开进行并不重要。

  • “保存可能不是您普遍使用的语言的一部分”-谢谢您这句话!这完全有道理,是的,我绝对忽略了DDD方面。我专注于保存实现的位置以及它的外部域(和注入)似乎可以接受的事实。但是考虑到域的主要目的,`save`绝对不属于普遍存在的语言。这说明了“回归基本面”的重要性。非常感谢您的回答! (2认同)