WorkFlow从入门到精通目录第一章WF简介.......................................................................................1第二章workflow运行时..........................................................................8第三章workflow实例............................................................................22第四章活动及workflow类型介绍.......................................................38第五章workflow跟踪............................................................................51第六章加载和卸载实例........................................................................82第七章基本活动的操作......................................................................105第八章调用外部方法及工作流..........................................................132第九章逻辑流活动..............................................................................177第十章事件活动..................................................................................213第十一章并行活动..............................................................................260第十二章策略和规则..........................................................................295第十三章打造自定义活动..................................................................338第十四章基于状态的工作流..............................................................388第十五章工作流和事务......................................................................413第十六章明式工作流..........................................................................450第十七章关联及本地主机通信..........................................................476第1页共548页第一章WF简介学习完本章,你将掌握:1.了解工作流的概念和理论2.把WF和BizTalk与WCF做比较3.开始使用WF进行编程4.知道怎样使用VisualStudio工作流支持以下是一小段进行邮政编码验证的代码:stringUSCode=@^(d{5}$)|(d{5}$-d{4}$/);:stringCanadianCode=@[ABCEGHJKLMNPRSTVXY]D[A-Z]d[A-Z]d/;publicstaticboolValidatePostalCode(stringstr){return(Regex.IsMatch(str,USCode)||Regex.IsMatch(str,CanadianCode));}这没有什么特别的:“测试一个输入的字符串,如果为美国ZIP编码或者加拿大邮政编码则返回True,否则返回False”。这是一段很实用的代码,事实上假如你不想在ASP.NET中使用其它验证控件的话,你就可在你的ASP.NET中使用这段验证逻辑。我们现在就创建一个Workflow应用程序,它将进行同样的验证,并且返回验证是否通过的信息。创建一个基于控制台的Workflow项目1.启动VisualStudio2008第2页共548页2.创建顺序工作流控制台应用程序项目3.项目名称中输入PCodeFlow4.点击确定,将自动生成下面的初始界面在编辑代码或插入Workflow项前,停留片刻看看Workflow项目为你生成的两个文件:Program.cs:从许多方面可以看出,这是一个典型的控制台应用程序源第3页共548页文件。然而,这个模板增加了大量代码来支持Workflow的操作。理解这些代码是本书的一个主要目标,但本章只是简单了解一下它做了些什么。Workflow1.cs:这是一个Workflow组件,我们将对其进行修改以进行邮政编码的验证,第一次使用你就可以放入许多东西,但我们现在还是从使用这个简单的Workflow开始工作吧。创建一个工作流在工具箱中拖一个IfElse活动组件到workflow设计界面上。我们现在将使用IfElse活动组件来问下面的问题:“我们已有的一个字符串是一个合法的邮政编码吗?”。我们在代码中将确实使用先前你看到的代码段中的正则表达式来问这一问题。但在我们进行这一步前请仔细看看workflow的视图设计器。workflow视图设计器提醒我们没有提供相应的代码来做这一决定。假如你看看命名为“ifElseBranchActivity1”的左边分支的右上角,你将看到里面有一个惊叹号标第4页共548页记的小圆形图标。这是workflow视图设计器在告诉你workflow并不完整。假如你试图编译带有这种提醒图标的项目时,将会编译报错。如你把鼠标移到图标上并单击呈现出的向下箭头时,你还能看到更多关于这一错误情况的信息。在IfElse活动的分支上添加代码1.移动鼠标到命名为“ifElseBranchActivity1”的左边分支上,单击以在属性面板上激活这一分支的属性。2.我们添加一个条件,意思是说workflow执行到分支时将强制其执行一些动作(条件判断为True时,将执行左边分支)。为做到这些,单击“condition”属性激活条件类型属性的下拉列表。从列表中你可以选择“代码条件”类型、“(无)”类型和“声明性规则条件”类型。这里选择“代码条件”类型。3.上述步骤完成后,“condition”类型属性用户界面会包含一个“+”号,我们单击展开它的子属性,该子属性也命名为“condition”,单击以激活它。第5页共548页4.“condition”属性需要输入我们想添加的内部事件名字。当条件需要判断时这个事件将激发。在本例子中我们输入“EvaluatePostalCode”。Visualstudio2008在幕后为你在workflow源文件中添加了你在“condition”属性中所指明的事件。稍候我们将添加在事件激发时所要执行的正则表达式代码段。在我们做这些工作之前,让我们继续在workflow视图设计器上工作,我们刚刚增加了一个条件,它将引发工作流选择左边路径还是右边路径。但是两条路径中都没有指明工作流将进行的动作。我们在左边“ifElseBranchActivity1”分支和右边“ifElseBranchActivity2”分支中添加活动。添加Code活动1.拖一个“Code”活动到workflow视图设计器上,并放到左边分支(ifElseBranchActivity1)的区域内。2.就像先前添加条件判断的代码一样,我们将为该分支添加被选中时执行的代码。单击“codeActivity1”图标以在属性面板中激活它的属性。3.在“ExecuteCode”属性中输入“PostalCodeValid”。第6页共548页VisualStudio2008会自动插入该事件。稍候我们会提供对应的执行代码。右边分支也同样做,只是要在“ExecuteCode”属性中输入“PostalCodeInValid”。在我们的workflow中添加事件处理代码1.打开Workflow.cs准备进行编辑2.添加引用:usingSystem.Text.RegularExpression;3.定位到“EvaluatePostalCode”方法上,插入下面的代码:privatevoidEvaluatePostalCode(objectsender,ConditionalEventArgse){stringUSCode=@^(d{5}$)|(d{5}$-d{4}$);stringCanadianCode=@[ABCEGHJKLMNPRSTVXY]D[A-Z]d[A-Z]d;e.Result=(Regex.IsMatch(_code,USCode)||Regex.IsMatch(_code,CanadianCode));}变量e是“ConditionalEventArgs”类型的实例,它用来告知“IfElse”第7页共548页活动应选择哪条路径。4.我们也需要为workflow活动添加一种能力,以便接受输入的字符串来进行验证工作。为此我们添加下面的代码,我们将声明一个名为“PostalCode”的公有属性。privatestring_code=string.Empty;publicstringPostalCode{get{return_code;}set{_code=value;}}有了这些,我们的workflow应用程序就可以进行编译了,但程序并不完整,我们还要在Workflow1.cs文件中定位到“PostalCodeValid”方法并插入下面的代码:Console.Write(Thepostalcode{0}isvalid.,_code);同样在“PostalCodeInValid”方法中插入下面的代码:Console.Write(Thepostalcode{0}is*invalid*.,_code);第8页共548页调用工作流1.打开Program.cs文件。2.定位到:WorkflowInstanceinstance=workflowRuntime.CreateWorkflow(typeof(PCodeFlow.Workflow1),wfArgs);3.把上述代码替换为:Dictionarystring,objectwfArgs=newDictionarystring,object();wfArgs.Add(PostalCode,args.Length0?args[0]:);WorkflowInstanceinstance=workflowRuntime.CreateWorkflow(typeof(PCodeFlow.Workflow1),wfArgs);编译应用程序执行你的工作流应用程序1.打开命令提示符窗口。2.在命令提示符下定位到编译后所生成的应用程序目录。3.输入pcodeflow12345查看执行结果。4.输入pcodeflow1234x再看看执行结果。第二章workflow运行时学习完本章后,你将掌握:1.在你的应用程序中使用workflow第9页共548页2.理解“WorkflowRuntime”对象的的基本功能3.知道如何启动和停止workflow运行时4.能够使用各种workflow运行时的相关事件当你在WF环境中