2012-01-10 18 views
4

對於多個客戶端使用的產品,其中不同的客戶端要求不同的定製,既有明智的用戶界面功能,也有功能明智的,如何適應這些更改,而不會讓代碼混淆客戶端特定的代碼?如何管理客戶端特定配置

是否有任何框架(對於任何編程語言)可以幫助解決這個問題?

要添加更多詳細信息,UI是基於Web的,並使用JSP編寫。

+2

語言不可知的配置?我不這麼認爲..... – 2012-01-10 03:33:19

回答

3

這是管理同一應用程序的不同版本的最困難的業務需求之一,所以不要指望這種情況下的開放框架,然而每個公司都會爲此開發自己的系統。

至於業務邏輯的修改,你將受益於強大的接口和的IoC(如)。您可以覆蓋您的特定情況的服務並更改所需的方法,然後將修改後的服務版本注入IoC。

至於用戶界面,因爲您選擇了JSP,所以它更加困難,因爲它沒有什麼靈活性。當你用Swing或GWT進行編程時,你可以用相同的方式進行UI修改 - 覆蓋所需的UI類,改變它們,注入修改後的版本。使用JSP - 可以在自定義版本中對.jsp文件進行大量修改。

現在修改修改/ bug修復 - 版本控制系統完全使用。當然,您的客戶特定版本是分支機構,而主要的標準版本是主幹。修復了主幹問題,然後合併到客戶特定的分支機構。通過接口/重寫實現,大多數合併將成爲簡單的方法,但是,對於JSP,我期望經常發生衝突...

通常,代碼更改合併比任何基於XML的合併更容易。

2

如何簡單OOP?建立一個真實的接口/基類,並根據某種配置,實例化子類A或B,具體取決於客戶端。很難爲這樣的語言不可知的問題提供更多的細節,但我認爲這是非常現實的。

+0

感謝您的回答。如何UI元素? – 2012-01-10 05:26:33

2

在Win32/.NET世界中常見的一個解決此問題的方法是將客戶端特定的「代碼」移動到資源文件中。許多.NET項目(.NET通過System.Resources名稱空間內置支持此模式)將此模式用於國際化,方法是將UI字符串放入每種語言的一個文件中,然後在運行時從相應文件加載UI字符串。

這種模式如何應用於JSP應用程序?那麼,在這裏,您可以爲每個客戶端(或者,而不是文件使用數據庫)保留一個資源文件,並在您提供頁面時從資源文件中加載用戶特定的自定義項。

舉例來說,您的最大客戶希望將自己的徽標覆蓋在您網站每個網頁的某個部分。您的頁面可能會加載CustomerLogo屬性,並將該屬性用作頁面該部分的HTML圖像的src屬性。如果您正在向重要客戶提供該頁面,則加載URL「/static/images/importantCustomerLogo.png」,否則您將回退到默認資源文件,該文件指定URL「/static/images/logo.png 「。

通過這種方式,您可以將用於加載屬性的代碼抽象爲一個或兩個Java文件,並在整個網站中使用這些屬性。您的代碼庫中唯一的客戶特定部分是資源文件集,並且這些文件可以是易於閱讀和修改的純XML格式。結果是,沒有開發應用程序的人可以修改XML,而無需先閱讀代碼,這樣就不必維護資源文件 - 銷售部門可以爲您完成這項工作。

1

GWT通過一個稱爲deferred binding

當編譯GWT應用程序的編譯器實際上產生不同的版本針對每個不同的瀏覽器代碼的功能做到這一點的開箱。這是GWT組件自動開箱處理不同瀏覽器的細節。

此功能可以擴展到產品基於自定義屬性的任意編輯。這裏是一個簡單的例子:假設你有不同的視圖定義爲正常和詳細視圖

public abstract class AbstractView { ....} 
public abstract class NormalView extends AbstractView { ... } 
public abstract class DetailedView extends AbstractView { ....} 

您可以創建一個模塊定義,將使用DetailedView使用NormalView類其他產生兩個不同的版本,一個(在你的gwt。使用

AbstractView view = GWT.create(AbstractView.class); 

XML文件)

<define-property name="customMode" values="normal,detailed" /> 

<replace-with class="com.example.NormalView"> 
    <when-type-is class="com.example.AbstractView" /> 
    <when-property-is name="customMode" value="normal" /> 
</replace-with> 

<replace-with class="com.example.DetailedView"> 
    <when-type-is class="com.example.AbstractView" /> 
    <when-property-is name="customMode" value="detailed" /> 
</replace-with> 

將在運行時提供適當的實例。

您需要將您的客戶端特定代碼封裝到特定的類中,併爲不同的實現公開接口。

您還需要根據客戶當前正在查看(你可以使用JSP這一點。)


作爲測試請不要拿上面的代碼樣本選擇合適的編譯版本,有可能是與語法的問題,它只是意在傳達的總體思路


一個JSP後端是託管環境的GWT應用程序的理想,你將能夠採取的requestfactory米的優勢機制簡化客戶端和服務器之間的通信。

顯然這裏有一個學習曲線,IMO official documentation是一個很好的開始。

0

我想你可能會嘗試閱讀OSGi相關的文章(或書籍)......這個平臺會給你一個非常實用的答案,以解決你的模塊化問題。它的設計特別能夠處理不同的模塊,依賴和版本控制。 正如答案中提到的那樣,通過OSGi聲明式服務進行依賴注入是Spring的一個非常有價值的替代方案,它具有動態功能。部署提供服務和引用的包將自動更新,並將其刪除,並且它們也將被刷新... 看看這個技術後問一些問題嗎? Registers jerome