UI(User Interface)
UI 是客户端的用户界面,负责从用户方接收命令,请求,数据,传递给业务层处
理,然后将结果呈现出来。根据客户端的不同我们大体将应用程序分为
BS(Browser-Server) 浏览器结构,CS(Client-Server)桌面客户端结构。
BS 的优点是无需操心客户端,只需要部署维护好服务器即可。CS 的优点在于强
大的界面交互表达能力。RIA(Rich Internet Application)是为了融合这两种结构
优点的一种技术,它依赖在客户端一次性安装一个通用解释器之后即获得强大的界面
交互表达能力和无需部署具体客户端的方便性。具体的实现技术很多,例如微软的
SmartClient, Avalon; Macromedia 的 Flex;以 JS 为基础的 Bindows;Ajax 等
等很多。
UI 控制逻辑
UI 控制逻辑负责处理 UI 和业务层之间的数据交互,UI 之间状态流程的控制,同
时负责简单的数据验证和格式化等功能。具体的说在 dotNet 事件驱动的编程模型下,
UI 控制逻辑被自然的实现在了事件函数中,例如 PageLoad 事件函数,ButtonClick
事件函数。在这些事件函数中,主要任务就是做 UI 控件与业务实体的数据交换与业务
调用,但面对大量的数据交换工作量与维护量就成了最大的问题。而在复杂应用的系
统中,状态与流程的管理是必须要考虑的因素,它包含了界面与业务两方面。如果不
加以封装的直接写在事件函数中将导致业务依赖表示层。下面分别讨论这两个问题。
1.UI
与业务实体之间的数据交互
此阶段负责数据交换的业务实体我把它称为 DTO(Data Transfer Object),
但需要说明的是这里的 DTO 并不是只包含数据的业务对象,它仍然包含必要的方法是
完整的业务实体。处理输入时我们从 UI 控件的获得数据填入 DTO 再向下传播,处理
输出时用户发出请求业务层会将数据以 DTO 的形式返出再赋给 UI 控件展现。因此需
要一种方式来自动解决这样的来回赋值问题。Java 下 Structs 的 Formbean 对此问题
提供了一定支持,而遗憾的是 dotNet 下的不少控件虽然支持数据绑定但仍然没有一
个现成完整的解决办法。一种比较简单的方式是自己设计一个 Adapter 按照某种映射
关系来自动处理这样的绑定,这样的映射关系最好是 UI 控件与 DTO 属性的事先命名
约定,以此种方式的约定作为映射关系无需增加任何配置文件和配置工作即可实现。
例如你的一个输入人名的 Textbox 命名为 txtUserName,而我的业务实体属性命名
为 UserName,这样就可以通过字符串的查找来找到对应。
2.
状态与流程的管理
复杂业务方面的状态与流程可以通过一些工作流引擎来解决,微软最近独立发布
了自己的工作流引擎有兴趣的朋友可以去看看。一般更多的情况是需要解决界面上状
态与流程的管理。耦合再表示层中是不可取的办法。MVC(Model-View-
Controller)模式提供了实现这一目标的方法。Controller 是整个方案的核心,它是
一个流程管理器,来自 UI 所有的命令与数据经过 Controller 分发给业务层或其他
UI,这样我们可以把流程,权限等逻辑单独封装,例如配置文件中,达到最大化的业
务重用。dotNet 下 MVC 的方案并不像 Java 下有那么多选择,目前有以下几种选择: