我正在寻找一种更好的方法来管理我的改造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()
函数用于每个专业化:
答案 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