ошибка: [Dagger / MissingBinding] при попытке построения проекта

1

У меня есть класс обслуживания, и я хочу предоставить его через 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, но не нашел ничего, что мне помогло.

Теги:
dependency-injection
dagger-2
dagger

1 ответ

2
Лучший ответ

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню