为什么我不应该在构造函数中调用我的依赖项?

时间:2014-03-07 18:41:00

标签: c# constructor dependency-injection

我一直认为从构造函数中调用类依赖项是一种不好的做法,但是昨天无法向同事说明原因。任何人都可以提供不这样做的充分理由吗?

2 个答案:

答案 0 :(得分:6)

Nikola Malovic的4th law of IoC有几个原因:

  • 当我们使用Constructor Injection组合应用程序时,我们经常创建实质的对象图,我们希望能够create these graphs as efficiently as possible。这是尼古拉最初的论点。
  • 在具有循环依赖关系的奇数(并且不推荐)情况下,注入的依赖关系可能尚未完全初始化,因此在此时尝试调用其成员可能会导致异常。此问题与issue of invoking virtual members from the constructor类似。从概念上讲,注入的依赖项等同于虚拟成员。
  • 使用构造函数注入,构造函数的职责是请求和接收依赖项。因此,根据单一责任原则(SRP),它不应该尝试做其他事情。有些读者可能会说我在这里滥用SRP,但我认为我只是在更细化的背景下应用基本原则。

请注意this rule是上下文的:它适用于使用Constructor Injection的服务。实体和值对象倾向于不使用DI,因此其构造函数受其他规则的约束。

答案 1 :(得分:3)

如果你调用你的依赖项,你实际上是在构造函数中工作。

从客户的角度来看是出乎意料的。当我做这样的事情时:

var myObj = new SomeClass();

我不指望任何副作用。

如果您在构造函数中执行某些操作,例如它可能会抛出异常,这肯定不是您所期望的。这就像命名方法FetchUsers并在该方法中创建用户并返回它。不是你所期望的。