Android 如何摆脱这个令牌验证器Hilt依赖循环?
我有一个返回API的函数,它需要一个OkHttpClient实例Android 如何摆脱这个令牌验证器Hilt依赖循环?,android,kotlin,dagger-hilt,Android,Kotlin,Dagger Hilt,我有一个返回API的函数,它需要一个OkHttpClient实例 @Module @InstallIn(ApplicationComponent::class) object AuthNetworkModule { @Provides fun provideAuthRetrofitService (@AuthQualifier okHttpClient: OkHttpClient): IQuipsAuth{ return Retrofit.Builder()
@Module
@InstallIn(ApplicationComponent::class)
object AuthNetworkModule {
@Provides
fun provideAuthRetrofitService (@AuthQualifier okHttpClient: OkHttpClient): IQuipsAuth{
return Retrofit.Builder()
.baseUrl("${Config.BASE_URL}/")
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create(GsonBuilder().setLenient().create()))
.build().create(IQuipsAuth::class.java)
}
我还有一个函数,返回一个OkHttpClient,它需要一个API实例作为验证器,我该怎么办
@Provides
@AuthQualifier
fun provideOkHttpClient (application: Application, iQuipsAuth: IQuipsAuth): OkHttpClient {
val interceptor = HttpLoggingInterceptor(object : HttpLoggingInterceptor.Logger {
override fun log(message: String) {
Log.d("HttpLoggingInterceptor", message)
}
}).setLevel(HttpLoggingInterceptor.Level.HEADERS)
return OkHttpClient.Builder()
.readTimeout(180, TimeUnit.SECONDS)
.writeTimeout(45, TimeUnit.SECONDS)
.hostnameVerifier { _: String?, _: SSLSession? -> true }
.addInterceptor(interceptor)
.addInterceptor(AccessTokenInterceptor(application, iQuipsAuth))
.authenticator(AccessTokenAuthenticator(application, iQuipsAuth))
.build()
}
}
我正在尝试在希尔特中重新创建相同的Koin代码:
single {
val interceptor = HttpLoggingInterceptor(object : HttpLoggingInterceptor.Logger {
override fun log(message: String) {
Log.d("HttpLoggingInterceptor", message)
}
}).setLevel(HttpLoggingInterceptor.Level.BODY)
val okHttpClient = OkHttpClient.Builder()
.readTimeout(180, TimeUnit.SECONDS)
.writeTimeout(45, TimeUnit.SECONDS)
.hostnameVerifier { _: String?, _: SSLSession? -> true }
.addInterceptor(interceptor)
.build()
val retrofit = Retrofit.Builder()
.baseUrl("${Config.baseUrl}/")
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create(get()))
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build()
retrofit.create(IQuipsAuth::class.java)
}
似乎您需要两个不同的
OkHttpClient
s。IQuipsAuth
取决于哪个不使用AccessTokenInterceptor
或AccessTokenAuthenticator
(当直接与身份验证服务交谈时,您真的想要这些吗?)。另一个OkHttpClient
将用于使用IQuipsAuth
进行身份验证的其他服务
可以使用限定符区分同一类型的两个实例。这里有一个关于使用hilt限定符的片段:您可以使用
dagger.Lazy
绕过依赖循环
fun provideOkHttpClient(应用程序:应用程序,iQuipsAuth:Lazy):OkHttpClient{
// ...
.addInterceptor(AccessTokenInterceptor(应用程序,iquipAuth))//传递延迟
.authenticator(AccessTokenAuthenticator(应用程序,iquipAuth))//传递延迟
// ...
}
然后在实际使用客户端时调用lazy.get()
请注意,如果
AccessTokenInterceptor
和AccessTokenAuthenticator
都是使用@Inject constructor
提供给Dagger的,并且提供给这个@提供了作为方法参数的方法,那么这将更加不言而喻。问题不是限定符,问题在于正在创建的依赖循环,因为OkHttpClient和Api提供程序函数由于此处所述的身份验证而相互依赖。addInterceptor(AccessTokenInterceptor(application,IquipAuth))。authenticator(AccessTokenAuthenticator(application,IquipAuth))你真的想调用IQuipsAuth来调用AccessTokenInterceptor和AccessTokenAuthenticator吗?我正在尝试从Koin和RXJava迁移到Coroutines和Hilt,并在Hilt中重写相同的代码(我将编辑问题)
fun provideOkHttpClient (application: Application, iQuipsAuth: Lazy<IQuipsAuth>): OkHttpClient {
// ...
.addInterceptor(AccessTokenInterceptor(application, iQuipsAuth)) // pass lazy
.authenticator(AccessTokenAuthenticator(application, iQuipsAuth)) // pass lazy
// ...
}