最近,我与Dagger 2进行了很多合作,并且由于不同的原因,我有一个特殊的用例,我无法按照我想要的方式进行操作:
1)不可能; 2)我只是不了解范围和组件/子组件背后的概念。
我有3个组件:AppComponent,DBComponent,ActivityComponent。
我需要进行 Activity 以继承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);
}
当我注入(inject)bus()时,一切正常,但是一旦我尝试注入(inject)ActivityDependency(),它就根本不起作用。我不知道为什么...
请注意:在这里和外部,我已经阅读了几乎所有有关范围,组件和子组件的文章,但我仍然不知如何实现自己想要的东西。
注意2:我知道解决此问题的一种方法,即在AppComponent中将DatabaseModule.class添加为模块,然后从等式中删除DatabaseComponent。但是我觉得这会使AppComponent拥有太多信息,这并不是真正的可行之道。
最佳答案
从AppComponent和DBComponent继承依赖项。
错误。您需要从AppComponent
继承依赖项,并且DBComponent
的内容应该是AppComponent
的模块。
注意2:我知道解决此问题的一种方法,即在AppComponent中将DatabaseModule.class添加为模块,然后从等式中删除DatabaseComponent。但是我觉得这会使AppComponent拥有太多信息,这并不是真正的可行之道。
是的,如果您使用的是作用域依赖性,这是首选方法。
将依赖性继承视为Java中的extends
关键字。
您不能用同一 class 扩展多个 class ,可以吗?
同样,您也不能扩展多个作用域组件。
因此,如果您希望图形为给定范围提供绑定(bind),则您的组件需要具有该给定范围的所有模块。 @Database
并不是一个真正的作用域(请考虑生命周期),而是一个重命名的@Singleton
。