Проблемы реализации Assisted Injection при использовании Dagger-2 и Автозавода

Я использую Dagger-2 (версия: 2.7) и AutoFactory (версия: 1.0-beta3). Я сталкиваюсь со специфической проблемой.

У меня есть класс MyRequest, который ctor принимает 2 параметра как:

  1. ConnectivityManager conmgr
  2. int somevalue

Я создал ctor как

@Autofactory
public MyRequest(@Provider ConnectivityManager conmgr, int somevalue){
//
}

У меня есть модуль, содержащий следующие

@Provides
@SystemScope
public final ConnectivityManager provideConnectivityManager(App app) {
return (ConnectivityManager)       
app.getSystemService(Context.CONNECTIVITY_SERVICE);
}

В том же модуле я делаю следующее

@Provides
@SystemScope
public final MyRequestFactory providesMyRequestFactory(ConnectivityManager connectivityManager {
    return new MyRequestFactory(connectivityManager);
}

Я получаю несовместимые типы ошибок при сборке: ConnectivityManager не может быть преобразован в Provider .

Есть идеи, как это решить?

1 ответ

Как в примере с AutoFactory, если ваш конструктор принимает Foo, сгенерированный конструктор вашего AutoFactory будет принимать Provider<Foo> вместо. Это так, ваш завод будет запрашивать новый Foo (или же ConnectivityManager) один раз за каждый звонок get без необходимости делиться экземплярами между ними.

Это может быть тот случай, когда вы хотите Foo или же ConnectivityManager быть одинаковым экземпляром для всех экземпляров созданного объекта (MyRequest здесь), но это вам и Dagger диктовать, а не AutoFactory. Следовательно, AutoFactory всегда будет генерировать код, который принимает провайдеров, независимо от того, используете ли вы их таким образом или нет.

К счастью, исправить это очень легко: Dagger может ввести Provider<ConnectivityManager> так же легко, как он может ввести ConnectivityManager (как это может для любой привязки), так что вы можете просто изменить свой @Provides метод, как так...

@Provides
@SystemScope
public final MyRequestFactory providesMyRequestFactory(
        Provider<ConnectivityManager> connectivityManagerProvider {
    return new MyRequestFactory(connectivityManagerProvider);
}

... но потому что ваш сгенерированный завод будет иметь @Inject аннотации, вам, вероятно, лучше удалить @Provides метод полностью и позволяя Dagger использовать этот конструктор для MyRequestFactory инъекции. Хотя вы потеряете @SystemScope аннотация области от @Provides метод, это не проблема: с Provider<ConnectivityManager> Внедрение выше, вам не нужно беспокоиться о жизненном цикле сгенерированной фабрики, поэтому вы можете вернуться к предоставлению по умолчанию с незаданной областью.

Другие вопросы по тегам