以下是一小段进行邮政编码验证的代码 [img]/Images/OutliningIndicators/None.gif[/img]string USCode = @"^(\d{5}$)|(\d{5}$\-\d{4}$)";
[img]/Images/OutliningIndicators/None.gif[/img]string CanadianCode = @"[ABCEGHJKLMNPRSTVXY]\D[A-Z]\d[A-Z]\d";
[img]/Images/OutliningIndicators/None.gif[/img]
[img]/Images/OutliningIndicators/None.gif[/img]public static bool ValidatePostalCode(string str)
[img]/Images/OutliningIndicators/None.gif[/img]{
[img]/Images/OutliningIndicators/None.gif[/img]    return (Regex.IsMatch(str,USCode)||Regex.IsMatch(str,CanadianCode));
[img]/Images/OutliningIndicators/None.gif[/img]}

    这没有什么特别的:“测试一个输入的字符串,如果为美国ZIP编码或者加拿大邮政编码则返回True,否则返回False”。这是一段很实用的代码,事实上假如你不想在ASP.NET中使用其它验证控件的话,你就可在你的ASP.NET中使用这段验证逻辑。我们现在就创建一个Workflow应用程序,它将进行同样的验证,并且返回验证是否通过的信息。    创建一个基于控制台的Workflow项目
    1.启动Visual Studio 2008
    2.创建顺序工作流控制台应用程序项目

    3.项目名称中输入PCodeFlow
    4.点击确定,将自动生成下面的初始界面[img]/images/cnblogs_com/gyche/workflow6.png[/img]
    在编辑代码或插入Workflow项前,停留片刻看看Workflow项目为你生成的两个文件:
    Program.cs:从许多方面可以看出,这是一个典型的控制台应用程序源文件。然而,这个模板增加了大量代码来支持Workflow的操作。理解这些代码是本书的一个主要目标,但本章只是简单了解一下它做了些什么。
    Workflow1.cs:这是一个Workflow组件,我们将对其进行修改以进行邮政编码的验证,第一次使用你就可以放入许多东西,但我们现在还是从使用这个简单的Workflow开始工作吧。
    创建一个工作流
    在工具箱中拖一个IfElse活动组件到workflow设计界面上。[img=492,365]/images/cnblogs_com/gyche/workflow2.png[/img]
    我们现在将使用IfElse活动组件来问下面的问题:“我们已有的一个字符串是一个合法的邮政编码吗?”。我们在代码中将确实使用先前你看到的代码段中的正则表达式来问这一问题。
    但在我们进行这一步前请仔细看看workflow的视图设计器。workflow视图设计器提醒我们没有提供相应的代码来做这一决定。假如你看看命名为“ifElseBranchActivity1”的左边分支的右上角,你将看到里面有一个惊叹号标记的小圆形图标。这是workflow视图设计器在告诉你workflow并不完整。假如你试图编译带有这种提醒图标的项目时,将会编译报错。如你把鼠标移到图标上并单击呈现出的向下箭头时,你还能看到更多关于这一错误情况的信息。[img]/images/cnblogs_com/gyche/workflow3.png[/img]
    在IfElse活动的分支上添加代码
    1.移动鼠标到命名为“ifElseBranchActivity1”的左边分支上,单击以在属性面板上激活这一分支的属性。
    2.我们添加一个条件,意思是说workflow执行到分支时将强制其执行一些动作(条件判断为True时,将执行左边分支)。为做到这些,单击“condition”属性激活条件类型属性的下拉列表。从列表中你可以选择“代码条件”类型、“(无)”类型和“声明性规则条件”类型。这里选择“代码条件”类型。
    3.上述步骤完成后,“condition”类型属性用户界面会包含一个“+”号,我们单击展开它的子属性,该子属性也命名为“condition”,单击以激活它。
    4.“condition”属性需要输入我们想添加的内部事件名字。当条件需要判断时这个事件将激发。在本例子中我们输入“EvaluatePostalCode”。[img]/images/cnblogs_com/gyche/workflow4.png[/img]
    Visual studio 2008在幕后为你在workflow源文件中添加了你在“condition”属性中所指明的事件。稍候我们将添加在事件激发时所要执行的正则表达式代码段。
    在我们做这些工作之前,让我们继续在workflow视图设计器上工作,我们刚刚增加了一个条件,它将引发工作流选择左边路径还是右边路径。但是两条路径中都没有指明工作流将进行的动作。我们在左边“ifElseBranchActivity1”分支和右边“ifElseBranchActivity2”分支中添加活动。
    添加Code活动
    1.拖一个“Code”活动到workflow视图设计器上,并放到左边分支(ifElseBranchActivity1)的区域内。
    2.就像先前添加条件判断的代码一样,我们将为该分支添加被选中时执行的代码。单击“codeActivity1”图标以在属性面板中激活它的属性。
    3.在“ExecuteCode”属性中输入“PostalCodeValid”。[img]/images/cnblogs_com/gyche/workflow5.png[/img]
    Visual Studio 2008会自动插入该事件。稍候我们会提供对应的执行代码。右边分支也同样做,只是要在“ExecuteCode”属性中输入“PostalCodeInValid”。
    在我们的workflow中添加事件处理代码
    1.打开Workflow.cs准备进行编辑
    2.添加引用:using System.Text.RegularExpression;
    3.定位到“EvaluatePostalCode”方法上,插入下面的代码:
