- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在阅读 IoC/DI 容器时,我在几个地方(例如 here 和 here 和 here )读到容器最好只在启动时使用。
这是否意味着您需要始终依赖容器将参数注入(inject)到您需要解析的对象的构造函数中?即便如此,您是否仍然需要容器来创建这些类型?
那些使用在容器中注册的中央服务实例(通常是单例)的类呢?
那些构造函数需要未在容器中注册的类型参数的类呢?
最佳答案
While reading about IoC/DI containers, I read in a few places (e.g. here and here and here) that the container should ideally be used only at startup.
它们意味着您在应用程序启动时(或其他很早的时候)配置容器并注册所有组件。
这是有道理的,因为通常你有一个或几个根对象(例如,首先由容器实例化),如果所有对象都配置正确,容器应该从那里开始解决依赖关系。
在其他情况下,您必须从容器(例如控制台或 Windows 服务应用程序)请求根对象,因为它无法在启动时与平台集成,例如它可以为 ASP.NET WebApi 或MVC(好吧,除了汇编检测之外别无他法)。
更准确地说,在这些情况下,您需要为根对象调用Resolve
或GetInstance
(或DI 框架支持的任何内容)。
What about classes that use an instance of a central service (typically a singleton) which is registered in the container?
所有 DI 容器都支持每个容器的生命周期,这是单例基本上为您提供的。因此,您可以在容器中注册一个生命周期与容器匹配的单例实例,然后将该实例注入(inject)到您需要的地方。
编辑:事实证明我把它弄反了。您可以在此处选择向容器注册这些类并让它进行注入(inject),或者手动调用 Resolve
。但是,正如我在评论中所说,有些人认为服务定位器是一种反模式。我认为,如果您不滥用它并在向容器注册麻烦多于值得时使用它,那么就去做吧。
What about classes whose constructors require parameters of types that are not registered in the container?
我认为这就是 DI 的意义所在。如果您希望组件不使用 DI,则不要像往常一样通过 new
注册和实例化它。否则,如果 DI 容器检测到 Unresolved 依赖项,那么它很可能会抛出。它应该会抛出错误,以便您可以看到错误并进行更正。
关于c# - 为什么以及如何只在启动时使用 DI 容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25305661/
我是一名优秀的程序员,十分优秀!