接口注入和方法注入之间的区别

时间:2018-01-30 07:46:33

标签: c# dependency-injection interface-injection

我刚刚开始学习依赖注入(DI)及其在C#中的类型。我注意到在几乎所有文章中,前面提到的两种类型的注入机制是相同的,即构造函数注入属性/ Setter注入

但是第三篇文章在许多文章中都有所不同 - 有些作者提到“基于接口的注入”作为第三种机制,有些人提到了“方法注入”。我对同样的理解可能是错的,它们可能是同一个东西,但仅仅为了我的澄清,想知道它们之间是否有任何具体的差异?

提前致谢。

参考文献:http://www.dotnettricks.com/learn/dependencyinjection/implementation-of-dependency-injection-pattern-in-csharp

http://www.c-sharpcorner.com/UploadFile/ff2f08/dependency-injection-pattern/

1 个答案:

答案 0 :(得分:5)

有三种基本的DI模​​式描述 如何注入依赖关系:

  • 构造函数注入,是通过将它们指定为类的构造函数的参数来静态定义所需依赖项列表的行为。
  • 属性注入(又名Setter Injection),当已经存在良好的 Local Default 时,使用属性静态定义可选依赖项
  • 方法注入,允许通过将其作为方法参数传递给消费者提供依赖关系,其中此方法在Composition Root
  • 之外调用

Martin Fowler然而另外定义了Interface Injection。这可能看起来像DI的另一种形式,但它实际上只是 Property Injection Method Injection 的一种形式,其中属性或方法是类的一部分<强>抽象即可。据我所知,接口注入不是常用的术语。

Dependency Injection Principles, Practices, and Patterns描述了注入方法始终应放在抽象上。当这种注入方法仅在实现时实现时,它意味着只有组合根可以访问它们,但书中说明:

  

方法注入不适合 组合根中使用。在合成根中,方法注入可用于初始化以前构建的依赖关系类。但这样做会导致时间耦合,因此非常不鼓励(§4.3.2)。

另一方面,

属性注入通常用于实现,而不是抽象。这是因为在属性注入的情况下, 组合根将设置该依赖关系。

正如Fowler所描述的那样,

接口注入似乎主要用于初始化组件,但如上所述,这会导致 Temporal Couping 因此应该被阻止。使用构造函数注入或使用方法注入而不存储依赖项。

为了更好地理解DI,您应该阅读该书的免费chapter 1