Autowire DSL
Koinは、クラスのコンストラクタを直接ターゲットにし、依存関係を自動的に解決(Autowire)できるAutowire DSLを提供しています。
TIP
Koin Compiler Pluginを使用している場合は、追加のコンパイル時の安全性を備えた同様の自動解決機能を提供するCompiler Plugin DSLの使用を検討してください。
クラシック Autowire DSL
以下の依存関係を持つクラス ClassA がある場合:
class ClassA(val b: ClassB, val c: ClassC)
class ClassB()
class ClassC()クラスコンストラクタをターゲットにしてコンポーネントを宣言します:
import org.koin.dsl.*
module {
singleOf(::ClassA)
singleOf(::ClassB)
singleOf(::ClassC)
}get() 関数を使って依存関係を指定する必要はもうありません!
INFO
クラスコンストラクタをターゲットにするには、クラス名の前に :: を使用してください。
NOTE
コンストラクタは、必要なすべての依存関係で自動的に埋められます。Koinはすべてのパラメータを解決しようとするため、デフォルト値の使用は避けてください。
Compiler Plugin DSL との比較
| クラシック Autowire | コンパイラプラグイン |
|---|---|
singleOf(::ClassA) | single<ClassA>() |
factoryOf(::ClassA) | factory<ClassA>() |
scopedOf(::ClassA) | scoped<ClassA>() |
パッケージ: org.koin.dsl | パッケージ: org.koin.plugin.module.dsl |
Compiler Plugin DSLは、同様の自動解決機能を提供し、さらにコンパイル時の検証を可能にします。
利用可能なキーワード
コンストラクタから定義を構築するために、以下のAutowireキーワードが利用可能です:
factoryOf-factory { }と同等 - factory 定義singleOf-single { }と同等 - single 定義scopedOf-scoped { }と同等 - scoped 定義
INFO
Koinはすべてのパラメータを依存関係で埋めようとするため、コンストラクタでデフォルト値を使用しないように注意してください。
DSL オプション
どのAutowire DSL定義でも、ラムダ内でオプションを設定できます:
module {
singleOf(::ClassA) {
// 定義オプション
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
}注入パラメータ (Injected Parameters)
Autowire DSLによる宣言でも、注入パラメータ(injected parameters)を引き続き使用できます。Koinは注入されたパラメータと現在の依存関係を調べて、コンストラクタへの注入を試みます。
以下のような例です:
class MyFactory(val id : String)Autowire DSLでの宣言:
module {
factoryOf(::MyFactory)
}以下のように注入できます:
val id = "a_factory_id"
val factory = koin.get<MyFactory> { parametersOf(id)}リフレクションベースのDSL(3.2以降非推奨)
CAUTION
KoinリフレクションDSLは現在非推奨です。上記のKoin Autowire DSLを使用してください。
