使子组件从不同的组件

时间:2016-08-10 15:11:02

标签: dagger-2

最近我和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获得太多信息,而这并不是真的。

1 个答案:

答案 0 :(得分:1)

  

从AppComponent和DBComponent继承依赖项。

错误。您需要从AppComponent继承依赖项,DBComponent的内容应该是AppComponent的模块。

  

注意2:我知道一种方法可以解决这个问题,即在AppComponent中添加DatabaseModule.class作为模块,并从等式中删除DatabaseComponent。但是我觉得这会让AppComponent获得太多信息,而这并不是真的。

是的,如果您正在使用范围内的依赖关系,那么这是最佳选择。

将依赖继承视为Java中的extends关键字。

你不能用同一个类扩展多个类,对吗?

同样,您也无法扩展多个范围的组件。

因此,如果您希望图形为给定范围提供绑定,那么您的组件需要具有该给定范围的所有模块。并且@Database并非真正的范围(想想生命周期),而是重命名的@Singleton