最近,我与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

10-07 22:43