android - Dagger2 组件依赖于多个作用域组件

标签 android dagger-2

嘿,我有三个组件:

  • 应用程序 -> 提供上下文(例如 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/

相关文章:

android - Context 应该用 Dagger 注入(inject)吗?

android - lateinit property dispatchingAndroidInjector 还没有初始化

java - Dagger 2、如何添加依赖接口(interface)

javascript - 针对移动问题的 photoswipe 脚本

带有搜索 View 的 Android 操作栏

android - 如何为调试构建包含 Dagger Debug SubModule?

Maven:编译OK,打包OK,编译+打包失败

android - 在 Android WebView 中获取 HTTP 状态码

android - 如何在日历中添加提醒

Android 8 - 如何通过 ADB 设置模拟器语言环境?