コンストラクタDSL
Koinは、クラスコンストラクタを直接指定でき、ラムダ式内で定義を記述する必要がなくなる新しい種類のDSLキーワードを提供します。
以下の依存関係を持つClassA
クラスの場合:
class ClassA(val b : ClassB, val c : ClassC)
class ClassB()
class ClassC()
これらのコンポーネントを、クラスコンストラクタ
を直接指定して宣言できるようになりました:
module {
singleOf(::ClassA)
singleOf(::ClassB)
singleOf(::ClassC)
}
get()
関数を使ってコンストラクタで依存関係を指定する必要はもうありません!🎉
INFO
クラスコンストラクタを指定するには、クラス名の前に::
を使用してください。
NOTE
コンストラクタはすべてのget()
で自動的に埋められます。Koinが現在のグラフからその値を見つけようとするため、デフォルト値の使用は避けてください。
NOTE
"名前付き"定義を取得する必要がある場合は、クオリファイアを指定するために、ラムダとget()
を使用する標準DSLを使う必要があります。
利用可能なキーワード
コンストラクタから定義を構築するために、以下のキーワードが利用できます:
factoryOf
-factory { }
と同等 - ファクトリ定義singleOf
-single { }
と同等 - シングルトン定義scopedOf
-scoped { }
と同等 - スコープ定義
INFO
Koinがその値ですべてのパラメータを埋めようとするため、コンストラクタでデフォルト値を使用しないようにしてください。
DSLオプション
どのコンストラクタDSL定義も、ラムダ内でいくつかのオプションを開くこともできます:
module {
singleOf(::ClassA) {
// definition options
named("my_qualifier")
bind<InterfaceA>()
createdAtStart()
}
}
このラムダ内では、通常のオプションとDSLキーワードが利用できます:
named("a_qualifier")
- 定義に文字列クオリファイアを与えるnamed<MyType>()
- 定義に型クオリファイアを与えるbind<MyInterface>()
- 指定されたBean定義にバインドする型を追加するbinds(listOf(...))
- 指定されたBean定義に型リストを追加するcreatedAtStart()
- Koin起動時にシングルトンインスタンスを作成する
ラムダを必要とせずに、bind
またはbinds
演算子を使用することもできます:
module {
singleOf(::ClassA) bind InterfaceA::class
}
注入されたパラメータ
このような宣言では、引き続き注入されたパラメータを使用できます。Koinは注入されたパラメータと現在の依存関係を調べて、コンストラクタを注入しようとします。
以下のようになります:
class MyFactory(val id : String)
コンストラクタDSLで宣言する場合:
module {
factoryOf(::MyFactory)
}
このように注入できます:
val id = "a_factory_id"
val factory = koin.get<MyFactory> { parametersOf(id)}
リフレクションベースのDSL(3.2以降非推奨)
CAUTION
KoinリフレクションDSLは現在非推奨です。上記のKoinコンストラクタDSLを使用してください。