Open3

koinメモ

ta.toshiota.toshio

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 起動時にシングルトンインスタンスを作成します。
ta.toshiota.toshio

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は、依存性注入の定義を簡潔にする強力な機能です。従来の記法と比較して、よりシンプルで読みやすいコードを記述することができます。