Skip to content

相依項註冊

必要的相依項io.ktor:ktor-server-di

程式碼範例 server-di

Ktor 的 相依注入 (DI) 容器需要知道如何建立您的應用程式所相依的物件。此程序稱為相依項註冊。

基本相依項註冊

基本相依項註冊是在程式碼中完成的,通常位於 Application 模組內,並使用 dependencies {} 區塊。

您可以透過提供 Lambda 運算式函式參考類別參考建構函式參考 來註冊相依項:

使用 Lambda 運算式

當您想要完全控制執行個體的建立方式時,請使用 Lambda 運算式:

kotlin
dependencies {
    provide<GreetingService> { GreetingServiceImpl() }
}

這會註冊一個 GreetingService 的提供者。每當請求 GreetingService 時,都會執行該 Lambda 運算式來建立執行個體。

使用建構函式參考

如果一個類別可以使用其建構函式建立,且所有建構函式參數都已在 DI 容器中註冊,則您可以使用建構函式參考。

kotlin
dependencies {
    provide<GreetingService>(::GreetingServiceImpl)
}

這會告知您的應用程式使用 GreetingServiceImpl 的建構函式,並讓 DI 解析其參數。

使用類別參考

您可以註冊一個具體類別而不將其繫結到介面:

kotlin
dependencies {
    provide(BankServiceImpl::class)
}

在這種情況下,相依項會透過其 BankServiceImpl 型別進行解析。 當實作型別被直接注入且不需要抽象化時,這非常有用。

使用 函式參考

您可以註冊一個用於建立並傳回執行個體的函式:

kotlin
dependencies {
    provide(::createBankTeller)
}

DI 容器會解析函式參數,並將傳回值作為相依項執行個體。

使用工廠 Lambda 運算式

您可以將函式本身註冊為相依項:

kotlin
dependencies {
    provide<() -> GreetingService> {
        { GreetingServiceImpl() }
    }
}

這會註冊一個可以被注入並手動呼叫以建立新執行個體的函式。

具名相依項註冊

您可以在註冊時為相依項指派名稱,以區分相同型別的多個提供者。

當您需要為單一型別註冊多個實作或執行個體,並在解析期間明確選擇其中之一時,這非常有用。

要為相依項指派名稱,請將名稱作為第一個引數傳遞給 provide() 函式:

kotlin
dependencies {
    provide("default") { GreetingServiceImpl() }
    provide("alternative") { AlternativeGreetingServiceImpl() }
}

具名相依項必須使用 @Named 註解明確解析

基於配置的相依項註冊

您可以在配置檔案中使用類別路徑參考來宣告式地配置相依項。您可以列出傳回物件的函式,或是具有可解析建構函式的類別。

在配置檔案中的 ktor.application.dependencies 群組下條列相依項:

yaml
ktor:
  application:
    dependencies:
      - com.example.RepositoriesKt.provideDatabase
      - com.example.UserRepository

Ktor 會使用 DI 容器自動解析函式與建構函式參數。