iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
SideProject30

30天挑戰:從無到有,使用Vue.js和.NET建立一個Web登入系統系列 第 10

Day 10:.NET概念篇 - Services 和依賴注入(DI)是什麼?

  • 分享至 

  • xImage
  •  

本篇重點:

  1. Services 是什麼
    • 如何建立 Services 資料夾 & 檔案
  2. 依賴注入(DI)是什麼
    • 實例

昨天Day 9:.NET概念篇 - API Controller和 Dto 設計是什麼?講了API Controller和Dto設計的概念,那再正式進入開發前,還需要知道兩個東西,分別是「Services」和「DI注入」

1. Services 是什麼

一般來說,我們不會把API的功能寫在Controller裡面,而是寫在Services裡,因為Controller只是控制API路由和定義HTTP方式的地方,通常我們會在Controller裡引入相對應的Service檔案(ex:在UserController.cs裡引入「UserService.cs」),等Service做完動作,再將資料回傳回去
https://ithelp.ithome.com.tw/upload/images/20230925/20141088K00LhWQnKZ.png

如何建立 Services 資料夾 & 檔案

那因為我們原本的專案沒有自動生成Services的資料夾,所以我們要自己手動新增一個

對.NET專案點擊右鍵,選擇「加入(D)>新增資料夾(D)」
https://ithelp.ithome.com.tw/upload/images/20230926/201410889wm5vmVxjl.png

將資料夾重新命名成「Services」
https://ithelp.ithome.com.tw/upload/images/20230926/201410883eqEmvtH0o.png

剛剛上面有提到,通常我們會在Controller裡引入相對應的Service檔案,所以這裡我們對Services資料夾點擊右鍵,選擇「加入(D)>新增項目(W)」
https://ithelp.ithome.com.tw/upload/images/20230926/20141088gjghdnvIS5.png

通常Service的檔案命名規則跟Controller一樣,才不會搞混,所以如果我們想在UserController.cs裡引入Service的檔案,就會命名成「UserService.cs
https://ithelp.ithome.com.tw/upload/images/20230926/20141088yM2SuzcFiS.png

之後我們要開發API功能,就會寫在public class UserService { ... }
https://ithelp.ithome.com.tw/upload/images/20230926/20141088kCqKPxh7of.png

2. 依賴注入(DI)是什麼

依賴注入(Dependency Injection,簡稱DI):是一種撰寫程式碼的寫法,這種寫法有助於減少元件之間的耦合度,提高程式碼的可測試性和可維護性

耦合度有分「高耦合度」和「低耦合度」,以下是它的分法:

  • 高耦合度:當元件之間相互「依賴程度高」時,表示一個模組的變化可能會影響到其他模組,使得程式碼難以修改和維護,意味著程式碼的「重用性」較差
  • 低耦合度:當元件之間相互「依賴程度低」時,表示一個模組的變化不太會影響到其他模組,使得程式碼容易修改和維護,有助於提高程式碼的「可重用性」和「可擴展性

通常在開發上,我們會希望「降低」程式碼的耦合度,才不會修改一個地方,其他地方也要跟著做修改,所以我們會使用「依賴注入(DI)」,來實現程式碼的低耦合度

實例

舉個例子,如果我們現在要在「UserController.cs」裡引入我們剛剛建立的「UserService.cs」,且不使用DI的方式撰寫,就會寫成:

// 不使用依賴注入(DI)
private readonly UserService _userService;

public UserController()
{
    _userService = new UserService();
}

可以看到它直接在UserController()裡面實例化「UserService」,這樣會導致「UserController」直接依賴於「UserService」,使得程式碼的耦合度增加,後續如果想更改或替換UserService就會變得很麻煩
https://ithelp.ithome.com.tw/upload/images/20230926/20141088Pv2LSN4SOy.png

如果改成用依賴注入(DI)的方式撰寫,就會變成:

// 使用依賴注入(DI)
private readonly UserService _userService;

public UserController(UserService userService)
{
    _userService = userService;
}

雖然這樣「UserController」還是依賴於「UserService」,但它不再需要自己實例化UserService,所以就算修改「UserService」,也不用更改到「UserController」裡的寫法,這樣有助於實現「低耦合度」,使程式碼更具「可重用性」和「可維護性」
https://ithelp.ithome.com.tw/upload/images/20230926/20141088j1vwJKPRBs.png

如果在概念上有任何問題,都歡迎在下方留言提出喔!


上一篇
Day 9:.NET概念篇 - API Controller和 Dto 設計是什麼?
下一篇
Day 11:.NET CRUD開發篇 - 如何開發一隻新增 API(C)
系列文
30天挑戰:從無到有,使用Vue.js和.NET建立一個Web登入系統19
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言