在 ASP.NET Core 中,依赖注入(DI)是内置的核心功能之一。正确选择服务的生命周期对应用的性能、资源管理和行为一致性至关重要。ASP.NET Core 提供了三种主要的服务生命周期,每种适用于不同的场景。
1. Transient(瞬态)
特点:每次请求都会创建一个新的实例。
适合用于轻量级、无状态的服务。例如工具类、策略实现或不需要共享状态的简单服务。
建议使用场景: 服务是无状态的 实现逻辑简单,创建开销小 需要隔离调用上下文,避免数据污染比如:数据验证器、格式化工具等。
2. Scoped(作用域)
特点:在同一个请求内共享一个实例,不同请求之间相互独立。
这是 Web 应用中最常用的生命周期,尤其适用于与数据库上下文、用户会话相关的服务。
建议使用场景: Entity Framework 的 DbContext 需要在一次请求中保持状态的服务 服务依赖其他 scoped 或 singleton 实例注意:在中间件或后台任务中使用 scoped 服务时,需通过
IServiceScope手动创建作用域,避免内存泄漏。
3. Singleton(单例)
特点:整个应用程序生命周期中只创建一个实例,由容器管理其生命周期。
适用于全局共享、开销大或需要持久化状态的服务。
建议使用场景: 配置管理器、缓存服务(如 IMemoryCache) 日志记录器(虽然通常由框架注册) 跨请求共享的数据或连接池注意:不要在 Singleton 服务中直接注入 scoped 或 transient 服务,否则可能导致对象生命周期错乱(如 DbContext 被长期持有)。
如何选择?关键判断点
选择生命周期的本质是权衡实例的共享范围和资源消耗。
是否需要跨请求共享?→ 选 Singleton 是否在单个请求内共享?→ 选 Scoped 是否每次都要全新实例?→ 选 Transient常见错误:将数据库上下文注册为 Singleton,会导致多线程访问异常或数据不一致。
基本上就这些。合理利用这三种生命周期,结合实际业务需求,才能构建出稳定高效的 ASP.NET Core 应用。
