依赖项注册
所需依赖项:io.ktor:ktor-server-di
代码示例: server-di
Ktor 的 依赖注入 (DI) 容器需要知道如何创建应用程序所依赖的对象。这个过程被称为依赖项注册。
基本依赖项注册
基本的依赖项注册在代码中完成,通常在 Application 模块中使用 dependencies {} 代码块。
您可以通过提供 lambda表达式、函数引用、类引用 或 构造函数引用 来注册依赖项:
使用 lambda 表达式
当您想要完全控制实例的创建方式时,请使用 lambda表达式:
dependencies {
provide<GreetingService> { GreetingServiceImpl() }
}这会为 GreetingService 注册一个提供程序。每当请求 GreetingService 时,都会执行该 lambda 表达式来创建一个实例。
使用构造函数引用
如果一个类可以使用其构造函数创建,并且所有构造函数参数都已在 DI 容器中注册,则可以使用构造函数引用。
dependencies {
provide<GreetingService>(::GreetingServiceImpl)
}这会告知您的应用程序使用 GreetingServiceImpl 的构造函数,并让 DI 解析其参数。
使用类引用
您可以注册一个具体的类,而不将其绑定到接口:
dependencies {
provide(BankServiceImpl::class)
}在这种情况下,依赖项通过其 BankServiceImpl 类型进行解析。 当直接注入实现类型且不需要抽象时,这非常有用。
使用函数引用
您可以注册一个创建并返回实例的函数:
dependencies {
provide(::createBankTeller)
}DI 容器会解析函数参数,并将返回值用作依赖项实例。
使用工厂 lambda 表达式
您可以将函数本身注册为依赖项:
dependencies {
provide<() -> GreetingService> {
{ GreetingServiceImpl() }
}
}这会注册一个可以被注入并手动调用以创建新实例的函数。
命名依赖项注册
您可以在注册时为依赖项分配一个名称,以区分相同类型的多个提供程序。
当您需要为一个类型注册多个实现或实例,并在解析过程中显式选择它们时,这非常有用。
要为依赖项分配名称,请将该名称作为第一个参数传递给 provide() 函数:
dependencies {
provide("default") { GreetingServiceImpl() }
provide("alternative") { AlternativeGreetingServiceImpl() }
}命名依赖项必须使用 @Named 注解显式解析。
基于配置的依赖项注册
您可以在配置文件中使用类路径引用声明式地配置依赖项。您可以列出返回对象的函数,或者具有可解析构造函数的类。
在配置文件中的 ktor.application.dependencies 组下排列依赖项:
ktor:
application:
dependencies:
- com.example.RepositoriesKt.provideDatabase
- com.example.UserRepositoryKtor 会使用 DI 容器自动解析函数和构造函数参数。
