依賴注入 (Dependency Injection)

★★★★★Studied

FromDependency InjectionAgile Principles, Patterns, and PracticesDesign Patterns Explained

📚 From the Books

依賴注入 (Dependency Injection)ConceptDI & IoC

一個物件需要的協作對象,不自己 new,而是「從外面交給它」(建構子、setter 或參數)。控制反轉(IoC)是觀念,依賴注入是把這觀念落地的最常見手法。

🧠 When to Use

TIP

訊號:你想替某個類別寫單元測試,卻發現它在內部 new 了資料庫連線 / HTTP client / 時鐘,根本換不掉——這就是該注入的地方。

⚖️ Structure & Variants

三種注入方式
interface Clock { fun now(): Long }

// 1) 建構子注入(首選:依賴顯式、物件一建立就完整)
class Report(private val clock: Clock) {
    fun stamp() = "generated at ${clock.now()}"
}

// 2) Setter / property 注入(依賴可選、或要可重設時)
class Cache { var clock: Clock? = null }

// 3) 方法 / 參數注入(只有這個方法需要時)
fun render(clock: Clock) = clock.now()
  • 建構子注入是預設:物件不可能處於「半組好」狀態,依賴一眼可見。
DIP、IoC、DI 三個詞的關係
  • DIP(依賴反轉原則):高層與低層都依賴抽象,別讓高層直接依賴低層細節。是「為什麼」。
  • IoC(控制反轉):把「流程 / 建立」的控制權交給外部框架或組裝者。是「方向」。
  • DI(依賴注入):把依賴從外面傳進來的具體做法。是「怎麼做」。
手動 DI vs DI 容器
  • 手動:在 main / composition root 親手 new 並串接。小專案最清楚、零魔法。
  • 容器(Spring、Dagger、Koin…):宣告依賴關係,容器負責建立與串接。省樣板,但有學習與除錯成本。
  • 容器是「自動化的工廠」;它與 Factory Method 解決的是同一類「誰負責建立」的問題。

⚠️ Misuse & Anti-patterns

🔑 Takeaways

✍️ My Notes

No notes yet — jot your takeaways or Q&A here.

📖 Further Reading

🔗 Dive Deeper