Возможно ли в Dagger написать специального квалифицированного поставщика для типа, уже предоставленного во внешней библиотеке? (Или почему это не работает?) - PullRequest
0 голосов
/ 26 мая 2020

Внешняя библиотека поставляется с 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;
  }

...

Я потерялся где-то в другом месте, когда пытался сделать что-то подобное выше .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...