接口注入与方法注入的区别

Abh*_*uha 0 c# dependency-injection interface-injection

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

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

提前致谢.

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

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

Ste*_*ven 5

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

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

然而,Martin Fowler也定义了接口注入.这可能看起来像DI的另一种形式,但它实际上只是Property InjectionMethod Injection的一种形式,其中属性或方法是类的Abstraction的一部分.接口注入是我所知不常用的术语.

依赖注入原则,实践和模式描述了注入方法应始终放在抽象上.当这种注入方法仅在实现时实现时,它意味着只有组合根可以访问它们,但书中指出:

方法注入不适合使用成分根.在组合根中,方法注入可用于使用其依赖项初始化先前构造的类.然而,这样做会导致时间耦合,因此非常不鼓励(第4.3.2节).

另一方面,属性注入通常用于实现而不是抽象.这是因为在的情况下,物业注入成分根,将设置这种依赖性.

正如Fowler所描述的那样,接口注入似乎主要用于初始化组件,但如上所述,这导致时间耦合,因此应该被阻止.使用构造函数注入或使用方法注入而不存储依赖项.

为了更好地理解DI,您应该阅读该书免费提供的第1章.