为什么以及如何只在启动时使用DI容器
本文关键字:DI 容器 启动 为什么 | 更新日期: 2023-09-27 18:18:02
在阅读有关IoC/DI容器的内容时,我在一些地方(例如这里,这里和这里)读到容器应该理想地仅在启动时使用。
这是否意味着您需要始终依赖容器向需要解析的对象的构造函数注入参数?即使这样,您是否仍然需要容器来创建这些类型?
使用在容器中注册的中心服务实例(通常是单例)的类怎么办?
如果类的构造函数要求的参数类型不是在容器中注册的,该怎么办?
在阅读有关IoC/DI容器时,我在几个地方(例如:这里,这里和这里),理想情况下,容器应该只使用在启动.
意味着你要配置容器,并在应用程序启动时(或很早的时候)注册所有组件。
这是有意义的,因为通常你有一个或几个根对象(例如,首先由容器实例化),如果所有的根对象都配置正确,容器应该从那里开始解析依赖关系。
在其他情况下,你必须从容器(例如控制台或Windows服务应用程序)请求根对象,因为它没有办法在启动时与平台集成,就像它可以做的那样,例如ASP。. NET WebApi或MVC(好吧,没有办法,除了汇编仪表)。
更确切地说,在这些情况下,您需要为根对象调用Resolve
或GetInstance
(或DI框架支持的任何内容)。
使用中心服务实例的类怎么办(通常是一个单例)在容器中注册?
所有的DI容器都支持每个容器的生命周期,这基本上就是单例提供给你的。因此,你可以在容器中注册一个生命周期与容器匹配的单例实例,然后在需要的地方注入该实例。
编辑:事实证明我搞反了。您可以选择在容器中注册这些类并让它进行注入,或者手动调用Resolve
。然而,正如我在评论中所说,有些人认为服务定位器是一种反模式。我认为,如果你不滥用它,当它比注册容器更麻烦的时候使用它,那就去做吧。
构造函数要求形参类型为没有在集装箱内登记吗?
我认为这就是DI的意义所在。如果你想要一个组件不使用DI,那么不要注册它,并像往常一样通过new
实例化它。否则,如果DI容器检测到未解析的依赖项,那么它很可能会抛出。它应该会抛出,这样你就可以看到错误并纠正它