gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:04:20 25 4
gpt4 key购买 nike

在阅读 IoC/DI 容器时,我在几个地方(例如 hereherehere )读到容器最好只在启动时使用。

这是否意味着您需要始终依赖容器将参数注入(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(好吧,除了汇编检测之外别无他法)。

更准确地说,在这些情况下,您需要为根对象调用ResolveGetInstance(或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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com