Koin DSL
得益于 Kotlin 语言的强大,Koin 提供了一种 DSL(领域特定语言)来帮助你描述你的应用程序,而不是通过注解或生成代码。凭借其 Kotlin DSL,Koin 提供了一个智能的函数式 API 来帮助你准备依赖注入。
应用程序与模块 DSL
Koin 提供了几个关键字,让你能够描述 Koin 应用程序的各个元素:
- 应用程序 DSL:用于描述 Koin 容器配置
- 模块 DSL:用于描述需要注入的组件
应用程序 DSL
KoinApplication 实例是 Koin 容器实例的配置。这允许你配置日志记录、属性加载和模块。
要构建一个新的 KoinApplication,请使用以下函数:
koinApplication { }- 创建一个KoinApplication容器配置startKoin { }- 创建一个KoinApplication容器配置并将其注册到GlobalContext中,以允许使用GlobalContextAPI
要配置你的 KoinApplication 实例,你可以使用以下任何函数:
logger( )- 描述要使用的级别和Logger实现(默认使用EmptyLogger)modules( )- 设置要在容器中加载的 Koin 模块列表(列表或可变参数列表)properties()- 将HashMap属性加载到 Koin 容器中fileProperties( )- 从给定文件加载属性到 Koin 容器中environmentProperties( )- 从操作系统环境加载属性到 Koin 容器中createEagerInstances()- 创建急切实例(标记为createdAtStart的Single定义)
KoinApplication 实例:全局 vs 局部
如你所见,我们可以通过两种方式描述 Koin 容器配置:koinApplication 或 startKoin 函数。
koinApplication描述一个 Koin 容器实例startKoin描述一个 Koin 容器实例并将其注册到 Koin 的GlobalContext中
通过将你的容器配置注册到 GlobalContext 中,全局 API 可以直接使用它。任何 KoinComponent 都指向一个 Koin 实例。默认情况下,我们使用 GlobalContext 中的实例。
有关更多信息,请查看有关自定义 Koin 实例的章节。
启动 Koin
启动 Koin 意味着在 GlobalContext 中运行一个 KoinApplication 实例。
要使用模块启动 Koin 容器,我们只需像这样使用 startKoin 函数:
// 在全局上下文启动一个 KoinApplication
startKoin {
// 声明使用的日志记录器
logger()
// 声明使用的模块
modules(coffeeAppModule)
}模块 DSL
Koin 模块收集你将为应用程序注入/组合的定义。要创建新模块,只需使用以下函数:
module { // module content }- 创建一个 Koin 模块
要在模块中描述你的内容,你可以使用以下函数:
factory { //definition }- 提供一个factorybean 定义single { //definition }- 提供一个singletonbean 定义(也别名为bean)get()- 解析组件依赖(也可以使用名称、作用域或参数)bind()- 为给定的 bean 定义添加要绑定的类型binds()- 为给定的 bean 定义添加类型数组scope { // scope group }- 为scoped定义指定一个逻辑组scoped { //definition }- 提供一个只存在于某个作用域的bean定义
注意:named() 函数允许你通过字符串、枚举或类型提供一个限定符。它用于为你的定义命名。
编写模块
Koin 模块是声明所有组件的空间。使用 module 函数声明一个 Koin 模块:
val myModule = module {
// 你的依赖项在此
}在此模块中,你可以声明如下所述的组件。
withOptions - DSL 选项(自 3.2 起)
与新的 构造函数 DSL 定义一样,你可以使用 withOptions 操作符在“常规”定义上指定定义选项:
module {
single { ClassA(get()) } withOptions {
named("qualifier")
createdAtStart()
}
}在此选项 lambda 中,你可以指定以下选项:
named("a_qualifier")- 为定义提供一个字符串限定符named<MyType>()- 为定义提供一个类型限定符bind<MyInterface>()- 为给定的 bean 定义添加要绑定的类型binds(arrayOf(...))- 为给定的 bean 定义添加类型数组createdAtStart()- 在 Koin 启动时创建single实例
