第一部分我们对koin有了初步了解,也学会了在项目中如何快速接入。下面详细剖析下koin的核心及实现。
Koin 是一个面向 Kotlin 开发人员的实用且轻量级的依赖注入框架。
- Koin DSL
得益于 Kotlin 语言的强大功能,Koin 提供了一个 DSL 来帮助您描述您的应用程序,而不是对其进行注释或为其生成代码。凭借其Kotlin DSL,Koin提供了一个智能的函数式API,以实现准备您的依赖注入。
1.1 Application和Module DSL
Koin提供了几个关键字来描述Koin应用程序的元素:
Application DSL,用于描述Koin容器配置
Module DSL,用于描述必须注入的组件
1.2 Application DSL
实例是 Koin 容器实例配置。这将允许您配置日志记录、属性加载和模块。KoinApplication要构建新的 ,请使用以下函数:KoinApplication
koinApplication { }- 创建容器配置 KoinApplication
startKoin { } – 创建容器配置并将其注册到允许使用 GlobalContextAPI KoinApplication GlobalContext
要配置实例,您可以使用以下任一函数:KoinApplication
logger()- 描述要使用的级别和记录器实现(默认情况下使用EmptyLogger)
modules( ) – 设置要在容器中加载的Koin模块列表(列表或vararg列表)
properties() – 将哈希图属性加载到 Koin 容器中
fileProperties( )- 将属性从给定文件加载到 Koin 容器中
environmentProperties( )- 将属性从操作系统环境加载到 Koin 容器中
createEagerInstances()- 创建预先实例(标记为createdAtStart)
1.3 KoinApplication实例:全局VS本地
正如你上面看到的,我们可以通过2中方式配置koin容器。
koinApplication startKoin
koinApplication
描述了一个Koin 容器实例
startKoin
描述了一个Koin容器实例,并将它注册进Koin GlobalContext
通过将容器配置注册到 ,全局 API 可以直接使用它。任何都是指实例。默认情况下,我们使用来自 GlobalContext KoinComponent Koin GlobalContext
1.4 启动Koin
启动Koin意味着将运行一个实例到 KoinApplication GlobalContext
启动一个Koin容器,将使用startKoin函数。
// start a KoinApplication in Global context
startKoin {
// declare used logger
logger()
// declare used modules
modules(coffeeAppModule)
}
1.5 模块 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()
1.6 编写模块
Koin 模块是声明所有组件的空间。使用该函数声明一个 Koin 模块:
module
val myModule = module {
// your dependencies here
}
1.7 DSL选项
与新的构造函数 DSL 定义一样,您可以使用 操作符:withOptions
module {
single { ClassA(get()) } withOptions {
named(“qualifier”)
createdAtStart()
}
}
在此选项 lambda 中,您可以指定以下选项:
named(“a_qualifier”)
- 为定义提供字符串限定符
named()
- 为定义提供类型限定符
bind()
- 为给定的 Bean 定义添加要绑定的类型
binds(arrayOf(…))
- 为给定的 Bean 定义添加类型数组
createdAtStart()
- 在Koin开始时创建单个实例
- 构造函数DSL
Koin 现在提供了一种新的 DSL 关键字,允许您直接面向类构造函数,并避免在 lambda 表达式中键入您的定义。
对于具有以下依赖项的给定类:
ClassA
class ClassA(val b : ClassB, val c : ClassC)
class ClassB()
class ClassC()
您现在可以声明这些组件,直接针对:
class constructor
module {
singleOf(::ClassA)
singleOf(::ClassB)
singleOf(::ClassC)
}
不再需要使用函数在构造函数中指定依赖项
get()
注意:请务必在类名之前使用,以定位类构造函数::
2.1 可用关键字
以下关键字可用于从构造函数构建定义:
scoped { }
factoryOf
- 等效于 – 工厂定义
factory
{ }
singleOf
- 等效于 – 单一定义
single
{ }
scopedOf
- 等效于 – 作用域定义
scoped
{ }
注意:确保不要在构造函数中使用任何默认值,因为 Koin 会尝试填充它的每个参数。
2.2 DSL选项
任何构造函数 DSL 定义,也可以在 lambda 中打开一些选项:
module {
singleOf(::ClassA) {
// definition options
named(“my_qualifier”)
bind()
createdAtStart()
}
}
bindbinds
常用选项和 DSL 关键字在此 lambda 中可用:
named(
“a_qualifier”
)
- 为定义提供字符串限定符
named
()
- 为定义提供类型限定符
bind
()
- 为给定的 Bean 定义添加要绑定的类型
binds(arrayOf(…))
- 为给定的 Bean 定义添加类型数组
createdAtStart()
- 在Koin开始时创建单个实例
您也可以使用 or 运算符,而无需任何 lambda:
bind binds
module {
singleOf(::ClassA) bind InterfaceA::class
}
2.3 注入参数
使用这种声明,您仍然可以使用注入的参数。Koin 将查看注入的参数和当前依赖项,以尝试注入您的构造函数。
像下面这样:
class MyFactory(val id : String)
使用构造函数 DSL 声明:
module {
factoryOf(::MyFactory)
}
可以像这样注入:
val id = “a_factory_id”
val factory = koin.get { parametersOf(id)}
接下来的内容我们将讨论模块定义及启动koin。
参考
https://insert-koin.io
声明:来自码出Droid新高度,仅代表创作者观点。链接:https://eyangzhen.com/7953.html