Внешняя библиотека поставляется с FooClientModule для предоставления FooClient. Однако я хочу, чтобы в моем приложении всегда был предварительно авторизованный клиент, поэтому я сделал обертку:
@Module
public class AuthorizedFooClientModule {
@Singleton
@Provides
public FooClient provideFooClient(FooClient client, ConfigNode config) {
String token = config.getString("token"));
return GrpcAuthorizationTokenUtils.withToken(client, token);
}
}
Поскольку мое все еще зависит от внешней библиотеки, я подключаю их к Dagger:
@Singleton
@Component(
modules = {
FooClientModule.class,
AuthorizedFooClientModule.class,
...
Конечно, вышеуказанное по-прежнему не работает, поскольку FooClient теперь предоставляется дважды. Итак, я пытаюсь квалифицировать свой. Переписано:
@Module
public class AuthorizedFooClientModule {
@Qualifier
public @interface AuthorizedFooClient {}
@Singleton
@Provides
@AuthorizedFooClient
public FooClient provideFooClient(FooClient client, ConfigNode config) {
String token = config.getString("token"));
return GrpcAuthorizationTokenUtils.withToken(client, token);
}
}
Затем я вставляю его в конструкторы классов, используя его следующим образом:
public class SomeClass {
@Inject
public SomeClass(
@AuthorizedFooClientModule.AuthorizedFooClient FooClient fooClient) {
this.fooClient = fooClient;
}
...
Однако нет go. Запустив его через отладчик, я вижу, что внедряется FooClient внешней библиотеки, а не моя. Я неправильно использую одну из концепций Dagger? Или это потому, что оба поставщика должны быть квалифицированы для работы квалификаторов, т.е. внешняя библиотека по-прежнему имеет приоритет.
Причина, по которой я хочу продолжить использование типа FooClient ( в отличие от создания совершенно нового класса и модуля, которые могли бы работать) заключается в том, что многие места в моем приложении уже используют FooClient и многие из его различных методов. По возможности я хочу избежать излишнего рефакторинга. Я открыт для альтернативного подхода, который каким-то образом extends
FooClient для достижения того же результата, например,
public class SomeClass {
FooClient fooClient;
@Inject
public SomeClass(ExtendedFooClient fooClient) {
this.fooClient = fooClient;
}
...
Я потерялся где-то в другом месте, когда пытался сделать что-то подобное выше .