Dagger2依赖关系循环,通过使用@Binds和@Inject字段

问题描述 投票:0回答:1

每当我尝试将子组件与绑定对象一起使用时,都会得到一个依赖周期。我有一个应用程序范围和一个活动范围。在应用程序范围内,我创建了Web服务,然后在活动打开时,我想创建一个存储对象,控制器和导航器(所有自定义类,而不是androidx类),并将它们注入到我的androidx ViewModel类中。但是当我这样做时,我得到了一个依赖周期。

我的顶级组件看起来像

@AppScope
@Component(modules = [AppModule::class])
interface AppComponent {

  val activityComponentBuilder: ActivityComponent.Builder
}

@Module(subcomponents = [ActivityComponent::class])
interface AppModule {

  @Binds
  fun mockWebService(mockWebService: MockWebService): MockWebService
}

接下来我的子组件看起来像

@ActivityComponent
@Subcomponent(modules = [ActivityModule::class])
interface ActivityComponent {

  fun inject(sharedViewModel: SharedViewModel)

  @Subcomponent.Builder
  interface Builder {
    @BindsInstance
    fun storage(storage: Storage): Builder

    fun build(): ActivityComponent
  }
}

在我的活动模块中,我绑定了两个对象

  @Binds
  abstract fun controller(controller: Controller): Controller

  @Binds
  abstract fun navigator(navigator: Navigator): Navigator

每个对象都有一个@Inject构造函数

class Navigator @Inject constructor(private val storage: Storage)

class Controller @Inject constructor(
  private val webService: MockWebService,
  private val navigator: Navigator,
  private val storage: Storage
) {

在我的共享视图模型中,我尝试构建我的组件并注入字段

  @Inject
  lateinit var navigator: Navigator
  @Inject
  lateinit var controller: Controller

  init {
      MainApplication.component.activityComponentBuilder
        .storage(InMemoryStorage.from(UUID.randomUUID().toString()))
        .build()
        .inject(this)

  }

但是匕首不会建立。我收到一个错误

[Dagger/DependencyCycle] Found a dependency cycle: public abstract interface AppComponent {

MockWebService is injected at di.AppModule.mockWebService(mockWebService)
MockWebService is injected at ActivityModule.Controller(webService, …)
Controller is injected at SharedViewModel.controller
SharedViewModel is injected at

但是错误消息到此为止。在使用子组件将对象放在图形上然后将它们注入到对象中时,我是否缺少某些东西?用匕首不可能吗?

android kotlin dagger-2
1个回答
0
投票

@Binds用于使dagger知道接口的不同实现。您不需要@Binds,因为Navigator和Controller是不实现任何接口的常规类。我认为MockWebService也是如此。而且,这些类具有@Inject constructor,这意味着匕首可以实例化它们,而我们无需为这些类编写额外的@Provides函数。

@Binds未进行任何范围界定。唯一的工作就是告诉匕首有关不同的实现。您可以将@XScope@Binds相加,以使某些对象成为作用域。或者,您可以仅将范围注释添加到类声明中。 Here's如何将范围添加到类声明的示例。

关于依赖性周期,我认为这是因为您要告诉ActivityComponent使用ActivityModule,然后告诉ActivityModule安装ActivityComponent。 (我认为)应该只做一个。

© www.soinside.com 2019 - 2024. All rights reserved.