通过


服务生存期

可以将服务注册到 暂时性、 作用域单一实例 生存期。 为每个注册的服务选择适当的生存期。

Transient

每次从服务容器请求服务时,都会创建具有 暂时 性生存期的服务。 若要将服务注册为暂时性服务,请调用 AddTransient

在处理请求的应用中,在请求结束时会释放暂时服务。 此生命周期会导致每次请求的分配,因为每次都会解析和构建服务。 有关详细信息,请参阅 有关暂时性和共享实例的 IDisposable 指南

范围内

对于 Web 应用程序, 生存期是指服务在每个客户端请求(连接)中创建一次。 在处理请求的应用中,在请求结束时会释放有作用域的服务。 通过调用 AddScoped注册作用域服务。

注释

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

范围服务应始终在作用域内使用——可以是在隐式作用域中(例如 ASP.NET Core 的每个请求作用域),也可以是在显式作用域中,通过 IServiceScopeFactory.CreateScope() 创建的。

请勿通过构造函数注入或在单一实例中请求IServiceProvider,直接解析范围服务。 这样做会导致作用域服务表现为单例,进而在处理后续请求时可能导致状态不正确。

如果创建并使用显式作用域, IServiceScopeFactory则可以在单一实例中解析作用域服务。

也没关系:

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

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

Singleton

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

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

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

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

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