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