2015-02-05 29 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" />