1. 程式人生 > 實用技巧 >IOC/DI概念簡述及基本應用

IOC/DI概念簡述及基本應用

早幾年面試時,面試官經常問我依賴注入的概念,但有面試官自己都不是很清楚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>();

希望對大家有幫助。