首页 > 解决方案 > Dagger 2 访问依赖模块中的命名依赖项

问题描述

我正在将遗留代码库转换为多功能模块架构,我目前正在尝试整理我的匕首设置,但遇到了一些问题。

我有一个顶级 AppComponent (AC),它有一个依赖的 FeatureLegacyComponent (FLC)。AC 在一个模块中提供了几个命名的调度程序,我试图将它们公开给 FLC,但要么我误解了这一切是如何挂在一起的,要么我的某个地方的设置存在错误。

我不完全确定公开命名依赖项的最佳方式,但我在 AC 中写了类似的东西

@Component(
    modules = [
        AndroidSupportInjectionModule::class,
        SchedulerModule::class],
    dependencies = [BaseComponent::class,
        FeatureLegacyComponent::class]
)
@AppScope
interface AppComponent : AndroidInjector<MainApplication> {
    @Named("computation")
    fun computationScheduler(): Scheduler

    @Named("ui")
    fun uiScheduler(): Scheduler
}

SchedulerModule 看起来像

@Module
class SchedulerModule {
    @Provides
    @Named("computation")
    fun providesComputationScheduler(): Scheduler = Schedulers.computation()

    @Provides
    @Named("ui")
    fun providesUiScheduler(): Scheduler = AndroidSchedulers.mainThread()

    @Provides
    @Named("io")
    fun providesIoScheduler(): Scheduler = Schedulers.io()
}

但我仍然看到错误表明计算调度程序在 FeatureLegacyComponent 中不可用

OAuth2TokenRefreshInterceptor getOAuth2TokenRefreshInterceptor();
                                ^
      @javax.inject.Named("computation") io.reactivex.Scheduler is injected at
          com.meetup.feature.legacy.dagger.BusModule.providesBus(scheduler)
      com.meetup.feature.legacy.bus.RxBus is injected at
          com.meetup.feature.legacy.http.OAuth2TokenRefreshInterceptor.<init>(…, bus)
      com.meetup.feature.legacy.http.OAuth2TokenRefreshInterceptor is provided at
          com.meetup.feature.legacy.dagger.FeatureLegacyComponent.getOAuth2TokenRefreshInterceptor()

BusModule 是 FLC 中包含的模块

@FeatureLegacyScope
@Component(
    modules = {
        BusModule.class
    }
)
public interface FeatureLegacyComponent {...

BusModule 看起来像这样:

@Module(includes = {OtherModule.class})
public class BusModule {
  @Provides
  @FeatureLegacyScope
  RxBus providesBus(@Named("computation") Scheduler scheduler) {
    return new RxBus(scheduler);
  }...

是什么赋予了?我在这里搞砸什么?

标签: androiddependency-injectiondagger-2

解决方案


@Component(
    modules = [..],
    dependencies = [..., FeatureLegacyComponent::class]
)
@AppScope
interface AppComponent

这使您的 AppComponent 依赖于 FeatureLegacyComponent 而不是您所说的相反:

我有一个顶级 AppComponent (AC),它有一个依赖的 FeatureLegacyComponent (FLC)

这就是 FeatureLegacyComponent 无法访问您的 AppComponent 提供的实例的原因。为了修复它,您可以使 FeatureLegacyComponent 依赖于 AppComponent,或者使 FeatureLegacyComponent 成为AppComponent 的子组件


推荐阅读