Dagger 2 组件链依赖
Dagger 2 components chain dependencies
我有 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();
}
但这看起来不正确,重复。你知道如何以干净、正确的方式解决这个问题吗?
谢谢,
尼克.
你的做法是正确的。组件只能访问其直接 parent 组件显式公开的类型。
作为 parent,当您不想将所有依赖项暴露给任何依赖您的人时,这会很有用。例如,Parent
可能依赖于 BankComponent 并且不想将 BankAccount
公开给它的 Children
。
另一种方法是使用 Subcomponent
。文档和其他答案将有助于理解:.
我有 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();
}
但这看起来不正确,重复。你知道如何以干净、正确的方式解决这个问题吗?
谢谢, 尼克.
你的做法是正确的。组件只能访问其直接 parent 组件显式公开的类型。
作为 parent,当您不想将所有依赖项暴露给任何依赖您的人时,这会很有用。例如,Parent
可能依赖于 BankComponent 并且不想将 BankAccount
公开给它的 Children
。
另一种方法是使用 Subcomponent
。文档和其他答案将有助于理解: