2012-01-10 107 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