首页 > 解决方案 > 注入到 Hilt 未实例化的任意 Logic 类中

问题描述

我目前正在迁移一个应用程序anko-sqliteroom因为 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 类中获取实例。我知道构造函数注入是推荐使用的东西。但我不认为如果没有比现在更大的折射镜,它对我来说是行不通的。

标签: androidkotlindagger-hilt

解决方案


如果我正确理解您的问题,您可以使用这样的刀柄入口点

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()
    }

}

推荐阅读