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 容器自动解析函数和构造函数参数。