代码之家  ›  专栏  ›  技术社区  ›  Hady

设计模式以在显示的UI元素上调用不同的业务规则

  •  3
  • Hady  · 技术社区  · 16 年前

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

    我的问题是——知道这三个客户机中的每一个都将继续提供自己的特定需求,在UI上实现这些需求的最佳方法是什么??

    我不喜欢在我拥有的每个Web表单中都有一系列if语句,这些语句可以单独操作下拉列表和控制可见性。它只不过是把我组织得很好的文件按自定义要求乱扔。

    有人能给我指出一个适合这个账单的模式吗?

    看看这个简单的假设例子,看看我在说什么:

    • Web表单由一个下拉列表填充,该下拉列表包含3个菜单项(例如,住宅号码、业务号码、海外号码);下拉列表用于记录联系人的电话号码类型。

    • 我的两个客户很乐意将尽可能多的电话类型关联到一个联系人(即使可能出现重复)

    • 1如果当前联系人已将“业务号码”关联到其个人资料,客户希望我们只在下拉列表中显示“家庭号码”和“海外号码”

    我想我可能会抛出一个包含下拉实例和其唯一名称的通知事件。然后我有不同的“客户机侦听器”,它们使用这些事件并修改在不同类中传递的控件,因此每个客户机配置都保存在干净的筒仓中。

    3 回复  |  直到 15 年前
        1
  •  0
  •   Dmitry Karpezo    15 年前

    我认为你需要使用 State pattern 但也有很多其他的方法。

        2
  •  0
  •   Erik Funkenbusch    15 年前

    你不会说你在使用什么技术。我假设使用ASP.NET。如果不是这样的话,请更新您的问题,将技术包含进来,因为它可以在什么样的解决方案上产生巨大的差异。

    你基本上有两种主要的方法。您可以为UI中的每个控件创建一个抽象层,根据一组规则验证自己。这是最灵活的,但这意味着您正在向每个控件添加抽象的开销,不管它是否需要它…最有可能的是,95%的控件不需要它,从而增加了开销。

    另一种选择是要求每个页面运行不同的额外步骤,可能是通过创建您自己的“onxxx”事件(OnourCompanPreInit、OnourCompanyInit等),在其中为每个客户机放置额外的逻辑。

    像ASP.NET这样的框架的一个缺点是,在它追求高度灵活的过程中,它强制执行一定的关注分离,这可能与您需要的关注分离不一致。

        3
  •  0
  •   Hady    15 年前

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

    ASP.NET项目是在所有客户机都能得到的模块化公共基础上开发的。

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

    所以在我的页面的基本调用中,我有如下内容:

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

    这个 ConfigurationInterceptors 方法将当前页对象传递给一个模块,该模块将读取特定于客户端的配置,循环访问需要修改的控件,并在运行时和作为客户端网页的服务器之前进行修改。

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

    这个 Interceptor 类是运行一系列 FindControl 根据需要调用和修改。

    通过这种方式,这种模式已经允许我们将特定于客户机的自定义设置放在单独的思洛存储器中,而不会使基本公共代码库复杂化。

    推荐文章