但是我想做这样的事情:
@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,为每个AppDataLevelComponent指定@SubcomponentScope,我也尝试为每个子组件创建一个新范围,但它们都失败了“不能依赖于多个范围的组件”.
编辑:显然,为了获得作用域提供程序,使用作用域标记组件是不够的 – 您还必须指定@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,AppPresentationComponent {
其中xyzComponent类只是存储提供方法的接口…
(请注意this structure is an anti-pattern as described by Martin Fowler,and you should organize modules based on features / activities,并使用组件依赖关系将它们转换为子范围组件.组件依赖关系用于替代您的超级作用域组件,并“继承”依赖关系提供程序.)
解决方法
你可能会在这里看到一个例子:
How to migrate missing inject from module with complete = false from Dagger 1 to Dagger 2
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。