如何将Dagger2的子组件用于GWT

问题描述 投票:0回答:1

我正在尝试将两个组件与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能够将子组件注入其图形中,我想让子组件选择要使用的实现。是否可以使用子组件?我误解了什么?

java gwt inversion-of-control dagger-2
1个回答
1
投票

Dagger中的组件代表“范围”,即生命周期。你的MainView依赖于CarteWidget,因此它的生命周期(必然)比小部件的生命周期长。这将导致视图位于子组件和父组件中的窗口小部件中,而不是相反(或在同一组件中)。

如果你想要隔离,那么使用组件依赖而不是子组件;但你试图在这里向后绑定事物。

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

© www.soinside.com 2019 - 2024. All rights reserved.