首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用dagger限定符注释来提供不同的OkHttpClient构建器?

如何使用dagger限定符注释来提供不同的OkHttpClient构建器?
EN

Stack Overflow用户
提问于 2019-11-05 23:27:34
回答 3查看 801关注 0票数 1

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

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

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

代码语言:javascript
运行
复制
@Provides
@Singleton
@Authorized
OkHttpClient.Builder provideOkHttpClientBuilderWithAuthorization(...)
代码语言:javascript
运行
复制
@Provides
@Singleton
OkHttpClient.Builder provideOkHttpClientBuilder(...)
EN

回答 3

Stack Overflow用户

发布于 2019-11-06 00:38:29

Dagger是建立在标准之上的。所以你可以使用这些注解,它将被完全支持。出于同样的原因,您不需要显式地使用@Qualifier。您可以使用本身具有@Qualifier注释的@Named注释。

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

授权:

代码语言:javascript
运行
复制
@Provides
@Singleton
@Named("authorized")
OkHttpClient.Builder provideOkHttpClientBuilderWithAuthorization(...)

基本信息:

代码语言:javascript
运行
复制
@Provides
@Singleton
@Named("basic")
OkHttpClient.Builder provideOkHttpClientBuilder(...)

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

代码语言:javascript
运行
复制
 @Inject 
 @Named("authorized") 
 OkHttpClient.Builder authorizedBuilder;

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

代码语言:javascript
运行
复制
 @Inject 
 @Named("basic") 
 OkHttpClient.Builder basicBuilder;

有关如何使用这把短剑的更多详细信息,请访问

票数 2
EN

Stack Overflow用户

发布于 2019-11-05 23:57:19

您可以这样访问它

下面是如何创建限定符的方法

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

票数 0
EN

Stack Overflow用户

发布于 2021-06-29 17:16:40

首先,声明你的常量:

代码语言:javascript
运行
复制
const val okHttpClientWithCertificatePinner = "okHttpClientWithCertificatePinner"
const val okHttpClientWithOutCertificatePinner = "okHttpClientWithOutCertificatePinner"

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

然后在你的模块中:

代码语言:javascript
运行
复制
@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,
        headersInterceptor: HeadersInterceptor,
        responseCodeInterceptor: ResponseCodeInterceptor
    ): OkHttpClient {
    //...
    }

}

并添加翻新提供程序:

代码语言:javascript
运行
复制
@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 {
    //...
    }

}

最后,提供您的apis:

代码语言:javascript
运行
复制
@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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58714560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档