嘿,我有三个组件:
应用程序 -> 提供上下文(例如 LocationUsecase)
ApiService -> 提供 Retrofit(Rest 调用)
- DBService -> 提供 RoomDB(保存在 SQLite 中)
有时我想在 ViewModel 中使用多个组件
- 但我遇到了异常,我可能无法为许多组件 .inject(ViewModel)
相同的类。
UserViewModel{
@Inject ApiService api;
@Inject DatabaseService db;
public User(){
Application.getApiComponent.inject(this)
Application.getDBComponent.inject(this)
}
}
因为我想将组件解耦(用于测试目的) 我决定向我的 ApplicationComponent 添加依赖项,并且在注入(inject)应用程序时能够使用 albo DB 和 REST
@PerApplication
@Component(dependencies = {DBComponent.class, RestApiComponent.class},
modules = {ApplicationModule.class})
public interface ApplicationComponent{...}
@DbScope
@Component(modules = {DBModule.class})
public interface DBComponent {...}
@RestScope
@Component(modules = {RestApiRetrofitModule.class})
public interface RestApiComponent {...}
这次我遇到编译错误:
PerApplication ApplicationComponent 依赖于多个作用域组件: @DbScope DBComponent @RestScope RestApiComponent
问题是,当人们使用不止一种依赖性时,我没有找到任何例子 - 它是否受到限制? 当我删除 DBComponent 的 @Scope 时,效果很好 - 但我有无范围实例,每次新实例都会返回 当我从依赖项中删除一个组件时,我的构建也不会出现错误。
如何在我的组件中使用两个依赖项?
最佳答案
你就快到了 - dependency =
需要放入依赖(子)组件
@PerApplication
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent{...}
@DbScope
@Component(dependencies = ApplicationComponent.class, modules = DBModule.class)
public interface DBComponent {...}
@RestScope
@Component(dependencies = ApplicationComponent.class, modules = RestApiRetrofitModule.class)
public interface RestApiComponent {...}
现在只需确保您公开了 ApplicationComponent
模块集中绑定(bind)的依赖项,以便依赖组件可以使用它们。
因此,如果您在 ApplicationComponent
级别绑定(bind) SharedPreferences
并且希望与依赖组件共享该依赖项,则需要在 >应用程序组件
@Component
public interface ApplicationComponent {
SharedPreferences exposeSharedPreferences();
}
此外,您可能需要重新考虑仅为 DB 和 REST 创建范围 - 这些更像是功能分组,并且您想要的解耦可以通过模块来完成。
您通常在 Android 应用程序中只需要几个作用域 - 一个 @PerApp
和一个 @PerActivity
作用域,因为作用域跟踪生命周期,而这是两个主要的生命周期。
关于android - Dagger2 组件依赖于多个作用域组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45545130/