開啟小鈴鐺通知
檢舉內容

Android 依賴注入基礎:概念、原理與實務應用

更新於 發佈於 閱讀時間約 8 分鐘
raw-image
zoomable
【Android Hilt 依賴注入完整教學】系列文章目錄:連結
Youtube 教學頻道:HKT線上教室

在 Android 開發中,你可能經常聽到「依賴注入」(Dependency Injection,簡稱 DI)這個詞。無論是使用 Dagger、Hilt 或 Koin 等框架,依賴注入都是現代 Android 開發中不可或缺的重要概念。讓我們從零開始,深入淺出地了解什麼是依賴注入,以及為什麼我們需要它。

什麼是依賴注入?

raw-image
zoomable
為什麼會看到廣告

讓我們用一個簡單的例子來說明。假設我們有一個 Car 類別,這個類別需要一個引擎(Engine)來運作:

// 未使用依賴注入的寫法
class Car {
private val engine = Engine()

fun start() {
engine.start()
}
}

這時我們就可以說 Car 類別依賴於 Engine 類別。在實際程式開發的過程中經常會遇到,類似的問題,這段程式碼看起來似乎沒什麼問題,但實際上存在一些設計上的缺陷:

  1. Car 類別與 Engine 類別緊密耦合
  2. 難以替換或測試不同類型的引擎
  3. 違反了 SOLID 原則中的開放封閉原則(Open-Closed Principle)

未使用依賴注入的問題

今天假設我們要支援不同類型的引擎,如:純電動車(ElectricEngine)或是油電混合車(HybridEngine),使用上面的寫法就會遇到困難:

// 不好的改法
class Car {
// private val engine = Engine() // 原本的汽油引擎
// private val electricEngine = ElectricEngine() // 改成純電動車
private val hybridEngine = HybridEngine() // 又改成油電混合動力

fun start() {
// engine.start()
// electricEngine.start()
hybridEngine.start()
}
}

這種作法有幾個明顯的缺點:

  1. 每次要改變引擎類型都需要修改 Car 類別的程式碼
  2. 無法同時支援不同類型的引擎
  3. 「透過車子產生引擎」在邏輯上就不合理
raw-image
zoomable

上述問題的根本原因在於程式碼之間產生了高度耦合 (Coupling) 的情況。為了解決這個問題,我們可以運用控制反轉 (Inversion of Control,IoC)的設計原則,將物件的控制權從物件本身移轉到外部的容器或框架。這樣做可以降低程式碼之間的相依性(Dependency),讓系統更容易維護與擴充。

而依賴注入(Dependency Injection,DI)就是實作控制反轉的一種常見手法。它的概念是在建立物件時,將相依的物件從外部注入進去,而不是讓物件自己產生相依物件。透過這種方式,我們就能達到程式碼解耦 (Decoupling) 的目的。

舉個例子,使用依賴注入的方式,A 類別的建構子可以接收 B 的介面當作參數,IoC 容器在產生 A 的物件實體時,會自動將 B 的物件實體注入進去。如此一來,A 只需要依賴 B 的介面定義,而不需要知道 B 的具體實作細節。

使用依賴注入的改良方案

// 使用依賴注入的寫法
class Car(private val engine: Engine) {
fun start() {
engine.start()
}
}

依賴注入的兩種主要方式

  1. 建構子注入(Constructor Injection)
    class Car(private val engine: Engine)
  2. 欄位注入(Field Injection)
    class Car {
    lateinit var engine: Engine
    }

為什麼需要依賴注入?

1. 提高程式碼重用性

使用依賴注入後,我們可以輕鬆替換不同的實作。例如,可以替換成電動引擎:

interface Engine {
fun start()
}

class GasEngine : Engine {
override fun start() { /* 實作汽油引擎啟動邏輯 */ }
}

class ElectricEngine : Engine {
override fun start() { /* 實作電動引擎啟動邏輯 */ }
}

2. 便於測試

在單元測試中,我們可以輕鬆注入模擬物件:

class CarTest {
@Test
fun testCarStart() {
val mockEngine = MockEngine()
val car = Car(mockEngine)
car.start()
// 驗證測試結果
}
}

