我正在构建一个使用Dagger 2的应用程序。
因此,我的应用程序组件如下所示:
@Singleton
@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {
// Exported for child-components.
Application application ();
final class Initializer {
public static ApplicationComponent init (Application app) {
return DaggerApplicationComponent.builder()
.applicationModule(new ApplicationModule(app)).build();
}
private Initializer () {
} // No instances.
}
ConnectorComponent plus(ConnectorModule module);
... injections
}
这是@Singleton的作用域,因此它在应用程序生命周期中是独一无二的 然后我有另一个组件,它应该能够使用上面组件提供的所有依赖项,但是它提供了@PerActivity范围的依赖项:
@Scope
@Retention(RUNTIME)
public @interface PerActivity {}
看起来像这样
@PerActivity
@Subcomponent(modules = ConnectorModule.class)
public interface ConnectorComponent {
... injections
}
问题是。如何确保@Singleton提供的所有内容都将作为依赖项的Singletons传递给ConnectorModule?另外,我如何确保ApplicationComponent中的方法plus
始终添加我想要的新模块(@PerActivity)?
最后,任何人都可以考虑在所有活动中使用它的策略(与@PerAcitivity范围一起使用是有意义的),而不是每次都使用新的ConnectorModule调用plus
吗?
答案 0 :(得分:1)
如何确保@Singleton提供的所有内容都将作为依赖项的Singletons传递给ConnectorModule?
Dagger将确保@Singleton
中的任何@Provides
- 注释类型或ApplicationModule
方法仅在您构建的DaggerApplicationComponent
生命周期内提供一次,即使是ConnectorComponent
中的绑定使用它。
如何确保ApplicationComponent中的方法加上将始终添加我想要的新模块(@PerActivity)?
我不确定你在这里问的是什么。当您致电plus
时,您必须自己传递ConnectorModule
的实例。
任何人都可以想到在所有活动中使用它的策略(这与@PerAcitivity范围一起使用是有意义的)并且不必每次使用新的ConnectorModule都调用plus吗?
ConnectorModule
在其构造函数中是否包含参数?如果没有,您可以将其排除在plus
方法的参数之外,Dagger将为您构建一个。
但是,您仍然必须调用plus
方法才能获取活动子组件的实例。这就是@PerActivity
范围的工作原理:ConnectorComponent
的实例,该范围与该实例的生命周期相关联。