koinメモ

space

Koin DSL
Koin DSL 概要
この資料は、Koin DSL (Domain Specific Language) について解説しています。Koin は、Kotlin で依存性注入を行うための軽量なフレームワークです。アノテーションやコード生成に頼らず、Kotlin の DSL を活用することで、アプリケーションの依存関係を記述できます。
Koin DSL の主な特徴
- 簡潔で読みやすい構文: Kotlin の DSL を使用することで、依存関係を宣言的に記述できます。
- 型安全性: コンパイル時に依存関係の整合性をチェックできるため、実行時エラーを回避できます。
- 柔軟性: 依存関係を動的に解決したり、スコープを設定したりできます。
アプリケーションとモジュール DSL
Koin は、依存関係を定義するための2つの主要な DSL を提供しています。
- Application DSL: Koin コンテナの設定を記述します。ロギング、プロパティのロード、モジュールなどを設定できます。
- koinApplication { }: KoinApplication コンテナ設定を作成します。
- startKoin { }: KoinApplication コンテナ設定を作成し、GlobalContext に登録します。
- Module DSL: 注入するコンポーネントを記述します。
- module { ... }: Koin モジュールを作成します。
- factory { ... }: ファクトリービーン定義を提供します。
- single { ... }: シングルトンビーン定義を提供します (bean というエイリアスもあります)。
- get(): コンポーネントの依存関係を解決します (名前、スコープ、パラメータも使用可能)。
- bind(): 指定されたビーン定義にバインドする型を追加します。
- binds(): 指定されたビーン定義に型の配列を追加します。
- scope { ... }: scoped 定義の論理グループを定義します。
- scoped { ... }: スコープ内でのみ存在するビーン定義を提供します。
モジュールの記述例
val myModule = module {
// 依存関係をここに記述
}
withOptions - DSL オプション (3.2 以降)
withOptions 演算子を使用して、定義オプションを指定できます。
module {
single { ClassA(get()) } withOptions {
named("qualifier")
createdAtStart()
}
}
利用可能なオプション:
- named("a_qualifier"): 定義に文字列修飾子を指定します。
- named<MyType>(): 定義に型修飾子を指定します。
- bind<MyInterface>(): 指定されたビーン定義にバインドする型を追加します。
- binds(arrayOf(...)): 指定されたビーン定義に型の配列を追加します。
- createdAtStart(): Koin 起動時にシングルトンインスタンスを作成します。

Constructor DSL
Koin コンストラクタDSLの概要
このドキュメントは、KoinのコンストラクタDSLに関する主要なテーマと重要なアイデア、事実をまとめたものです。
コンストラクタDSLとは
Koin コンストラクタDSLは、クラスコンストラクタを直接ターゲットにすることで、ラムダ式内で定義を記述する必要性をなくした新しいDSLキーワードです。
従来の記法では、依存関係を持つクラスを定義する際に、get()関数を使用して依存関係を明示的に指定する必要がありました。
class ClassA(val b: ClassB, val c: ClassC)
class ClassB()
class ClassC()
module {
single { ClassA(get(), get()) }
single { ClassB() }
single { ClassC() }
}
コンストラクタDSLを使用すると、以下のように簡潔に記述できます。
module {
singleOf(::ClassA)
singleOf(::ClassB)
singleOf(::ClassC)
}
重要なポイント:
- クラスコンストラクタをターゲットにするには、クラス名の前に :: を付ける必要があります。
- コンストラクタは自動的に get()ですべて埋められます。デフォルト値を使用しないでください。Koinは現在のグラフでデフォルト値を見つけようとします。
- 名前付き定義を取得する必要がある場合は、ラムダと get() を使用した標準DSLを使用して修飾子を指定する必要があります。
利用可能なキーワード
コンストラクタDSLでは、以下のキーワードを使用して定義を構築できます。
- factoryOf - factory {} と同等のファクトリ定義
- singleOf - single {} と同等のシングルトン定義
- scopedOf - scoped {} と同等のスコープ定義
DSLオプション
コンストラクタDSL定義では、ラムダ内でオプションを指定することもできます。
module {
singleOf(::ClassA) {
named("my_qualifier")
bind<InterfaceA>()
createdAtStart()
}
}
利用可能なオプション:
- named("a_qualifier") - 定義に文字列修飾子を指定
- named<MyType>() - 定義に型修飾子を指定
- bind<MyInterface>() - 指定されたBean定義にバインドする型を追加
- binds(listOf(...)) - 指定されたBean定義に型のリストを追加
- createdAtStart() - Koin起動時にシングルトンインスタンスを作成
bind または binds オペレータは、ラムダなしで使用することもできます。
module {
singleOf(::ClassA) bind InterfaceA::class
}
注入パラメータ
コンストラクタDSLを使用する場合でも、注入パラメータを使用できます。 Koinは注入パラメータと現在の依存関係を調べて、コンストラクタを注入しようとします。
class MyFactory(val id: String)
module {
factoryOf(::MyFactory)
}
val id = "a_factory_id"
val factory = koin.get<MyFactory> { parametersOf(id) }
リフレクションベースDSL (3.2以降非推奨)
注意: Koin リフレクションDSLは非推奨になりました。上記 Koin コンストラクタDSLを使用してください。
まとめ
Koin コンストラクタDSLは、依存性注入の定義を簡潔にする強力な機能です。従来の記法と比較して、よりシンプルで読みやすいコードを記述することができます。