.net 服务生存期

服务生存期

可以使用以下任一生存期注册服务:

  • 暂时
  • 作用域
  • 单例

下列各部分描述了上述每个生存期。 为每个注册的服务选择适当的生存期。

暂时

暂时生存期服务是每次从服务容器进行请求时创建的。 这种生存期适合轻量级、 无状态的服务。 向 AddTransient 注册暂时性服务。

在处理请求的应用中,在请求结束时会释放暂时服务。

范围内

对于 Web 应用,指定了作用域的生存期指明了每个客户端请求(连接)创建一次服务。 向 AddScoped 注册范围内服务。

在处理请求的应用中,在请求结束时会释放有作用域的服务。

使用 Entity Framework Core 时,默认情况下 AddDbContext 扩展方法使用范围内生存期来注册 DbContext 类型。

 备注

不要从单一实例解析限定范围的服务,并小心不要间接地这样做,例如通过暂时性服务。 当处理后续请求时,它可能会导致服务处于不正确的状态。 可以:

  • 从范围内或暂时性服务解析单一实例服务。
  • 从其他范围内或暂时性服务解析范围内服务。

默认情况下在开发环境中,从具有较长生存期的其他服务解析服务将引发异常。 有关详细信息,请参阅作用域验证

单例

创建单例生命周期服务的情况如下:

  • 在首次请求它们时进行创建;或者
  • 在向容器直接提供实现实例时由开发人员进行创建。 很少用到此方法。

来自依赖关系注入容器的服务实现的每一个后续请求都使用同一个实例。 如果应用需要单一实例行为,则允许服务容器管理服务的生存期。 不要实现单一实例设计模式,或提供代码来释放单一实例。 服务永远不应由解析容器服务的代码释放。 如果类型或工厂注册为单一实例,则容器自动释放单一实例。

向 AddSingleton 注册单一实例服务。 单一实例服务必须是线程安全的,并且通常在无状态服务中使用。

在处理请求的应用中,当应用关闭并释放 ServiceProvider 时,会释放单一实例服务。 由于应用关闭之前不释放内存,因此请考虑单一实例服务的内存使用。

 

不同

  • 暂时性对象始终不同。 IndexModel 和中间件中的临时 OperationId 值不同。
  • 范围内对象对每个请求而言是相同的,但在请求之间不同。
  • 单一实例对象对于每个请求是相同的。

 

posted @ 2021-04-23 16:20  顾小凡  阅读(59)  评论(0)    收藏  举报