3. 更容易重構

由於各個元件之間的耦合度降低,重構程式碼變得更加容易。

實際應用案例:ViewModel 中的依賴注入

在 Android MVVM 架構中,ViewModel 經常需要存取 Repository:

// 未使用依賴注入寫法
class ProductViewModel : ViewModel() {
// 傳統寫法會在 ViewModel 內直接建立 Repository 實例
// 超級常見,超耦合寫法,難以替換實作、難以進行單元測試
private val repository = ProductRepository()
private val _products = MutableLiveData<List<Product>>()

fun getProducts() {
val products = repository.getProducts()
_products.value = products
}
}

// 使用依賴注入的寫法
class ProductViewModel(
private val repository: ProductRepository
) : ViewModel() {
private val _products = MutableLiveData<List<Product>>()

fun getProducts() {
val products = repository.getProducts()
_products.value = products
}
}


自動化依賴注入

在大型專案中,手動管理所有依賴關係會變得非常繁瑣。這就是為什麼我們需要依賴注入框架(如 Hilt)的原因。這些框架可以:

  • 自動管理依賴的生命週期
  • 處理依賴之間的關係
  • 提供更簡潔的語法
  • 減少樣板程式碼

結論

依賴注入是一個強大的設計模式,它能夠:

  • 提高程式碼的可重用性
  • 簡化測試流程
  • 使程式碼更容易維護和重構
  • 提供更靈活的架構設計


在接下來的系列文章中,我們將一步一步帶大家由淺入深探討如何在 Android 專案中使用 Hilt 來實現依賴注入!

