概要
Kotlinを使うことがあったので、KotlinでDependency Injection (DI)を扱うライブラリであるkoinを試してみました!
- Kotlin: 1.3.61
- Gradle: 6.1
使い方
早速使い方です。
まずは build.gradle
にライブラリを追加します。
implementation "org.koin:koin-core:$koin_version"
implementation "org.koin:koin-core-ext:$koin_version"
implementation "org.koin:koin-java:$koin_version"
testImplementation "org.koin:koin-test:$koin_version"
module
koinでは module
というものを定義する必要があります。
moduleの中に自分で定義したインスタンスを定義しておくことで、実行時に定義したインスタンスをDIすることが出来ます。
var module: Module = module {
// シングルトンとして定義
single { SomeClass() }
single { SomeClass() as SomeInterface }
// 毎回生成する
factory { SomeClass() }
// 引数を渡す
factory { (arg: Any) -> SomeClass(arg = arg) }
}
Injection
まずは startKoin
を呼んで、DIコンテナをスタートさせます。
ちなみに modules
を使えば、複数のmoduleを利用することもできます。
fun main(args: Array<String>) {
startKoin {
modules(module)
// 複数使う場合
// modules(module1, module2)
}
// なにか処理をする
}
定義したクラスを利用する場合は、以下のようにします。
これだけで簡単にDIを使うことができました。
class SomeClass2 {
val some: SomeClass by inject()
}
おまけ
テストのときにもKoinを利用します。 (Spekを利用した場合です)
ポイントはテストケース(グループ)終了時に stopKoin()
を呼び出すことです。
呼び出さないまま次のテストに進んでしまうと、すでにKoinが開始されていますと怒られてしまいます。
object SomeClassTest : Spek({
beforeGroup {
startKoin {
modules(testModule)
}
}
afterGroup {
stopKoin()
}
// ...
}
おわりに
よきKotlinライフを!
久しぶりにKotlin触ったけど、やっぱ可愛いです。
次はServer Side Swiftやりたい。