Koin — 用于 Kotlin 的依赖注入容器

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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                    

推荐