Workflow Foundation 4.0中的事件驱动流程设计和应用(二)

上一篇,我介绍到了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

image

点击该菜单,会有一个提示

image

 

我们可以选择将其粘贴到任何地方,例如

image

请注意,此时会多出来一个变量,叫__handler1,它的类型是CorrelationHandler,这个东西我们后面一篇会详细介绍,这里可以不关注它的细节。

 

粘贴过来的这个Activity,它是自动与之前的Receive这个Activity进行关联的

image

那么,我们到底要发送什么数据给用户呢?可以点击Activity上面的Content这个地方

image

将Message data绑定到我们之前的那个TicketId变量,并且设置Type为INT 32

 

这样,我们就将流程设计好了。重新编译一下吧

 

2. 重新生成客户端代码类

流程发生了此类变化,通常客户端代理类也要有所变化。我们先启动服务器程序

image

确认在浏览器中可以看到下面的结果

image

生成客户端代码文件

image

 

3. 修改客户端

将生成好的DocumentReviewWorkflow.cs文件,添加到客户端项目中,替换掉原先那个文件。

这里无需添加output.config,因为这个文件内容其实没有啥变化 。

修改窗口如下,添加了一个ListBox

image

 

修改代码如下

        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键进行调试,在窗口上多次点击“创建流程”的话,会怎么样呢

image

不光是服务端有消息输出,我们在客户端也可以看到一个TicketId的列表

image

 

本文代码,可以通过 这里 下载

 

下一篇,我们将完成这个流程的例子,我们将添加经理审批的事件。通过这样一个例子,你可以理解如何设计基于事件驱动的流程。

posted @ 2010-10-07 15:38  陈希章  阅读(4690)  评论(7编辑  收藏  举报