Dagger 2 Singleton组件取决于Singleton

时间:2016-09-26 17:53:18

标签: java android dependency-injection dagger-2

我在这里遇到了一个奇怪的问题,我不太清楚为什么我正在做的事情是不允许的。我有以下模块:

@Module
public final class AppModule {
  private Context mContext;

  @Provides
  @Singleton
  @AppContext
  public Context provideContext() { return mContext; }
}

@Module
public final class NetModule {
  @Provides
  @Singleton
  public OkHttpClient provideOkHttp() {
    return new OkHttpClient.Builder().build();
  }
}

由于各种原因,我不希望将这两个模块放在同一个组件中(主要是由于我的项目结构)。所以我尝试创建以下组件:

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
  @AppContext Context appContext();
}

@Singleton
@Component(dependencies = AppComponent.class, modules = NetModule.class)
public interface NetComponent {
  Retrofit retrofit();
}

但是当我尝试编译它时,我收到以下错误消息:

Error:(12, 1) error: This @Singleton component cannot depend on scoped components: @Singleton com.myapp.service.dagger.AppComponent

我理解为什么依赖于不同的范围会很糟糕且不允许。但是为什么Singleton依赖Singleton不允许?这感觉它应该工作,因为我所做的只是声明兄弟组件。我错过了什么?

1 个答案:

答案 0 :(得分:16)

因为您的NetComponent组件依赖于您的AppComponent组件,所以它们不能具有相同的范围。范围用于注释生命周期,并且因为NetComponent依赖于AppComponent,所以它们没有相同的生命周期。 AppComponent可能比NetComponent寿命更长,因为它是NetComponent实际构建过程的一部分。没有AppComponent,NetComponent就不可能存在,但不能相反。

您可以添加自己的自定义范围并将其应用于NetComponent和NetModule,以便修复它。