如何避免 Dagger 2 的循环依赖?

弗朗索瓦·勒格朗

我有以下模块:

@Module
class HomeModule(private val context: Context) {

    @Provides
    fun provideContext() = context

    @Provides
    fun provideHomeUi(): HomeUi {
        return HomeUi()
    }

    @Provides
    @Singleton
    fun provideHomePresenter(homeUi: HomeUi): HomePresenter {
        return HomePresenter(homeUi)
    }
}

那些注入的字段 HomeUi.kt

@Inject lateinit var context: Context
@Inject lateinit var presenter: HomePresenter

而这个在 HomePresenter.kt

@Inject lateinit var context: Context

这是我的 Deps 组件

@Singleton
@Component(modules = arrayOf(
        NetworkModule::class,
        HomeModule::class
))
interface Deps {
    fun inject(homePresenter: HomePresenter)
    fun inject(homeActivity: HomeActivity)
    fun inject(homeUi: HomeUi)
} 

我正在使用 Dagger 2.10,但StackOverflowError抛出了 a 我正在寻找一种方法来避免我的循环依赖。

注意:这是我的无限实例化的 HomeUi。

大卫·梅登杰克

似乎您HomeUi要从演示者构造函数中调用字段注入,从而触发无限循环,因为没有另一个对象(?),两个对象都无法完成构造。这看起来是一个非常糟糕的方法,您应该尝试将您的依赖项移动到对象构造函数中,而不是创建半成品对象。

字段注入主要用于您无法自己创建的对象,例如 Android 框架类型。恕我直言,inject(homeActivity: HomeActivity)应该是您的组件的唯一方法。

循环依赖很难管理,也没有完美的解决方案,但是你可以尝试切换Provider<HomePresenter>到延迟依赖之类的方法,并能够通过这种方式解决它。

以下应该按照您的意图执行,请注意我如何使用构造函数注入而不是在模块中使用 2 个附加方法。

@Singleton
@Component(modules = arrayOf(
    NetworkModule::class,
    HomeModule::class
))
interface Deps {
  fun inject(homeActivity: HomeActivity)
}

@Module
class HomeModule(private val context: Context) {

  @Provides
  fun provideContext() = context

}

@Singleton
class HomeUi @Inject constructor(presenter : Provider<HomePresenter>, context : Context)
{
  // use with presenter.get()
}

@Singleton
class HomePresenter @Inject constructor(homeUi : HomeUi)

请注意,使用 aProvider<T>是解决我所知道的循环依赖的最便宜的方法,但它可能并不适合所有情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Dagger 2的依赖注入

来自分类Dev

如何避免在活动中设置我所有组件的模块以使用Dagger 2注入依赖项?

来自分类Dev

如何使用Dagger 2注入pojo依赖项?

来自分类Dev

如何通过Dagger2提供GoogleApiClient依赖关系?

来自分类Dev

Dagger 2,如何在依赖项中添加接口

来自分类Dev

Dagger 2注入依赖链

来自分类Dev

使用@Binds和@Inject字段的Dagger2依赖关系循环

来自分类Dev

如何处理依赖循环匕首2

来自分类Dev

使用 Dagger 2 Scope 避免活动泄漏

来自分类Dev

使用Dagger 2查看依赖项注入

来自分类Dev

Dagger 2依赖关系是否可以注入?

来自分类Dev

Dagger 2子组件与组件依赖关系

来自分类Dev

在模块中添加依赖项-Dagger 2

来自分类Dev

Android Dagger2 依赖注入

来自分类Dev

Dagger 2 和依赖注入地狱?

来自分类Dev

Dagger2 - 跨模块依赖

来自分类Dev

如何在Dagger 2上重新启动Retrofits 2的依赖项

来自分类Dev

如何在Dagger 2上重新启动Retrofits 2的依赖项

来自分类Dev

循环依赖-如何解决和避免

来自分类Dev

如何重构它以避免循环依赖?

来自分类Dev

Vuerouter:需要导入,但如何避免循环依赖?

来自分类Dev

避免对休眠的循环依赖

来自分类Dev

如何在Dagger 2中覆盖范围内的依赖项

来自分类Dev

如何在Android中使用Dagger2依赖注入和Robolectric进行测试?

来自分类Dev

如何使用Dagger2将依赖项注入任何类型的对象中?

来自分类Dev

如何在 Dagger2 中实例化我们的依赖图实例

来自分类Dev

如何在 Android 上使用 Kotlin 获取 Dagger 2 模块中的组件依赖项?

来自分类Dev

Dagger 2 访问依赖模块中的命名依赖项

来自分类Dev

避免依赖注入中的依赖循环

Related 相关文章

热门标签

归档