Dagger2子组件模块覆盖

时间:2016-05-27 18:08:24

标签: android dependency-injection dagger-2

ApplicationComponent.java

@Component(modules = SomeModule.class)
@ApplicationScope
public interface ApplicationComponent {
    // stuff
    ActivityComponent activityComponent();
}

ActivityComponent.java

@Subcomponent(modules = AnotherModule.class)
@ActivityScope
public interface ActivityComponent {
    // stuff
    void inject(MainActivity mainActivity);
}
可以使用this之类的内容覆盖

SomeModule。但AnotherModule怎么样?

一种解决方案是将两个组件分开,但是如果我想重用一些来自父组件的绑定呢?

编辑:

MainActivity.java

onCreate(Bundle bundle) {
    getApplicationComponent().getActivityComponent().inject(this);
}

EDIT2:

ActivityRyle.java

init() {
    application.setComponent(DaggerApplicationComponent.builder()
                    .someModule(new TestSomeModule(application))
                    .build();
}

edit3:我正在尝试避免在Application(创建主要组件的位置)中布线过多的东西。

2 个答案:

答案 0 :(得分:1)

您需要将模块声明为子组件工厂方法的输入参数。

答案 1 :(得分:0)

您也可以覆盖模块。

请记住,创建子组件的方式:

public interface ApplicationComponent {

    ActivityComponent activityComponent(/*needed modules go here*/);
}

因此,除非你有模块的no-args构造函数,否则你必须将它们作为参数放在方法声明中。

如果您希望能够使用no-arg构造函数覆盖模块,则必须将它们添加到方法签名中:

public interface ApplicationComponent {

    ActivityComponent activityComponent(AnotherModule module);
}

在你的测试中,你只需提供你的子类。