.netcore 自帶依賴注入
阿新 • • 發佈:2022-05-10
.net core主要提供了三種依賴注入的方式
AddTransient瞬時模式:每次請求,都獲取一個新的例項。即使同一個請求獲取多次也會是不同的例項
AddScoped:每次請求,都獲取一個新的例項。同一個請求獲取多次會得到相同的例項
AddSingleton單例模式:每次都獲取同一個例項
權重:
AddSingleton→AddTransient→AddScoped
AddSingleton的生命週期:
專案啟動-專案關閉 相當於靜態類 只會有一個
AddScoped的生命週期:
請求開始-請求結束 在這次請求中獲取的物件都是同一個
AddTransient的生命週期:
請求獲取-(GC回收-主動釋放) 每一次獲取的物件都不是同一個
問題:如果我們需要注入的物件很多怎麼辦?(通過反射來解決)
新建擴充套件方法CoreExtensions,然後在Startup中ConfigureServices方法中加上 services.AddRepository();。
注入介面
1 services.AddScoped(typeof(IUserService), typeof(UserService)); 2 services.AddScoped<IUserService, UserService>();
無介面,自己注入自己
services.AddScoped<UserService>(); services.AddScoped( typeof(UserService));
注入,建構函式傳參
1 services.AddScoped<IUserService, UserSerivce>(x => {return new UserSerivce("");}); 2 services.AddScoped<IUserService>(x => {return new UserSerivce("");}); 3 services.AddScoped(typeof(IUserService), x => {return new UserSerivce("");});
注入,建構函式傳參,需要依賴另一服務
1 services.Add<IUserService, UserService>(x => {return new UserService(x.GetServce<SomeService>());});
動態注入多個介面實現
1 var assembly = Assembly.GetExecutingAssembly().DefinedTypes.Where(a => a.Name.EndsWith("Service") && !a.Name.StartWith("I")); 2 foreach(var assm in assembly) 3 { 4 services.AddTransient(assm.GetInterfaces.FirstOrDefault(), assm); 5 }
呼叫的時候:IEnumerable<IUserService>