1. 程式人生 > 其它 >.netcore 自帶依賴注入

.netcore 自帶依賴注入

.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>