六 科学的架构设计带来系统的灵活性
在本文示例程序中,控制器类EmployeeController中定义的方法Process代表了整个应用程序的核心。根据用户行为的不同(不论他是点击“Next”按钮还是点击“Back”按钮),它都能够使用一个工具类WorkflowUtil与工作流进行通信,并且能够确定系统中的相应的导航。
{
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);
}
注意,我们将创建的用于导航的工作流的类型取决于基于配置文件中的具体配置。下面给出了配置信息的示例片断:
<add key="WorkflowType" value="Workflow3"/>
</appSettings>
另外,工具类WorkflowUtil中的StartWorkflow方法负责启动实现各个工作流的任务。下面给出了关键片断代码:
{
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移到步骤二中,这是一个非常简单的事情—“剪切和粘贴”即可。根本不需要你更改应用程序代码,验证代码,及测试等内容—只需要一会儿的功能!
![](http://sy0.img.it168.com/it168_default.png)
也就是说,你只需要把Step1.aspx中的代码片断剪切到页面Step2.aspx中。如下所示:
<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工作流架构二位一体的组合并不太适合。