Microsoft.Extensions.DependencyInjection依賴注入


為什么要使用依賴注入

輕松管理類之間的依賴,構建應用時遵循設計原則。確保代碼的可維護性和可擴展性。
依賴注入提供了對象創建和生命周期管理的核心能力

具體運用的組件:

接口實現分離模式,抽象包只需要聲明,具體包包括具體的實現。意味着我們的組件只需要依賴它的抽象接口,不需要依賴實現。當使用時注入它的具體實現即可。
好處:以后可以任務修改具體實現的內容,不需要更改代碼里面的引用邏輯代碼。

依賴注入的核心類型

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 適用於具體某個接口使用時


免責聲明!

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



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