Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Dagger2:使子作用域组件可以访问父组件依赖项_Android_Scope_Dagger 2 - Fatal编程技术网

Android Dagger2:使子作用域组件可以访问父组件依赖项

Android Dagger2:使子作用域组件可以访问父组件依赖项,android,scope,dagger-2,Android,Scope,Dagger 2,我有以下设置: @ApplicationScope @Component( dependencies = {AppContextComponent.class, CertUtilsComponent.class, ServiceComponent.class, JobManagerComponent.class}) public interface ApplicationComponent extends AppContextComponent, CertUtil

我有以下设置:

@ApplicationScope
@Component(
        dependencies = {AppContextComponent.class, CertUtilsComponent.class, ServiceComponent.class, JobManagerComponent.class})
public interface ApplicationComponent
        extends AppContextComponent, CertUtilsComponent, ServiceComponent, JobManagerComponent {

    void inject(MainActivity mainActivity); //honestly, I won't need this
}
我有以下子范围组件:

@PresenterScope
@Component(dependencies = {ApplicationComponent.class, PersistenceComponent.class})
public interface PresenterComponent
        extends ApplicationComponent, PersistenceComponent {
    void inject(HomePresenter homePresenter);

    void inject(SendCertificateRequestInteractor sendCertificateRequestInteractor);
}
    PersisterComponent persisterComponent = DaggerPersisterComponent.builder()
            .jobManagerComponent(Injector.INSTANCE.getJobManagerComponent()) //this should be subcomponent
            .realmComponent(realmComponent)
            .repositoryComponent(repositoryComponent)
            .persisterModule(new PersisterModule())
            .build();
问题在于
PersistenceComponent
具有以下组件作为其依赖项:

@Component(dependencies = {JobManagerComponent.class, RealmComponent.class, RepositoryComponent.class}, modules = {PersisterModule.class})
public interface PersisterComponent {
    DummyCertPersister dummyCertPersister();
}
它使用
JobManagerComponent
,这是应用程序组件的依赖项

不幸的是,此组件似乎不是从
ApplicationComponent
继承的。我需要明确地跟踪这个组件,并像这样为构建者提供它

//INJECTOR
    ApplicationComponent applicationComponent = DaggerApplicationComponent.builder()
            .appContextComponent(appContextComponent)
            .certUtilsComponent(certUtilsComponent)
            .jobManagerComponent(jobManagerComponent)
            .serviceComponent(serviceComponent)
            .build();

    this.jobManagerComponent = jobManagerComponent;
    this.applicationComponent = applicationComponent;
    this.certUtilsComponent = certUtilsComponent;
    this.appContextComponent = appContextComponent;
    this.serviceComponent = serviceComponent;
}

public ApplicationComponent getApplicationComponent() {
    return applicationComponent;
}

public JobManagerComponent getJobManagerComponent() {
    return jobManagerComponent;
}
并在构建持久性组件时通过getter提供:

@PresenterScope
@Component(dependencies = {ApplicationComponent.class, PersistenceComponent.class})
public interface PresenterComponent
        extends ApplicationComponent, PersistenceComponent {
    void inject(HomePresenter homePresenter);

    void inject(SendCertificateRequestInteractor sendCertificateRequestInteractor);
}
    PersisterComponent persisterComponent = DaggerPersisterComponent.builder()
            .jobManagerComponent(Injector.INSTANCE.getJobManagerComponent()) //this should be subcomponent
            .realmComponent(realmComponent)
            .repositoryComponent(repositoryComponent)
            .persisterModule(new PersisterModule())
            .build();
我希望从
ApplicationComponent
继承该
JobManagerComponent
。我猜我需要将它变成一个
@子组件
,并为它提供一个供应方法,但到目前为止,它还没有起作用(我没有一个生成器方法,但它仍然没有在
作业管理器组件
中看到
作业管理器


如果子组件依赖于
@Subcomponent
,我是否需要跟踪
ApplicationComponent
的“子组件”呢?

答案是,我在Dagger2中对组件如何工作的概念上是错误的

一个组件只有在子作用域中才能依赖另一个组件。具有多个组件依赖项的组件不能依赖作用域组件。这意味着它们不能有作用域模块;这也意味着它们根本不能使用作用域,除非模块保留对新实例的引用,否则您将每次注入时都会得到一个新实例。这很糟糕,根本不是你想要的

正确的方法是将同一作用域的每个模块绑定到同一个组件。这样,提供的依赖项在构造函数中是可访问的,并且在不同组件中共享同一模块也不会有问题

因此,这个问题的做法是完全错误的


哦……等我有时间的时候,我可以回答这个问题。