接口注入和方法注入的区别
Difference between Interface Injection and Method Injection
我刚刚开始学习 C# 中的依赖注入 (DI) 及其类型。我注意到在几乎所有文章中,提到的前两种注入机制都是相同的,即 Constructor Injection 和 Property/Setter Injection .
但是第三种在很多文章中都不同——有些作者提到“Interface-based Injection”作为第三种机制,有些作者提到“Method注入”。我对相同的理解可能是错误的,它们可能是同一件事,但为了澄清一下,想知道它们两者之间是否有任何具体差异?
提前致谢。
http://www.c-sharpcorner.com/UploadFile/ff2f08/dependency-injection-pattern/
描述如何注入依赖项的三种基本 DI 模式:
- 构造函数注入,是静态定义所需Dependencies列表的行为,方法是将它们指定为class的构造函数。
- 属性注入(a.k.a.Setter注入),静态定义一个可选依赖 使用 属性,当已经有一个好的 Local Default.
- 方法注入,允许通过将其作为方法参数传递给消费者来提供依赖关系,其中此方法在 Composition Root
之外调用
Martin Fowler 定义了 Interface Injection。这可能看起来像是另一种形式的 DI,但实际上它只是 属性 注入 或 方法注入 的一种形式,其中属性 或方法是 class 的 抽象 的一部分。据我所知,接口注入是一个不常用的术语。
Dependency Injection Principles, Practices, and Patterns 描述了注入方法应该总是 放在抽象 上。当这种注入方法仅在实现上实现时,这意味着只有 Composition Root 可以访问它们,但书中指出:
Method Injection is unsuited to be used within the Composition Root. Within a Composition Root, Method Injection can be used to initialize a previously constructed class with its Dependencies. Doing so however leads to Temporal Coupling and is for that reason highly discouraged (§ 4.3.2).
另一方面,属性 注入 通常 单独 用于实现而不是 抽象。那是因为在 属性 注入 的情况下,它 是 将设置的 Composition Root那种依赖。
接口注入,正如 Fowler 所描述的,似乎主要用于初始化一个组件,但如上所述,这导致Temporal Couping,因此应该加以预防。使用构造函数注入或使用方法注入而不存储依赖项。
为了更好地理解 DI,您应该阅读该书的免费 chapter 1。
我刚刚开始学习 C# 中的依赖注入 (DI) 及其类型。我注意到在几乎所有文章中,提到的前两种注入机制都是相同的,即 Constructor Injection 和 Property/Setter Injection .
但是第三种在很多文章中都不同——有些作者提到“Interface-based Injection”作为第三种机制,有些作者提到“Method注入”。我对相同的理解可能是错误的,它们可能是同一件事,但为了澄清一下,想知道它们两者之间是否有任何具体差异?
提前致谢。
http://www.c-sharpcorner.com/UploadFile/ff2f08/dependency-injection-pattern/
描述如何注入依赖项的三种基本 DI 模式:
- 构造函数注入,是静态定义所需Dependencies列表的行为,方法是将它们指定为class的构造函数。
- 属性注入(a.k.a.Setter注入),静态定义一个可选依赖 使用 属性,当已经有一个好的 Local Default.
- 方法注入,允许通过将其作为方法参数传递给消费者来提供依赖关系,其中此方法在 Composition Root 之外调用
Martin Fowler 定义了 Interface Injection。这可能看起来像是另一种形式的 DI,但实际上它只是 属性 注入 或 方法注入 的一种形式,其中属性 或方法是 class 的 抽象 的一部分。据我所知,接口注入是一个不常用的术语。
Dependency Injection Principles, Practices, and Patterns 描述了注入方法应该总是 放在抽象 上。当这种注入方法仅在实现上实现时,这意味着只有 Composition Root 可以访问它们,但书中指出:
另一方面,Method Injection is unsuited to be used within the Composition Root. Within a Composition Root, Method Injection can be used to initialize a previously constructed class with its Dependencies. Doing so however leads to Temporal Coupling and is for that reason highly discouraged (§ 4.3.2).
属性 注入 通常 单独 用于实现而不是 抽象。那是因为在 属性 注入 的情况下,它 是 将设置的 Composition Root那种依赖。
接口注入,正如 Fowler 所描述的,似乎主要用于初始化一个组件,但如上所述,这导致Temporal Couping,因此应该加以预防。使用构造函数注入或使用方法注入而不存储依赖项。
为了更好地理解 DI,您应该阅读该书的免费 chapter 1。