Constructor DSL
Koinは、クラスのコンストラクタを直接ターゲットにできる新しい種類のDSLキーワードを提供するようになりました。これにより、ラムダ式内で定義を入力する必要がなくなります。
次の依存関係を持つ指定されたクラスClassA
の場合:
class ClassA(val b : ClassB, val c : ClassC)
class ClassB()
class ClassC()
これらのコンポーネントを、class constructor
を直接ターゲットにして宣言できるようになりました。
module {
singleOf(::ClassA)
singleOf(::ClassB)
singleOf(::ClassC)
}
get()
関数を使用してコンストラクタに依存関係を指定する必要はもうありません!🎉
クラスコンストラクタをターゲットにするには、クラス名の前に::
を使用してください。
コンストラクタは、すべてのget()
で自動的に入力されます。Koinは現在のグラフでそれを見つけようとするため、デフォルト値は使用しないでください。
「名前付き」定義を取得する必要がある場合は、ラムダとget()
を含む標準DSLを使用して、qualifier(修飾子)を指定する必要があります。
利用可能なキーワード
次のキーワードは、コンストラクタから定義を構築するために使用できます。
factoryOf
-factory { }
と同等 - ファクトリ定義singleOf
-single { }
と同等 - シングル定義scopedOf
-scoped { }
と同等 - スコープ定義
Koinはすべてのパラメータを埋めようとするため、コンストラクタでデフォルト値を使用しないようにしてください。
DSLオプション
コンストラクタDSL定義では、ラムダ内でいくつかのオプションを開くこともできます。
module {
singleOf(::ClassA) {
// 定義オプション
named("my_qualifier")
bind<InterfaceA>()
createdAtStart()
}
}
このラムダでは、通常のオプションとDSLキーワードを使用できます。
named("a_qualifier")
- 定義にString qualifier(修飾子)を付与named<MyType>()
- 定義にType qualifier(修飾子)を付与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以降非推奨)
KoinリフレクションDSLは非推奨になりました。上記のKoinコンストラクタDSLを使用してください