Koin 简介
Koin 是一个高效的依赖注入框架,我们将实例化应用程序中各种对象的任务委托给它。我们将探讨 Koin 如何帮助我们高效地管理这些依赖关系。
开始使用 Koin
Koin 是一个非常简单易用的框架,我们要做的就是构建我们的类,指示 Koin 如何创建这些依赖关系,然后我们就可以在需要时随时调用它们。首先,我们创建一个空的活动项目,并在应用级 build.gradle 文件中添加以下依赖项。
// Koin for Android
implementation "org.koin:koin-android:3.2.0"
implementation ‘org.koin:koin-androidx-viewmodel:3.2.0‘
implementation ‘org.koin:koin-androidx-scope:3.2.0‘
定义项目组件
为了演示,我们需要几个相互依赖的组件。以下代码应添加到我们项目的 Kotlin 文件中。
class Pilot(private val fly: Fly, private val eat: Eat) {
fun perform(): String = fly.flyPlane() + "
" + eat.eatFood()
}
class Eat {
fun eatFood(): String = "I am eating food"
}
class Fly {
fun flyPlane(): String = "I am flying a plane"
}
第一个类是飞行员类;飞行员会驾驶飞机并进食。因此,Pilot 类依赖于那些类。eatFood() 和 flyPlane() 函数(它们都位于 Eat 和 Fly 类中)必须由它们调用或访问。为了消除这种依赖关系,这两个类被作为参数添加。因此,要创建 Pilot 类,需要 Eat 和 Fly 类的实例。以下代码应添加到 MainActivity 文件的 onCreate 函数中。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val fly = Fly()
val eat = Eat()
val pilot = Pilot(course, friend)
binding.textView.text = pilot.perform()
}
代码创建了所有类的实例。应用程序启动时,文本视图将显示以下内容:
I am flying a plane
I am eating food
应用程序目前这样运行是可以的。然而,正如我们刚才讨论的,依赖这种形式的依赖注入会使应用程序在扩展时难以管理。让我们看看 Koin 如何帮助我们管理这些依赖关系。
Koin 模块的实现
Koin 使用模块来创建依赖项。以下代码应添加到一个名为“module”的新 Kotlin 文件中。
val appModule = module {
single { Fly() }
factory { Eat() }
factory { Pilot(get(), get()) }
}
顾名思义,模块是使用 module 函数创建的。创建单例实例需要关键字 single。这表明当需要依赖项时,Koin 将返回该类的同一实例。因为我们认为所有飞行员都以相似的方式飞行,所以我们创建了一个单例。另一方面,当我们每次调用都需要类的新实例时,我们使用 factory 方法。Eat 和 Fly 类都是使用 factory 创建的,因为我们每次使用它们时都需要一个新实例。Koin 会识别我们需要的依赖类型,然后为我们获取它。对于模块,这就是我们需要的一切。让我们继续启动 Koin。
启动 Koin
要启动 Koin,我们创建一个应用程序类并插入以下代码。
// get list of all modules
val moduleList = listOf(testModule)
// start koin with the module list
startKoin(this, moduleList)
为了启动 Koin,我们实现了 startKoin 函数。Koin 已经准备好实施了,因此让我们将其集成到我们的主活动中。用以下代码替换 MainActivity 的 onCreate 方法。
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val pilot: Pilot by inject()
binding.textView.text = pilot.perform()
通过注入委托进行依赖的延迟注入时,代码行数肯定有所减少。也可以通过使用 get 函数以非延迟方式获取依赖项。重新启动应用程序。虽然代码运行完美,但这次我们使用了依赖注入框架,这确实有助于确保我们的项目易于测试和维护。
结论
本文介绍了依赖注入以及如何使用 Koin(一个 Kotlin 依赖注入框架)来处理依赖关系。Koin 已被证明易于设置和使用。此外,我们还看到了依赖注入如何使我们保持程序的质量。本文提供了开始使用这个实用且轻量级的框架所需的基础知识。不要犹豫去使用它,因为它是一个有用的框架,允许