How to Migrate from Dagger2 to Koin
No more generated classes, more simplicity, more KO[TL]IN :D
Dari artikel saya sebelumnya, yang membahas tentang Koin, telah dijelaskan kalau Koin ini adalah DSL first dependency.
Untuk contoh migrasi Dagger2 ke Koin, saya ambil sample project FootballClub dari artikel saya sebelumnya yang membahas tentang Android Clean Architecture, aplikasinya dibangun menggunakan Kotlin + Dagger2.
The reason why to move from Dagger2 to Koin
Seperti yang dikatakan di websitenya, Koin adalah:
A pragmatic lightweight dependency injection framework for Kotlin developers. Written in pure Kotlin using functional resolution only: no proxy, no code generation, no reflection!
and yep, gak ada lagi yang namanya generated code/classes, seperti yang bisa kalian lihat digambar, saat kita membuat aplikasi menggunakan Dagger2, dia akan selalu membuat generated classes untuk injectionnya. Dan dalam bentuk Java Classes.
Itulah mengapa alasan saya migrasi dari Dagger2 ke Koin ini.
Build time comparison
Karena sample project ini masih sederhana, jadi belum terlalu terasa perbedaan build time nya (perlu dicoba untuk project yang berskala besar), perbedaan build time-nya hanya 11 detik:
Implementation
Untuk permulaan, tambahkan Koin dependency di app/build.gradle:
Gak perlu lagi annotation processing dan kapt compiler plugin. Simple kan? :D
1. Migrating Module
Pada aplikasi FootballClub yang jadi contoh pada artikel sebelumnya, memiliki AppModule.kt seperti ini:
Sekarang kita ubah menjadi Koin module:
Kelihatan kan berapa jauh perbedaan baris yang harus dibuat? :D
Di Koin ini, gak perlu membuat Class AppModule, cukup membuat variable menggunakan top level feature nya Kotlin. Anotasi Dagger “@Module” digantikan dengan Koin “module” function.
Terdapat 3 hal yang bisa dilihat diatas:
single
— mendeklarasikan singleton untuk suatu tipe data, artinya Koin container akan menyimpan unique instance dari komponen yang telah dideklarasikan. Ini sama dengan anotasi Singleton di Dagger2.factory
— mendeklarasikan sebuah factory untuk suatu class/data, artinya deklarasi factory component akan membuat new instance setiap kalian ingin ingin mengaksesnya. Ini sama dengan anotasi Provides di Dagger2.get
— mengambil data yang dideklarasikan didalam suatu class, artinya setiap kalian ingin mem-provide sebuah instance didalam Koin module, cukup gunakanget()
function. Ini sama dengan input parameters setiap kali kalian ingin mem-provide dependency di setiap module yang kalian deskripsikan di Dagger2.
2. Migrating Component
Membuat component sesuai dengan best practices nya, berikut AppComponent yang ada di aplikasi FootballClub:
Siap siap ya, Let’s do the magic…
Tada…..
Di Koin sudah gak perlu lagi membuat component yang harus didefinisikan seperti di Dagger2. Dan di Koin ini, yang dimaksud component adalah list of modules kalian.
3. Starting the Koin
Untuk meng-inisiasi Koin ini, kalian cukup tambahkan baris kode ini di Application class:
Kalian sudah tidak perlu lagi membuat banyak hal di Application class untuk meng-inisiasi injection seperti halnya di Dagger2.
4. Implementing injection in your activity
Untuk memanggil dependency injection di activity, kalian cukup memanggil by inject().
Dengan Koin ini, codingan kalian jadi lebih clean dan more readability.
Kalian bisa clone atau download sample projectnya di github saya:
Sekian.
Happy Coding everyone :)