Dependency Injection : Dari Dagger 2 ke KOIN
KOIN?
KOIN adalah dependency injection framework yang dibuat untuk Kotlin, 100% ditulis dengan Kotlin.
KOIN merupakan dependency injection (DI) yang ditulis pure menggunakan kotlin. Dari kesimpulan artikel berikut KOIN mempunyai beberapa kelebihan daripada Dagger 2, diantaranya :
- Line of code; KOIN mempunyai sintak dan konfigurasi yang lebih sedikit daripada Dagger 2, baik yang ditulis oleh developer ataupun saat code generation yang dibuat oleh KOIN maupun dagger 2 setelah di compile
- Build Time; walaupun hanya berbeda sedikit, namun dengan skala project yang lebih besar maka akan lebih kelihatan perbedaan Built Time-nya
Migrasi dari Dagger 2 ke KOIN pada existing project
Saya mempunyai boilerplate yang biasa saya gunakan, disana juga terdapat contoh penggunaan boilerplate tersebut. Dari existing project ini yang sebelumnya menggunakan Dagger 2 akan kita ubah menggunakan KOIN sehingga kita akan tahu bagian mana saja yang akan berubah ketika melakukan migrasi dari Dagger 2 ke KOIN. Project bisa di clone disini
Konfigurasi dependency
Dagger 2
KOIN
AppModule
Dagger 2
KOIN
Terdapat syntax deklarasi single dan factory pada koin. single akan mem-provide singleton komponen, seperti database, api, dsb. Sedangkan factory akan mem-provide komponen baru setiap kali kita melakukan pemanggilan instance tersebut. Jika diperhatikan setiap komponen pada Dagger 2 yang menggunakan anotation @Singleton maka bentuk migrasinya pada KOIN adalah dengan menggunakan syntax single, sedangkan apabila komponen tanpa anotation @Singleton pada Dagger 2 maka bentuk migrasinya pada KOIN adalah dengan menggunakan syntax factory.
Sebenarnya kita dapat memisahkan MoviePresenter dan MovieAdapter menjadi module tersendiri yang terpisah dari appModule, tapi komponen-komponen tersebut tetap akan bisa diakses oleh setiap class pada project kita tanpa ada batasan seperti module komponen pada Dagger 2.
Kemudian syntax get() digunakan untuk melakukan inisiasi komponen yang sudah dideklarasikan pada appModule, contohnya pada MoviePresenterImpl membutuhkan parameter berupa CompositeDisposable, DataManager dan SchedulerProvider. Karena kita sudah melakukan deklarasi komponen tersebut pada appModule maka untuk membuat instance dari komponen tersebut cukup menggunakan get() dan KOIN akan mem-provide komponen yang diminta / dibutuhkan.
AppComponent
Dagger 2
KOIN
Pada konfigurasi AppModule KOIN tidak membutuhkan class ActivityBuilder karena sepertinya KOIN cukup melakukan deklarasi semua komponen pada AppModule, dan semua komponen yang ada di AppModule dapat digunakan dan diakses oleh semua class baik activity, fragment dan sebagainya, sehingga tidak perlu membuat class ActivityBuilder dimana pada Dagger 2 digunakan untuk melakukan binding komponen seperti adapter, presenter, dsb ke activity.
Konfigurasi Aplikasi
Dagger 2
KOIN
Setelah melakukan konfigurasi KOIN, kemudian untuk melakukan inject komponen ke dalam class cukup mengganti anotation @Inject dengan by inject()
Contoh :
Dagger 2 pada halaman MovieActivity
KOIN
Setelah itu hapus semua anotation @Inject pada class yang menggunakan anotation tersebut. Jangan lupa hapus AndroidInjection.inject(this) pada BaseActivity, karena KOIN sudah melakukan binding sejak pertama kali dijalankan.
Kemudian? selesai, kita tidak perlu merubah kode apapun pada project kita terkecuali yang berhubungan langsung dengan konfigurasi KOIN dan injeksi pada class yang membutuhkan.
Demikian sedikit tulisan mengenai Dagger 2 dan KOIN, saya belum pernah menggunakan KOIN pada production app, tapi sepertinya KOIN cukup menjanjikan.
Apabila ada kesalahan dan kekurangan mohon kritik dan sarannya, terimakasih.
Tulisan saya yang lain :