使用Koin的安卓依赖注入
依赖注入是一种编程技术,它使一个类独立于其依赖关系。这是通过将一个对象的使用与它的创建脱钩而实现的。许多Android开发者都熟悉基于Java的依赖注入框架,如Dagger和Guice。
然而,有些框架是完全用Kotlin编写的,用于Kotlin。这些框架包括Koin和Kodein。本文将介绍如何使用新的依赖注入框架--Koin来管理Android中的依赖关系。
前提条件
要继续学习本教程,你需要。
- 安装有Android Studio。
- 拥有构建Android应用程序的基本知识。
- 对Kotlin编程语言有基本了解。
让我们开始吧!
依赖性注入到底是什么?
作为一个软件开发者,你一定或可能听说过依赖注入,但并不真正了解它是什么。你甚至可能问自己,我为什么要使用这种技术?
它有多重要?我有没有使用过它?嗯,最后一个问题的答案很简单。你有,但没有任何依赖性注入框架。
考虑一下下面的情况。你有两个类,A和B。B类需要A的一个实例来执行一个特定的任务。正确的说法是,B类直接依赖于A类。
因此,我们经常发现自己在使用被依赖的类之前,先创建一个被依赖的类的实例,或者把它作为一个参数传递。所有这些都是依赖性注入的形式。这对于一个小项目来说是没有问题的。
然而,随着项目规模的扩大,维护和测试变得具有挑战性。这就是依赖性注入框架发挥作用的地方。
依赖性注入框架帮助我们创建和管理依赖关系。如前所述,有许多基于Java的Android依赖注入框架。然而,随着Kotlin在Android上的应用越来越多,对完全用Kotlin编写的库的需求正在上升。
Koin 洛克菲勒是一个符合这一需求的依赖注入框架。它是一个轻量级的框架,易于学习,并且没有太多的模板代码。让我们来看看我们如何使用这个框架来管理Android应用程序中的依赖关系。
开始使用Koin
Koin是相当简单的。我们需要做的就是创建我们的类,告诉Koin如何创建依赖关系,然后我们就可以在任何时候/任何地方调用它们。
在我们进一步行动之前,创建一个empty activity 项目,并给它起一个你选择的名字。等待项目构建完成,然后在你的应用级build.gradle 文件中添加以下依赖项。
implementation "org.koin:koin-android:1.0.2"
让我们继续前进并创建一些类。
创建项目组件
我们将需要一些相互依赖的组件进行演示。让我们创建一个场景。创建一个Kotlin文件并在其中添加以下代码。
class Student(private val course: Course, private val friend: Friend) {
fun doWork(): String =
course.study() + "\n" + friend.play()
}
class Friend {
fun play(): String = "I am playing with my friend"
}
class Course {
fun study(): String = "I am studying"
}
第一个类是Student ,一个student ,有一个学习的课程和一个朋友一起玩。因此,Student 类依赖于这些类。
它需要它们来调用或访问分别包含在Course 和Friend 类中的study() 和play() 函数。为了解决这种依赖关系,我们将这两个类作为参数加入。
这意味着,如果没有Course 和Friend 类的实例,Student 类就不能被实例化。
打开MainActivity 文件,用下面的代码替换onCreate 函数。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val course = Course()
val friend = Friend()
val student = Student(course, friend)
binding.textView.text = student.doWork()
}
该应用程序使用View binding 来访问默认的TextView ,ID为text_view 。
该代码创建了所有类的实例。
运行该应用程序后,文本视图将显示。
I am studying
I am playing with my friend
应用程序的现状没有任何问题。但是,正如我们前面提到的,依靠这种依赖性注入会使应用程序在扩展时难以维护。让我们看看Koin如何帮助我们管理这些依赖关系。
创建一个Koin模块
Koin使用模块来创建依赖关系。创建一个名为 "模块 "的新Kotlin文件,并添加以下代码。
val appModule = module {
single { Course() }
factory { Friend() }
factory { Student(get(), get()) }
}
module function ,顾名思义是用来创建一个模块。single ,用来创建一个单子实例。这意味着,当需要依赖时,Koin将返回相同的类的实例。
我们把Course ,因为我们假设所有的学生都做同样的课程。factory另一方面,当我们每次调用该类时都希望有一个新的instance 。
我们对Friend 和Student 这两个类都使用了工厂,因为我们希望每次调用它们都有一个新的实例。get 函数用于获取所需的依赖关系,只有当它在模块中被指定时。
它检测我们需要的依赖类型并为我们获取它。这就是我们对模块的所有需求。让我们继续启动Koin。
启动Koin
启动Koin是相当简单的。用你选择的名字创建一个应用类,并添加以下代码来启动Koin。
startKoin(this, listOf(appModule))
我们使用startKoin 函数来启动Koin。
就这样了!Koin已经完全设置好了。现在,让我们在我们的MainActivity 中使用Koin。
用这个替换MainActivity 中的onCreate 方法。
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val student: Student by inject()
binding.textView.text = student.doWork()
代码行数的减少是很明显的。by inject 委托用于lazily 注入依赖关系。我们也可以使用get 函数来获得依赖性non-lazily 。
再次运行该应用程序。
代码运行正常,但是,这次我们采用了一个依赖注入框架,这对确保我们的项目可维护和容易测试有很大帮助。
总结
在这篇文章中,我们已经经历了依赖注入,以及如何使用Kotlin依赖注入(Koin)来管理依赖关系。我们已经看到了Koin是如何容易设置和使用的。
我们还看到了依赖注入是如何帮助我们使我们的应用程序可维护的。我希望这个教程能给你提供开始使用这个伟大的轻量级框架所需的基础知识。