Lebih dekat dengan koin part 2

C. Module

Untuk membuat module dengan Koin, Anda cukup mendeklarasikan variabel dengan menggunakan Module DSL module { // isi module }. Module sendiri adalah tempat kita menginisialisasi object yang dibutuhkan.

val appModule = module {
   
factory {
       
Engine()
    }
}

Misalnya Anda menginginkan objek Engine(), maka Anda cukup mendefinisikannya di dalam factory { }. Cukup simpel bukan?

D. startKoin

Supaya Anda bisa menggunakan Koin di semua kelas, Anda dapat membuat Custom Application untuk memanggil Koin. Kelas ini akan dijadikan sebagai base Application dengan menambahkan name pada AndroidManifest.

open class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        startKoin {
           
modules(appModule)
        }
   
}
}

Anda cukup menggunakan startKoin dan memasukkan module yang sudah dibuat sebelumnya di dalam fungsi modules.

E. Constructor Injection

Lalu bagaimana jika Anda ingin melakukan Injection pada class Car yang membutuhkan Engine? 

val appModule = module {
   
factory {
       
Engine()
    }
   
factory {
       
Car(get())
    }
}

class MainActivity : AppCompatActivity() {

    val car: Car by inject()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        car.start()
    }
}

Karena Engine sudah kita buat sebelumnya, maka Anda cukup menambahkan parameter get() dan Koin akan mem-provide komponen yang dibutuhkan. Anda tak perlu menambahkan kode apa pun lagi pada kelas Car maupun Engine. Mantap!

F. androidContext

Pada sebuah aplikasi Android kita sering membutuhkan Context untuk menginisialisasi suatu Object, seperti membuat database, atau sharedpreference. Lalu bagaimana cara melakukannya dengan Koin? Tenang, caranya yaitu dengan menambahkan androidContext pada saat startKoin, untuk lebih jelasnya lihatlah kode berikut:

val appModule = module {
   
factory {
       
Engine(get())
    }
   
factory {
       
Car(get())
    }
}

open class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        startKoin {
           
androidContext(this@MyApplication)
            modules(appModule)
        }
   
}
}
class Engine(val context: Context) {
    fun start() {
        println(context.applicationContext.getString(R.string.engine_start))
    }
}

Dengan menggunakan androidContext semua fungsi di dalam Module yang membutuhkan Context sudah otomatis ter-cover. Sehingga, Anda tak perlu melakukan injection untuk Context secara manual. Siip lah.

G. Single

Pada dasarnya semua fungsi yang menggunakan factory akan membuat Instance baru ketika dipanggil. Supaya sistem tidak membuat instance yang baru, Anda bisa memanfaatkan fungsi single. Berikut ini adalah contoh membuat kelas Car menjadi Singleton:

val appModule = module {
   
factory {
       
Engine(get())
    }

   
single {
       
Car(get())
    }
}

Anda cukup mengganti kode factory menjadi single. Anda tak perlu menambahkan anotasi atau kode lainnya. Super sekali.

H. Qualified scope

Pada dasarnya saat menggunakan fungsi single, Koin akan membuat Object selalu hidup selama aplikasi berjalan. Lalu bagaimana jika Anda ingin membuat sebuah Object dapat diakses hanya pada modul tertentu saja? Anda bisa menggunakan scope.  Untuk mendeklasikan sebuah scope Anda bisa menggunakan fungsi scoped seperti berikut:

val appModule = module {
   
scope(named(“Modul A”)) {
       
factory {
           
Engine(get())
        }
       
scoped {
           
Car(get())
        }
    }
}

Anda perlu memberikan nama untuk scope yang Anda buat. Apabila suatu Object memiliki nama yang sama artinya ia akan berada di scope yang sama.

Leave a Comment