上一篇,我介绍到了WF4的全新事件驱动工作流设计的第一部分。我们可以大致总结几个重点
1. WF4的事件机制与WF3有了革命性的不同。WF3是基于ExternalDataExchange服务的。而WF4是基于WCF的。这种设计相对来说,对于开发人员而言,简便了很多。
2. WF3中是使用所谓的EventDriven这样的Activity,而WF4则使用了Receive这样的Activity.其实,从WF 3.5的时候就可以看到这样的端倪。
3. 如果需要进行事件的监听,则不能使用WorkflowInvoker或者WorkflowApplication来启动流程,而是需要通过WorkflowServiceHost来启动监听即可。(这里有个根本区别,WorkflowServiceHost只是启动监听,并不立即创建Workflow的实例。)
上一篇我们讲到了如何接收客户端的请求,并且做出响应。这种响应我们仅限于在服务端打印有关的消息。
但显然这样是不够的。我们创建好流程整合,至少希望将流程的最新编号通知客户端吧。那么,如何进行这样的设计呢?
本文代码,可以通过 这里 下载
1.修改工作流设计
WF4中对这种需求已经考虑得很周全了,我们可以选择Receive这个Activity,然后在右键菜单中找到Create SendReply
点击该菜单,会有一个提示
我们可以选择将其粘贴到任何地方,例如
请注意,此时会多出来一个变量,叫__handler1,它的类型是CorrelationHandler,这个东西我们后面一篇会详细介绍,这里可以不关注它的细节。
粘贴过来的这个Activity,它是自动与之前的Receive这个Activity进行关联的
那么,我们到底要发送什么数据给用户呢?可以点击Activity上面的Content这个地方
将Message data绑定到我们之前的那个TicketId变量,并且设置Type为INT 32
这样,我们就将流程设计好了。重新编译一下吧
2. 重新生成客户端代码类
流程发生了此类变化,通常客户端代理类也要有所变化。我们先启动服务器程序
确认在浏览器中可以看到下面的结果
生成客户端代码文件
3. 修改客户端
将生成好的DocumentReviewWorkflow.cs文件,添加到客户端项目中,替换掉原先那个文件。
这里无需添加output.config,因为这个文件内容其实没有啥变化 。
修改窗口如下,添加了一个ListBox
修改代码如下
private void btCreate_Click(object sender, EventArgs e)
{
var proxy = new DocumentReviewClient();
var result = proxy.CreateTicket();
lstTickets.Items.Add(result);
}
请注意,现在CreateTicket方法是有返回值的(int?),而在上一篇,它没有返回值,是void.
4. 调试程序
按下F5键进行调试,在窗口上多次点击“创建流程”的话,会怎么样呢
不光是服务端有消息输出,我们在客户端也可以看到一个TicketId的列表
本文代码,可以通过 这里 下载
下一篇,我们将完成这个流程的例子,我们将添加经理审批的事件。通过这样一个例子,你可以理解如何设计基于事件驱动的流程。