android - 注入到 Hilt 未实例化的任意 Logic 类中
问题描述
我目前正在迁移一个应用程序anko-sqlite
,room
因为 anko 很久以前就已经停产了。在这样做的过程中,我引入了存储库层,并认为我会尝试引入依赖注入来获取对所有类中存储库实例的引用。
在此之前,我使用了一个单例实例,我只是将它塞入我的应用程序类伴随对象并从任何地方访问它。
我设法将我的存储库注入 Fragments、Workmanager 和 Viewmodels。但我现在确实有点难以理解他们如何预见我们应该使用任意逻辑类来处理这个问题。
例如,我的 workmanager 工作人员调用了一个实例化“作业”列表的类,这些类需要访问存储库。实际上,工作人员本身甚至确实需要访问存储库,因为所有工作都从中抽象出来。
我怎样才能使这样的工作
class Job(val someExtraArgINeed: Int) {
@Inject
lateinit var someRepository: SomeRepository // <= this should be injected when the job is instanciated with the constructor that already exists
}
对于活动等,我们有特殊的注释@AndroidEntryPoint
可以使其工作。但是,文档不清楚我们应该如何从任何其他非 Android 类中获取实例。我知道构造函数注入是推荐使用的东西。但我不认为如果没有比现在更大的折射镜,它对我来说是行不通的。
解决方案
如果我正确理解您的问题,您可以使用这样的刀柄入口点
class CustomClass(applicationContext: Context) {
@EntryPoint
@InstallIn([/*hilt component that provide SomeRepository*/ApplicationComponent]::class)
interface SomeRepositoryEntryPoint {
fun provideSomeRepository(): SomeRepository
}
private val someRepository by lazy {
EntryPointAccessors.fromApplication(applicationContext, SomeRepositoryEntryPoint::class.java).provideSomeRepository()
}
fun doSomething() {
someRepository.doSomething()
}
}
推荐阅读
- c++ - 在 Windows 上使用 cmake 编译 FFTW (OpenMP)
- javascript - NodeJS - 一分钟后电子托盘图标消失
- r - 比较多列中的字符(因子)
- css - 减少 SASS 函数生成的 CSS 数量
- dialogflow-es - dialogFlow 中是否有办法将所有意图更改为 endInteraction 为真?
- android - 如何保存地图
从 Flutter 到 Firestore - r - 如何对具有不同长度的多个站点数据执行 Mann Kendall 测试并在 R 中的单个数据帧中输出?
- python - 如何在输入框中打印新行?
- ios - 在 iOS 13 上,AVPlayer 会为此 HLS 视频选择仅音频流。我可以控制这种行为,而是让它加载视频+音频吗?
- python - Jedi - Python 自动完成(提示)不显示方法或建议