Dagger 2 访问依赖模块中的命名依赖
Dagger 2 acessing named dependencies in dependant module
我正在将遗留代码库转换为多功能模块架构,目前我正在尝试整理我的 Dagger 设置,但遇到了一些问题。
我有一个顶级 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);
}...
什么给了?我在这里搞砸了什么?
@Component(
modules = [..],
dependencies = [..., FeatureLegacyComponent::class]
)
@AppScope
interface AppComponent
这使您的 AppComponent 依赖于 FeatureLegacyComponent 而不是您所说的相反:
I've got a top level AppComponent (AC) which has a dependant FeatureLegacyComponent (FLC)
这就是 FeatureLegacyComponent 无法访问 AppComponent 提供的实例的原因。为了修复它,您可以使 FeatureLegacyComponent 依赖于 AppComponent,或者使 FeatureLegacyComponent 成为 AppComponent 的 subcomponent。
我正在将遗留代码库转换为多功能模块架构,目前我正在尝试整理我的 Dagger 设置,但遇到了一些问题。
我有一个顶级 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);
}...
什么给了?我在这里搞砸了什么?
@Component(
modules = [..],
dependencies = [..., FeatureLegacyComponent::class]
)
@AppScope
interface AppComponent
这使您的 AppComponent 依赖于 FeatureLegacyComponent 而不是您所说的相反:
I've got a top level AppComponent (AC) which has a dependant FeatureLegacyComponent (FLC)
这就是 FeatureLegacyComponent 无法访问 AppComponent 提供的实例的原因。为了修复它,您可以使 FeatureLegacyComponent 依赖于 AppComponent,或者使 FeatureLegacyComponent 成为 AppComponent 的 subcomponent。