c# - DI 容器是否需要自己实例化对象才能使用构造函数注入(inject)?

标签 c# dependency-injection ioc-container

或者他们不是自己创建对象,而是以某种方式拦截 Hook 对象创建(例如,由 MVC 框架实例化的 Controller )并传入任何内容他们需要依赖吗?

我意识到他们需要在创建对象时做一些事情以便使用构造函数注入(inject),但我不清楚容器是否需要创建,或者他们是否以某种方式拦截对象的创建。

无论答案是什么,所有的 DI 容器都是这样做的吗?

我意识到这个问题对于最熟悉 StructureMap、Unity、Ninject 等工具的人来说可能是显而易见的……但我是新手,意识到我并不真正了解它们的幕后工作原理。我已经在互联网上搜索过,但找不到好的答案。

最佳答案

在我使用过的所有 DI/IoC 容器中,容器都会自行创建。您不会使用 new Something(dependency1, dependency2) 找到任何生产代码... 相反,您将有代码隐式或显式地向容器询问“Something 的实例”(可能是其他东西的依赖项)。然后容器负责重用 Something 的实例。 ,基于它的配置方式(以及 Something 的注释方式)。

经常显式调用构造函数的地方是在 Something 的测试中,此时容器可能根本不存在 - 或者您可能有一个特定于测试的配置,允许您以库存方式请求一些依赖项,并可能以特定于测试的方式提供其他依赖项。 (在某些情况下,您仍然不需要显式调用构造函数......如果您有容器的测试配置,例如对所有内容使用假存储,那么您可能仍然只需要请求一个 Something 的实例在你的测试中使用。)

关于c# - DI 容器是否需要自己实例化对象才能使用构造函数注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26261229/

相关文章:

c# - 在 VS 2017 中使用 MockHttpClient nuget 包

c# - 掷骰子游戏

dependency-injection - MEF(托管可扩展性框架)与 IoC/DI

c# - StructureMap - 如何注册和解析开放泛型类型

php - 如何通过 Laravel IoC 容器访问 Orchestra Xml Parser

c# - ThrowIfCancellationRequested 带或不带异步/等待?

java - 有时我不知道某些方法属于哪个类。我究竟做错了什么?

java - Seam 组件不会注入(inject)到 ExtendedDataModel 子级中

configuration - 使用 ".properties"文件的依赖注入(inject)

asp.net-mvc - 结构图和 MVC 3.0