如何使用匕首限定符批注提供不同的OkHttpClient构建器?

我正在尝试使用匕首限定符在我的Android应用程序中提供不同类型的OkHttpClient.Builder。例如,我有两个注释,分别是@Authorized和@WithTime,每个注释都应向客户端构建器添加一些拦截器。

我希望能够仅通过注释提供方法来获得不同的构建器(添加不同的拦截器)。但是当我有多个注释时,我不知道该怎么做。

这是我以前只需要一个注释(@Authorized)时所做的事情。但是现在我可能需要更多类型的客户端,而这是不可能的。

@Provides
@Singleton
@Authorized
OkHttpClient.Builder provideOkHttpClientBuilderWithAuthorization(...)
@Provides
@Singleton
OkHttpClient.Builder provideOkHttpClientBuilder(...)
wanghaitao1987 回答:如何使用匕首限定符批注提供不同的OkHttpClient构建器?

Dagger建立在 JSR 330: Dependency Injection for Java 的标准之上。因此,您可以使用这些注释,它将得到完全支持。出于同样的原因,您无需显式使用@Qualifier。您可以使用本身具有@Named批注的@Qualifier批注。

在您的第一个条目上,添加@Named("authorized"),然后在第二个条目上,添加@Named("basic")。您可以以类似的方式添加其他实现。现在,当您需要注入实例时,请使用相同的注释来标识类型。 这样您的整体代码就变成了

已授权:

@Provides
@Singleton
@Named("authorized")
OkHttpClient.Builder provideOkHttpClientBuilderWithAuthorization(...)

基本:

@Provides
@Singleton
@Named("basic")
OkHttpClient.Builder provideOkHttpClientBuilder(...)

要注入authorized类型的实例,现在您可以使用

 @Inject 
 @Named("authorized") 
 OkHttpClient.Builder authorizedBuilder;

类似地注入basic,您可以使用

 @Inject 
 @Named("basic") 
 OkHttpClient.Builder basicBuilder;

有关如何使用匕首的更多详细信息,请访问 dagger users guide

,

您可以像这样访问它
这就是创建限定符的方式

@Qualifier @Retention(AnnotationRetention.RUNTIME) @Target(AnnotationTarget.FIELD,AnnotationTarget.VALUE_PARAMETER,AnnotationTarget.FUNCTION,AnnotationTarget.PROPERTY_GETTER,AnnotationTarget.PROPERTY_SETTER) annotation class Authorized()

当您访问它时,必须在这样的模块中注释您的提供者乐趣

@JvmStatic @Provides @@YourPackagetoQualifier("Authorized") OkHttpClient.Builder provideOkHttpClientBuilderWithAuthorization(...)

,

首先,声明你的常量:

const val okHttpClientWithCertificatePinner = "okHttpClientWithCertificatePinner"
const val okHttpClientWithOutCertificatePinner = "okHttpClientWithOutCertificatePinner"

const val retrofitWithCertificatePinner = "retrofitWithCertificatePinner"
const val retrofitWithOutCertificatePinner = "retrofitWithOutCertificatePinner"

然后在您的模块中:

@Module
class RestClientModule {
    @Provides
    @Singleton
    @Named(okHttpClientWithOutCertificatePinner)
    internal fun provideOkHttpClientWithoutPinner(
        context: Context,headersInterceptor: HeadersInterceptor,responseCodeInterceptor: ResponseCodeInterceptor
    ): OkHttpClient {
    //...
    }

    @Provides
    @Singleton
    @Named(okHttpClientWithCertificatePinner)
    internal fun provideOkHttpClientWithPinner(
        context: Context,responseCodeInterceptor: ResponseCodeInterceptor
    ): OkHttpClient {
    //...
    }

}

并添加改造提供者:

@Module
class RestClientModule {
        /*
        ...
        */

    @Provides
    @Singleton
    @Named(retrofitWithOutCertificatePinner)
    internal fun provideRetrofit(
        @Named(okHttpClientWithOutCertificatePinner)
        client: OkHttpClient,gson: Gson
    ): Retrofit {
    //...
    }

    @Provides
    @Singleton
    @Named(retrofitWithCertificatePinner)
    internal fun provideRetrofitWithPinner(
        @Named(okHttpClientWithCertificatePinner)
        client: OkHttpClient,gson: Gson
    ): Retrofit {
    //...
    }

}

最后,提供您的 api:

@Provides
@Singleton
internal fun provideNotificationsApi(
    @Named(retrofitWithCertificatePinner)
    retrofit: Retrofit
) = retrofit.create(NotificationsApi::class.java)

@Provides
@Singleton
internal fun provideCommonApi(
    @Named(retrofitWithOutCertificatePinner)
    retrofit: Retrofit
) = retrofit.create(CommonApi::class.java)
本文链接:https://www.f2er.com/3158378.html

大家都在问