从功能上看,AddSingleton()、AddTransient()、AddScoped() 都是依赖注入(DI) 的方式向系统中注入对象或服务。这就是我们疑惑的地方,因为三个方法的功能几乎一样。
但是它们的生命周期(作用范围、作用时间、作用域)是不一样的:
AddSingleton()的生命周期为 项目启动 -> 项目结束,即存在于整个应用的生命周期内,相当于全局单例模式。AddScoped()的生命周期为 Http 请求开始 -> Http 响应结束,即存在于每一个 HTTP 请求周期内。AddTransient()的生命周期为 请求服务对象开始 -> (GC 主动回收-主动释放),即仅限于程序作用域。
因为生命周期的不一样,如果一个作用域范围内同时存在以上三种方式注入的服务或对象,那么在使用时,权重就是下面这样
AddSingleton < AddTransient < AddScoped
也就是
AddSingleton()创建的对象可以在AddTransient()和AddScoped()对象中使用。AddTransient()创建的对象基本可以在AddScoped()对象中使用,但有时候也不行。AddScoped()创建的对象几乎不能在AddTransient()对象中使用,但并不绝对。
为什么是这样的呢?
这是因为 AddScoped() 对象是在接受一个 Http 请求时创建的,所以不能在 AddSingleton() 对象中使用,甚至也不能在 AddTransient() 对象中使用。
P.S 后面这句话其实大多数时候感觉在绕弯弯,哎,只能经历多了大概就懂了来解释了**
目前尚无回复