具有RunTime SubComponent的Dagger 2 Singleton组件

时间:2015-10-19 18:40:35

标签: java android dependency-injection dagger-2

我正在构建一个使用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吗?

1 个答案:

答案 0 :(得分:1)

  

如何确保@Singleton提供的所有内容都将作为依赖项的Singletons传递给ConnectorModule?

Dagger将确保@Singleton中的任何@Provides - 注释类型或ApplicationModule方法仅在您构建的DaggerApplicationComponent生命周期内提供一次,即使是ConnectorComponent中的绑定使用它。

  

如何确保ApplicationComponent中的方法加上将始终添加我想要的新模块(@PerActivity)?

我不确定你在这里问的是什么。当您致电plus时,您必须自己传递ConnectorModule的实例。

  

任何人都可以想到在所有活动中使用它的策略(这与@PerAcitivity范围一起使用是有意义的)并且不必每次使用新的ConnectorModule都调用plus吗?

ConnectorModule在其构造函数中是否包含参数?如果没有,您可以将其排除在plus方法的参数之外,Dagger将为您构建一个。

但是,您仍然必须调用plus方法才能获取活动子组件的实例。这就是@PerActivity范围的工作原理:ConnectorComponent的实例,该范围与该实例的生命周期相关联。