2015-02-05 117 views
1

使用GWTP/Gin,可以在编译期间选择性地安装模块吗?在“开发”模式下运行时,我们希望有一个演示者和视图仅在应用程序中可用,其中该模式由.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 

我明白任何洞察问题,或在我们的应用程序中使用“有条件地包含”模块的替代解决方案。

回答

0

我不使用GWTP,但只是活动/地方架构。 我发现以下解决方案适用于我的情况。

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

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

一个基于此参数的视图/演示器配置,正确的视图在GIN模块中初始化。

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

万一别人运行到类似的情况......我落得这样做的可选模块代码移动到一个独立的模块,GWT,从主应用程序源代码树中删除。然后,该模块可以在我们的应用程序.gwt.xml文件中继承(通过构建过程)。

即使设置完成后,我还是得到了Gin警告无法创建或继承绑定。我在应用程序.gwt.xml文件中以指定的顺序跟踪了一个问题。在设置“gin.ginjector.modules”之前,我正在做继承。一旦我改变了订单,一切都按预期工作。

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

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