我认为这个问题的答案是如此明显,以至于没有人费心写这个,但已经晚了,我真的无法理解这个问题。
我一直在阅读 IoC 容器(在本例中为 Windsor),但我不知道如何从代码的各个部分与容器进行通信。
我得到了 DI,我已经做了穷人 DI(空构造函数调用具有默认参数实现的重载注入构造函数)有一段时间了,我可以完全看到容器的好处。然而,我错过了一个重要的信息:每次需要容器提供服务时,如何引用该容器?
我是否创建一个我传递的全局实例?当然不是!
我知道我应该这样称呼:
WindsorContainer container = new WindsorContainer(new XmlInterpreter());
(例如)当我想加载 XML 配置时,那么我该如何处理容器呢?此后每次创建一个新容器是否通过一些内部静态 majicks 或其他方式保留加载的配置,或者我是否每次都必须重新加载配置(我猜不是,或者生命周期无法工作)。
不理解这一点会阻碍我弄清楚生命周期是如何工作的,也无法继续使用一些 IoC 的强大功能
Thanks,
Andrew
99% 的情况下,每个应用程序都有一个容器实例。通常您在 Application_Start 中初始化它(对于网络应用程序),像这样 https://github.com/castleproject/Castle.MonoRail-READONLY/blob/45ac205867396b1b7ad287a872e5b20afd0af837/src/TempWeb/Global.asax.cs.
之后,这实际上取决于容器的使用者。例如,一些框架,例如Monorail http://www.castleproject.org/MonoRail/ and ASP.NET MVC http://www.codeplex.com/aspnet允许您拦截实例(在本例中为控制器)的创建,因此您只需在容器中注册控制器及其依赖项即可,每当您收到请求时,容器都会负责将其依赖项注入每个控制器。参见示例这个 ASP.NET MVC 控制器 http://mvccontrib.codeplex.com/SourceControl/changeset/view/6aa25407de83#src%2fSamples%2fMvcContrib.Samples.WindsorControllerFactory%2fControllers%2fHomeController.cs。
在这些框架中,您几乎不需要在类中调用甚至引用容器,这是推荐的用法。
其他框架不允许您轻松进入创建过程(例如 Webforms),因此您必须求助于像this one http://ayende.com/Blog/archive/2007/09/03/Rhino-Igloo-ndash-MVC-Framework-for-Web-Forms.aspx, or pull所需的依赖项(即显式调用容器)。要提取依赖项,请使用容器的静态网关,例如this one https://rhino-tools.svn.sourceforge.net/svnroot/rhino-tools/trunk/commons/Rhino.Commons/RhinoContainer/IoC.cs或所描述的maxnk https://stackoverflow.com/questions/367178/usage-of-ioc-containers-specifically-windsor#367190。请注意,通过这样做,您实际上是将容器用作服务定位器,这不会解耦事物以及控制反转。 (见差异here http://martinfowler.com/articles/injection.html#ServiceLocatorVsDependencyInjection and here http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx)
希望这能消除您的疑虑。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)