我正在尝试使用dagger限定符在我的android应用程序中提供不同类型的OkHttpClient.Builder。例如,我有两个注解,即@Authorized和@WithTime,每个注解都应该向客户端构建器添加一些拦截器。
我希望能够通过注释provide方法来获得不同的构建器(添加不同的拦截器)。但是当我有多个注解时,我不知道该怎么做。
这就是我之前只需要一个注解(@Authorized)时所做的。但现在我可能需要更多类型的客户端,而这是不可能的。
@Provides
@Singleton
@Authorized
OkHttpClient.Builder provideOkHttpClientBuilderWithAuthorization(...)
@Provides
@Singleton
OkHttpClient.Builder provideOkHttpClientBuilder(...)
发布于 2019-11-06 00:38:29
Dagger是建立在标准之上的。所以你可以使用这些注解,它将被完全支持。出于同样的原因,您不需要显式地使用@Qualifier
。您可以使用本身具有@Qualifier
注释的@Named
注释。
在第一个条目上添加@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;
有关如何使用这把短剑的更多详细信息,请访问
发布于 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(...)
发布于 2021-06-29 17:16:40
首先,声明你的常量:
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,
headersInterceptor: HeadersInterceptor,
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 {
//...
}
}
最后,提供您的apis:
@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://stackoverflow.com/questions/58714560
复制相似问题