最近我和Dagger 2一起工作了很多,而且我有这个特殊的用例,我不能按照我想要的方式做各种原因: 1)这是不可能的; 2)我只是不理解范围和组件/子组件背后的概念。
我有3个组件:AppComponent,DBComponent,ActivityComponent。
我需要让我的活动继承AppComponent和DBComponent的依赖关系。这是我的以下设置:
AppComponent:
@Singleton
@Component(modules = { AppModule.class }) {
EventBus bus()
ActivityComponent plus(ActivityModule activityModule);
}
DatabaseComponent:
@Database
@Component(dependencies = AppComponent.class, modules = DatabaseModule.class) {
ActivityDependency activityDependency();
}
ActivityComponent:
@PerActivity
@Subcomponent(modules = ActivityModule.class) {
void inject(MainActivity activity);
}
当我注入bus()时,一切正常,但是一旦我尝试注入ActivityDependency(),它就无法正常工作。我无法弄清楚为什么......
请注意:我已经阅读了此处和外部几乎所有帖子,解释了范围,组件和子组件,但我仍然无法理解如何实现我想要的目标。
注意2:我知道一种方法可以解决这个问题,即在AppComponent中添加DatabaseModule.class作为模块,并从等式中删除DatabaseComponent。但是我觉得这会让AppComponent获得太多信息,而这并不是真的。
答案 0 :(得分:1)
从AppComponent和DBComponent继承依赖项。
错误。您需要从AppComponent
继承依赖项,DBComponent
的内容应该是AppComponent
的模块。
注意2:我知道一种方法可以解决这个问题,即在AppComponent中添加DatabaseModule.class作为模块,并从等式中删除DatabaseComponent。但是我觉得这会让AppComponent获得太多信息,而这并不是真的。
是的,如果您正在使用范围内的依赖关系,那么这是最佳选择。
将依赖继承视为Java中的extends
关键字。
你不能用同一个类扩展多个类,对吗?
同样,您也无法扩展多个范围的组件。
因此,如果您希望图形为给定范围提供绑定,那么您的组件需要具有该给定范围的所有模块。并且@Database
并非真正的范围(想想生命周期),而是重命名的@Singleton
。