Koin DSL
多虧了 Kotlin 語言的強大功能,Koin 提供了一種 DSL(Domain Specific Language,領域特定語言),可幫助您描述您的應用程式,而無需對其進行註解或生成程式碼。 憑藉其 Kotlin DSL,Koin 提供了一個智慧型函數式 API,以實現準備您的依賴注入。
應用程式 & 模組 DSL
Koin 提供了幾個關鍵字,讓您可以描述 Koin 應用程式(Koin Application)的元素:
- 應用程式 DSL(Application DSL),用於描述 Koin 容器配置
- 模組 DSL(Module DSL),用於描述必須注入的元件
應用程式 DSL
KoinApplication
實例是一個 Koin 容器實例配置。 這將讓您配置日誌記錄、屬性載入和模組。
要構建一個新的 KoinApplication
,請使用以下函數:
koinApplication { }
- 創建一個KoinApplication
容器配置startKoin { }
- 創建一個KoinApplication
容器配置,並將其註冊到GlobalContext
中,以允許使用全域上下文 API(GlobalContext API)
要配置您的 KoinApplication
實例,您可以使用以下任何函數:
logger( )
- 描述要使用的日誌級別和 Logger 實作(預設使用 EmptyLogger)modules( )
- 設定要在容器中載入的 Koin 模組列表(列表或變長參數列表)properties()
- 將 HashMap 屬性載入到 Koin 容器中fileProperties( )
- 從給定檔案將屬性載入到 Koin 容器中environmentProperties( )
- 從作業系統環境(OS environment)將屬性載入到 Koin 容器中createEagerInstances()
- 建立預先實例 (標記為createdAtStart
的 Single 定義)
KoinApplication 實例:全域 vs 區域
如您在上面看到的,我們可以通過 2 種方式描述 Koin 容器配置: koinApplication
或 startKoin
函數。
koinApplication
描述一個 Koin 容器實例startKoin
描述一個 Koin 容器實例,並將其註冊到 KoinGlobalContext
中
通過將您的容器配置註冊到 GlobalContext
中,全域 API 可以直接使用它。 任何 KoinComponent
都引用一個 Koin
實例。 預設情況下,我們使用來自 GlobalContext
的實例。
有關更多資訊,請查看有關自訂 Koin 實例的章節。
啟動 Koin
啟動 Koin 意味著在 GlobalContext
中執行 KoinApplication
實例。
要使用模組啟動 Koin 容器,我們可以像這樣使用 startKoin
函數:
// start a KoinApplication in Global context
startKoin {
// declare used logger
logger()
// declare used modules
modules(coffeeAppModule)
}
模組 DSL
一個 Koin 模組收集您將為您的應用程式注入/組合的定義(definitions)。 要創建一個新模組,只需使用以下函數:
module { // module content }
- 創建一個 Koin 模組
要在模組中描述您的內容,您可以使用以下函數:
factory { //definition }
- 提供一個 factory bean 定義single { //definition }
- 提供一個 singleton bean 定義(也別名為bean
)get()
- 解析一個元件依賴(也可以使用名稱、作用域或參數)bind()
- 為給定的 bean 定義添加要綁定的類型binds()
- 為給定的 bean 定義添加類型陣列scope { // scope group }
- 為scoped
定義定義一個邏輯組scoped { //definition }
- 提供一個 bean 定義,它只存在於一個作用域中
注意: named()
函數允許您通過字串、枚舉或類型給出一個限定符(qualifier)。 它用於命名您的定義。
編寫一個模組
一個 Koin 模組是聲明所有元件的空間。 使用 module
函數來聲明一個 Koin 模組:
val myModule = module {
// your dependencies here
}
在這個模組中,您可以聲明如下所述的元件。
withOptions - DSL 選項(自 3.2 起)
與新的 Constructor DSL 定義一樣,您可以使用 withOptions
運算符在「常規」定義上指定定義選項:
module {
single { ClassA(get()) } withOptions {
named("qualifier")
createdAtStart()
}
}
在這個選項 lambda 中,您可以指定以下選項:
named("a_qualifier")
- 給定義一個字串限定符(String qualifier)named<MyType>()
- 給定義一個類型限定符(Type qualifier)bind<MyInterface>()
- 為給定的 bean 定義添加要綁定的類型binds(arrayOf(...))
- 為給定的 bean 定義添加類型陣列createdAtStart()
- 在 Koin 啟動時創建單例實例