【问题标题】:Dagger 2 Singleton Component Depend On SingletonDagger 2 Singleton 组件依赖于 Singleton
【发布时间】:2016-09-26 17:53:17
【问题描述】:

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

@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 呢?这感觉应该可以工作,因为我所做的只是声明兄弟组件。我错过了什么?

【问题讨论】:

    标签: java android dependency-injection dagger-2


    【解决方案1】:

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

    您可以添加自己的自定义范围并将其应用于您的 NetComponent 和 NetModule,这样就可以解决问题。

    【讨论】:

    • 嗯,我明白了 - 这是有道理的。但只是在这里问一个明显的后续问题,我认为这个限制也适用于所有其他自定义范围,对吧?如果我创建了一个“PerApplication”范围,我可以将它应用到 NetComponent/Module 并且没问题。但是如果我想构建另一个依赖于 NetComponent 的组件,我将需要另一个范围(因为生命周期可能会略有不同)。对吗?
    猜你喜欢
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 2015-08-07
    • 2023-04-01
    • 2017-02-26
    • 1970-01-01
    • 2017-01-01
    相关资源
    最近更新 更多