生命周期

JeremyJone ... 2023-7-13 大约 1 分钟

# 生命周期

ASP.NET Core 中,可以将服务注册为以下任一生存周期:

  • Transient(暂时)
  • Scoped(作用域)
  • Singleton(单例)

# Transient(暂时)

暂时 是每次从服务容器进行请求时创建的。这种生存期适合轻量级、 无状态的服务。在处理请求的应用中,在请求结束时会释放暂时服务。

通过 AddTransient<>() 进行注册。

# Scoped(作用域)

作用域 对于 Web 应用,每个客户端请求(连接)就创建一次服务。在处理请求的应用中,在请求结束时会释放有作用域的服务。

通过 Add?Scoped<>() 进行注册。

默认情况下,AddDbContext 就是作用域的生命周期。

# Singleton(单例)

单例 最好理解,首次请求时创建,或者在添加注册时直接创建,虽然这样很少使用。

单例服务应该由 DI 容器进行管理其生命周期,不要在代码中提供释放。

通过 AddSingleton<>() 进行注册。单例服务必须是线程安全的,通常在无状态服务中使用它。

# 注意事项

需要注意的是,因为生命周期不一致,所以不要:

  • 单例服务中解析作用域暂时服务

因为这样可能会导致服务处于不正确的状态。你可以:

  • 作用域暂时服务中解析单例服务