說起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容器來提供物件需要的外部資源;
●誰注入誰:很明顯是IoC容器注入應用程式某個物件,應用程式依賴的物件;
●注入了什麼:就是注入某個物件所需要的外部資源(包括物件、資源、常量資料)
1.4 為啥需要反轉?
1.5 使用DI的好處?
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應用
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的擴充套件)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(老張的哲學)