gpt4 book ai didi

dependency-injection - .Net 核心 DI 范围验证,范围与 transient ?

转载 作者:行者123 更新时间:2023-12-04 02:44:55 26 4
gpt4 key购买 nike

阅读docs :

When the app is running in the Development environment, the default service provider performs checks to verify that:

  • Scoped services aren't directly or indirectly resolved from the root service provider.
  • Scoped services aren't directly or indirectly injected into singletons


这意味着我不应该将 Scoped 服务注入(inject)到单例服务中。

基于 transient 服务在每次被请求时都会创建一个实例的事实,VS 范围内的服务在整个请求的生命周期中都是单个实例:

问题:

为什么 DI 只验证范围服务而不验证临时服务?

最佳答案

It's dangerous to resolve a scoped service from a singleton. It may cause the service to have incorrect state when processing subsequent requests.



来自 Docs上面描述了他们为什么做这个检查。为了更好地理解这一点,我开始阅读关于各种生命周期的更多信息,我自己是一个 autofac 人,以了解注册的 .net 核心风格。
  • 范围注册需要一个服务生命周期
    每个请求的实例(连接)
  • 单例在注册时或构造函数运行时仅定义一个状态。
    (在 startup.cs 中)
  • transient 是每个构造函数注入(inject)的新实例,即每个
    依赖。

  • 通常,您会使用单例模式来为您的应用程序生命周期等维护内存中的某种状态,有很多用例,但重要的是要了解单例类的构造函数(注入(inject)依赖项的位置)将 只运行一次为您的整个应用程序生命周期。

    您可以想象在考虑到上述情况的同时将作用域或 transient 服务注入(inject)单例会导致一些......意想不到的结果,您期望您的服务遵守其特定的生命周期,但实际上它实际上只是同一个实例每次都是由于单例的性质。

    用我的理解回答你的问题:注入(inject)单例的 transient (虽然本质上不正确)仍然可以正常工作,因为它的生命周期很短并且几乎没有破坏状态的风险,而作用域保证了单个请求的生命周期(想想某种以请求缓存为例),作用域无法在注入(inject)单例时遵守该生命周期。

    关于dependency-injection - .Net 核心 DI 范围验证,范围与 transient ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57620528/

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