Koin 在 Kotlin Multiplatform(KMP)中的完整配置指南:依赖、模块划分与多平台启动
后端【免费下载链接】koinKoin - a pragmatic lightweight dependency injection framework for Kotlin Kotlin Multiplatform项目地址https://gitcode.com/gh_mirrors/ko/koin点击查看免费下载Koin 为 Kotlin MultiplatformKMP项目提供了一等公民first-class支持同一份业务代码在 Android、iOS、JVM、JS、Wasm、桌面与服务器端共享依赖注入容器按平台分别初始化。本文以 Koin 官方 KMP 指南docs/reference/koin-core/kmp-setup.md为主体结合仓库中koin-core的源码实现系统讲解build.gradle.kts依赖配置、expect/actual 平台模块、共享初始化函数initKoin()以及 Android/iOS/JVM 三端入口点的完整落地步骤。支持平台一览Koin 的核心库koin-core采用 Kotlin Multiplatform 工程结构见 projects/core/koin-core/src 下的commonMain、androidMain、iosMain、jsMain、jvmMain、nativeMain、wasmJsMain等源码集官方对目标平台的支持情况如下平台状态Android✅ 完整支持iOSarm64、x64、simulatorArm64✅ 完整支持JVM✅ 完整支持JS✅ 完整支持Wasm✅ 完整支持macOS✅ 完整支持Linux✅ 完整支持Windows✅ 完整支持其中KoinPlatformprojects/core/koin-core/src/commonMain/kotlin/org/koin/mp/KoinPlatform.kt正是面向 KMP 暴露的统一基础设施 API提供startKoin(modules, level)、stopKoin()、getKoin()等跨平台入口上层各平台只需针对自己的原生运行时做薄薄一层封装。依赖配置shared/build.gradle.kts在共享模块中应用kotlin(multiplatform)插件并按需声明各平台 target。建议通过Koin BOM统一管理版本避免手工对齐依赖版本plugins { kotlin(multiplatform) id(io.insert-koin.compiler.plugin) // 可选使用 Compiler Plugin DSL 时启用 } kotlin { androidTarget() iosX64() iosArm64() iosSimulatorArm64() jvm() js(IR) { browser() } sourceSets { commonMain.dependencies { implementation(platform(io.insert-koin:koin-bom:4.2.0)) implementation(io.insert-koin:koin-core) } commonTest.dependencies { implementation(io.insert-koin:koin-test) } androidMain.dependencies { implementation(io.insert-koin:koin-android) } } }要点说明koin-bomBOM 会锁定koin-core、koin-test、koin-android、koin-compose等一组坐标的版本声明依赖时无需再写版本号本例版本4.2.0为文档示例可按实际发布版本替换。BOM 模块位于 projects/bom/koin-bom。koin-test放入commonTest意味着单元测试本身可以跨平台共享配合KoinTest接口见 projects/core/koin-test/src/commonMain/kotlin/org/koin/test/KoinTest.kt中的getT()/injectT()扩展即可在 commonTest 中直接解析依赖。koin-android仅放入androidMainAndroid 专属的androidContext()、androidLogger()扩展见 projects/android/koin-android/api/koin-android.api 中的 API 签名只在 Android 源码集中可见避免污染共享代码。Compiler Plugin 插件为可选id(io.insert-koin.compiler.plugin)仅在你使用 Compiler Plugin DSLsingleType()无 lambda 写法时启用详见 docs/setup/compiler-plugin.md。搭配 Compose Multiplatform如果共享层还要提供 UI可在commonMain中追加 Compose 相关依赖kotlin { sourceSets { commonMain.dependencies { implementation(platform(io.insert-koin:koin-bom:4.2.0)) implementation(io.insert-koin:koin-core) implementation(io.insert-koin:koin-compose) implementation(io.insert-koin:koin-compose-viewmodel) } } }koin-compose与koin-compose-viewmodel的 multiplatform 实现分别位于 projects/compose/koin-compose 与 projects/compose/koin-compose-viewmodel可在 Android、iOS、Desktop 等平台共享koinViewModel()等组合函数。仓库的版本目录 projects/gradle/libs.versions.toml 同时维护了 JetBrains Composejb-compose与 AndroidX 生态的版本对齐供参考。项目结构建议官方推荐按“共享模块 各平台宿主应用”组织工程project/ ├── shared/ │ ├── src/ │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ ├── di/ │ │ │ │ └── KoinModules.kt │ │ │ └── domain/ │ │ │ └── UserRepository.kt │ │ ├── androidMain/ │ │ │ └── kotlin/ │ │ │ └── di/ │ │ │ └── PlatformModule.android.kt │ │ └── iosMain/ │ │ └── kotlin/ │ │ └── di/ │ │ └── PlatformModule.ios.kt │ └── build.gradle.kts ├── androidApp/ │ └── src/main/kotlin/ │ └── MainApplication.kt └── iosApp/ └── iOSApp.swift核心思路业务逻辑repository、use case 等全部放在commonMain平台能力文件系统、数据库驱动、网络引擎等通过 expect/actual 下沉到androidMain/iosMain的专属模块中。共享模块定义commonMain 中的 KoinModules.kt在commonMain/kotlin/di/KoinModules.kt中声明共享的 DI 模块并声明一个expect的平台模块占位import org.koin.dsl.module // 共享定义Compiler Plugin DSL 写法 val sharedModule module { singleUserRepository() singleApiClient() factoryGetUserUseCase() } // 平台专属模块按平台分别实现 expect val platformModule: Module官方建议共享模块优先使用Compiler Plugin DSLsingleType()直接引用类型、无 lambda。它需要启用编译器插件但语法最干净也不需要为每个平台单独配置 KSP是跨平台一致性最好的声明方式。关于三种声明方式Compiler Plugin DSL、Annotations、Classic DSL与Single/Factory/ViewModel定义类型的详细说明见 docs/reference/koin-core/definitions.md。平台专属模块expect/actual 实现平台模块可以用任意一种 DSL 方式声明。当需要自定义构造逻辑如传入平台特有的依赖时使用带 lambda 的 Classic DSLandroidMain/kotlin/di/PlatformModule.android.ktimport org.koin.dsl.module actual val platformModule module { // Classic DSL with lambda自定义构造逻辑 singlePlatformHelper { AndroidPlatformHelper(get()) } singleDatabaseDriver { AndroidDatabaseDriver(get()) } }iosMain/kotlin/di/PlatformModule.ios.ktimport org.koin.dsl.module actual val platformModule module { // 若无自定义逻辑也可用 Compiler Plugin DSL / Annotations singleIosPlatformHelper() bind PlatformHelper::class singleIosDatabaseDriver() bind DatabaseDriver::class }两种写法分别展示了“lambda 手动装配”与“bind附加绑定按接口解析实现类”两种模式前者适合构造参数来自平台上下文如get()拉取其他依赖的场景后者适合实现类可直接无参构造、只需暴露为抽象接口的场景。平台模块的 expect/actual 组织方式在 docs/reference/koin-core/kmp-shared-modules.md 中有更完整的展开含 JS 平台的LocalStorageSettings等示例。共享初始化initKoin 统一入口在commonMain/kotlin/di/KoinInit.kt定义一次性的初始化函数把共享模块与平台模块一并装配并通过includes(config)为各平台预留扩展钩子import org.koin.core.context.startKoin import org.koin.core.KoinApplication fun initKoin(config: KoinAppDeclaration? null): KoinApplication { return startKoin { includes(config) modules( sharedModule, platformModule ) } }从源码看startKoin最终会委托给平台相关的默认上下文projects/core/koin-core/src/commonMain/kotlin/org/koin/core/context/DefaultContextExt.kt 中的startKoin(appDeclaration)由KoinPlatformTools.defaultContext()路由到 JVM/Native/JS/Wasm 各自的GlobalContext实现KoinApplicationprojects/core/koin-core/src/commonMain/kotlin/org/koin/core/KoinApplication.kt则负责在启动时统计并加载模块INFO 级别下会打印Started N definitions in ... ms。includes(config)的语义是若平台传入了额外的KoinAppDeclaration配置块则将其内联进本次初始化等价于把平台扩展代码合入同一个 DSL 作用域。各平台入口点KMP 中没有统一的“main”每个平台在自己的入口处调用共享的initKoin()再按需叠加平台扩展。AndroidApplication 中启动在androidApp/src/main/kotlin/MainApplication.kt中利用koin-android提供的androidContext()/androidLogger()扩展class MainApplication : Application() { override fun onCreate() { super.onCreate() initKoin { androidContext(thisMainApplication) androidLogger() } } }androidContext()会把Application的Context注册进 Koin 容器供需要Context的依赖如数据库、SharedPreferences 封装通过get()解析androidLogger()则将日志输出桥接到 Android LogcatAPI 定义见 projects/android/koin-android/api/koin-android.api。iOSSwift 侧调用共享初始化iOS 端需在共享模块的iosMain里暴露一个可被 Swift 调用的无参包装函数// shared/src/iosMain/kotlin/di/KoinInitIos.kt fun initKoinIos() { initKoin() }// iosApp/iOSApp.swift import shared main struct iOSApp: App { init() { KoinInitIosKt.initKoinIos() } var body: some Scene { WindowGroup { ContentView() } } }注意 Swift 侧调用的是 Kotlin 编译器生成的KoinInitIosKt.initKoinIos()文件名KoinInitIos.kt对应类名KoinInitIosKt在App.init()中完成容器初始化确保后续任何视图访问依赖前容器已就绪。JVMmain 函数直接启动JVM桌面或服务器入口最为直接启动后即可通过get()解析依赖fun main() { initKoin { printLogger() } val repository: UserRepository get() }printLogger()使用平台默认的PrintLogger默认日志级别为Level.INFO见 projects/core/koin-core/src/commonMain/kotlin/org/koin/core/KoinApplication.kt 中printLogger(level: Level Level.INFO)的定义。若需要显式配置日志级别、属性或覆盖策略同样可在initKoin { ... }的 DSL 块内追加logger(...)、properties(...)、allowOverride(...)等配置。KMP 中三种 DSL 方式的选择声明方式适用场景Compiler Plugin DSL默认首选——全平台可用语法最干净singleType()无 lambdaAnnotations默认首选——全平台可用无需手写模块代码由注解处理器生成Classic DSL with lambda构建器模式、自定义工厂逻辑、测试替身mock等需要手动装配的场景Compiler Plugin DSL 与 Annotations 在所有支持平台上均可使用只有当你确实需要自定义构造逻辑时才退回到 Classic DSL with lambda。Compiler Plugin 的具体接入步骤见 docs/setup/compiler-plugin.md。最佳实践清单共享代码放进commonMain——业务逻辑、repository、use case 全部共享最大化复用。平台特性使用 expect/actual——文件系统、设备 API、平台库只出现在对应平台源码集。每个平台单独初始化 Koin——各平台拥有自己的入口点通过initKoinincludes(config)模式统一扩展。平台模块保持最小化——只放真正平台相关的内容其余全部留在共享模块。下一步阅读Sharing Patterns模块组织与 expect/actual 模式——共享模块的按层/按功能组织、平台扩展与 ViewModel 共享写法Multiplatform ViewModel——koin-compose-viewmodel的跨平台 ViewModel 支持Advanced Patterns架构模式与平台集成——KMP 项目的高级架构与测试实践TestingKMP 测试——如何在 commonTest 中验证模块与依赖解析赞分享后端【免费下载链接】koinKoin - a pragmatic lightweight dependency injection framework for Kotlin Kotlin Multiplatform项目地址https://gitcode.com/gh_mirrors/ko/koin点击查看免费下载相关推荐Koin 跨平台模块共享模式在 Kotlin Multiplatform 项目中组织与共享依赖注入模块Koin 跨平台模块共享模式在 Kotlin Multiplatform 项目中组织与共享依赖注入模块 导读 在 Kotlin MultiplatformK后端Koin 项目接入指南从依赖配置到多平台启动BOM 与平台 Setup 全解Koin 项目接入指南从依赖配置到多平台启动BOM 与平台 Setup 全解 本文是 Koin 在当前仓库中的官方安装与配置指南覆盖纯 Kotlin、A后端IntelliJ 平台 Pseudo-KMP 模块实战指南借助 expects-compiler-plugin 模拟 Kotlin Multiplatform expect/actualIntelliJ 平台 Pseudo KMP 模块实战指南借助 expects compiler plugin 模拟 Kotlin Multiplatform开发工具IDE代码编辑器上一篇抖音无水印下载神器douyin-downloader 完全使用指南下一篇告别限速烦恼九大网盘直链下载助手完整使用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考