У меня проблемы с тем, что Кинжал вводит неправильный объект поведения.Кажется, что он игнорирует мою аннотацию @Named ("") при объявлении члена переменной.У меня полусложная задача.Мне нужен объект ProtectionSubject, к которому непосредственно обращаются в службе, помещают в несколько объектов / интерфейсов-оболочек, которые затем внедряются.
Я получаю сообщения об ошибках типа.java.lang.IllegalStateException: ошибки при создании графа объектов: io.reactivex.subjects.PublishSubject требуется общедоступному io.reactivex.subjects.PublishSubject xxxxx.android.service.xxxx.myBehaviorSubject
При попытке внедрить его мой сервис.
@Inject
@Named(NAME)
lateinit var myBehaviorSubject: PublishSubject<MYOBJECT>
Этот первый пример работает.Но я хочу сделать это без переменной-члена (как тогда смысл использовать кинжал ...), и я не хочу создавать будущую ошибку, когда кто-то еще пытается создать предметную инъекцию.
PublishSubject<MYOBJECT> LPS = null;
@Provides
@Named(NAME)
@Singleton
PublishSubject<MYOBJECT> provideSubjectRx() {
if(LPS == null){
LPS = PublishSubject.create();
}
return LPS;
}
Следующее не работает по некоторым причинам.Невозможно построить график.Это то, что я хочу.
@Provides
@Named(NAME)
@Singleton
PublishSubject<MYOBJECT> provideSubjectRx(PublishSubject<MYOBJECT> LPS)
{
if(LPS == null){
LPS = PublishSubject.create();
}
return LPS;
}
Я должен включить это ..
@Provides
PublishSubject<MYOBJECT> providePublishSubject() {
PublishSubject<MYOBJECT> publishSubject = PublishSubject.create();
return publishSubject;
}
Странно ... это то, что должна делать первая функция.Это похоже на то, что Даггер не хочет использовать его по какой-то причине ... и теперь я получаю разные экземпляры темы публикации, а это совсем не то, что мне нужно.ApiProvider создается с помощью provideSubjectRx, затем мой СЕРВИС извлекает НЕПРАВИЛЬНЫЙ, он игнорирует мою аннотацию с именем @ named и вызывает providePublishSubject
Ниже сборки, но дает неверную версию моему сервису.
@Provides
@Named(NAME)
@Singleton
PublishSubject<MYOBJECT> provideSubjectRx(PublishSubject<MYOBJECT> LPS)
{
return LPS;
}
@Provides
PublishSubject<MYOBJECT> providePublishSubject() {
PublishSubject<MYOBJECT> publishSubject = PublishSubject.create();
return publishSubject;
}
Я создаю свои обертки вот так ..
Служба просто внедряет
@Inject
@Named(NAME)
lateinit var behaviorSubject: PublishSubject<MYOBJECT>
моя обертка вводится вот так
@Inject
ApiProvider apiProvider;
и создается так же в этоммодуль кинжала ..
@Provides
@Singleton
ApiProvider provideApiProvider(
Context context,
@Named(NAME) final PublishSubject<MYOBJECT> subject) {
return new ApiProvider(context, subject);
}
Единственное, о чем я могу думать, это то, что мне нужно создать свой сервис с помощью Dagger, но это не очень хорошо для моей архитектуры, и я не являюсь владельцем этого сервиса.Я действительно просто хочу сделать это.Так что, кроме создания еще большего количества объектов-обёрток, что происходит?Это похоже на довольно четкий DI, который сходит с ума.
Просто кажется, что он считает, что правильный конструктор не может быть использован ... если я уберу @ named, он все равно не будет собираться.Может быть, это связано с PublishSubject в сигнатуре метода ... но, насколько я знаю, так оно и должно работать.Что хорошо, я предоставляю, как сделать предмет, это не объясняет, почему он игнорирует мой @ named