IOC/DI概念簡述及基本應用
阿新 • • 發佈:2020-06-25
早幾年面試時,面試官經常問我依賴注入的概念,但有面試官自己都不是很清楚ioc和di的區別,而是草草歸於一類,今天翻了翻以前寫的demo,順便把這部分概念整理出來,加深一下印象。
先科普一下,IOC是什麼
IOC(Inversion of Control)又稱控制反轉,它並不是指某種技術實現,而是OOP的一種設計原則。
這個概念基礎不牢靠的同學很多都是和DI混淆的,包括我曾經遇到幾個面試官也是這樣(面試過程極其尷尬),這裡著重強調。
為什麼叫控制反轉?傳統程式設計中,我們經常使用 new 建立物件,這種做法是我們主動去建立依賴物件,可以理解為“正轉”。
如果把建立物件(new)的操作移交給某個程式(IOC容器)來控制,就理解為“反轉”。也就是說,就是把建立物件交給IOC容器去做,將控制權反轉給IOC容器。
什麼是DI
DI(Dependency Injection)又稱依賴注入,是IOC的一種實現方式。
言簡意賅的講,由容器動態建立依賴關係並注入到元件中去。依賴注入並不能給程式帶來更多功能,卻可以提升元件重用率、系統可擴充套件性,讓程式更靈活。
.Net Core的實現
net core自帶IOC容器(也許你聽過這一句:一切皆注入),只需要簡單配置即可使用。
先新建一個core專案,然後編寫介面和實現類:
public interface IProduct
{
void Get();
} public class Product : IProduct
{
public void Get(){
throw new NotImplementedException();
}
}
之後進入Startup進行配置:
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IProduct, Product>();
}
接下來是程式碼環節:
public class Test
{
private IProduct Pro { get; set; } public UserController(IProduct pro){
Pro = pro;
} public void Get()
{
//實現
Pro.Get();
}
}
別走,還沒完
還有一個點需要注意,那就是生命週期。一般來說,既然問到了IOC,那麼生命週期必然也會引出,所以一定要搞清楚。
生命週期有三種:
(單例模式)Singleton:首次請求建立,之後所有請求都沿用這個已建立的服務。
(瞬態模式)Transient:每次請求都建立,上面的程式碼裡就是這種模式。
(作用域模式)Scoped:每次請求建立,同一個請求內不管呼叫多少次都只會被建立一次。
//瞬態
services.AddTransient<IProduct, Product>(); //作用域
services.AddScoped<IProduct, Product>(); //單例
services.AddSingleton<IProduct, Product>();
希望對大家有幫助。