Dagger2:组件不能依赖多个作用域组件

是的,我知道这已经被问过,是的,我知道这是“devise”。

但我想要做这样的事情:

@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; } } 

不是粉丝。

那么,如何构build并分解依赖关系树, 而不是使每个单一模块列出的每个 模块 拥有一个庞大的超大块组件,而不是使用这些“子组件”依赖关系?

我尝试使用子组件,但是你必须为最终的ApplicationComponent提供每个模块。

我不确定在这里做什么。 我试着为每个第一级组件指定@SubcomponentScope为每个AppDataLevelComponent ,我也尝试为每个子组件创build一个新的范围,但是他们都失败了“不能依赖多个范围的组件”。

编辑:显然,为了得到范围提供者,用范围标记组件是不够的 – 你也必须指定@Provides注释方法的范围。

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

与此同时,我结束了这个超级组件。

 @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类只是存储提供方法的接口…

请注意, 这个结构是Martin Fowler描述的一种反模式,您应该根据特性/活动来组织模块 ,并使用组件依赖关系将它们组合成子范围的组件,组件依赖关系用于超范围组件的子范围,inheritance“依赖提供者。)

Solutions Collecting From Web of "Dagger2:组件不能依赖多个作用域组件"

我以前也遇到过像以前一样的问题,并使用相同的ubercomponent方法,除了我使用@Subcomponent s来组织这些东西,而不是将所有模块列在ubercomponent(我称之为“top”或“app”组件) 。

你可能会在这里看到一个例子: 如何将从Dagger 1到Dagger 2的完整= false模块中缺失的注入迁移