Skip to content

帶有 @Module 的模組

在使用定義時,你可能需要將它們組織成模組,或者不這麼做。你甚至可以完全不使用任何模組,而使用「預設」生成的模組。

不使用模組 - 使用生成的預設模組

如果你不想指定任何模組,Koin 會提供一個預設模組來存放你所有的定義。defaultModule 可以直接使用:

kotlin
// 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 註解標記一個類別:

kotlin
@Module
class MyModule

要在 Koin 中載入你的模組,只需使用為任何 @Module 類別生成的 .module 擴展函數。只需建立模組 MyModule().module 的新實例:

kotlin
// Use Koin Generation
import org.koin.ksp.generated.*

fun main() {
    startKoin {
        modules(
          MyModule().module
        )
    }
}

別忘了使用 org.koin.ksp.generated.* 導入。

帶有 @ComponentScan 的組件掃描

要掃描並收集帶有註解的組件到一個模組中,只需在模組上使用 @ComponentScan 註解:

kotlin
@Module
@ComponentScan
class MyModule

這將會掃描目前套件及其子套件中的帶有註解的組件。你可以指定掃描某個給定的套件,例如 @ComponentScan("com.my.package")

INFO

當使用 @ComponentScan 註解時,KSP 會針對同一個套件遍歷所有 Gradle 模組。(自 1.4 版起)

類別模組中的定義

要直接在你的模組中定義一個定義,你可以使用定義註解來註解一個函數:

kotlin
// given 
// class MyComponent(val myDependency : MyDependency)

@Module
class MyModule {

  @Single
  fun myComponent(myDependency : MyDependency) = MyComponent(myDependency)
}

@InjectedParam@Property 也可以用於函數成員上。

包含模組

要將其他類別模組包含到你的模組中,只需使用 @Module 註解的 includes 屬性:

kotlin
@Module
class ModuleA

@Module(includes = [ModuleA::class])
class ModuleB

這樣你就可以直接運行你的根模組:

kotlin
// Use Koin Generation
import org.koin.ksp.generated.*

fun main() {
    startKoin {
        modules(
          // will load ModuleB & ModuleA
          ModuleB().module
        )
    }
}