Skip to content

Koin DSL

Koin DSL 的快速參考。如需詳細指南,請參閱 Core - 定義Core - 模組

DSL 做法

做法語法套件
經典 DSLsingle { Class(get()) }org.koin.dsl
經典 AutowiresingleOf(::Class)org.koin.dsl
編譯器外掛程式single<Class>()org.koin.plugin.module.dsl

TIP

編譯器外掛程式 DSL 提供了自動裝配 (auto-wiring) 與編譯時期安全性。請參閱 編譯器外掛程式設定

Application DSL

KoinApplication 執行個體代表您配置的 Koin 容器。這讓您可以設定記錄 (logging)、載入屬性並註冊模組。

建立 KoinApplication

可在以下兩種做法中選擇:

  • koinApplication { } - 建立一個獨立的 KoinApplication 執行個體
  • startKoin { } - 建立一個 KoinApplication 並將其註冊到 GlobalContext
kotlin
// 獨立執行個體(對測試或自訂內容很有用)
val koinApp = koinApplication {
    modules(myModule)
}

// 全域執行個體(應用程式的標準做法)
startKoin {
    logger()
    modules(myModule)
}

配置函式

koinApplicationstartKoin 中,您可以使用:

  • logger() - 設定記錄層級與 Logger 實作(預設:EmptyLogger)
  • modules() - 將模組載入到容器中(接受列表或可變參數 (vararg))
  • properties() - 載入屬性的 HashMap
  • fileProperties() - 從檔案中載入屬性
  • environmentProperties() - 從作業系統環境變數中載入屬性
  • createEagerInstances() - 具現化所有標記為 createdAtStart 的定義
  • allowOverride(Boolean) - 啟用/停用定義覆寫(自 3.1.0 起預設為 true)

全域與區域內容 (Context)

koinApplicationstartKoin 之間的主要區別:

  • startKoin - 在 GlobalContext 中註冊容器,使其可透過 KoinComponentby inject() 以及其他全域 API 存取
  • koinApplication - 建立一個由您直接控制的隔離執行個體
kotlin
// 全域內容 - 標準用法
startKoin {
    logger()
    modules(appModule)
}

// 稍後在應用程式中的任何位置:
class MyClass : KoinComponent {
    val service: Service by inject() // 使用 GlobalContext
}
kotlin
// 區域內容 - 進階用法(測試、多內容應用程式)
val customKoin = koinApplication {
    modules(testModule)
}.koin

val service = customKoin.get<Service>() // 使用特定的執行個體

啟動 Koin

一個完整的 Koin 設定範例:

kotlin
startKoin {
    // 配置記錄
    logger(Level.INFO)

    // 載入屬性
    environmentProperties()

    // 宣告模組
    modules(
        networkModule,
        databaseModule,
        repositoryModule,
        viewModelModule
    )

    // 建立預先載入執行個體 (eager singletons)
    createEagerInstances()
}

Module DSL

如需全面的模組與定義文件,請參閱:

快速參考

定義經典 Lambda經典 Autowire編譯器外掛程式
Singletonsingle { Class(get()) }singleOf(::Class)single<Class>()
Factoryfactory { Class(get()) }factoryOf(::Class)factory<Class>()
Scopedscoped { Class(get()) }scopedOf(::Class)scoped<Class>()
ViewModelviewModel { VM(get()) }viewModelOf(::VM)viewModel<VM>()

基本模組

kotlin
val myModule = module {
    single<Database>()
    single<UserRepository>()
    factory<UserPresenter>()
}

模組組合

kotlin
val appModule = module {
    includes(networkModule, databaseModule)
    single<AppConfig>()
}

startKoin {
    modules(appModule)
}

詳情請參閱 模組 - includes()