Dagger2:组件不能依赖于多个范围的组件

时间:2015-07-10 13:58:04

标签: android scope named-scope dagger-2

是的,我知道以前曾经问过,是的,我知道这是“按设计”。

但我想做这样的事情:

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

然而,我得到的是无范围,每次我注入JobManagerScheduleRepository或其他任何内容,我得到一个新实例。我可以“解决”这个问题的唯一方法就是这个。

@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,我也尝试为每个子组件创建一个新范围,但它们都失败了“不能依赖于多范围组件“。

编辑:显然,为了获得作用域提供程序,使用作用域标记组件是不够的 - 您还必须为@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类只是存储提供方法的接口......

请注意 this structure is an anti-pattern as described by Martin Fowler, and you should organize modules based on features / activities,并使用组件依赖关系将它们转换为子范围组件。组件依赖关系用于查看超级作用域组件,并“继承”依赖关系提供程序。)

1 个答案:

答案 0 :(得分:3)

我有同样的问题,就像你以前一样,并使用相同的超级组件方法结束,除了我使用#include <iostream> #include <stdio.h> #include <curl/curl.h> int main(void) { CURL *curl; CURLcode res; curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, "http://google.com"); res = curl_easy_perform(curl); /* always cleanup */ curl_easy_cleanup(curl); } return 0; } s来组织事情而不是在ubercomponent中列出所有模块(我称之为#34) ;顶部&#34;或&#34; app&#34;组件)。

您可以在此处看到一个示例: How to migrate missing inject from module with complete = false from Dagger 1 to Dagger 2