四 状态管理问题
正如前面提及的,多步骤web表单应用的一个关键的问题就是用户浏览多个不同的网页时的数据持久性存储问题。借助于ASP.NET MVC框架引入的一个新功能—TempData数据结构,可以存储HTTP重定向中使用的数据。TempData数据结构的一个重要特征是,存储在其中的数据只能在下一次(就此一次)HTTP请求中保持着存储状态。在之后的其他的HTTP请求中,将被自动删除。
在本文雇员注册示例程序中,我们结合使用TempData数据结构和另外两个关键事件—OnActionExecuting和OnResultExecuted共同完成临时存储的任务。
需要明确的是,在每一个行为(Action)方法执行之前将执行OnActionExecuting事件,而OnResultExecuted事件是在每个行为方法执行之后才执行的。
五 解耦流程逻辑
对于一个涉及到多步骤实现用户导航的应用程序(如电子商贸网络应用程序中的从购物车到订单确认程序,一些使用多步骤进行新用户注册导航的网站,以及一些在企业内网中实现的审批程序,等等)来说,可以采用的方案有:或者把工作流逻辑封装在应用程序逻辑内部,或者使之干脆独立出应用程序逻辑。
使用工作流逻辑减小应用程序逻辑中的耦合度将会提供极大的灵活性。通过这种方案,我们可以轻而易举地变更工作流程而不触及修改应用程序代码。这将使应用程序很容易维护。
接下来,我们简单地介绍一下本文示例中引用的几个工作流。
图1 工作流Workflow1
图2 工作流Workflow2
在本文雇员注册示例程序中,正常的工作流程顺序包括三个步骤(见下图中的Workflow3)顺序依次为:Step1,Step2,Step 3及最后部分。另外,我们还有两个工作流:Workflow 1,Workflow 2。工作流Workflow 1的执行顺序为:Step1,Step2及最后部分。工作流Workflow 2的执行顺序为:Step1,Step3及最后部分。所有这些工作流都被抽象出来,使用Windows工作流的状态机工作流加以封装。
图3 工作流Workflow3
在我们的应用程序中,工作流程中的每一步的命名类似于网页的命名。在工作流程步骤和网页间我们建立了一一对应的关系,这样方便工作流程驱动用户界面导航。实际开发中,不可能总会存在这种一一对应。在这种情况下,我们可以把这些步骤映射到某种配置信息—在配置信息更改网页要容易得多。
六 科学的架构设计带来系统的灵活性
在本文示例程序中,控制器类EmployeeController中定义的方法Process代表了整个应用程序的核心。根据用户行为的不同(不论他是点击“Next”按钮还是点击“Back”按钮),它都能够使用一个工具类WorkflowUtil与工作流进行通信,并且能够确定系统中的相应的导航。
public ActionResult Process(string nextButton, string backButton)
{
if (wrkFlw == null && selectedWrkflw != “”)
{
wrkFlw = new WorkflowUtil(selectedWrkflw);
}
if ((nextButton != null) && ModelState.IsValid)
{
page = wrkFlw.MoveNext();
return View(page, employeeObj);
}
else if (backButton != null)
{
ModelState.Clear();
page = wrkFlw.MovePrev();
return View(page, employeeObj);
}
else
return View(page, employeeObj);
}
注意,我们将创建的用于导航的工作流的类型取决于基于配置文件中的具体配置。下面给出了配置信息的示例片断:
<appSettings>
<add key=”WorkflowType” value=”Workflow3″/>
</appSettings>
另外,工具类WorkflowUtil中的StartWorkflow方法负责启动实现各个工作流的任务。下面给出了关键片断代码:
switch (WorkflowType)
{
case “Workflow1”:
wfInstance = _wfRuntime.CreateWorkflow(typeof(EmpRegWorkflow.Workflow1));
break;
case “Workflow2”:
wfInstance = _wfRuntime.CreateWorkflow(typeof(EmpRegWorkflow.Workflow2));
break;
case “Workflow3”:
wfInstance = _wfRuntime.CreateWorkflow(typeof(EmpRegWorkflow.Workflow3));
break;
default:
wfInstance = _wfRuntime.CreateWorkflow(typeof(EmpRegWorkflow.Workflow3));
break;
}
wfInstance.Start();
显而易见,只需通过改变单一的配置信息—例如,把“Workflow1”改变为“Workflow2”,我们即可以改变雇员注册程序的整个导航路径。
根据当前状态,Windows工作流运行时能够自动把工作流推进到下一个工作流,并且会返回其对应的名称。相应地,再由过程方法将把用户导航到下一个网页。有关Windows工作流基础和事件驱动的活动的详细讨论并非本文的目的,所以我们在此不去赘述,读者可以参考MSDN等内容。
如果不是借助于Windows工作流,那么我们将需要在EmployeeController控制器类中定义更多的方法,以映射到工作流中的不同步骤,于是导致应用程序的逻辑代码零碎而且迅速膨胀,也就相应地导致了难以维护的紧耦合的应用程序。
在我们的示例中,如果我们希望将年龄(Age)字段从步骤1移到步骤二中,这是一个非常简单的事情—“剪切和粘贴”即可。根本不需要你更改应用程序代码,验证代码,及测试等内容—只需要一会儿的功能!
图4 工作流Workflow3
也就是说,你只需要把Step1.aspx中的代码片断剪切到页面Step2.aspx中。如下所示:
<p>
<label for=”Age”>Age:</label>
<%= Html.TextBox(“Age”, Model.Age) %>
<%= Html.ValidationMessage(“Age”, “*”) %>
</p>
而且,上述更改立即在应用程序中起作用,绝不会妨碍到系统流程。这就是灵活性!—这也体现了ASP.NET MVC框架的强大功能。
七 小结
通过有效地组合利用ASP.NET MVC框架和Windows工作流架构,我们可以建立更加灵活的向导型用户界面工作流应用程序。这种设计完全可以满足中小型系统流程变更的要求。有兴趣的读者可以试着把在本文实例中介绍的方法应用于另外一些类似的要求根据用户输入相应变更程序流程的动态工作流应用程序中。
如果我们在建立一个工作流应用程序之初,能够认真地分析业务流程中所有可能的潜在的变化并把这些相应变化转移到Windows工作流中进行管理,那么,系统的灵活性将极大地增强,从而使系统流程的更改不再付出巨大的代价。
最后提醒你的是,ASP.NET MVC框架与Windows工作流架构的组合非常适合于克服UI类型的工作流问题中的低效率问题,但是对于昂贵的BPM(Business Process Management,即业务流程管理系统)应用开发这样的场所,本文中介绍的ASP.NET MVC框架与Windows工作流架构二位一体的组合并不太适合。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
API创建影响生产的六个方面
在API创建方面,简单性至关重要。AnyPresence的Vivek Gupta讨论了开发者可以从6个方面处理好API的创建问题,从而加速API生产。
-
微服务:是谁看上了这块小鲜肉
微服务——IT领域的又一个新名词。但它是否能如同OpenStack,如同Docker那样成为众人疯抢的“肥肉”呢?从目前来看,可能还没有到达疯抢的地步,但也不乏支持者。
-
应用开发工具帮助报社与时俱进
新闻媒体业务要一直向顶尖技术看齐,如果他们想要打败竞争对手,成为社会的脉搏的话。心态一直是最重要的,无论是在收集和报道新闻方面,还是在内部运营方法。
-
为移动工作者赋权构建API及工作流的步骤
主管不能简单地把移动工作者认为是不坐在一起的人。相反,赋权要从评估员工需求开始,因为接下来关键的速度爆发当然就必须来自于移动设备和宽带服务的利用。