Kodein-DI 中 Android 系统服务的依赖注入问题解析
2025-06-25 22:17:59作者:蔡丛锟
问题背景
在使用 Kodein-DI 框架进行 Android 开发时,从版本 5 迁移到版本 7 后,开发者可能会遇到一个常见问题:当尝试获取 Android 系统服务(如 SharedPreferences 或 ConnectivityManager)时,会抛出 DI$NotFoundException 异常,尽管容器中确实存在这些类型的绑定。
问题分析
在 Kodein-DI 7.x 版本中,Android 相关的系统服务绑定方式发生了变化。通过查看容器日志可以发现,所有 Android 系统服务都被标记为 contexted,这意味着这些绑定需要一个 Android Context 上下文才能正确解析。
解决方案
要正确获取这些系统服务,需要在注入时明确指定上下文。以下是正确的使用方式:
val myModule = DI.Module {
bindSingleton<AppSettingsService> {
AppSettingsServiceImpl(
context = instance(),
preferences = on(instance<Context>()).instance(arg = "name")
)
}
}
关键点在于 on(instance<Context>()) 这部分代码,它明确指定了 SharedPreferences 的获取需要基于特定的 Context 实例。
技术原理
Kodein-DI 7.x 对 Android 系统服务的绑定做了更严格的上下文管理:
- 所有 Android 系统服务现在都是
contexted绑定 - 这意味着它们必须在一个特定的 Context 上下文中解析
- 直接使用
instance()无法满足这种上下文要求 - 必须使用
on(context).instance()的形式明确指定上下文
最佳实践
- 对于 Android 系统服务,总是使用
on(context).instance()形式获取 - 确保在模块绑定时已经正确导入了 androidXModule
- 检查 Context 实例是否正确可用
- 对于需要名称参数的绑定(如 SharedPreferences),确保正确传递参数
总结
Kodein-DI 7.x 版本对 Android 系统服务的绑定方式进行了改进,要求更明确的上下文管理。这种改变虽然增加了少量代码复杂度,但带来了更好的类型安全和上下文管理能力。开发者需要适应这种新的绑定方式,特别是在从旧版本迁移时要注意这一变化。
登录后查看全文
项目优选
收起
deepin linux kernel
C
27
11
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
514
3.69 K
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
873
532
Ascend Extension for PyTorch
Python
315
359
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
333
152
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.31 K
730
暂无简介
Dart
756
181
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
12
1
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
67
20
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
1.05 K
519