Dagger 2定制提供了改造

时间:2017-11-07 17:42:13

标签: android dependency-injection kotlin retrofit2 dagger-2

我正在寻找一种更好的方法来管理我的改造DI。我的应用程序可以调用几种改进版本:不可重试,更长的超时,缓存或非缓存等。

我已经解决了我可以使用命名参数并指定在我使用它时提供的不同类型的okhttp / retrofit,但这意味着我必须为每个可能的组合提供不同的提供函数,并维护字符串对于命名的参数。我可以看到我的NetworkModule类变得非常大。

NetworkModule.kt

@Module
class NetworkModule {

    @Provides
    @Singleton
    fun provideHttpLoggingInterceptor(): HttpLoggingInterceptor {
        val loggingInterceptor = HttpLoggingInterceptor { message -> Timber.d(message) }
        loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
        return loggingInterceptor
    }

    @Provides
    @Named("standard")
    @Singleton
    fun provideOkHttpClient(httpLoggingInterceptor: HttpLoggingInterceptor): OkHttpClient {
        val httpClientBuilder = OkHttpClient.Builder()
        if (BuildConfig.DEBUG) httpClientBuilder.addInterceptor(httpLoggingInterceptor)
        return httpClientBuilder.build()
    }

    @Provides
    @Named("standard")
    @Singleton
    fun provideRetrofit(@Named("baseUrl") baseUrl: String, @Named("standard") okHttpClient: OkHttpClient): Retrofit {
        return Retrofit.Builder()
                .baseUrl(baseUrl)
                .client(okHttpClient)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build()
    }
}

LoginApiModule.kt

@Module(includes = arrayOf(NetworkModule::class))
class LoginApiModule {

    @Provides
    @Singleton
    internal fun provideLoginApi( @Named("standard") retrofit: Retrofit): LoginService {
        return retrofit.create(LoginService::class.java)
    }
}

在这个例子中,我需要一个provide<some specialization>OkHttpClient()函数用于每个专业化:

  • 一个更长的超时
  • 一个用于不可重试性
  • 一个两个
  • 一个用于缓存
  • 一个用于缓存更长时间的缓存
  • 一个用于具有不可重试性等的cachine等。

1 个答案:

答案 0 :(得分:0)

您可以使用自定义标头的多个OkHttpClient实例(分享内容,请参阅:https://github.com/square/okhttp/wiki/Recipes#per-call-configuration)和网络拦截器。过去人们曾经这样做过缓存(参见:https://krtkush.github.io/2016/06/02/caching-using-okhttp-part-2.html)。另外,请尝试@Qualifiers

,而不是使用@Named