四 状态管理问题
正如前面提及的,多步骤web表单应用的一个关键的问题就是用户浏览多个不同的网页时的数据持久性存储问题。借助于ASP.NET MVC框架引入的一个新功能—TempData数据结构,可以存储HTTP重定向中使用的数据。TempData数据结构的一个重要特征是,存储在其中的数据只能在下一次(就此一次)HTTP请求中保持着存储状态。在之后的其他的HTTP请求中,将被自动删除。
在本文雇员注册示例程序中,我们结合使用TempData数据结构和另外两个关键事件—OnActionExecuting和OnResultExecuted共同完成临时存储的任务。
需要明确的是,在每一个行为(Action)方法执行之前将执行OnActionExecuting事件,而OnResultExecuted事件是在每个行为方法执行之后才执行的。
五 解耦流程逻辑
对于一个涉及到多步骤实现用户导航的应用程序(如电子商贸网络应用程序中的从购物车到订单确认程序,一些使用多步骤进行新用户注册导航的网站,以及一些在企业内网中实现的审批程序,等等)来说,可以采用的方案有:或者把工作流逻辑封装在应用程序逻辑内部,或者使之干脆独立出应用程序逻辑。
使用工作流逻辑减小应用程序逻辑中的耦合度将会提供极大的灵活性。通过这种方案,我们可以轻而易举地变更工作流程而不触及修改应用程序代码。这将使应用程序很容易维护。
接下来,我们简单地介绍一下本文示例中引用的几个工作流。
图1 工作流Workflow1
在本文雇员注册示例程序中,正常的工作流程顺序包括三个步骤(见下图中的Workflow3)顺序依次为:Step1,Step2,Step 3及最后部分。另外,我们还有两个工作流:Workflow 1,Workflow 2。工作流Workflow 1的执行顺序为:Step1,Step2及最后部分。工作流Workflow 2的执行顺序为:Step1,Step3及最后部分。所有这些工作流都被抽象出来,使用Windows工作流的状态机工作流加以封装。
在我们的应用程序中,工作流程中的每一步的命名类似于网页的命名。在工作流程步骤和网页间我们建立了一一对应的关系,这样方便工作流程驱动用户界面导航。实际开发中,不可能总会存在这种一一对应。在这种情况下,我们可以把这些步骤映射到某种配置信息—在配置信息更改网页要容易得多。