我有3个组成部分: 主要应用程序组件:
@Singleton
@Component(modules = {AppModule.class, UserModule.class, DatabaseModule.class})
public interface AppComponent {
Context getContext();
DatabaseHelper getDatabaseHelper();
UserManager getUserManager();
}
存储库组件:
@DataScope
@Component(dependencies = AppComponent.class, modules = CategoryRepositoryModule.class)
public interface CategoryRepositoryComponent {
CategoryRepository getCategoryRepository();
}
屏幕组件:
@MenuScope
@Component(dependencies = CategoryRepositoryComponent.class, modules = {MenuModule.class, DrawerModule.class})
interface MenuComponent {
void inject(MenuActivity activity);
}
问题是我的MenuComponent无法看到提供AppComponent的依赖项。但MenuComponent依赖于CategoryRepositoryComponent和CategoryRepositoryComponent依赖于AppComponent,因此MenuComponent应该看到AppComponent(MenuComponent - > CategoryRepositoryComponent - > AppComponent)。
如果我将getter添加到CategoryRepositoryComponent
@DataScope
@Component(dependencies = AppComponent.class, modules = CategoryRepositoryModule.class)
public interface CategoryRepositoryComponent {
CategoryRepository getCategoryRepository();
DatabaseHelper getDatabaseHelper();
UserManager getUserManager();
}
但那看起来不正确,重复。你知道如何以干净,正确的方式解决这个问题吗?
谢谢, 尼克。
答案 0 :(得分:4)
你的方法是正确的。组件只能访问由其直接父组件显式公开的类型。
如果作为父母,您不希望将所有依赖关系暴露给依赖于您的人,那么这将非常有用。例如,Parent
可能依赖于BankComponent,并且不希望将BankAccount
公开给其Children
。
另一种方法是使用Subcomponent
。文档和其他答案将有助于理解:Dagger 2 subcomponents vs component dependencies。