c#di 注入有三種生命週期,Transient,Scoped,Singleton,如下表所述
生命週期 | 描述 | 使用時機 |
---|---|---|
Transient | 每次注入都會建立一個新的實例。 | 適用於輕量級且無狀態的服務。 |
Scoped | 從 request 進來到回傳 response 期間每次注入都是共用相同得實例 | 適用於需要在單一請求中共用狀態的服務。 |
Singleton | 當應用程式服務啟動時,只會建立一個實例,直到該服務關閉 | 適用於需要在應用程式中共用狀態的服務。 |
個別的使用時機是什麼時候?
- Transient:適用於輕量級且無狀態的服務,例如寄信服務。
- Scoped:適用於需要在單一請求中共用狀態的服務,例如資料庫上下文。一般使用三層架構時,
Controller
、Service
和Repository
通常會使用Scoped
。 - Singleton:適用於需要在應用程式中共用狀態的服務,例如配置設定或日誌記錄。連線字串也應該使用
Singleton
生命週期,確保在應用程式的整個生命週期內是唯一且一致的。
為什麼要用 DI 注入
依賴注入(Dependency Injection, DI)是一種設計模式,用於實現對象之間的鬆耦合。使用 DI 有以下幾個好處:
- 解耦:DI 使得類之間的依賴關係變得明確,減少了類之間的耦合度。這樣可以更容易地替換和測試各個組件。
- 可測試性:通過 DI,可以輕鬆地將依賴項替換為模擬對象(Mock),從而進行單元測試。這使得測試變得更加簡單和可靠。
- 可維護性:DI 使得代碼結構更加清晰,依賴關係更加明確,從而提高了代碼的可維護性。當需要修改某個依賴項時,只需修改注入的配置,而不需要修改使用該依賴項的代碼。
- 可重用性:通過 DI,可以將通用的依賴項提取出來,實現代碼的重用。這樣可以減少重複代碼,提高開發效率。
- 靈活性:DI 允許在運行時動態地注入依賴項,從而提高了應用程式的靈活性和可配置性。