Dagger2: подстановочный знак с обобщениями - PullRequest
0 голосов
/ 04 июля 2018

Я новичок в Dagger2 и DI в целом, но мне интересно заполнить карту введенными ключами / значениями. Проблема в том, что это работает, если я предоставляю точные типы, я не могу заставить его работать с подстановочными знаками, какое-либо решение для этого?

@Module
public class SimpleIssueModule
{
  @Provides
  @Singleton
  @IntoMap
  @StringKey("simple_issue")
  public SimpleIssue provideSimpleIssue()
  {
    return new SimpleIssue();
  }
}

@Module
public class DaggerFactoryModule
{
  @Provides
  @Singleton
  public Factory provideFactory(Map<String, Provider< ? extends Issue>> map)
  {
    return new Factory(map);
  }
}

1 Ответ

0 голосов
/ 04 июля 2018

Если вам нужна карта Provider< ? extends Issue>> map, вам нужно использовать Issue в качестве типа, возвращаемого в вашем модуле. Кинжал не будет сам по себе кастовать или угадывать.

@Provides
@Singleton
@IntoMap
@StringKey("simple_issue")
public Issue provideSimpleIssue() {
  return new SimpleIssue();
}

что делать в случае, если мне нужен Модуль, который предоставляет базовый класс (Issue) для Map, а также нужен поставщик конкретного класса (SimpleIssue), и я хотел бы, чтобы он был Singleton (один и тот же экземпляр возвращается в обоих случаях )

В этом случае вы предоставляете @Singleton из SimpleIssue.

@Provides
@Singleton
public SimpleIssue provideSimpleIssue() {
  return new SimpleIssue();
}

// or you can use constructor injection, dropping the method above...

@Singleton
public class SimpleIssue {

  @Inject
  public SimpleIssue(...) {
  }
}

Затем вы привязываете этот экземпляр к карте. В области видимости нет необходимости, поскольку реализация должна объявить ее (как сделано выше).

@Provides
@IntoMap
@StringKey("simple_issue")
public Issue provideSimpleIssue(SimpleIssue issue) {
  return issue;
}

// or alternatively with `@Binds` when using an abstract class / interface
// this leads to actually better performing dagger code

@Binds
@IntoMap
@StringKey("simple_issue")
public Issue provideSimpleIssue(SimpleIssue issue);
...