說起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(老張的哲學)
