三、 实现控制器逻辑
接下来,你需要以一个Http处理器来实现控制器逻辑。为了构建该控制器,所有你需要做的是创建一个称为WorkflowController处理器的类-它实现IHttp处理器接口。到目前为止,你还没有看到有关Windows WF的任何特别的东西-这是特别针对于ASP.NET的功能(请继续往下读)。
在这个WorkflowController处理器类中,名为ProcessRequest的IHttp处理器接口方法处理一个来自于该ASP.NET应用程序的Web请求。这里,你需要获得到一个静态的工作流运行时刻实例的一个参考,为该工作流建立事件处理器,并且启动工作流的执行。在启动一个工作流实例之前,你需要检查是否该请求的查询串值包含一个代表一个工作流实例ID的GUID。如果存在这个ID,你就知道已经有一个实例正在运行,这样你可以得到一个到该实例的参考并继续执行。如果不存在这个ID,你需要通过调用工作流运行时刻Start Workflow方法来创建一个新的实例并且开始执行过程。
在启动一个实例后,事件处理器将管理进出工作流的通讯。因为本文的目的不是讨论本地通讯服务,所以在此我不会详细讨论这个主题,而是分析其高级的实现技术,并再次讨论这在一个ASP.NET应用程序中是如果工作的。为了便利通讯处理,你将需要若干.NET接口--用于描述出/入该工作流和宿主的信息。你会在本文所附WorkflowClassLibrary工程源码中找到这一些。你还会找到一些实现这些接口的类以及实现工作流机制所必须的相应功能。
让我们再简单地看一下web.config文件。注意,在早些时候讨论的ASPNetThreadingService元素附近,我们使用了三个元素来描述通讯服务类:
| <add type="Workflow.RuntimeServices.GetNameService, Workflow.Library, Version=1.0.0.0, Culture=neutral, PublicKeyToken=c4620ae819b5257e"/> <add type="Workflow.RuntimeServices.GetEmailService, Workflow.Library, Version=1.0.0.0, Culture=neutral, PublicKeyToken=c4620ae819b5257e"/> <add type="Workflow.RuntimeServices.SendDataService, Workflow.Library, Version=1.0.0.0, Culture=neutral, PublicKeyToken=c4620ae819b5257e"/> |

