Dagger2: компонент не может зависеть от нескольких компонентов с областью

Да, я знаю, что это было задано раньше, и да, я знаю, что это «по дизайну».

Но я хотел бы сделать что-то вроде этого:

@Component(modules = {RealmModule.class}) public interface RealmComponent { Realm realm(); } @Component(modules = {RepositoryModule.class}) public interface RepositoryComponent { PersonRepository personRepository(); ScheduleRepository schedulesRepository(); } @Component(dependencies = {RealmComponent.class, RepositoryComponent.class}) public interface AppDataComponent extends RealmComponent, RepositoryComponent { } @ApplicationScope @Component(dependencies = {AppContextComponent.class, AppDataComponent.class, AppDomainComponent.class, AppPresentationComponent.class, AppUtilsComponent.class}) public interface ApplicationComponent extends AppContextComponent, AppDataComponent, AppDomainComponent, AppUtilsComponent, AppPresentationComponent { void inject(CustomApplication customApplication); void inject(DashboardActivity dashboardActivity); } 

Однако то, что я получаю, не облагается , каждый раз, когда я JobManager или ScheduleRepository или что-то еще, я получаю новый экземпляр . Единственный способ, который я мог бы «исправить», был именно этим.

 @Module public class JobManagerModule { private JobManager jobManager; @Provides public JobManager jobManager(Context context) { if(jobManager == null) { jobManager = new JobManager(context, new Configuration.Builder(context).networkUtil( new WifiOrMobileNetworkUtil(context)).build()); } return jobManager; } } 

Не поклонник.

Итак, как создать структуру и разделить дерево зависимостей, не создавая одного большого гигантского компонента blob-компонента, который содержит каждый отдельный модуль и каждый отдельный метод (вместо зависимостей компонентов «подкомпонента»)?

Я попытался использовать подкомпоненты для этого, но тогда вам нужно предоставить каждый модуль для окончательного ApplicationComponent .

Я не уверен, что делать здесь. Я попробовал указать @Singleton для каждого компонента первого уровня и @SubcomponentScope для каждого AppDataLevelComponent , я также попытался создать новую область для каждого отдельного компонента, но оба они не смогли «не могут зависеть от нескольких компонентов с областью».

EDIT: По-видимому, для того, чтобы получить охваченных провайдеров, маркировки компонентов с областью недостаточно – вы должны указать область для аннотированных методов @Provides .

 @Module public class RepositoryModule { @Provides @Singleton public PersonRepository personRepository() { return new PersonRepositoryImpl(); } @Provides @Singleton public ScheduleRepository schedulesRepository() { return new SchedulesRepositoryImpl(); } } 

Тем временем я закончил с этим überкомпонентом.

 @Singleton @Component(modules = { AppContextModule.class, DbMapperModule.class, DbTaskModule.class, RealmModule.class, RepositoryModule.class, InteractorModule.class, ServiceModule.class, PresenterModule.class, XmlPersisterModule.class }) public interface ApplicationComponent extends AppContextComponent, AppDataComponent, AppDomainComponent, AppUtilsComponent, AppPresentationComponent { 

Где классы xyzComponent – это просто интерфейсы для хранения методов предоставления …

( Обратите внимание, что эта структура является анти-шаблоном, как описано Мартином Фаулером, и вы должны организовывать модули на основе функций / действий и превращать их в подкопные компоненты с использованием зависимостей компонентов. Компонентные зависимости используются для подкачки ваших компонентов суперскопа, Наследовать "поставщиков зависимостей.)

Solutions Collecting From Web of "Dagger2: компонент не может зависеть от нескольких компонентов с областью"

У меня были такие же проблемы, как и вы, и раньше, и закончили использовать тот же подход ubercomponent, за исключением того, что я использую @Subcomponent s, чтобы упорядочить вещи и не иметь все модули, перечисленные в ubercomponent (я называю это «top» или «app») ,

Здесь вы можете увидеть пример: как перенести отсутствующую инъекцию из модуля с полным = ложь от кинжала 1 до кинжала 2