android - Dagger 2 访问依赖模块中的命名依赖项
问题描述
我正在将遗留代码库转换为多功能模块架构,我目前正在尝试整理我的匕首设置,但遇到了一些问题。
我有一个顶级 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 而不是您所说的相反:
我有一个顶级 AppComponent (AC),它有一个依赖的 FeatureLegacyComponent (FLC)
这就是 FeatureLegacyComponent 无法访问您的 AppComponent 提供的实例的原因。为了修复它,您可以使 FeatureLegacyComponent 依赖于 AppComponent,或者使 FeatureLegacyComponent 成为AppComponent 的子组件。
推荐阅读
- javascript - Jquery自动完成不显示自动完成下拉菜单?
- c# - 列表、字符串拆分选项和逻辑
- java - 使用 CascadeType 进行复制
- javascript - Nestjs验证器构造函数参数错误
- selenium - 如何在以下 URL 上使用 Selenium webdriver 选择日期
- c++ - EEPROM ESP8266 - 倒问号
- git - 如何 git 还原一个特定文件的更改,而我的提交更改也涉及其他文件?
- ms-access - 从 MS Access 中的交叉表查询中引用计算值
- caffe - 为什么尝试在 Jetson TX2 上运行 nvidia 的教程代码时,图层权重为空且 TRT 找不到缓存?
- python - 从二维列表中给定相同坐标的列表中选择最小值