ошибка: [Dagger / MissingBinding] при попытке построения проекта - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть класс обслуживания, и я хочу предоставить его через Dagger.Но я получаю эту ошибку ниже:

ошибка: [Dagger / MissingBinding] service.KeyStoreService не может быть предоставлен без конструктора @Inject или аннотированного метода @ Provides.service.KeyStoreService предоставляется по адресу di.component.ApplicationComponent.getKeyStoreService ()

Вот мой класс компонента:

@ApplicationScope
@Component(modules = {ApplicationContextModule.class, KeyStoreModule.class})
public interface ApplicationComponent {

    @ApplicationContext
    Context getApplicationContext();

    KeyStoreService getKeyStoreService();

}

Вот мой KeyStoreModule:

@Module(includes = {ApplicationContextModule.class})
public class KeyStoreModule {

    @Provides
    @ApplicationScope
    KeyStoreServiceInterface getKeyStoreService(@ApplicationScope Context context){
        File file = new File(context.getFilesDir(), "keystore/keystore");
        return new KeyStoreService(file);
    }
}

KeyStoreService реализует KeyStoreServiceInterface.

Вот как я запускаю Dagger2:

public class MyApplication extends Application {

    private ApplicationComponent applicationComponent;

    @Override
    public void onCreate() {
        super.onCreate();

        applicationComponent = DaggerApplicationComponent.builder()
                .applicationContextModule(new ApplicationContextModule(this))
                .build();

    }

}

Кто-нибудь видел, где это могло пойти не так?Я посмотрел на похожие вопросы по Stackoverflow, но не нашел ничего, что помогло бы мне.

1 Ответ

0 голосов
/ 21 ноября 2018

Дело в том, что Dagger предоставляет экземпляры на основе определенного типа .Вот несколько способов решения этой проблемы

  • Измените тип возврата метода getKeyStoreService с KeyStoreServiceInterface на KeyStoreService в KeyStoreModule
  • Измените возвраттип getKeyStoreService метода от KeyStoreService до KeyStoreServiceInterface в ApplicationComponent
  • Создайте абстрактный метод с аннотацией @Binds, который получит KeyStoreService и тип возвращаемого значения будет KeyStoreServiceInterface (вЧтобы сделать это, весь модуль должен быть абстрактным - так что можно либо создать отдельный абстрактный модуль с аннотациями @Binds, либо сделать KeyStoreModule абстрактный и модифицировать getKeyStoreService метод, чтобы он был статическим)
  • СноваИспользование аннотации @Binds для сопоставления экземпляра KeyStoreService с предоставленным KeyStoreServiceInterface, но применение аннотации @Inject для конструктора KeyStoreService и предоставление хранилища ключей File через Dagger
  • Не использование аннотации @Binds, но применяя аннотацию @Inject к конструктору KeyStoreService и предоставляя хранилище ключей File через Dagger
...