DI (Dependency Injection) & IoC (Inversion of Control)

INexLin
Oct 22, 2020

--

Net Core整個都圍繞的DI的概念,讓我們先來了解DI & IoC

前言

CustomerController提供如下兩支API:

1. A品牌客戶是否為VIP => GetVIPStatus(string userid)

2. 取得參與過的會員活動 => GetActivities(string userid)

另建立一CustomerService類別提供如上兩支API資料撈取與撰寫商業邏輯

在CustomerController要使用CustomerService的方法首先想到的是透過new CustomerService()的方式。因此CustomerController增加如下代碼:

CustomerService CustomerService = new CustomerService();

我們可用下圖表示兩個類別關係,CusotmerController依賴CustomerService。意即當CustomerService有任何更動,CustomerController可能也需要做相對應的修改。

假設B品牌也需要上述兩支API,且B品牌有特定邏輯,我們可能會將CustomerService改寫如下:

因為相依性CustomerController使用到CustomerService的方法也需要做對應的修改,多傳入brand參數。

此種開發架構(高耦合、低內聚),可能會發生如下問題:

1. 如果參考CustomerService的Controller有很多個,當CustomerService邏輯內容變更,就需要更改A Controller、B Controller、C Controller….,CustomerService修改一小部分,可能造成很多地方都出錯,要額外花費時間去修正衍生的錯誤。

2. 會因為品牌邏輯不同,而不斷增加if..else或是單一品牌又再展開其它邏輯,如此造成程式碼越來越長與複雜,維護成本不斷增加。

3. 不利於單元測試

DI (Dependency Injection)

由外部注入實作的物件,而非由類別內部透過new的方式決定,常見的DI方式如下:

Constructor

Setter

DI一般會搭配Interface來定義所需要的類別,類別並符合單一設計原則,透過DI可輕易抽換實作的類別,如此可提升單元測試可行性,降低程式複雜度與維護成本。

IoC(Inversion of Control)

IoC是一種設計模式,透過DI來實踐IoC的設計概念,降低類別間的依賴。如剛前言例子透過new方式去實作類別,會讓CustomerController依賴CustomerService,見下圖。

本來由CustomerController決定ICustomerService實作的類別,如果改由第三方控制並注入CustomerController,可以看到箭頭方向改變了,解除依賴,這就是IoC的概念。

邊學邊筆記,如果有誤的地方,還請各位指教啦!!

--

--