簡介

Dependency Injection (DI,依賴注入) 是一種設計模式 (Design Pattern),開發時使用合適的設計模式可以讓後續的維護和擴充更為方便。

DI 是 Android 程式開發者一定要了解的技術,幾乎在每個專案中都可以用到。

我在剛入門時對這個觀念很模糊,沒辦法真正理解其原理與目的為何,依照  James Shore 的說法,Dependency Injection 的簡單意思就是 “Giving an object its instance variables.”

也就是說,其實 Dependency Injection 只是讓程式知道,這些要注入的參數,要到那裏去找到,而且自動載入 。

活用這個概念,有以下優點:

1、程式運用更靈活 (Improve Reusable)

2、維護更方便 (Improve Maintainable)

3、測試程式更好寫 (Improve Testable)

說明

什麼是依賴 (ependency)?

以車輛為例

class Car {
    var body = Body("Aluminum")
    var tire = Tire(16)
    var engine = Engine("V8")
} {
    fun move() { }
}

val mycar = Car()

在 Car 類別中,我們用到了 Body (車身)、Tire (輪胎)、Engine (引擎) 這三個類別的實例;我們就可以說:Car 這個類別依賴 Body, Tire, Engine 這三個類別的實例。

但這種寫法其實是不好的,因為缺乏彈性,如果我們需要一個 V6 引擎的 Car instance,我們就得重寫一個類別。

比較好的寫法,是把這些依賴的實例,使用建構參數傳入,

class Car(
    var body: Body,
    var tire: Tire,
    var engine: Engine
) {
    fun move() { }
}

val myV8car = Car(
    body = Body("Allumiun"),
    tire = Tire(16),
    engine = Engine("V8")
)

val myV6car = Car(
    body = Body("Allumiun"),
    tire = Tire(16),
    engine = Engine("V6")
)

這樣一來,我們可以隨時更換其依賴的元件,提升程式的再用性。

這其實就是一種最常用的注入方式:建構元注入

依賴注入的原則

依賴介面,而非實作

問題

1、Dependency Injection 一定要使用 Dagger-Hilt 或是 Koin 這一類的函式庫嗎?

不是,這一類的函式庫只是幫助我們更容易的使用而已,我們其實可以自行完成 Dependency Injection 的功。

參考資料

Dependency Injection Demystified -James Shore

淺入淺出 Dependency Injection – Wenchin Roll Around

Dependency Injection, The Best Pattern

Last modified: 2025 年 6 月 30 日

Author

Comments

Write a Reply or Comment

Your email address will not be published.