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