可选模块安装

时间:2015-02-05 21:57:42

标签: gwtp gwt-platform gin

使用GWTP / Gin,是否可以在编译期间选择性地安装模块?我们有一个案例,我们希望在#34; development"中运行时,我们希望有一个演示者和视图仅在应用程序中可用。模式,其中该模式由.gwt.xml文件中的标志(由构建设置)确定。

以前,我们使用MVC架构运行GXT,并在我们的模块中执行以下操作:

  <replace-with class="com.mypackage.DevEditController" >
    <all>
        <when-property-is name="isDevelopment" value="true" />
        <when-type-is class="com.mypackage.EditController" />
    </all>
  </replace-with>
  <replace-with class="com.mypackage.StubEditController" >
    <all>
        <when-property-is name="isDevelopment" value="false" />
        <when-type-is class="com.mypackage.EditController" />
    </all>
  </replace-with>

并使用以下内容创建控制器:

(EditController)GWT.create(EditController.class);

我想用GWTP做类似的事情,其中​​应用程序的非开发编译对此演示者一无所知。基本上,在我们的模块文件中执行以下操作:

<set-configuration-property name="gin.ginjector.modules" 
                              value="com.mypackage.gin.SharedModule"/>

if this is development mode:
<set-configuration-property name="gin.ginjector.module.desktop"
                              value="com.mypackage.gin.DevDesktopModule"/>
else:
<set-configuration-property name="gin.ginjector.module.desktop"
                              value="com.mypackage.gin.DesktopModule"/>

DesktopModule和DevModule会做同样的事情,但DevDesktopModule会加载一个包含演示者/视图绑定的附加模块(TestModule)。

从配置的角度来看这是可行的吗?我认为我可以使用构建过程切换出的两个.gwt.xml文件来完成此操作,但构建过程始终会看到TestModule文件,无论它是否正在安装(显然是因为Inject)。这是我们在源代码树中存在但从未安装过模块时得到的错误消息(这是来自我们不想安装它的构建版本)

[ERROR] Error injecting com.blah.test.TestPresenter$MyView: Unable to create or inherit binding: No @Inject or default constructor found for com.blah.test.TestPresenter$MyView
Path to required node:

com.google.gwt.inject.client.AsyncProvider<com.blah.test.TestPresenter> [com.gwtplatform.mvp.client.ClientGinjector#getcomblahtestTestPresenter()]
-> com.blah.test.TestPresenter [Implicit injection of com.google.gwt.inject.client.AsyncProvider<com.blah.test.TestPresenter>]
-> com.blah.test.TestPresenter$MyView [@Inject constructor of com.blah.test.TestPresenter]

[ERROR] Errors in 'gen/com/gwtplatform/mvp/client/DesktopGinjectorProvider.java'
[ERROR] Line 8: Failed to resolve 'com.gwtplatform.mvp.client.DesktopGinjector' via deferred binding
[WARN] For the following type(s), generated source was never committed (did you forget to call commit()?)

[WARN] com.gwtplatform.mvp.client.com_gwtplatform_mvp_client_DesktopGinjectorImpl

我很欣赏这个问题的任何见解,或者有条件地包含&#34;有条件的&#34;模块在我们的应用程序中。

2 个答案:

答案 0 :(得分:0)

我不使用 GWTP ,而只使用Activity / Place架构。 我发现以下解决方案适用于我的情况。

*.gwt.xml*中的配置参数由构建脚本设置,稍后在 EntryPoint 中解析。

<define-configuration-property name="demoMode" is-multi-valued="true" />
<extend-configuration-property name="demoMode" value="false" />

A具有基于此参数的视图/演示者配置,并在GIN模块中初始化正确的视图。

@Provides @Singleton
public LoginView getLoginView() {
  if (SharedState.IS_DEMO_MODE) {
    return new LoginViewMobileDemo();
  } else {
    return new LoginViewMobile();
  }
}

答案 1 :(得分:0)

如果其他人遇到类似情况......我最终做的是将可选模块代码移动到独立的GWT模块中,将其从主应用程序源树中删除。然后可选地在我们的应用程序.gwt.xml文件中继承该模块(通过构建过程)。

即使在设置之后,我仍然会收到关于无法创建或继承绑定的Gin警告。我在应用程序.gwt.xml文件中以指定的顺序跟踪问题。我在设置&#34; gin.ginjector.modules&#34 ;;之前做了继承。一旦我改变了订单,一切都按预期工作。

<set-configuration-property name="gin.ginjector.modules" value="com.test.app.SharedModule"/>

<inherits name="com.test.optional.OptionalModule" />