在 ASP.NET 中,**Transient** 和 **Scoped** 是使用 **依赖注入 (DI)** 时两种不同类型的 **依赖生命周期**。这些生命周期决定了在整个应用程序生命周期中如何创建和管理服务实例。它们之间的区别如下:
1. 瞬态
生命周期:每次请求时都会创建一个新的服务实例。用例:适用于轻量级、无状态的服务,这些服务不需要在请求之间维持任何状态。范围:每次请求一个实例时,即使在同一个 HTTP 请求中,您也会获得一个新对象。示例:执行小任务(如格式化字符串或记录特定于方法调用的内容)的服务。services.AddTransient();
在这种情况下,每次注入`IService`时,都会创建一个新的`ServiceImplementation`实例。
2. 范围
生命周期:每次请求(或每个范围)都会创建一个新的服务实例。这意味着在单个 HTTP 请求或操作中,同一个实例将在不同的组件中使用。用例:非常适合需要在单个 HTTP 请求持续期间保持状态的服务(例如,与数据库交互的服务,您希望在整个请求过程中使用相同的实例)。范围:每个 HTTP 请求(或明确定义的范围)都会创建一次实例。如果同一请求中的多个组件请求该服务,它们将获得同一个实例。services.AddScoped();
在这种情况下,在单个 HTTP 请求中,每个请求“IService”的组件都将获得相同的“ServiceImplementation”实例。
主要区别:
在它们之间进行选择:
当服务不需要保持状态或以需要维护单个实例的方式依赖于其他服务时,请使用 Transient。当服务在请求持续期间保持某种状态时使用 Scoped(例如,数据库上下文、依赖于单个请求生命周期的服务)。