Koin DSL
Kotlin言語の力のおかげで、Koinはアノテーションを付けたりコードを生成したりする代わりに、アプリを記述するのに役立つDSLを提供します。そのKotlin DSLにより、Koinは依存性注入の準備を実現するためのスマートな関数型APIを提供します。
アプリケーション & モジュールDSL
Koinは、Koinアプリケーションの要素を記述するためのいくつかのキーワードを提供します。
- アプリケーションDSL:Koinコンテナの設定を記述します
- モジュールDSL:注入する必要があるコンポーネントを記述します
アプリケーションDSL
KoinApplication インスタンスは、Koinコンテナインスタンスの設定です。これにより、ロギング、プロパティのロード、モジュールを設定できます。
新しい KoinApplication を構築するには、以下の関数を使用します。
koinApplication { }-KoinApplicationコンテナ設定を作成しますstartKoin { }-KoinApplicationコンテナ設定を作成し、GlobalContextに登録してGlobalContext APIの使用を可能にします
KoinApplication インスタンスを設定するには、以下のいずれかの関数を使用できます。
logger( )- 使用するレベルとLogger実装を記述します(デフォルトではEmptyLoggerを使用)modules( )- コンテナにロードするKoinモジュールのリストを設定します(リストまたは可変長引数リスト)properties()-HashMapのプロパティをKoinコンテナにロードしますfileProperties( )- 指定されたファイルからプロパティをKoinコンテナにロードしますenvironmentProperties( )- OS環境からプロパティをKoinコンテナにロードしますcreateEagerInstances()- eagerインスタンス(createdAtStartとマークされたSingle定義)を作成します
KoinApplicationインスタンス:グローバル vs ローカル
上記のように、Koinコンテナ設定はkoinApplicationまたはstartKoin関数の2つの方法で記述できます。
koinApplicationはKoinコンテナインスタンスを記述しますstartKoinはKoinコンテナインスタンスを記述し、KoinのGlobalContextに登録します
コンテナ設定をGlobalContextに登録することで、グローバルAPIはそれを直接使用できます。任意のKoinComponentはKoinインスタンスを参照します。デフォルトでは、GlobalContextからのインスタンスを使用します。
詳細については、カスタムKoinインスタンスに関する章を参照してください。
Koinの開始
Koinを開始するということは、KoinApplicationインスタンスをGlobalContextで実行することを意味します。
モジュールを使用してKoinコンテナを開始するには、startKoin関数を次のように使用するだけです。
// KoinApplicationをグローバルコンテキストで開始
startKoin {
// 使用するロガーを宣言
logger()
// 使用するモジュールを宣言
modules(coffeeAppModule)
}モジュールDSL
Koinモジュールは、アプリケーションに注入/結合する定義を収集します。新しいモジュールを作成するには、以下の関数を使用するだけです。
module { // module content }- Koinモジュールを作成します
モジュール内でコンテンツを記述するには、以下の関数を使用できます。
factory { //definition }- ファクトリbean定義を提供しますsingle { //definition }- シングルトンbean定義を提供します(beanとしてもエイリアスされます)get()- コンポーネントの依存関係を解決します(名前、スコープ、またはパラメータも使用可能)bind()- 指定されたbean定義にバインドする型を追加しますbinds()- 指定されたbean定義に型の配列を追加しますscope { // scope group }-scoped定義の論理グループを定義しますscoped { //definition }- スコープ内でのみ存在するbean定義を提供します
注: named() 関数を使用すると、文字列、Enum、または型によって修飾子を付与できます。これは定義に名前を付けるために使用されます。
モジュールの作成
Koinモジュールは、すべてのコンポーネントを宣言する場所です。module関数を使用してKoinモジュールを宣言します。
val myModule = module {
// ここに依存関係を記述
}このモジュールでは、以下に示すようにコンポーネントを宣言できます。
withOptions - DSLオプション (バージョン3.2以降)
新しいConstructor DSL定義と同様に、withOptionsオペレーターを使用して「通常の」定義に定義オプションを指定できます。
module {
single { ClassA(get()) } withOptions {
named("qualifier")
createdAtStart()
}
}このオプションラムダ内で、以下のオプションを指定できます。
named("a_qualifier")- 定義に文字列修飾子を付与しますnamed<MyType>()- 定義に型修飾子を付与しますbind<MyInterface>()- 指定されたbean定義にバインドする型を追加しますbinds(arrayOf(...))- 指定されたbean定義に型の配列を追加しますcreatedAtStart()- Koin開始時にシングルインスタンスを作成します
