如何在DWT中使用Dagger2的子组件

时间:2018-09-10 12:10:39

标签: java gwt inversion-of-control dagger-2

我正在尝试将两个组件与Dagger2(2.17版)链接。一种是GWT活动(MainView.class),另一种是复杂的小部件,其中嵌入了一些映射功能(CarteWidget.class)。

我想将活动定义为@Component,其中特别包含一个@Subcomponent来包含CarteWidget的依赖项。

这是我的主要组件及其模块:

@Lvl1Scope
@Component(modules = Lvl1Module.class)
public interface Lvl1Component {

    MainView getMainView();

}

@Module(subcomponents = CarteSubComponent.class)
public class MainModule {

    @Provides
    public MainView provideMainView (CarteSubComponent.Builder carteBuilder) {
        return new MainView (carteBuilder.build().getCarte());
    }
}

还有我的子组件及其模块:

@CarteScope
@Subcomponent(modules = CarteModule.class)
public interface CarteSubComponent {

    CarteWidget getCarte();

    @Subcomponent.Builder
    interface Builder {

        CarteSubComponent build();
    }

    @Module
    public class CarteModule {

    }

}

它可以工作,但我不喜欢它,我更喜欢将CarteWidget注入到MainView中,而不使用@Provides方法。因此,我的主模块仅包含从子组件获取CarteWidget的方法:

@Module(subcomponents = CarteSubComponent.class)
public class Lvl1Module {

    @Provides
    public CarteWidget provideCarte(CarteSubComponent.Builder carteBuilder) {
        return carteBuilder.build().getCarte();
    }

}

但是有了这个很小的变化我遇到了无限循环,因为在执行provideCarte Lvl1Module时调用了carteBuilder.build().getCarte()的方法...

如果我将CarteWidget的生产者方法添加到子组件中,则会出现错误,发现为CarteWidget类型找到两个绑定,这是正确的。

我想要的是我的Lvl1Component能够将Subcomponent注入到它的图形中,并且我想让Subcomponent选择要使用的实现。子组件可能吗?我误会了什么?

1 个答案:

答案 0 :(得分:1)

Dagger中的组件表示“作用域”,也就是生命周期。您的MainView依赖于CarteWidget,因此其生命周期(必须)比小部件的生命周期更长。这将导致视图位于子组件中,而窗口小部件位于父组件中,而不是相反(或两者都在同一组件中)。

如果要隔离,请使用组件依赖性而不是子组件;但是您正在尝试将内容向后绑定。

真正的问题是:为什么要使用子组件,甚至是单独的组件?