Как использовать аннотации в квалификаторе кинжала для предоставления различных компоновщиков OkHttpClient? - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь использовать классификаторы кинжалов для предоставления различных типов OkHttpClient.Builder в моем приложении для Android. Например, у меня есть две аннотации, а именно @Authorized и @WithTime, каждая из которых должна добавить некоторый перехватчик в клиентский построитель.

Я хочу иметь возможность получать разных сборщиков (добавлять разные перехватчики), просто аннотируя обеспечениеметоды. Но я не знаю, как это сделать, когда у меня более одной аннотации.

Это то, что я делал ранее, когда мне нужна была только одна аннотация (@Authorized). Но теперь мне может потребоваться больше типов клиентов, а это невозможно.

@Provides
@Singleton
@Authorized
OkHttpClient.Builder provideOkHttpClientBuilderWithAuthorization(...)
@Provides
@Singleton
OkHttpClient.Builder provideOkHttpClientBuilder(...)

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Кинжал построен по стандарту JSR 330: внедрение зависимостей для 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;

Для получения более подробной информации о том, как использовать кинжал, посетите руководство пользователя кинжала

0 голосов
/ 05 ноября 2019

Вы можете получить к нему доступ вот так
так вы создадите свой квалификатор

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

...