首页
/ Kodein-DI 中 Android 系统服务的依赖注入问题解析

Kodein-DI 中 Android 系统服务的依赖注入问题解析

2025-06-25 12:59:05作者:蔡丛锟

问题背景

在使用 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 系统服务的绑定做了更严格的上下文管理:

  1. 所有 Android 系统服务现在都是 contexted 绑定
  2. 这意味着它们必须在一个特定的 Context 上下文中解析
  3. 直接使用 instance() 无法满足这种上下文要求
  4. 必须使用 on(context).instance() 的形式明确指定上下文

最佳实践

  1. 对于 Android 系统服务,总是使用 on(context).instance() 形式获取
  2. 确保在模块绑定时已经正确导入了 androidXModule
  3. 检查 Context 实例是否正确可用
  4. 对于需要名称参数的绑定(如 SharedPreferences),确保正确传递参数

总结

Kodein-DI 7.x 版本对 Android 系统服务的绑定方式进行了改进,要求更明确的上下文管理。这种改变虽然增加了少量代码复杂度,但带来了更好的类型安全和上下文管理能力。开发者需要适应这种新的绑定方式,特别是在从旧版本迁移时要注意这一变化。

登录后查看全文
热门项目推荐

热门内容推荐

最新内容推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
185
266
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
138
188
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
889
529
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
370
385
Git4ResearchGit4Research
Git4Research旨在构建一个开放、包容、协作的研究社区,让更多人能够参与到科学研究中,共同推动知识的进步。
HTML
19
0
kernelkernel
deepin linux kernel
C
22
6
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
337
1.11 K
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.08 K
0
note-gennote-gen
一款跨平台的 Markdown AI 笔记软件,致力于使用 AI 建立记录和写作的桥梁。
TSX
84
4
harmony-utilsharmony-utils
harmony-utils 一款功能丰富且极易上手的HarmonyOS工具库,借助众多实用工具类,致力于助力开发者迅速构建鸿蒙应用。其封装的工具涵盖了APP、设备、屏幕、授权、通知、线程间通信、弹框、吐司、生物认证、用户首选项、拍照、相册、扫码、文件、日志,异常捕获、字符、字符串、数字、集合、日期、随机、base64、加密、解密、JSON等一系列的功能和操作,能够满足各种不同的开发需求。
ArkTS
62
2