Dagger2:使子范围组件可以访问父组件依赖项
Dagger2: Make parent component dependency accessible for subscoped component
我有以下设置:
@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
。我猜我需要把它变成一个 @Subcomponent
并为它提供一个提供方法,但到目前为止,它还没有奏效(我没有得到一个构建器方法,但它仍然没有看到JobManagerComponent
.
中的 jobManager
@Subcomponent
可以吗?还是我 需要 跟踪 ApplicationComponent
的 "subcomponents" 以防子组件依赖于它?
答案是我对组件在 Dagger2 中的工作方式在概念上是错误的。
一个组件应该只依赖于另一个组件,如果它是另一个组件的子范围。 具有多个组件依赖项的组件不能依赖作用域组件;这意味着他们不能有作用域模块;这也意味着他们根本不能使用范围,除非模块保留对新实例的引用,否则每次注入时都会获得一个新实例。哪个不好,根本不是你想要的。
正确的方法是将同一作用域的每个 模块绑定到同一组件。这样,所提供的依赖项就可以在构造函数中访问,并且在不同的组件中共享相同的模块也不会有问题。
所以题中的做法是完全错误的。
Use this instead.
我有以下设置:
@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
。我猜我需要把它变成一个 @Subcomponent
并为它提供一个提供方法,但到目前为止,它还没有奏效(我没有得到一个构建器方法,但它仍然没有看到JobManagerComponent
.
jobManager
@Subcomponent
可以吗?还是我 需要 跟踪 ApplicationComponent
的 "subcomponents" 以防子组件依赖于它?
答案是我对组件在 Dagger2 中的工作方式在概念上是错误的。
一个组件应该只依赖于另一个组件,如果它是另一个组件的子范围。 具有多个组件依赖项的组件不能依赖作用域组件;这意味着他们不能有作用域模块;这也意味着他们根本不能使用范围,除非模块保留对新实例的引用,否则每次注入时都会获得一个新实例。哪个不好,根本不是你想要的。
正确的方法是将同一作用域的每个 模块绑定到同一组件。这样,所提供的依赖项就可以在构造函数中访问,并且在不同的组件中共享相同的模块也不会有问题。
所以题中的做法是完全错误的。
Use this instead.