LoginSignup
1
3

More than 3 years have passed since last update.

KotlinでDIを使う (koin)

Posted at

概要

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やりたい。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3