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