生命周期
JeremyJone ... 2024-6-18 大约 1 分钟
# 生命周期
在 ASP.NET Core
中,可以将服务注册为以下任一生存周期:
- Transient(暂时)
- Scoped(作用域)
- Singleton(单例)
# Transient(暂时)
暂时 是每次从服务容器进行请求时创建的。这种生存期适合轻量级、 无状态的服务。在处理请求的应用中,在请求结束时会释放暂时服务。
通过 AddTransient<>()
进行注册。
# Scoped(作用域)
作用域 对于 Web 应用,每个客户端请求(连接)就创建一次服务。在处理请求的应用中,在请求结束时会释放有作用域的服务。
通过 Add?Scoped<>()
进行注册。
默认情况下,AddDbContext
就是作用域的生命周期。
# Singleton(单例)
单例 最好理解,首次请求时创建,或者在添加注册时直接创建,虽然这样很少使用。
单例服务应该由 DI 容器进行管理其生命周期,不要在代码中提供释放。
通过 AddSingleton<>()
进行注册。单例服务必须是线程安全的,通常在无状态服务中使用它。
# 注意事项
需要注意的是,因为生命周期不一致,所以不要:
- 从单例服务中解析作用域或暂时服务
因为这样可能会导致服务处于不正确的状态。你可以:
- 从作用域或暂时服务中解析单例服务