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的概念。
邊學邊筆記,如果有誤的地方,還請各位指教啦!!