我正在尝试组合一个多项目应用程序,其中一个子项目对单个演示者具有多个视图。我正在使用 Gin 将视图注入我的演示者。
子项目包含演示者和 2 个不同的视图。我有 2 个单独的 gin 模块,每个模块将一个视图绑定到视图界面。
根据 Thomas Broyer 对这篇文章的回答的建议,我的 Ginjector 被包装在一个“holder”类中,该类在特定的 ginjector 上调用 GWT.create。使用 replace-with 语句在 gwt.xml 文件中配置适当的持有者。
当我在开发模式下运行我的项目时,我看到备用视图按我的预期出现。但是,当我编译项目时,我仍然只能得到默认视图。此外,只有 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 示例项目中逐字复制的 gwt.xml 中定义的。
Holder 类如下所示:
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。