Koin — 用于 Kotlin 的依赖注入容器
在现代 Kotlin 开发中,依赖管理是一项重要任务。Koin 是一个用 Kotlin 编写的轻量级依赖注入 (DI) 容器,它不需要代码生成、反射或复杂配置。与 Dagger 或 Spring 不同,Koin 使用简单的 DSL,并且与协程和 Flow 完全集成。在本页面中,我们将介绍如何安装 Koin、声明模块、注入依赖项以及将其用于教育项目。
什么是依赖注入?
依赖注入 (DI) 是一种模式,其中对象从外部获取其依赖项,而不是自己创建它们。这简化了测试,使代码更灵活并减少了耦合。Koin 通过一个管理对象创建和生命周期的容器来实现 DI。
安装 Koin
将以下依赖项添加到 build.gradle.kts 文件中:
// build.gradle.ktsdependencies { implementation("io.insert-koin:koin-core:3.5.3") // 对于 Android implementation("io.insert-koin:koin-android:3.5.3")}Koin 的核心概念
- 模块 (module) — 声明依赖项的块。
- 定义 (definition) — 创建对象的方式 (single, factory, scoped)。
- 容器 (KoinApplication) — 启动并管理模块。
- 注入 (inject) — 通过委托或函数获取依赖项。
创建模块和声明依赖项
Koin 使用 DSL 来描述模块。考虑一个包含仓库和服务的示例:
// 定义接口和实现interface UserRepository { fun getUser(id: Int): String}
class UserRepositoryImpl : UserRepository { override fun getUser(id: Int) = "User #$id"}
class UserService(private val repository: UserRepository) { fun printUser(id: Int) { println(repository.getUser(id)) }}
// Koin 模块val appModule = module { // single — 创建一个实例 (单例) single<UserRepository> { UserRepositoryImpl() } // factory — 每次请求时创建一个新实例 factory { UserService(get()) }}启动容器
在使用依赖项之前,需要启动 Koin:
import org.koin.core.context.startKoin
fun main() { startKoin { modules(appModule) } // 现在可以获取依赖项 val service: UserService by inject() service.printUser(42)}依赖注入的方式
- by inject() — 延迟获取 (推荐)。
- get() — 立即获取。
- 构造函数 — Koin 自动将依赖项传递给构造函数。
使用 by inject() 的示例:
class MyActivity : AppCompatActivity() { // 延迟注入 private val repository: UserRepository by inject() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 使用 repository }}作用域依赖项
有时需要创建一个在特定上下文(例如用户会话)内存在的依赖项。为此使用 scope:
val sessionModule = module { scope<UserSession> { scoped { UserSessionManager(get()) } }}与协程一起使用
Koin 通过 koin-core-coroutines 模块支持协程。异步获取示例:
import org.koin.core.component.KoinComponentimport org.koin.core.component.inject