kotlin依赖注入框架之koin(二)

第一部分我们对koin有了初步了解,也学会了在项目中如何快速接入。下面详细剖析下koin的核心及实现。

Koin 是一个面向 Kotlin 开发人员的实用且轻量级的依赖注入框架。

  1. 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开始时创建单个实例
  1. 构造函数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

码出Droid新高度的头像码出Droid新高度

相关推荐

添加微信
添加微信
Ai学习群
返回顶部