我正在将遗留代码库转换为多功能模块体系结构,并且我目前正在尝试整理我的匕首设置,但是有一些问题。
我有一个顶层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);
}...
有什么作用?我在这里搞砸了吗?
答案 0 :(得分:1)
@Component(
modules = [..],
dependencies = [..., FeatureLegacyComponent::class]
)
@AppScope
interface AppComponent
这使您的AppComponent依赖FeatureLegacyComponent,而不是您所说的相反方式:
我有一个顶层AppComponent(AC),其中有一个依赖的FeatureLegacyComponent(FLC)
这就是为什么FeatureLegacyComponent无法访问您的AppComponent提供的实例的原因。为了对其进行修复,可以使FeatureLegacyComponent依赖于AppComponent,或者使FeatureLegacyComponent成为AppComponent的subcomponent。