AddTransient、AddSingleton、AddScoped的區別


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  僅作為學習記錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM