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