Dependency Injection dengan Dagger 2

Wahyu Permadi
Tunaiku Tech
Published in
3 min readNov 13, 2019

Hallo temen-temen, kali ini gw membahas tentang Dagger2 + Kotlin. Sebelumnya udah pada familiar belum dengan yang namanya DI (Dependency Injection), selanjutnya dibaca DI ? kalau belum, secara garis besarnya DI itu.

DI (Depedency Injection) merupakan sebuah proses untuk memasukan (inject) sebuah object kedalam class lain yang membutuhkannya.

Sebagai contoh lain ada sebuah class Car yang tersusun dari class Fuel, dan class Wheel.

class Car{
private lateinit var wheel : Wheel
private lateinit var fuel : Fuel
constructor(wheel: Wheel, fuel: Fuel){
this.wheel = wheel
this.fuel = fuel
}
fun getWheel(){
println("Jumlah Roda "+wheel.wheels())
}

fun getFuel(){
println(fuel.getName())
}
fun getFuelPrice(){
println(fuel.getPrice())
}
}
class Wheel{
fun wheels() : String{
return "4 Wheels"
}
}
class Fuel(){
fun getName() : String {
return "Pertamax"
}

fun getPrice() : String {
return "12.000"
}
}
fun main(){
var car = Car(Wheel(), Pertamax())
car.getWheel()
car.getFuel()
car.getFuelPrice()
}

Dari kode diatas dapat dilihat bahwa ketika kita ingin membuat object dari class Car, kita perlu membuat object class Wheel dan object class Fuel juga. Coba bayangkan saja jika class Car digunakan di banyak Activity maupun Fragment, berapa kali kalian akan membuat instance object yang sama ? tentunya banyak bukan. Nah karena itulah DI itu ada.

DI yang akan gw bahas disini adalah Dagger dengan versi 2.24, kenapa Dagger ? karena Dagger merupakan salah satu DI favorite dikalangan para Android Developer selain Koin. Pada Dagger kita akan mengenal dengan yang namanya Annotation Processor, seperti @Inject, @Module, @Component, @SubComponent, @Binds, @Provides, @ContributesAndroidInjector dan sebagainya.

@Inject merupakan sebuah annotation yang berfungsi untuk me-request dependencies. Annotation ini dapat digunakan didalam constructor, field maupun class.

class MoviesViewModel @Inject constructor(
val apiService: ApiService
) : ViewModel(){
// function here
}

Sebelum menggunakan @Inject, pastikan dependencies yang diperlukan sudah di Provides sebelumnya.

@ContributesAndroidInjector pada dagger-android berfungsi untuk meng-generate AndroidInjector sesuai dengan tipe dari method tersebut. Sehingga proses mendaftarkan Activity/ Fragment yang telah dibuat kedalam Dagger Graph menjadi lebih mudah.

@Modules merupakan annotation untuk mendefinisikan sebuah class yang menyediakan dependencies yang diperlukan seperti NetworkModule dibawah ini.

Pada NetworkModule terdapat annotation @Provides dan @Singleton, @Singleton sendiri berfungsi untuk membuat instance dari object tersebut cukup sekali saja, dan @Provides digunakan untuk membuat dependencies dari object tersebut, sehingga dapat dibaca oleh @Inject annotation dan penggunaan @Provides hanya bisa digunakan didalam class yang memiliki annotation @Module.

@Component merupakan sebuah annotation yang digunakan untuk menampung modul-modul yang telah dibuat dan digunakan untuk memulai Dipendency Injection. Seperti ApplicationComponent dibawah ini.

pada @Component kita daftarkan module-module apa saja yang telah dibuat, modul-modul tersebut akan di-generate untuk menghasilkan depedencies yang diperlukan didalam aplikasi.

@Binds sejauh yang gw pahami, biasanya digunakan untuk method yang bertipe abstract, hampir mirib seperti @Provides, namun tidak memiliki return instance.

Nah untuk mengimplementasikan Dagger kedalam sebuah project Android, jangan lupa untuk meng-install dependency library-nya terlebih dahulu ke dalam build.gradle/app.

implementation 'com.google.dagger:dagger-android:2.x'
implementation 'com.google.dagger:dagger-android-support:2.x'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.x'

Untuk implementasi sederhana Dagger 2 dengan Kotlin, dapat dilihat pada Repo berikut, pada branch master menggunakan MVP dan pada branch MVVM menggunakan MVVM pattern. Thank you

--

--

Wahyu Permadi
Tunaiku Tech

Android and Kotlin Enthusiast | Software Engineer @Grab