Dagger 2 单例组件依赖于单例
Dagger 2 Singleton Component Depend On Singleton
我遇到了一个奇怪的问题,我不太清楚为什么我正在做的事情不被允许。我有以下模块:
@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 depends-on Singleton是不允许的呢?这感觉应该可行,因为我所做的只是声明同级组件。我错过了什么?
因为您的 NetComponent 组件依赖于您的 AppComponent 组件,所以它们不能具有相同的作用域。范围用于注释生命周期,并且由于 NetComponent 依赖于 AppComponent,因此它们没有相同的生命周期。 AppComponent 可能比 NetComponent 寿命更长,因为它是 NetComponent 实际构建过程的一部分。没有 AppComponent 就没有 NetComponent,反之亦然。
您可以添加您自己的自定义作用域并将其应用到您的 NetComponent 和 NetModule,这将修复它。
我遇到了一个奇怪的问题,我不太清楚为什么我正在做的事情不被允许。我有以下模块:
@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 depends-on Singleton是不允许的呢?这感觉应该可行,因为我所做的只是声明同级组件。我错过了什么?
因为您的 NetComponent 组件依赖于您的 AppComponent 组件,所以它们不能具有相同的作用域。范围用于注释生命周期,并且由于 NetComponent 依赖于 AppComponent,因此它们没有相同的生命周期。 AppComponent 可能比 NetComponent 寿命更长,因为它是 NetComponent 实际构建过程的一部分。没有 AppComponent 就没有 NetComponent,反之亦然。
您可以添加您自己的自定义作用域并将其应用到您的 NetComponent 和 NetModule,这将修复它。