Koin DSL
憑藉 Kotlin 語言的強大功能,Koin 提供了一個 DSL,幫助您描述應用程式,而不是透過註解或產生程式碼來實現。透過其 Kotlin DSL,Koin 提供了一個智慧型函式式 API,用於準備您的依賴注入。
應用程式與模組 DSL
Koin 提供了幾個關鍵字,讓您可以描述 Koin 應用程式中的元素:
- 應用程式 DSL,用於描述 Koin 容器組態
- 模組 DSL,用於描述需要注入的元件
應用程式 DSL
一個 KoinApplication
實例就是一個 Koin 容器實例組態。這將讓您配置日誌記錄、載入屬性以及模組。
若要建立新的 KoinApplication
,請使用以下函式:
koinApplication { }
- 建立一個KoinApplication
容器組態startKoin { }
- 建立一個KoinApplication
容器組態並將其註冊到GlobalContext
中,以允許使用 GlobalContext API
若要配置您的 KoinApplication
實例,您可以使用以下任何函式:
logger( )
- 指定要使用的日誌級別和 Logger 實作 (預設使用 EmptyLogger)modules( )
- 設定要載入到容器中的 Koin 模組列表 (列表或可變引數列表)properties()
- 將 HashMap 屬性載入到 Koin 容器中fileProperties( )
- 從指定檔案載入屬性到 Koin 容器中environmentProperties( )
- 從作業系統環境載入屬性到 Koin 容器中createEagerInstances()
- 建立即時實例 (標記為createdAtStart
的單例定義)
KoinApplication 實例:全域與局部
如您所見,我們可以用兩種方式描述 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 模組集合了您將為應用程式注入/組合的定義。若要建立新模組,只需使用以下函式:
module { // module content }
- 建立一個 Koin 模組
若要在模組中描述您的內容,您可以使用以下函式:
factory { //definition }
- 提供一個工廠 bean 定義single { //definition }
- 提供一個單例 bean 定義 (亦可別名為bean
)get()
- 解析元件依賴 (亦可使用名稱、作用域或參數)bind()
- 為給定的 bean 定義添加要綁定的類型binds()
- 為給定的 bean 定義添加類型陣列scope { // scope group }
- 定義scoped
定義的邏輯群組scoped { //definition }
- 提供一個僅存在於一個作用域內的 bean 定義
注意:named()
函式允許您透過字串、列舉或類型來提供限定詞。它用於為您的定義命名。
編寫模組
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")
- 為定義提供一個字串限定詞named<MyType>()
- 為定義提供一個類型限定詞bind<MyInterface>()
- 為給定的 bean 定義添加要綁定的類型binds(arrayOf(...))
- 為給定的 bean 定義添加類型陣列createdAtStart()
- 在 Koin 啟動時建立單例實例