构造函数 DSL
Koin 现在提供了一种新型的 DSL 关键字,允许你直接面向类的构造函数,避免在 lambda 表达式中定义你的类型。
对于具有以下依赖的给定类 ClassA
:
kotlin
class ClassA(val b : ClassB, val c : ClassC)
class ClassB()
class ClassC()
你现在可以直接面向“类构造函数”来声明这些组件:
kotlin
module {
singleOf(::ClassA)
singleOf(::ClassB)
singleOf(::ClassC)
}
不再需要使用 get()
函数在构造函数中指定依赖!🎉
INFO
确保在你的类名之前使用 ::
,以指向你的类构造函数。
NOTE
你的构造函数将自动填充所有的 get()
调用。避免使用任何默认值,因为 Koin 将尝试在当前图中查找它。
NOTE
如果你需要获取一个“命名”定义,你需要使用带有 lambda 和 get()
的标准 DSL 来指定限定符。
可用关键字
以下关键字可用于从构造函数构建你的定义:
factoryOf
- 相当于factory { }
- 工厂定义singleOf
- 相当于single { }
- 单例定义scopedOf
- 相当于scoped { }
- 作用域定义
INFO
确保不要在构造函数中使用任何默认值,因为 Koin 将尝试使用它填充每个参数。
DSL 选项
任何构造函数 DSL 定义,也可以在 lambda 中开启一些选项:
kotlin
module {
singleOf(::ClassA) {
// definition options
named("my_qualifier")
bind<InterfaceA>()
createdAtStart()
}
}
常用的选项和 DSL 关键字在此 lambda 中可用:
named("a_qualifier")
- 为定义指定一个字符串限定符named<MyType>()
- 为定义指定一个类型限定符bind<MyInterface>()
- 为给定的 bean 定义添加要绑定的类型binds(listOf(...))
- 为给定的 bean 定义添加类型列表createdAtStart()
- 在 Koin 启动时创建单例实例
你也可以使用 bind
或 binds
操作符,无需 lambda:
kotlin
module {
singleOf(::ClassA) bind InterfaceA::class
}
注入参数
采用这种声明方式,你仍然可以使用注入参数。Koin 将在注入参数和当前依赖中查找,以尝试注入你的构造函数。
如下所示:
kotlin
class MyFactory(val id : String)
使用构造函数 DSL 声明:
kotlin
module {
factoryOf(::MyFactory)
}
可以这样注入:
kotlin
val id = "a_factory_id"
val factory = koin.get<MyFactory> { parametersOf(id)}
基于反射的 DSL(自 3.2 版起已弃用)
CAUTION
Koin 反射 DSL 现已弃用。请使用上方的 Koin 构造函数 DSL。