Dagger 2在依赖模块中访问命名依赖

时间:2019-06-07 11:51:05

标签: android dependency-injection dagger-2

我正在将遗留代码库转换为多功能模块体系结构,并且我目前正在尝试整理我的匕首设置,但是有一些问题。

我有一个顶层AppComponent(AC),其中有一个依赖的FeatureLegacyComponent(FLC)。 AC在一个模块中提供了几个名为Scheduler的模块,我正试图向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);
  }...

有什么作用?我在这里搞砸了吗?

1 个答案:

答案 0 :(得分:1)

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

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

  

我有一个顶层AppComponent(AC),其中有一个依赖的FeatureLegacyComponent(FLC)

这就是为什么FeatureLegacyComponent无法访问您的AppComponent提供的实例的原因。为了对其进行修复,可以使FeatureLegacyComponent依赖于AppComponent,或者使FeatureLegacyComponent成为AppComponent的subcomponent