现在公司的一个美国项目,对用户交换要求特别高,因此,有N多UI。由于我们将事件处理全都写在对应的UI中了,所以UI几乎无法复用,因为每个界面都或多或少有些不同。这个问题也要我闹心了好长一段时间。今天总算想到了一些思路。

对于UI交互非常多的Software,界面操作通常混合了业务逻辑,比较灵活,不好复用,但是表现层的UI却是可以复用的。因此提出一下建议:

1、基于组件设计UI界面,将一个大的UI划分为若干个小的组件。例如,一个主界面上有一个Data Grid和一个显示Detail信息的Panel,那么分别将其封装为自定义组件。

2、利用IoC模式,降低组件之间的耦合性,在运行时,动态注入它们之间的依赖关系。比如实现类似于选择Data Grid中的一条记录,在Detail Panel上显示其详细信息的功能。
    首先Data Grid和Detail Panel之间没有直接的耦合关系,它们谁都不知道谁。抽象出中间层DataGridDetailController,它的作用是动态注入Data Grid和Detail Panel的关系。这里需要一个XML配置文件,该配置文件中记录了Data Grid和Detail Panel的关系以及字段数据的对应关系。DataGridControlller负责从XML配置文件中读取配子信息,从Data Grid中获取selected item,并将对应字段的数据绑定到Detail Panel的对应字段。

    这样,Data Grid和Detail Panel都可以得到最大的复用。而DataGridDetailController也可以得到复用。如果再有这种Data Grid绑定Detail Panel的情况,只需在XML配置文件中添加新的配置信息就能实现目标功能,而无须想现在这样,没碰到这样的情况都再写一次Data Grid绑定Detail Panel的逻辑控制代码。

3、利用IoC模式,降低UI和UI控制的耦合性,实现UI不变,只是UI控制逻辑不同而已,增加UI表现的复用性。一般UI和UI控制的耦合关系是通过事件处理器建立起来的,例如,我们通常会将事件处理函数hard code到UI界面中,因此,一个UI界面通常会有N多个时间处理函数。
    为了降低这种耦合关系,不再在UI界面中hard code事件处理函数,而是将它们移到UI界面以外的另一对象中。再利用IoC模式动态注入它们之间的关系。
    1、首先需要一个XML配置文件,该配置文件配置了哪个UI界面的哪个事件,对应哪个对象中的哪个事件处理函数。
    2、自定义一个Envent Handler,它能够读取XML配置文件,动态注入特定UI界面和特定事件处理函数的关系。
    这样,UI界面只是表现,不直接和业务逻辑相关,能够实现最大的复用。而业务逻辑的修改也变得很方便了,如果业务逻辑发生了变化,只需修改XML配置文件,替换新的对象中的新的事件处理函数。

这种思路的不好之处,可能有几点:
1、对设计和实现者的要求比较高。
2、开发上会比较复杂,毕竟相当于架了好几个中间层。但是,维护成本非常小,灵活性高。这就叫“有所得必有所失”。
3、开发人员可能需要自行开发、或学习使用IoC容器。可以使用现成的IoC容器,例如,Spring、Spring.Net等。

OK,我的思路完成,大家有什么意见可以给我发邮件。leimin3113591@163.com,欢迎交流。

Posted on 2005-10-12 13:51 雨田美文 阅读(1428) 评论(7) 编辑 收藏