正在阅读docs https://learn.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.2#scope-validation :
当应用程序在开发环境中运行时,默认
服务提供商执行检查以验证:
- 范围服务不是直接或间接从根服务提供者解析的。
- 作用域服务不会直接或间接注入到单例中
这意味着我不应该将作用域服务注入到单例服务中。
基于瞬态服务在每次请求时都会创建一个实例的事实,VS 作用域服务在整个请求的生命周期中都是单个实例:
问题:
为什么 DI 只验证范围服务而不验证瞬态服务?
从单例解析范围服务是危险的。它可能会导致服务在处理后续请求时出现不正确的状态。
来自Docs https://learn.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.2上面描述了他们为什么要做这个检查。为了更好地理解这一点,我自己开始阅读有关各种生命周期的内容,以了解注册的 .net core 风格。
- 范围注册需要服务生命周期为一
每个请求的实例(连接)
- Singleton 仅在注册时或构造函数运行时定义一个状态。
(在
startup.cs
)
- 瞬态是每个构造函数注入的一个新实例,即每个
依赖性。
一般来说,您会使用单例模式在应用程序生命周期等中维护内存中的某种状态,有很多用例,但重要的是要了解单例类的构造函数(您注入依赖项的位置)将运行一次且仅运行一次在您的整个应用程序生命周期内。
您可以想象,在考虑到上述情况的同时,将作用域或瞬态服务注入到单例中会导致一些……意想不到的结果,您期望您的服务遵守其特定的生命周期,但实际上它实际上只是同一个实例每次都是由于单例的性质。
用我的理解来回答你的问题:注入到单例中的瞬态(虽然本质上不正确)仍然可以正常工作,因为它的生命周期很短并且几乎没有破坏状态的风险,而范围保证了单个请求的生命周期(想想某种以请求缓存为例),作用域在被注入到单例中时无法遵守该生命周期。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)