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

时间:2017-12-17 14:46:42

标签: domain-driven-design

我正在尝试了解域驱动设计的细节,我来到这个问题。 我找到了很多例子:

  1. 在域中定义存储库接口
  2. 在其他地方定义存储库实现
  3. 将存储库接口注入聚合根
  4. 另一方面,有一些例子严格违背它并从服务中做所有与存储库相关的事情。

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

1 个答案:

答案 0 :(得分:5)

  

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

是的,主要是因为许多不同的顾虑感到困惑。

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

换句话说,Repository管道关注点,而不是关注点。您的域名实体负责表达您的域名,而不会出现基础设施问题。

  

例如,要使用在内部使用IRepository接口保存的Aggregate.Save()方法。

Aggregate.Save()肯定表明存在问题。好吧,准确地说有两个问题:Save可能不是你普遍存在的语言的一部分,而且Aggregate可能也不是。

Save不是域关注点,它是持久性问题 - 它只是将数据从内存表示(易失性存储)复制到持久表示(稳定存储)。您的域模型不需要了解任何相关内容。

您发现“许多示例”的原因之一是将这些问题正确分开是 hard ;意思是你真的需要深入思考这个问题来挑逗它们。大多数示例都没有,因为当您总是将所有内容部署在一起时,将事情分开并不重要。