Dagger 2 обрабатывает именованные зависимости в зависимом модуле - PullRequest
0 голосов
/ 07 июня 2019

Я конвертирую устаревшую кодовую базу в архитектуру многофункционального модуля и в настоящее время пытаюсь разобраться в настройке своего кинжала, но у меня возникают некоторые проблемы.

У меня есть 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);
  }...

Что дает? Что я тут напортачил?

1 Ответ

1 голос
/ 09 июня 2019
@Component(
    modules = [..],
    dependencies = [..., FeatureLegacyComponent::class]
)
@AppScope
interface AppComponent

Это делает ваш AppComponent зависимым от FeatureLegacyComponent, а не наоборот, как вы заявили:

У меня есть AppComponent верхнего уровня (AC), который имеет зависимый FeatureLegacyComponent (FLC))

Вот почему FeatureLegacyComponent не может получить доступ к экземплярам, ​​предоставляемым вашим AppComponent.Чтобы это исправить, вы можете либо сделать FeatureLegacyComponent зависимым от AppComponent, либо сделать FeatureLegacyComponent субкомпонентом AppComponent.

...