利用WWF进行ASP.NET程序开发(2)
发表于:2007-06-30来源:作者:点击数:
标签:
当使用Windows WF在ASP.NET中实现MVC架构时, 开发 者应该尝试构建独立于应用程序的工作流-而该工作流仍然宿主于该应用程序中。这将有助于保持逻辑独立于描述并且保持在该Web应用程序中的工作步骤顺序和页面流之间的高度独立性。 一个WWF开发新手可能试图用
当使用Windows WF在ASP.NET中实现MVC架构时,
开发者应该尝试构建独立于应用程序的工作流-而该工作流仍然宿主于该应用程序中。这将有助于保持逻辑独立于描述并且保持在该Web应用程序中的工作步骤顺序和页面流之间的高度独立性。
一个WWF开发新手可能试图用一固定数目的活动以某种顺序去开发一个工作流,然后开发一组ASP.NET Web表单--这些表单以与之相同的顺序从一个表单流向另一个表单。很遗憾,尽管这看上去挺符合逻辑,但是实际上这是非常不具有生产效率的,因为你将会再次实现这个工作流逻辑。Web页面X不需要知道是否它需要转到页面Y或页面Z来正确地实现该工作流步骤。代之的是,该工作流(模型)应该告诉ASP.NET(控制器)下一步该干什么;然后ASP.NET应该决定要显示哪个页面。这样,每个页面几乎不需要了解整个过程;它仅需要知道怎样完成一个不同的活动并且让该工作流来关心页面是如何从一处流向另一处的。这种分离在开发者处理页面流时带来了一种极大的灵活性。例如,如果你决定改变该页面显示顺序,那么你可以从工作流中容易地实现这一点,而不需要改变该ASP.NET应用程序中的一行代码。
二、 一个简单的工作流MVC实例
为了说明这一思想,我将向你展示一个简单ASP.NET应用程序和工作流。这个过度简化的工作流描述了一个进度-收集一些来自于一外部应用程序的私人信息,然后显示它。步骤如下:
1. 调用一个方法--这意味着请求一个人的名字;该工作流使用了InvokeMethod活动(见图1)。
2. 等待直到一个事件被激发--这意味着收到一个名字;在这一步中,该工作流使用了EventSink活动。
3. 使用一类似调用,从宿主获得一个电子邮件地址。
4. 等待一个事件意味着收到一个地址。
5. 在收到名字和电子邮件以后,该工作流启动一个InvokeMethod活动来发送个人资料到调用者应用程序。在一种真实世界情形,这最后一步并不很重要。更可能的是,你将调用一个Web服务来发送数据到另外的系统,或把它放进一
数据库。
图1.示例工作流:这个工作流描述了隐含在示例ASP.NET应用程序中的过程
为了在ASP.NET中实现这个工作流,你需要一个页面来收集人名,一个页面来收集电子邮件地址和一个页面来显示个人资料。记住,数据登录表单应该丝毫不知道之前或之后所发生的一切。对于显示页面也是如此。然而,该ASP.NET应用程序必须了解要把哪个页面显示给用户;这正是引入控制器的目的之所在。这个示例使用一个Http处理器来实现该
解决方案。这个称为WorkflowController的定制的处理器负责下列任务:
·获得到工作流运行时刻的一个参考。
·获得一个到已有的或启动一个新的工作流实例的参考(这依赖于是否已启动一个工作流实例)。
·建立控制器和工作流之间的通讯。
·处理来自该工作流的事件。
·告诉ASP.NET需要显示哪个页面,这依赖于现在正执行该工作流中的哪一层。
你已看到,这个定制的处理器实质上负责处理所有的与WWF和页面控制相关的工作--让单个的ASP.NET页面对在后台正在进行的动作保持"缄默"。Web表单需要担心的唯一的事情是执行手头特定的任务并且把必要的数据传递到控制器。
默认地,WWF以一个异步的模型工作。这意味着,当一个应用程序宿主启动一个工作流实例时,控制立即返回到该宿主,而该工作流继续在另一个线程上执行。这在一个Windows表单应用程序中可能是很有用的-其中十分期盼用户接口的连续响应性。通过使用这个异步的模型,工作流可以在后台执行而该用户可以继续操作该应用程序。然而,在一个Web应用程序中,可能不期望这种类型的行为,因为在
服务器完成一个单元的工作后控制通常将只返回到用户。这正是Windows WF的可扩展性的体现。在Windows WF中,开发者可以利用或创建"运行时刻服务"来监控甚至修改该工作流运行时刻。该示例包括:
·持续性服务-存储执行和空闲时间之间的工作流状态
·追踪服务-输出有关工作流执行的信息到某种媒体
·事务服务-帮助维持工作流执行过程中的数据完整性
另外,线程服务让开发者控制工作流实例的执行方式。如前面所讨论的,工作流运行时刻默认地将在一个独立于宿主的线程上异步地运行实例。但是由于这很可能不是ASP.NET所期望的,所以你需要交换默认工作流线程服务。幸运的是,微软已经为此提供了一种解决方案--ASPNetThreadingService。为了实现这一变化,你或者可以手工编码方式把ASPNetThreadingService添加到工作流运行时刻服务,或在web.config文件中完成这一任务。本文中的示例应用程序使用了配置方式。在web.config(见列表1)的工作流运行时刻/服务节中,添加类似下列的这一行:
<add type=
"System.Workflow.Runtime.Hosting.ASPNetThreadingService,
System.Workflow.Runtime, Version=3.0.00000.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
原文转自:http://www.ltesting.net