使用Gin注入多个视图

时间:2013-08-09 18:37:55

标签: gwt gin

我正在尝试组合一个多项目应用程序,其中一个子项目有一个演示者的多个视图。我正在使用Gin向我的演示者注入视图。

子项目包含演示者和2个不同的视图。我有2个单独的gin模块,每个模块将其中一个视图绑定到视图界面。

根据Thomas Broyer关于this post答案的建议,我的Ginjectors被包含在一个“持有者”类中,该类调用特定ginjector上的GWT.create。使用replace-with语句在gwt.xml文件中配置适当的holder。

当我在开发模式下运行我的项目时,我看到备用视图按照我的预期显示。但是,当我编译项目时,我仍然只获得默认视图。此外,只有6个排列(由于替换逻辑,我会期望更多),并且我没有得到我在不同场景中的预期。

这里有一些代码可供说明。

Subproject.gwt.xml包含:

<replace-with class="com.example.GinjectorDesktopHolder">
    <when-type-is class="com.example.GinjectorHolder" />        
</replace-with>

<replace-with class="com.example.GinjectorTabletHolder">
    <when-type-is class="com.example.GinjectorHolder" />
    <when-property-is name="formfactor" value="tablet" />
</replace-with>

“formfactor”变量在从GWT的mobilewebapp sample project逐字复制的gwt.xml中定义。

持有人课程如下:

public abstract class GinjectorHolder {
    public abstract Ginjector getGinjector();
}


public class GinjectorTabletHolder extends GinjectorHolder {
    @Override
    public Ginjector getGinjector() {
        return GWT.create(GinjectorTablet.class);
    }   
}


public class GinjectorDesktopHolder extends GinjectorHolder {
    @Override
    public Ginjector getGinjector() {
        return GWT.create(GinjectorDesktop.class);
    }
}

我的Ginjectors看起来像这样:

public interface MyGinjector {
    MyView getView();
    EventBus getEventBus();
}


@GinModules({ModuleDesktop.class})
public interface GinjectorDesktop extends Ginjector, MyGinjector {}


@GinModules({ModuleTablet.class})
public interface GinjectorTablet extends Ginjector, MyGinjector {}

我的模块看起来像这样:

public class ModuleDesktop extends AbstractGinModule {
    @Override
    protected void configure() {
        bind(MyPresenter.View.class).to(DesktopView.class);
    }
}


public class ModuleTablet extends AbstractGinModule {
    @Override
    protected void configure() {
        bind(MyPresenter.View.class).to(TabletView.class);
    }
}

最后,在我的演示者代理中,基本上是这个特定子项目的切入点,我有这一行:

GinjectorHolder holder = GWT.create(GinjectorHolder.class);
MyGinjector ginjector = holder.getGinjector();      

如前所述,当我在开发模式下运行并输入断点时,我可以看到创建了相应的GinjectorHolder。 FormFactor.gwt.xml(上面链接)提供了一个开关,用于使用URL参数切换到您想要查看的上下文。所以我可以在URL中创建formfactor = tablet并创建Tablet Ginjector Holder。

2 个答案:

答案 0 :(得分:1)

如评论中所述,删除行

<collapse-property name="formfactor" values="*"/>

导致排列数量的预期增加。

然而,这很神秘,为什么这是必要的,因为通常应该可以折叠你喜欢的任何属性 - 这只是意味着每个浏览器必须下载更多的代码,但仍然应该得到它需要的一切。可能是一个错误。

答案 1 :(得分:0)

首先,不是将视图映射到viewimpl,而是将其绑定到viewprovider,然后根据用户代理值,您可以返回要绑定的相应实例。