设计模式,用于在呈现的UI元素上调用不同的业务规则

时间:2010-07-01 11:36:39

标签: design-patterns customization

我正在开发一个为3个客户开发网站应用程序的项目。所有客户都对我们生产的基础产品感到满意。其中2个有一些略微不同的要求 - 关于某些控件的可见性,不同的数据绑定到下拉列表等。

我的问题是 - 知道3个客户端中的每个客户端都会继续满足自己的特定需求,在UI上实现这些需求的最佳方式是什么?

我不喜欢在每个网络表单中都有一系列IF语句的想法,这些语句可以单独操作下拉菜单和控制可见性。它简单地用自定义要求填充我组织得很好的文件。

有人能指出一个符合条件的模式吗?

看看这个简化的假设示例,看看我在说什么:

  • 网页表格中包含一个下拉菜单,其中包含3个菜单项(例如,家庭电话号码,商业号码,海外电话号码);下拉列表用于将电话号码类型记录到联系人

  • 我的2位客户很乐意将尽可能多的手机类型与联系人联系起来(即使可能发生重复)

  • 如果当前联系人已将“公司号码”与其个人资料相关联,则客户希望我们仅在下拉列表中显示“家庭电话号码”和“海外电话号码”

我想我可能会抛出一个包含下拉列表实例的通知事件及其唯一名称。然后我有不同的'客户端监听器'消耗这些事件并修改它们在不同的类中传递的控件 - 因此每个客户端配置都保存在漂亮的干净孤岛中。

3 个答案:

答案 0 :(得分:0)

我说你需要使用 State pattern,但可能有很多其他方式。

答案 1 :(得分:0)

您并没有真正说出您正在使用的技术。我将假设ASP.NET。如果情况并非如此,请更新您的问题以包含技术,因为它可以在可能的解决方案方面产生巨大的差异。

你基本上有两种主要方法。您可以为UI中的每个控件创建一个抽象层,以根据一组规则验证自身。这是最灵活的,但它意味着你将抽象的开销添加到每个控件,无论是否需要它......而且很可能,95%的控件都不需要它,因此增加了开销。

另一个选择是要求每个页面运行各种额外的步骤,可能是通过创建自己的“OnXXX”事件(OnOurCompanyPreInit,OnOurCompanyInit等),在其中为每个客户端放置额外的逻辑。

像ASP.NET这样的框架的一个缺点是,它需要高度灵活,它会强制执行某些可能无法与您需要的关注分离的关注点。

答案 2 :(得分:0)

以下方法是我在项目中用于为不同客户端进行配置特定更改的方法。

ASP.Net项目是在一个模块化的共同基础上开发的,所有客户都可以获得。

在使用适当的控件填充Page之后,在我们开始渲染之前,我将Page对象传递给执行所有客户端特定配置更改的模块。

所以在我的页面的基本调用中,我有类似的东西:

protected void Page_Load(object sender, EventArgs e)
{
    PreRender += ConfigurationInterceptors;
}

ConfigurationInterceptors方法将当前Page对象传递给一个模块,该模块将读取客户端特定的配置,遍历需要修改的控件,并在运行时和服务器到客户端网页之前进行修改。

protected void ConfigurationInterceptors(object sender, EventArgs e)
{
    Interceptor interceptor = new Interceptor(this.Page);
}

Interceptor类是一个独立的层,它运行一系列FindControl次调用并根据需要进行修改。

通过这种方式,这种模式已经成功地允许我们将客户特定的自定义设置放在一个单独的孤岛中,而不是使基本公共代码库复杂化。