Dagger 2组件链依赖

时间:2016-10-17 20:21:38

标签: android dependency-injection components dagger-2

我有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();
}

但那看起来不正确,重复。你知道如何以干净,正确的方式解决这个问题吗?

谢谢, 尼克。

1 个答案:

答案 0 :(得分:4)

你的方法是正确的。组件只能访问由其直接父组件显式公开的类型。

如果作为父母,您不希望将所有依赖关系暴露给依赖于您的人,那么这将非常有用。例如,Parent可能依赖于BankComponent,并且不希望将BankAccount公开给其Children

另一种方法是使用Subcomponent。文档和其他答案将有助于理解:Dagger 2 subcomponents vs component dependencies