为什么以及如何在启动时使用DI容器?

时间:2014-08-14 10:19:29

标签: c# dependency-injection inversion-of-control

在阅读IoC / DI容器时,我读了几个地方(例如hereherehere),理想情况下,容器应该只在启动时使用。

这是否意味着您需要始终依赖容器将参数注入需要解决的对象的构造函数?即使这样,你还不需要容器来创建那些类型吗?

使用在容器中注册的中央服务实例(通常是单例)的类怎么样?

那些构造函数需要未在容器中注册的类型参数的类呢?

1 个答案:

答案 0 :(得分:3)

  

在阅读IoC / DI容器时,我在几个地方读过(例如   这里和这里和这里)理想情况下应该只使用容器   在启动时。

它们意味着您配置容器并在应用程序启动时(或非常早)注册所有组件。

这是有道理的,因为通常你有一个或几个根对象(例如,首先由容器实例化),如果所有这些对象都配置正确,那么容器上应该解析依赖关系。

在其他情况下,您必须从容器(例如控制台或Windows服务应用程序)请求根对象,因为它无法在启动时与平台集成,就像它可以为ASP.NET WebApi或MVC(嗯,除组装仪器外没有办法)。

更确切地说,在这些情况下,您需要为根对象调用ResolveGetInstance(或DI框架支持的任何内容)。

  

使用中央服务实例的类怎么样?   (通常是单身人士)在集装箱中注册?

所有DI容器都支持每个容器的生命周期,这是单身人士基本上给你的。因此,您可以在容器中注册单个实例,其生命周期与容器的生命周期相匹配,然后将该实例注入您需要的位置。

编辑:事实证明我倒退了。您可以在这里选择使用容器注册这些类并让它进行注入,或者手动调用Resolve。但是,正如我在评论中所说,有些人认为服务定位器是一种反模式。我认为,如果你没有滥用它并使用它,当注册容器更麻烦,那就去做吧。

  

那些构造函数需要类型参数的类呢?   没有在容器中注册?

我认为这是DI的重点。如果您希望组件不使用DI,则不要注册它并像往常一样通过new实例化它。 否则,如果DI容器检测到未解析的依赖关系,那么它很可能会抛出。它应该抛出,这样你就可以看到错误并纠正它。