c# - IoC 容器的使用;特别是温莎

标签 c# inversion-of-control castle-windsor

我认为这个问题的答案很明显,以至于没有人费心写这个,但已经晚了,我真的无法理解这个问题。

我一直在阅读 IoC 容器(在本例中为 Windsor),但我不知道您如何从代码的各个部分与容器对话。

我得到了 DI,我一直在做穷人 DI(空构造函数调用具有默认参数实现的重载注入(inject)构造函数)一段时间,我完全可以看到容器的好处。但是,我遗漏了一条重要信息;每次需要容器服务时,您应该如何引用该容器?

我是否创建了一个我传递的单一全局实例?当然不是!

我知道我应该这样称呼:

WindsorContainer container = new WindsorContainer(new XmlInterpreter());

(例如)当我想加载我的 XML 配置时,我该如何处理容器?是否每次都创建一个新容器通过一些内部静态 majicks 或其他方式保存加载的配置,或者我是否每次都必须重新加载配置(我猜不是,或者生命周期无法工作)。

不理解这一点会阻止我弄清楚生命周期是如何工作的,并继续使用一些 IoC awsomeness

谢谢,

安德鲁

最佳答案

99% 的情况是每个应用一个容器实例。通常您在 Application_Start(对于网络应用程序)中初始化它,like this .

在那之后,就真的取决于容器的消费者了。例如,一些框架,如 MonorailASP.NET MVC允许您拦截实例(在本例中为 Controller )的创建,因此您只需在容器中注册 Controller 及其依赖项,仅此而已,每当您收到请求时,容器都会负责将其依赖项注入(inject)每个 Controller 。参见示例 this ASP.NET MVC controller . 在这些框架中,您几乎不需要在类中调用甚至引用容器,这是推荐的用法。

其他框架不允许您轻松进入创建过程(如 Webforms),因此您必须求助于像 this one 这样的 hack。 ,或所需的依赖项(即显式调用容器)。要提取依赖项,请使用容器的静态网关,如 this onemaxnk 描述的那个.请注意,通过这样做,您实际上是在将容器用作服务定位器,它不会分离事物以及控制反转。 (查看区别 herehere )

希望这能消除您的疑虑。

关于c# - IoC 容器的使用;特别是温莎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/367178/

相关文章:

php - 如何引导 Laravel 命令行脚本?

.net - CaSTLe Windsor IoC 未将 log4net 注入(inject)我的 Controller

c# - NEST 2.0和ElasticSearch 2中的重大更改

c# - 扩展正则语言框架中正则语言的算法复杂度

c# - 如何为 MvvmCross 测试设置属性注入(inject)?

c# - 如何在更高的类中使用覆盖的属性值?

c# - CaSTLe Windsor 拦截器不适用于方法级属性

c# - 如何将已解析的实例从控制反转传递给应用程序中的类?

c# - 如何覆盖在某些测试中使用 IWebHostBuilder.ConfigureTestServices 模拟的服务

C# HttpClient 文件流内容边界头错误