メインコンテンツまでスキップ

Koin Component

Koinは、モジュールと定義を記述するためのDSLであり、定義の解決を行うためのコンテナです。ここで必要なのは、コンテナの外部でインスタンスを取得するためのAPIです。それがKoinコンポーネントの目的です。

備考

KoinComponentインターフェースは、Koinから直接インスタンスを取得するのに役立ちます。ただし、これはクラスをKoinコンテナAPIにリンクすることに注意してください。modulesで宣言できるクラスで使用することは避け、コンストラクタインジェクションを優先してください。

Koinコンポーネントの作成

クラスにKoin機能を使用する機能を与えるには、KoinComponentインターフェースでタグ付けする必要があります。例を見てみましょう。

MyServiceインスタンスを定義するモジュール

class MyService

val myModule = module {
// MyServiceのシングルトンを定義します
single { MyService() }
}

定義を使用する前にKoinを起動します。

myModuleでKoinを起動します

fun main(vararg args : String){
// Koinを起動します
startKoin {
modules(myModule)
}

// MyComponentインスタンスを作成し、Koinコンテナから注入します
MyComponent()
}

Koinコンテナからインスタンスを取得するために、MyComponentを記述する方法を次に示します。

get()とby inject()を使用してMyServiceインスタンスを注入します

class MyComponent : KoinComponent {

// Koinインスタンスを遅延注入(lazy inject)します
val myService : MyService by inject()

// または
// Koinインスタンスを即時注入(eager inject)します
val myService : MyService = get()
}

KoinComponentsでKoin APIをアンロックする

クラスにKoinComponentとしてタグ付けすると、以下にアクセスできるようになります。

  • by inject() - Koinコンテナからの遅延評価(lazy evaluated)インスタンス
  • get() - Koinコンテナからの即時取得(eager fetch)インスタンス
  • getProperty()/setProperty() - プロパティの取得/設定

getとinjectを使用した定義の取得

Koinは、Koinコンテナからインスタンスを取得する2つの方法を提供します。

  • val t : T by inject() - 遅延評価された委譲インスタンス(lazy evaluated delegated instance)
  • val t : T = get() - インスタンスへの即時アクセス(eager access)
// 遅延評価されます
val myService : MyService by inject()

// インスタンスを直接取得します
val myService : MyService = get()
注記

遅延注入(lazy inject)形式は、遅延評価が必要なプロパティを定義するのに適しています。

名前によるインスタンスの解決

必要に応じて、get()またはby inject()で次のパラメータを指定できます。

  • qualifier - 定義の名前(定義でnameパラメータを指定した場合)

定義名を使用するモジュールの例:

val module = module {
single(named("A")) { ComponentA() }
single(named("B")) { ComponentB(get()) }
}

class ComponentA
class ComponentB(val componentA: ComponentA)

次の解決を行うことができます。

// 指定されたモジュールから取得します
val a = get<ComponentA>(named("A"))