android – 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,为每个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,并使用组件依赖关系将它们转换为子范围组件.组件依赖关系用于替代您的超级作用域组件,并“继承”依赖关系提供程序.)

解决方法

我有同样的问题,就像你之前没有,并使用相同的超级组件方法结束,除了我使用@Subcomponents组织事情,而不是在ubercomponent中列出所有模块(我称之为“顶部”或“应用程序”组件).

你可能会在这里看到一个例子:
How to migrate missing inject from module with complete = false from Dagger 1 to Dagger 2

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...