為什么要使用依賴注入
輕松管理類之間的依賴,構建應用時遵循設計原則。確保代碼的可維護性和可擴展性。
依賴注入提供了對象創建和生命周期管理的核心能力
具體運用的組件:
接口實現分離模式,抽象包只需要聲明,具體包包括具體的實現。意味着我們的組件只需要依賴它的抽象接口,不需要依賴實現。當使用時注入它的具體實現即可。
好處:以后可以任務修改具體實現的內容,不需要更改代碼里面的引用邏輯代碼。
依賴注入的核心類型
IserviceCollection:負責服務的注冊
ServiceDescriptor:每個服務注冊時的信息
IserviceProvider:具體的容器,也是由servicecollection build出來的
IserviceScope:表示一個容器的子容器的生命周期
######生命周期 是由IserviceScope繼承的
#######單例singleton:整個生命周期都是一致的
#######作用域 scoped:容器的生存周期內是一致的,二次請求會更新
#######瞬間 Transient:每次從容器獲取對象時都是一個全新的對象
測試聲明周期 附代碼
先創建不同的生命周期的三個接口和三個類
namespace HostWebDetail
{
//聲明三個接口 測試生命周期 分別為單例,作用域,瞬間
public interface IMySingletonService
{
}
public interface IMyScopedService
{
}
public interface IMyTransientService
{
}
//聲明方法 繼承接口
public class MySingletonService: IMySingletonService
{
}
public class MyScopedService: IMyScopedService
{
}
public class MyTransientService: IMyTransientService
{
}
}
然后在startup中依賴注入
public void ConfigureServices(IServiceCollection services)
{
#region 注冊服務不同生命周期的服務
services.AddSingleton<IMySingletonService, MySingletonService>();
services.AddScoped<IMyScopedService, MyScopedService>();
services.AddTransient<IMyTransientService, MyTransientService>();
#endregion
}
然后在控制器中實現
[Route("ServiceLifetime")]
[HttpGet]
//FromServices從容器里獲取我們的對象
//每個對象輸出兩次 對比它的變化
public List<string> GetServiceLifetime(
[FromServices] IMySingletonService singleton1,
[FromServices] IMySingletonService singleton2,
[FromServices] IMyScopedService scoped1,
[FromServices] IMyScopedService scoped2,
[FromServices] IMyTransientService transient1,
[FromServices] IMyTransientService transient2)
{
var s = new List<string>();
s.Add($"singleton1:{singleton1.GetHashCode()}");
s.Add($"singleton2:{singleton2.GetHashCode()}");
s.Add($"scoped1:{scoped1.GetHashCode()}");
s.Add($"scoped2:{scoped2.GetHashCode()}");
s.Add($"transient1:{transient1.GetHashCode()}");
s.Add($"transient2:{transient2.GetHashCode()}");
return s;
}
執行效果
依賴注入的二種方式:構造函數和formservice
1構造函數:適用於大部分方法都需要該方法的情況下 2 FromService 適用於具體某個接口使用時