淺談ASP.NET Core中IOC與DI的理解和使用

小隱於市發表於2019-07-02

說起IOC和DI,使用過ASP.NET Core的人對這兩個概念一定不陌生,早前,自己也有嘗試過去了解這兩個東西,但是一直覺得有點很難去理解,總覺得對其還是模糊不清,所以,趁著今天有空,就去把兩個概念捋清楚,並將學習過程的知識點記錄下來。

 一、IOC和DI的理解

1.1 什麼是IOC?

Ioc—Inversion of Control,即控制反轉,其是一種設計思想,而不是一種技術。再沒有使用IOC之前,我們一般是通過new來例項化,從而建立一個物件。但是我們使用IOC之後,建立這個物件的控制權將由內部轉換到外部,那麼這個過程便可以理解為控制反轉。

1.2 什麼是DI(依賴注入)?

全稱為Dependency Injection,意思自身物件中的內建物件是通過注入的方式進行建立。形象的說,即由容器動態的將某個依賴關係注入到元件之中。

1.3 IOC和DI的聯絡?

IOC是一種設計思想,而DI是這種設計思想的一個實現。理解IOC和DI的關鍵是:“誰依賴誰,為什麼需要依賴,誰注入誰,注入了什麼”。
●誰依賴於誰:當然是應用程式依賴於IoC容器;
●為什麼需要依賴:應用程式需要IoC容器來提供物件需要的外部資源;
●誰注入誰:很明顯是IoC容器注入應用程式某個物件,應用程式依賴的物件;
●注入了什麼:就是注入某個物件所需要的外部資源(包括物件、資源、常量資料)

 1.4 為啥需要反轉?

為了在業務變化的時候儘量減少改動程式碼造成的問題。

1.5 使用DI的好處?

1)讓程式之間鬆散耦合,減少依賴,有利於功能複用。
2)讓程式整體結構更加靈活,有利於單元測試。

1.6 常見的IOC框架。

微軟自帶DI、Autofac、Unity

二、.NET Core自身DI使用

2.1.NET Core自身DI

ASP.NET Core本身已經整合了一個輕量級的IOC容器,開發者只需要定義好介面後,在Startup.cs的ConfigureServices方法裡使用對應生命週期的繫結方法即可,常見方法如下

在start.up類中ConfigureServices方法對例項進行註冊

services.AddTransient<IApplicationService,ApplicationService>();
services.AddSingleton<IApplicationService,ApplicationService>(); 
services.AddScoped<IApplicationService,ApplicationService>();

這三個方法都是將我們例項註冊進去,只不過是生命週期不一樣。

AddSingleton:整個應用程式生命週期以內只建立一個例項,相當於一個靜態類。

AddScoped:在同一個Scope內只初始化一個例項 ,可以理解為( 每一個request級別只建立一個例項,同一個http request會在一個 scope內)。

AddTransient:每一次都會建立一個新的例項。

 2.2 Demo應用

1)首先定義好一個IUserService介面,然後實現該介面
 2)在startup.cs類中ConfigureServices方法中新增下面程式碼
3)通過建構函式來注入

4)執行,檢視結果

 三、 採用Autofac替換IOC容器

Autofac是一款輕量級的IOC框架,目前和ASP.NET Core結合的非常好,官方網站http://autofac.org,原始碼下載地址https://github.com/autofac/Autofac

1)在Nuget中引入兩個:Autofac.Extras.DynamicProxy(Autofac的動態代理,它依賴Autofac,所以可以不用單獨引入Autofac)、Autofac.Extensions.DependencyInjection(Autofac的擴充套件)
2)在startup.cs類中ConfigureServices方法中新增以下程式碼:(注意:把返回值型別改為IServiceProvider)
var builder = new ContainerBuilder();//例項化Autofac容器
            builder.RegisterType<UserService>().As<IUserService>();//註冊要通過反射建立的元件
            builder.Populate(services);
            var ApplicationContainer = builder.Build();
            return new AutofacServiceProvider(ApplicationContainer);//第三方IOC接管

3)同樣也是通過建構函式進行注入

4)執行,檢視結果

四、總結

本篇文章,主要是講了IOC和DI的關係,以及通過微軟自帶的IOC框架和Autofac實現在ASP.NET Core中進行簡單注入,其最大的優點就是實現瞭解耦的作用。同樣,本篇文章也是為了記錄自己學習的過程,後續有時間將會繼續深入研究關於Autofac的內容。

好文參考:https://www.cnblogs.com/laozhang-is-phi/p/9541414.html(老張的哲學)

 

相關文章