.Net核心DI范围验证,范围还是临时?

时间:2019-08-23 05:51:51

标签: dependency-injection .net-core

阅读docs

  

应用在开发环境中运行时,默认   服务提供商进行检查以确认:

     
      
  • 范围服务不会直接或间接地从根服务提供商处解决。
  •   
  • 作用域服务不会直接或间接注入到单例中
  •   

这意味着我不应该将范围服务注入到单例服务中。

基于瞬态服务在每次请求时都会创建一个实例的事实,VS作用域服务在请求的整个生命周期中都是单个实例:

问题:

为什么DI只验证作用域服务而不验证瞬时服务?

1 个答案:

答案 0 :(得分:4)

  

从单例中解析作用域服务很危险。处理后续请求时,可能导致服务的状态不正确。

以上Docs中描述了他们进行此检查的原因。为了更好地理解这一点,我开始阅读各种有关生命的文章,而我本人则是一个了解.net核心注册样式的人。

  • 范围注册需要一个服务生命周期为一个 每个请求(连接)的实例
  • Singleton在注册或构造函数运行时仅定义一个状态。 (在startup.cs中)
  • 瞬态是每个构造函数注入的新实例,即每个 依赖性。

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

您可以想象,在不考虑上述情况的情况下将范围化或临时性服务注入到singleton中会导致一些...意外的结果,您希望您的服务遵守其特定的生存时间,但实际上它实际上只是由于单例的性质,每次都具有相同的实例。

使用我的理解来回答您的问题:注入到一个单例中的瞬态(虽然本质上是不正确的)仍然可以正常工作,因为它的生存期很短并且几乎没有破坏状态的风险,而作用域保证了单个请求的生存期(以某种类型的请求缓存为例),在将作用域注入到单例中时,没有办法使作用域能够保留该生存期。