在現代 Android 開發中,依賴注入(Dependency Injection, DI)是構建可維護、可測試程式碼的關鍵技術。Dagger 作為 Google 推出的依賴注入框架,透過編譯時代碼生成大幅提升效能。本文將以 Kotlin 示範 Dagger 的實際應用。
// build.gradle (Module)
plugins {
id("kotlin-kapt") // 新增 Kapt 插件
}
dependencies {
// Dagger 核心庫
implementation("com.google.dagger:dagger:2.55") // 建議使用最新版本
kapt("com.google.dagger:dagger-compiler:2.55") // Kotlin 需用 kapt 取代 annotationProcessor
}
// User.kt
import javax.inject.Inject
class User @Inject constructor() // Kotlin 簡潔構造函數標注
// ApplicationComponent.kt
import dagger.Component
import com.tiger.dagger.MainActivity
@Component
interface ApplicationComponent {
fun inject(activity: MainActivity) // 函數參數自動辨識注入目標
}
// MainActivity.kt
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import javax.inject.Inject
class MainActivity : AppCompatActivity() {
@Inject
lateinit var user: User // Kotlin 使用 lateinit 延遲初始化
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
DaggerApplicationComponent.create().inject(this)
println("注入成功: ${user.hashCode()}")
}
}
// NetModule.kt
import dagger.Module
import dagger.Provides
import retrofit2.Retrofit
@Module
object NetModule { // Kotlin 建議使用 object 單例模組
@Provides
fun provideRetrofit(): Retrofit =
Retrofit.Builder()
.baseUrl("https://api.example.com/")
.build()
}
// ApplicationComponent.kt
@Component(modules = [NetModule::class])
interface ApplicationComponent {
fun inject(activity: MainActivity)
}
// MainActivity.kt
class MainActivity : AppCompatActivity() {
@Inject lateinit var user: User
@Inject lateinit var retrofit: Retrofit
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
DaggerApplicationComponent.create().inject(this)
println("Retrofit 實例: ${retrofit.baseUrl()}")
}
}
// ServiceModule.kt
@Module
object ServiceModule {
@Provides
fun provideApiService(retrofit: Retrofit, user: User): ApiService {
println("注入使用者到服務: ${user.hashCode()}")
return retrofit.create(ApiService::class.java)
}
}
// ApplicationScope.kt
import javax.inject.Scope
@Scope
@Retention(AnnotationRetention.RUNTIME)
annotation class AppScope
@AppScope
@Component(modules = [NetModule::class, ServiceModule::class])
interface ApplicationComponent {
fun inject(activity: MainActivity)
}
@Module
object DatabaseModule {
@AppScope
@Provides
fun provideDatabase(): AppDatabase =
Room.databaseBuilder(...).build()
}
// DaggerExtensions.kt
fun Application.initDagger(): ApplicationComponent =
DaggerApplicationComponent
.factory()
.create(this)
class MyApp : Application() {
val appComponent by lazy { initDagger() }
}
通過以上步驟,我們成功地在 Kotlin 專案項目中使用了 Dagger 依賴注入框架。Dagger 可以幫助我們更好地管理依賴關係,使程式碼結構更加清晰,提高代碼的可維護性和可測試性。在實際的開發中,你可以根據項目的需求,擴展和完善 Dagger 的使用,引入更多的模塊和組件,以適應不同的業務場景。