Dagger 2 组件链依赖
Posted
技术标签:
【中文标题】Dagger 2 组件链依赖【英文标题】:Dagger 2 components chain dependencies 【发布时间】: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();
但这看起来不正确,重复。你知道如何以干净、正确的方式解决这个问题吗?
谢谢, 尼克。
【问题讨论】:
【参考方案1】:你的方法是正确的。组件只能访问由其直接父组件显式公开的类型。
当您作为父母不想将所有依赖项暴露给依赖您的人时,这可能很有用。例如,Parent
可能依赖于 BankComponent,并且不想将BankAccount
暴露给它的Children
。
另一种方法是使用Subcomponent
。文档和其他答案将有助于理解:Dagger 2 subcomponents vs component dependencies。
【讨论】:
完全正确,在这里您可以找到使用子组件的示例项目:github.com/mmirhoseini/fyber_mobile_offers以上是关于Dagger 2 组件链依赖的主要内容,如果未能解决你的问题,请参考以下文章
Dagger 2:@Component.Builder 缺少所需模块或组件的设置器:[appi.example.com.dagger.AppModule]`