Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Dagger 2访问从属模块中的命名依赖项_Android_Dependency Injection_Dagger 2 - Fatal编程技术网

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

Android Dagger 2访问从属模块中的命名依赖项,android,dependency-injection,dagger-2,Android,Dependency Injection,Dagger 2,我正在将一个遗留代码库转换为一个多功能模块体系结构,目前我正在尝试整理我的dagger设置,但有一些问题 我有一个顶级AppComponent(AC),它有一个依赖的FeatureLegacyComponent(FLC)。AC在一个模块中提供了两个命名的调度程序,我正试图将其公开给FLC,但要么我误解了这一切是如何联系在一起的,要么我的设置中有一个bug 我不完全确定公开命名依赖项的最佳方式,但我在AC @Component( modules = [ AndroidSup

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

我有一个顶级AppComponent(AC),它有一个依赖的FeatureLegacyComponent(FLC)。AC在一个模块中提供了两个命名的调度程序,我正试图将其公开给FLC,但要么我误解了这一切是如何联系在一起的,要么我的设置中有一个bug

我不完全确定公开命名依赖项的最佳方式,但我在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
}
但我仍然看到一些错误,表明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()
总线模块如下所示:

@Module(includes = {OtherModule.class})
public class BusModule {
  @Provides
  @FeatureLegacyScope
  RxBus providesBus(@Named("computation") Scheduler scheduler) {
    return new RxBus(scheduler);
  }...
有什么好处?我搞砸了什么

@Component(
    modules = [..],
    dependencies = [..., FeatureLegacyComponent::class]
)
@AppScope
interface AppComponent
这使您的AppComponent依赖于FeatureLegacyComponent,而不是如您所述的那样依赖于FeatureLegacyComponent:

我有一个顶级AppComponent(AC),它有一个从属特性LegacyComponent(FLC)


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

我实际上用了一种稍微不同的方法:定义一个接口
FeatureLegacyComponentParent
,它定义了依赖项
FeatureLegacyComponent
需要什么,然后让
AppComponent
扩展该接口并让
FeatureLegacyComponent
依赖于真正的app组件的
FeatureLegacyComponentParent
impl
@Module(includes = {OtherModule.class})
public class BusModule {
  @Provides
  @FeatureLegacyScope
  RxBus providesBus(@Named("computation") Scheduler scheduler) {
    return new RxBus(scheduler);
  }...
@Component(
    modules = [..],
    dependencies = [..., FeatureLegacyComponent::class]
)
@AppScope
interface AppComponent