4

我有以下设置:

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

问题是PersistenceComponent具有以下组件作为其依赖项:

@Component(dependencies = {JobManagerComponent.class, RealmComponent.class, RepositoryComponent.class}, modules = {PersisterModule.class})
public interface PersisterComponent {
    DummyCertPersister dummyCertPersister();
}

哪个使用JobManagerComponent,哪个是ApplicationComponent的依赖。

不幸的是,这个组件似乎不是继承自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 提供:

    PersisterComponent persisterComponent = DaggerPersisterComponent.builder()
            .jobManagerComponent(Injector.INSTANCE.getJobManagerComponent()) //this should be subcomponent
            .realmComponent(realmComponent)
            .repositoryComponent(repositoryComponent)
            .persisterModule(new PersisterModule())
            .build();

我想JobManagerComponent继承自ApplicationComponent. 我猜我需要把它变成 a@Subcomponent并为它提供一个提供方法,但到目前为止,它还没有奏效(我没有得到一个构建器方法,但它仍然看不到jobManagerinside JobManagerComponent

这可能@Subcomponent吗?或者我是否需要跟踪子组件的“子组件”ApplicationComponent以防子组件依赖它?

4

1 回答 1

4

答案是我对组件在 Dagger2 中的工作方式在概念上是错误的。

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

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

因此,问题中的方法是完全错误的。

改用这个。

于 2015-08-14T12:29:32.463 回答