Android 如何摆脱这个令牌验证器Hilt依赖循环?

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()

我有一个返回API的函数,它需要一个OkHttpClient实例

@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

    // ...
}