【问题标题】:Dagger2: Component cannot depend on multiple scoped componentsDagger2:组件不能依赖多个作用域组件
【发布时间】:2015-07-10 13:58:03
【问题描述】:

是的,我知道以前有人问过这个问题,是的,我知道这是“设计使然”。

但我想做这样的事情:

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

不是粉丝。

那么,如何构建和拆分依赖关系树,而不制作一个巨大的 über 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();
    }
}

与此同时,我最终得到了这个 übercomponent。

@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,并使用组件依赖项将它们变成子范围组件。组件依赖项用于子范围您的超范围组件,并“继承”依赖提供者。)

【问题讨论】:

    标签: android scope named-scope dagger-2


    【解决方案1】:

    我不久前遇到了和你一样的问题,最后使用了相同的 ubercomponent 方法,除了我使用@Subcomponents 来组织事物并且没有在 ubercomponent 中列出所有模块(我称之为“顶部”或“应用程序的”组件)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2018-06-11
      • 1970-01-01
      相关资源
      最近更新 更多