我认为这个问题的答案很明显,以至于没有人费心写这个,但已经晚了,我真的无法理解这个问题。
我一直在阅读 IoC 容器(在本例中为 Windsor),但我不知道您如何从代码的各个部分与容器对话。
我得到了 DI,我一直在做穷人 DI(空构造函数调用具有默认参数实现的重载注入(inject)构造函数)一段时间,我完全可以看到容器的好处。但是,我遗漏了一条重要信息;每次需要容器服务时,您应该如何引用该容器?
我是否创建了一个我传递的单一全局实例?当然不是!
我知道我应该这样称呼:
WindsorContainer container = new WindsorContainer(new XmlInterpreter());
(例如)当我想加载我的 XML 配置时,我该如何处理容器?是否每次都创建一个新容器通过一些内部静态 majicks 或其他方式保存加载的配置,或者我是否每次都必须重新加载配置(我猜不是,或者生命周期无法工作)。
不理解这一点会阻止我弄清楚生命周期是如何工作的,并继续使用一些 IoC awsomeness
谢谢,
安德鲁
最佳答案
99% 的情况是每个应用一个容器实例。通常您在 Application_Start(对于网络应用程序)中初始化它,like this .
在那之后,就真的取决于容器的消费者了。例如,一些框架,如 Monorail和 ASP.NET MVC允许您拦截实例(在本例中为 Controller )的创建,因此您只需在容器中注册 Controller 及其依赖项,仅此而已,每当您收到请求时,容器都会负责将其依赖项注入(inject)每个 Controller 。参见示例 this ASP.NET MVC controller . 在这些框架中,您几乎不需要在类中调用甚至引用容器,这是推荐的用法。
其他框架不允许您轻松进入创建过程(如 Webforms),因此您必须求助于像 this one 这样的 hack。 ,或拉所需的依赖项(即显式调用容器)。要提取依赖项,请使用容器的静态网关,如 this one或 maxnk 描述的那个.请注意,通过这样做,您实际上是在将容器用作服务定位器,它不会分离事物以及控制反转。 (查看区别 here 和 here )
希望这能消除您的疑虑。
关于c# - IoC 容器的使用;特别是温莎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/367178/