AddTransient、AddSingleton、AddScoped的區別
權重:
AddSingleton→AddTransient→AddScoped
AddSingleton的生命周期:
項目啟動-項目關閉 相當於靜態類 只會有一個
AddScoped的生命周期:
請求開始-請求結束 在這次請求中獲取的對象都是同一個
AddTransient的生命周期:
請求獲取-(GC回收-主動釋放) 每一次獲取的對象都不是同一個
控制器
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[HttpGet]
public
IActionResult SetTest()
{
sing.Age = 18;
sing.Name =
"小紅"
;
tran.Age = 19;
tran.Name =
"小明"
;
scon.Age = 20;
scon.Name =
"小藍"
;
aService.RedisTest();
return
Json(
"OK"
);
}
|
注入
|
1
2
3
4
5
6
|
public
static
void
AddTestTran(
this
IServiceCollection service) {
service.AddTransient<ITranTest, TranTest>();
service.AddSingleton<ISingTest, SingTest>();
service.AddScoped<ISconTest, SconTest>();
service.AddScoped<IAService, AService>();
}
|
服務:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public
class
AService: IAService
{
private
ISingTest sing; ITranTest tran; ISconTest scon;
public
AService(ISingTest sing, ITranTest tran, ISconTest scon)
{
this
.sing = sing;
this
.tran = tran;
this
.scon = scon;
}
public
void
RedisTest()
{
}
}
|


AddSingleton的對象沒有變
AddScoped的對象沒有變化
AddTransient的對象發生變化
------------------------------------------------------------
請求get

AddSingleton的對象沒有變
AddScoped的對象發生變化
AddTransient的對象發生變化
注意:
由於AddScoped對象是在請求的時候創建的
所以不能在AddSingleton對象中使用
甚至也不能在AddTransient對象中使用
所以權重為
AddSingleton→AddTransient→AddScoped
不然則會拋如下異常

出處:https://www.cnblogs.com/AnAng/p/9370913.html
