【问题标题】:Dagger 2 components chain dependenciesDagger 2 组件链依赖
【发布时间】:2017-02-26 22:42:39
【问题描述】:

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

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

谢谢, 尼克。

【问题讨论】:

    标签: android dependency-injection components dagger-2


    【解决方案1】:

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

    当您作为父母不想将所有依赖项暴露给依赖您的人时,这可能很有用。例如,Parent 可能依赖于 BankComponent,并且不想将BankAccount 暴露给它的Children

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

    【讨论】:

    猜你喜欢
    • 2015-08-07
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多