Kodein-DI 从6.x迁移到7.x的完整指南
Kodein 项目地址: https://gitcode.com/gh_mirrors/kod/Kodein
前言
Kodein-DI 7.x版本带来了多项重大改进,包括全新的类型系统、简化的模块结构以及更一致的命名规范。本文将详细解析这些变化,并提供逐步迁移指南,帮助开发者顺利完成版本升级。
核心变化解析
1. 全新类型系统
Kodein-DI 7.x引入了基于Kotlin最新特性的类型系统,主要改进包括:
- 跨平台泛型支持:现在Native和JS平台也能正确处理泛型类型,例如
List<String>
和List<Int>
会被视为不同的绑定 - 统一实现:使用
typeOf()
内联函数实现类型处理,在JVM上仍保持反射机制 - 默认采用泛型版本:不再需要区分erased和generic实现,简化了API使用
2. 模块结构简化
7.x版本大幅简化了模块依赖:
| 6.x版本模块 | 7.x替代方案 | |------------|------------| | kodein-di-core | kodein-di | | kodein-di-generic-jvm | kodein-di | | kodein-di-erased | kodein-di |
现在只需添加单个依赖即可使用核心功能:
implementation("org.kodein.di:kodein-di:{version}")
3. 包结构调整
- 废弃
org.kodein.di.erased
和org.kodein.di.generic
包 - 所有实现移至根包
org.kodein.di
- 默认采用泛型类型系统实现
4. 类名重构
为保持命名一致性,所有包含"Kodein"的类名都改为"DI"前缀:
| 旧类名 | 新类名 | |-------|-------| | Kodein | DI | | KodeinAware | DIAware | | DKodein | DirectDI | | KodeinContainer | DIContainer |
详细迁移步骤
1. 依赖更新
根据目标平台选择适当的依赖声明方式:
Gradle Metadata启用时:
implementation("org.kodein.di:kodein-di:{version}")
按平台指定:
// JVM
implementation("org.kodein.di:kodein-di-jvm:{version}")
// JS
implementation("org.kodein.di:kodein-di-js:{version}")
// Native
implementation("org.kodein.di:kodein-di-linuxx64:{version}")
2. 包导入更新
手动或使用IDE的重构功能将所有:
org.kodein.di.generic.*
org.kodein.di.erased.*
更新为:
org.kodein.di.*
3. 类名迁移
基础接口迁移
Kodein接口:
// 6.x
val di: Kodein
// 7.x
val di: DI
KodeinAware接口:
// 6.x
class MyService : KodeinAware {
override val kodein: Kodein
override val kodeinContext: Any?
override val kodeinTrigger: KodeinTrigger?
}
// 7.x
class MyService : DIAware {
override val di: DI
override val diContext: Any?
override val diTrigger: DITrigger?
}
绑定与检索
虽然API签名基本保持不变,但需要注意导入包的变更。确保使用org.kodein.di
包下的函数。
4. 框架适配器变更
Android模块
// 核心模块
implementation("org.kodein.di:kodein-di-framework-android-core:{version}")
// Support库模块
implementation("org.kodein.di:kodein-di-framework-android-support:{version}")
// AndroidX模块
implementation("org.kodein.di:kodein-di-framework-android-x:{version}")
主要API变更:
RetainedKodeinFragment
→RetainedDIFragment
closestKodein()
→closestDI()
kodein()
→di()
Ktor模块
KodeinFeature
→DIFeature
kodein { }
→di { }
AbstractKodeinController
→AbstractDIController
TornadoFX模块
closestKodein()
→closestKodeinDI()
kodein()
→kodeinDI()
迁移建议
- 逐步迁移:先更新依赖,再逐个模块处理API变更
- 利用IDE重构:IntelliJ IDEA提供部分自动重构功能
- 全面测试:特别注意泛型绑定的行为变化
- 查阅文档:了解新类型系统的详细特性
总结
Kodein-DI 7.x通过统一类型系统、简化模块结构和规范化命名,为开发者提供了更一致、更强大的依赖注入体验。虽然迁移过程需要一些手动调整,但改进后的API设计将带来长期的可维护性优势。按照本文指南,开发者可以顺利完成从6.x到7.x的过渡。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考