ASP.NET Core 中的 AddSingleton、AddTransient、AddScoped 有什么区别?

yufei       3 年 前       1549

从功能上看,AddSingleton()AddTransient()AddScoped() 都是依赖注入(DI) 的方式向系统中注入对象或服务。这就是我们疑惑的地方,因为三个方法的功能几乎一样。

但是它们的生命周期(作用范围、作用时间、作用域)是不一样的:

  1. AddSingleton() 的生命周期为 项目启动 -> 项目结束,即存在于整个应用的生命周期内,相当于全局单例模式。
  2. AddScoped() 的生命周期为 Http 请求开始 -> Http 响应结束,即存在于每一个 HTTP 请求周期内
  3. AddTransient() 的生命周期为 请求服务对象开始 -> (GC 主动回收-主动释放),即仅限于程序作用域

因为生命周期的不一样,如果一个作用域范围内同时存在以上三种方式注入的服务或对象,那么在使用时,权重就是下面这样

AddSingleton < AddTransient < AddScoped

也就是

  1. AddSingleton() 创建的对象可以在 AddTransient()AddScoped() 对象中使用。
  2. AddTransient() 创建的对象基本可以在 AddScoped() 对象中使用,但有时候也不行。
  3. AddScoped() 创建的对象几乎不能在 AddTransient() 对象中使用,但并不绝对。

为什么是这样的呢?

这是因为 AddScoped() 对象是在接受一个 Http 请求时创建的,所以不能在 AddSingleton() 对象中使用,甚至也不能在 AddTransient() 对象中使用

P.S 后面这句话其实大多数时候感觉在绕弯弯,哎,只能经历多了大概就懂了来解释了**

目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.