Dagger 2组件具有不同范围的模块

时间:2018-01-03 13:35:22

标签: java kotlin dagger-2

上下文

我有两个Dagger 2模块:

  1. NetworkModule,范围为@Singleton,提供HTTP客户端;
  2. ApiModule,具有自定义@UserScope范围,使用HTTP客户端为Github的API创建使用者。
  3. 然后,我创建了一个Dagger 2组件,以提供Retrofit客户端。

    NetworkModule.kt

    @Module
    class NetworkModule {
        @Provides
        @Singleton
        fun provideHttpClient(): OkHttpClient = OkHttpClient.Builder().build()
    }
    

    ApiModule.kt

    @Module(includes = [NetworkModule::class])
    class ApiModule(private val user: String) {
    
        @Provides
        @UserScope
        fun provideApi(httpClient: OkHttpClient): GithubApi = Retrofit.Builder()
                .baseUrl("https://api.github.com/")
                .client(httpClient)
                .build()
                .create(GithubApi::class.java)
    }
    

    ApiComponent.kt

    @Component(modules = [ApiModule::class])
    @UserScope
    interface ApiComponent {
        fun inject(target: GithubRetriever)
    }
    

    问题

    当我尝试构建应用程序时,如果我将@UserScope范围添加到ApiComponent,则会收到以下错误消息:

    e: ApiComponent.java:4: error: ApiComponent scoped with @UserScope may not reference bindings with different scopes:
    e: 
    e: @dagger.Component(modules = {ApiModule.class})
    e: ^
    e:       @org.jetbrains.annotations.NotNull @Singleton @Provides okhttp3.OkHttpClient NetworkModule.provideHttpClient()
    

    如果我使用@Singleton范围代替@UserScope,则会发生同样的情况。

    我应该如何声明ApiComponent才能成功构建?

1 个答案:

答案 0 :(得分:2)

单个模块不能引用两个范围;当您在NetworkModuleApiModule)中加入@Module(includes = [NetworkModule::class])时,会发生什么。

但是,模块可以依赖在使用不同范围的组件上。

@Component(modules = [NetworkModule::class])
@Singleton
interface NetworkComponent

@Component(dependencies = [NetworkComponent::class], modules = [ApiModule::class])
interface ApiComponent {
    fun inject(target: GithubRetriever)        
}