How to Migrate from Dagger2 to Koin

No more generated classes, more simplicity, more KO[TL]IN :D

Yoga C. Pranata
Style Theory Engineering & Data
3 min readJan 15, 2019

--

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:

Build time comparison using Passy

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 gunakan get() 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 :)

--

--