[img]/Images/OutliningIndicators/None.gif[/img]
private
void EvaluatePostalCode(object sender, ConditionalEventArgs e)
[img]/Images/OutliningIndicators/ExpandedBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedBlock.gif[/img]       
{
[img]/Images/OutliningIndicators/InBlock.gif[/img]           
string USCode =
@"^(\d{5}$)|(\d{5}$\-\d{4}$)";
[img]/Images/OutliningIndicators/InBlock.gif[/img]           
string CanadianCode =
@"[ABCEGHJKLMNPRSTVXY]\D[A-Z]\d[A-Z]\d"; [img]/Images/OutliningIndicators/InBlock.gif[/img]            e.Result = (Regex.IsMatch(_code, USCode) || Regex.IsMatch(_code, CanadianCode));
[img]/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img]        }

    变量e是“ConditionalEventArgs”类型的实例,它用来告知“IfElse”活动应选择哪条路径。
    4.我们也需要为workflow活动添加一种能力,以便接受输入的字符串来进行验证工作。为此我们添加下面的代码,我们将声明一个名为“PostalCode”的公有属性。
[img]/Images/OutliningIndicators/None.gif[/img]private
string _code=string.Empty;
[img]/Images/OutliningIndicators/None.gif[/img]
public
string PostalCode
[img]/Images/OutliningIndicators/ExpandedBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedBlock.gif[/img]   
{
[img]/Images/OutliningIndicators/InBlock.gif[/img]       
get
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img]       
{
[img]/Images/OutliningIndicators/InBlock.gif[/img]           
return _code;
[img]/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img]        }

[img]/Images/OutliningIndicators/InBlock.gif[/img]       
set
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img]       
{
[img]/Images/OutliningIndicators/InBlock.gif[/img]            _code
= value;
[img]/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img]        }

[img]/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img]    }

    有了这些,我们的workflow应用程序就可以进行编译了,但程序并不完整,我们还要在Workflow1.cs文件中定位到“PostalCodeValid”方法并插入下面的代码:
    Console.Write("The postal code {0} is valid.", _code); 
    同样在“PostalCodeInValid”方法中插入下面的代码:
    Console.Write("The postal code {0} is *invalid*.", _code);
    调用工作流
    1.打开Program.cs文件。
    2.定位到:
    WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(PCodeFlow.Workflow1),wfArgs);
    3.把上述代码替换为:
[img]/Images/OutliningIndicators/None.gif[/img]Dictionary<string, object> wfArgs =
new Dictionary<string, object>();
[img]/Images/OutliningIndicators/None.gif[/img]wfArgs.Add(
"PostalCode", args.Length >
0
? args[0] : ""); [img]/Images/OutliningIndicators/None.gif[/img]WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(PCodeFlow.Workflow1),wfArgs);

    编译应用程序
    执行你的工作流应用程序
    1.打开命令提示符窗口。
    2.在命令提示符下定位到编译后所生成的应用程序目录。
    3.输入pcodeflow 12345查看执行结果。
    4.输入pcodeflow 1234x再看看执行结果。
    源码下载:[url=/Files/gyche/PCodeFlow.rar]PCodeFlow[/url]