@Module付きモジュール
定義を利用する際、それらをモジュールに整理する必要がある場合とない場合があります。まったくモジュールを使わずに、生成された「デフォルト」モジュールを利用することもできます。
モジュールなし - 生成されたデフォルトモジュールの利用
モジュールを指定したくない場合、Koinはすべての定義をホストするためのデフォルトのモジュールを提供します。defaultModule
は直接使用できます。
// Use Koin Generation
import org.koin.ksp.generated.*
fun main() {
startKoin {
defaultModule()
}
}
// or
fun main() {
startKoin {
modules(
defaultModule
)
}
}
INFO
org.koin.ksp.generated.*
のインポートを忘れないでください。
@Module を用いたクラスモジュール
モジュールを宣言するには、クラスに @Module
アノテーションを付けるだけです。
@Module
class MyModule
Koinにモジュールをロードするには、@Module
クラス用に生成された .module
拡張機能を使用するだけです。モジュールの新しいインスタンス MyModule().module
を作成するだけで済みます。
// Use Koin Generation
import org.koin.ksp.generated.*
fun main() {
startKoin {
modules(
MyModule().module
)
}
}
org.koin.ksp.generated.*
のインポートを忘れないでください。
@ComponentScan を用いたコンポーネントスキャン
アノテーション付きコンポーネントをスキャンしてモジュールにまとめるには、モジュールに @ComponentScan
アノテーションを使用するだけです。
@Module
@ComponentScan
class MyModule
これにより、現在のパッケージとそのサブパッケージをスキャンし、アノテーション付きコンポーネントを探します。特定のパッケージ (@ComponentScan("com.my.package")
) をスキャンするように指定することもできます。
INFO
@ComponentScan
アノテーションを使用する場合、KSPは同じパッケージに対して全てのGradleモジュールを横断します。(1.4以降)
クラスモジュール内の定義
定義をクラスモジュール内に直接定義するには、関数を定義アノテーションでアノテーション付けすることができます。
// given
// class MyComponent(val myDependency : MyDependency)
@Module
class MyModule {
@Single
fun myComponent(myDependency : MyDependency) = MyComponent(myDependency)
}
@InjectedParam
、@Property
は関数メンバーでも使用可能です。
モジュールの組み込み
他のクラスモジュールを自分のモジュールに含めるには、@Module
アノテーションの includes
属性を使用するだけです。
@Module
class ModuleA
@Module(includes = [ModuleA::class])
class ModuleB
このようにして、ルートモジュールを実行するだけで済みます。
// Use Koin Generation
import org.koin.ksp.generated.*
fun main() {
startKoin {
modules(
// will load ModuleB & ModuleA
ModuleB().module
)
}
}