#java #android #dagger2
Имеется три пакета: a, b и c. Каждый из этих пакетов включает в себя интерфейс с буквой, реализацию интерфейса, компонент, модуль и Scope (не знаю, как правильно переводится). В результате, выходит вот такая структура проекта: │ │ ├───a A.java │ AComponent.java │ AImpl.java │ AModule.java │ AScope.java │ ├───b B.java │ BComponent.java │ BImpl.java │ BModule.java │ BScope.java │ └───c C.java CComponent.java CImpl.java CModule.java CScope.java Application.java CComponent имеет зависимость (dependencies) на BComponent, а BComponent - на CComponent. BModule требует класс A для создания класса B, а CModule требует классы A и B для создания класса C: @AScope @Component(modules = AModule.class) public interface AComponent { A a(); } @Module public class AModule { @Provides @AScope public A provideA() { return new AImpl(); } } @BScope @Component(modules = BModule.class, dependencies = AComponent.class) public interface BComponent { B b(); } @Module public class BModule { @Provides @BScope public B provideB(A a) { return new BImpl(a); } } @CScope @Component(modules = CModule.class, dependencies = BComponent.class) public interface CComponent { C c(); } @Module public class CModule { @Provides @CScope public C provideC(A a, B b) { return new CImpl(b, a); } } При попытке собрать проект, Dagger 2 начинает ругаться, что CComponent не может найти провайдера класса A: Error:(9, 7) java: com.dugin.rostislav.a.A cannot be provided without an @Provides-annotated method. com.dugin.rostislav.a.A is injected at com.dugin.rostislav.c.CModule.provideC(a, …) com.dugin.rostislav.c.C is provided at com.dugin.rostislav.c.CComponent.c() Почему компонент не может получить доступ к Provide-методам модулей компонентов, который находятся ниже по иерархической цепочке зависимостей (более одного компонента)?
Ответы
Ответ 1
Проблема была в том, что компонент BComponent должен был явно указать компонентам, имеющим на него зависимости, какие реализации он может провайдить из нижестоящих компонентов. То есть он должен указать, что может дать класс A: @BScope @Component(modules = BModule.class, dependencies = AComponent.class) public interface BComponent { A a(); B b(); } Для того, чтобы пробрасывать зависимости неявно — можно использовать Subcomponent. Очень хорошая статья на хабре про Component Dependencies и Subcomponents, где раскрывается данный вопрос - Dagger 2. Часть вторая. Custom scopes, Component dependencies, Subcomponents.
Комментариев нет:
Отправить комментарий