Dagger2组件依赖于多个范围组件

时间:2017-08-07 10:50:48

标签: android dagger-2

嘿,我有三个组成部分:

  • 应用程序 - >提供上下文(例如LocationUsecase)

  • ApiService - >提供Retrofit(休息电话)

  • DBService - >提供RoomDB(保存在SQLite中)

有时我想在ViewModel中使用多个组件   - 但是我遇到了异常,我可能.inject(ViewModel)对许多组件都没有UserViewModel{ @Inject ApiService api; @Inject DatabaseService db; public User(){ Application.getApiComponent.inject(this) Application.getDBComponent.inject(this) } }

@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 {...}

因为我希望将组件拆分(用于测试目的) 我决定向ApplicationComponent添加依赖项,并在注入Application时能够使用albo DB和REST

{{1}}

这次我遇到编译ERROR:

PerApplication ApplicationComponent依赖于多个作用域组件: @DbScope DBComponent @RestScope RestApiComponent

问题在于,当人们使用多于一种依赖性时,我没有找到任何例子 - 它是否受到限制? 当我删除DBComponent的 @Scope 时没关系 - 但是我有一个未编译的实例,它会在每次新实例时返回 当我从依赖项中删除一个组件时,我也将构建没有错误。

我如何在我的组件中使用两个依赖项?

1 个答案:

答案 0 :(得分:2)

你几乎就在那里 - dependencies =需要进入依赖(子)组件

@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模块集中绑定的依赖项,以便依赖组件可以使用它们。

因此,如果您在SharedPreferences级别绑定ApplicationComponent并希望与依赖组件共享该依赖关系,则需要在ApplicationComponent

@Component
public interface ApplicationComponent { 

    SharedPreferences exposeSharedPreferences();  
}

此外,您可能希望重新考虑为DB和REST创建范围 - 这些更像是功能分组,您可以通过模块实现所需的分离。

您通常只需要Android应用中的几个范围 - @PerApp@PerActivity范围,因为范围跟踪生命周期,这是两个主要的生命周期。