avatar-img
15會員
260內容數
哈囉!歡迎光臨我的沙龍!我是 KT,一位對應用程式開發充滿熱情的開發者。在這個專屬空間,我將與您分享我在應用開發領域的深入學習心得和豐富的實戰經驗。如果您對應用程式開發技術同樣充滿好奇,渴望不斷探索新知,歡迎成為我們的會員,一起在應用程式開發的旅途上,探索更深層次的技術世界,享受學習的樂趣。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
HKT實驗室 的其他內容
本文提供全面的 Android Hilt 依賴注入框架完整教學目錄,涵蓋基礎概念、注入方式、進階功能及測試實務。透過這些內容,開發者能夠深入理解並有效學習並運用 Android Hilt 進行依賴注入 Dependency Injection。
本篇文章展示 Android 開發中 Hilt 依賴注入的運用。它基於 Kotlin、Jetpack Compose 等技術搭建,採用 MVVM 架構,利用 Room 存儲數據。Hilt 通過多種注解實現依賴注入,可助學習 Hilt 等多項技術。
本篇文章詳細介紹如何在 Android 開發中使用 Dagger 2 進行依賴注入,並提供 GitHub 開源程式碼連結。專案基於 MVVM 架構,採用 Jetpack Compose 構建現代化 UI,展示實際應用中的最佳實踐。
在現代 Android 開發中,依賴注入(Dependency Injection, DI)是構建可維護、可測試程式碼的關鍵技術。Dagger 作為 Google 推出的依賴注入框架,透過編譯時代碼生成大幅提升效能。本文將以 Kotlin 示範 Dagger 的實際應用。 一、導入 Dagger
在 Android 開發中,依賴注入(Dependency Injection, DI)是實現模組化、低耦合程式碼的核心技術。本文將深入分析 Koin、Hilt 和 Dagger 當前主流的 DI 框架, 這三者的優缺點,幫助開發者根據專案需求做出最佳選擇。
本文提供全面的 Android Hilt 依賴注入框架完整教學目錄,涵蓋基礎概念、注入方式、進階功能及測試實務。透過這些內容,開發者能夠深入理解並有效學習並運用 Android Hilt 進行依賴注入 Dependency Injection。
本篇文章展示 Android 開發中 Hilt 依賴注入的運用。它基於 Kotlin、Jetpack Compose 等技術搭建,採用 MVVM 架構,利用 Room 存儲數據。Hilt 通過多種注解實現依賴注入,可助學習 Hilt 等多項技術。
本篇文章詳細介紹如何在 Android 開發中使用 Dagger 2 進行依賴注入,並提供 GitHub 開源程式碼連結。專案基於 MVVM 架構,採用 Jetpack Compose 構建現代化 UI,展示實際應用中的最佳實踐。
在現代 Android 開發中,依賴注入(Dependency Injection, DI)是構建可維護、可測試程式碼的關鍵技術。Dagger 作為 Google 推出的依賴注入框架,透過編譯時代碼生成大幅提升效能。本文將以 Kotlin 示範 Dagger 的實際應用。 一、導入 Dagger
在 Android 開發中,依賴注入(Dependency Injection, DI)是實現模組化、低耦合程式碼的核心技術。本文將深入分析 Koin、Hilt 和 Dagger 當前主流的 DI 框架, 這三者的優缺點,幫助開發者根據專案需求做出最佳選擇。
你可能也想看
Google News 追蹤
提問的內容越是清晰,強者、聰明人越能在短時間內做判斷、給出精準的建議,他們會對你產生「好印象」,認定你是「積極」的人,有機會、好人脈會不自覺地想引薦給你
一般而言,組件之間的資料傳遞,可以使用 props 來達成,不過一旦層級過多的時候,props 就要逐層向下傳遞,會越來越麻煩且複雜。 而 provide、inject 可以解決這個問題,它可以提供一個「源頭」,子組件們可以藉由同一個源頭取得對應的資料,且沒有層級分別,都可以取得,就不用逐層傳遞資
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
起源是當時 Facebook 有篇文章討論不少人分不清楚上述二者的差別,當時寫了首部曲《閒談軟體設計:API Naming Style》,接著是《閒談軟體設計:內部函式庫》,但始終沒談到 library 和 framework 的差別,主要是沒有好的例子,這次這例子還蠻不錯的。
本課程學習如何添加 Room 資料庫相關依賴庫配置。
本課程學習如何使用 Intent 傳遞整包資料。
Thumbnail
本課程學習如何在 Kotlin 程式碼檔案中,設定 ImageView 圖片元件,顯示本地端圖片。
本課程主要學習 Android Studio 建立初始(Empty View Activity)專案中的重要目錄資料夾和檔案。
Thumbnail
根據初學者設計了 Kotlin 程式語言的基礎課程,從 Android Studio 到 Android App 開發,提供完整指引。由基礎開始,傳授開發技巧。課程分為三部分:環境安裝、常用元件與界面設計,以及高階技巧如 DataStore、Room 資料儲存與網路處理。
提問的內容越是清晰,強者、聰明人越能在短時間內做判斷、給出精準的建議,他們會對你產生「好印象」,認定你是「積極」的人,有機會、好人脈會不自覺地想引薦給你
一般而言,組件之間的資料傳遞,可以使用 props 來達成,不過一旦層級過多的時候,props 就要逐層向下傳遞,會越來越麻煩且複雜。 而 provide、inject 可以解決這個問題,它可以提供一個「源頭」,子組件們可以藉由同一個源頭取得對應的資料,且沒有層級分別,都可以取得,就不用逐層傳遞資
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
起源是當時 Facebook 有篇文章討論不少人分不清楚上述二者的差別,當時寫了首部曲《閒談軟體設計:API Naming Style》,接著是《閒談軟體設計:內部函式庫》,但始終沒談到 library 和 framework 的差別,主要是沒有好的例子,這次這例子還蠻不錯的。
本課程學習如何添加 Room 資料庫相關依賴庫配置。
本課程學習如何使用 Intent 傳遞整包資料。
Thumbnail
本課程學習如何在 Kotlin 程式碼檔案中,設定 ImageView 圖片元件,顯示本地端圖片。
本課程主要學習 Android Studio 建立初始(Empty View Activity)專案中的重要目錄資料夾和檔案。
Thumbnail
根據初學者設計了 Kotlin 程式語言的基礎課程,從 Android Studio 到 Android App 開發,提供完整指引。由基礎開始,傳授開發技巧。課程分為三部分:環境安裝、常用元件與界面設計,以及高階技巧如 DataStore、Room 資料儲存與網路處理。