本篇重點:
- Services 是什麼
- 如何建立 Services 資料夾 & 檔案
- 依賴注入(DI)是什麼
- 實例
昨天Day 9:.NET概念篇 - API Controller和 Dto 設計是什麼?講了API Controller和Dto設計的概念,那再正式進入開發前,還需要知道兩個東西,分別是「Services」和「DI注入」
一般來說,我們不會把API的功能寫在Controller裡面,而是寫在Services裡,因為Controller只是控制API路由和定義HTTP方式的地方,通常我們會在Controller裡引入相對應的Service檔案(ex:在UserController.cs裡引入「UserService.cs」),等Service做完動作,再將資料回傳回去
那因為我們原本的專案沒有自動生成Services的資料夾,所以我們要自己手動新增一個
對.NET專案點擊右鍵,選擇「加入(D)>新增資料夾(D)」
將資料夾重新命名成「Services」
剛剛上面有提到,通常我們會在Controller裡引入相對應的Service檔案,所以這裡我們對Services資料夾點擊右鍵,選擇「加入(D)>新增項目(W)」
通常Service的檔案命名規則跟Controller一樣,才不會搞混,所以如果我們想在UserController.cs裡引入Service的檔案,就會命名成「UserService.cs」
之後我們要開發API功能,就會寫在public class UserService { ... }
裡
依賴注入(Dependency Injection,簡稱DI):是一種撰寫程式碼的寫法,這種寫法有助於減少元件之間的耦合度,提高程式碼的可測試性和可維護性
耦合度有分「高耦合度」和「低耦合度」,以下是它的分法:
通常在開發上,我們會希望「降低」程式碼的耦合度,才不會修改一個地方,其他地方也要跟著做修改,所以我們會使用「依賴注入(DI)」,來實現程式碼的低耦合度
舉個例子,如果我們現在要在「UserController.cs」裡引入我們剛剛建立的「UserService.cs」,且不使用DI的方式撰寫,就會寫成:
// 不使用依賴注入(DI)
private readonly UserService _userService;
public UserController()
{
_userService = new UserService();
}
可以看到它直接在UserController()
裡面實例化「UserService」,這樣會導致「UserController」直接依賴於「UserService」,使得程式碼的耦合度增加,後續如果想更改或替換UserService就會變得很麻煩
如果改成用依賴注入(DI)的方式撰寫,就會變成:
// 使用依賴注入(DI)
private readonly UserService _userService;
public UserController(UserService userService)
{
_userService = userService;
}
雖然這樣「UserController」還是依賴於「UserService」,但它不再需要自己實例化UserService,所以就算修改「UserService」,也不用更改到「UserController」裡的寫法,這樣有助於實現「低耦合度」,使程式碼更具「可重用性」和「可維護性」
如果在概念上有任何問題,都歡迎在下方留言提出喔!