返回首页

序言
系列文章,将帮助每一个乔从ABC开始在第二,作为本系列文章进步,稳步上升的专长尖顶。这第一篇文章系列上周公布。简介
文章将从上一篇文章结束时,虽然我们将运行快速概述本文加入我们党的哥们。 Windows工作流基金会(WF,节省打字的努力)被击中的四个超级明星之一NET 3.0的风头。它有一个编程模型,活动库,服务,运行时工具,引擎,和设计,有助于从程序员从核心业务中分离出来的逻辑顺序和状态机功能。评论家纷纷猜测WF的重大变化之一中间层,因为的COM / DTC的到来,因为微软已经计划支持电流(Windows XP中,2003年)和未来(Vista系统)的Windows排放; WF的使用和普及只会增加。
展望围绕软件领域使我们认识到几乎所有的软件解决方案有一定的任务(活动),以执行顺序的基础上一些事件(基于状态机的调用它们)。因此,在我们的行话,我们将重新短语上面的句子:几乎每一个应用程序中的工作流程"在它的"活动",这些工作流程可以执行在"顺序"的方式,或可能是"状态机"的基础。
总结这件事,这里是我们最近遇到的条款的确切的定义。工作流程:步骤,决定系列规则需要完成特定的任务。活动:定义的任务/步骤工作流程,这些工作流程的基本构建块。
可以有两种类型的工作流程:顺序:系列活动呼吁为了。国家机:活动被称为"国家"不同的参数的基础上。
,我们做了一个顺序工作流应用程序。这一次,我们在这里创建一个"国家"machine'为基础的应用程序。什么为什么 - 状态机工作流
"国家机"点亮一个灯泡,在我们许多计算机毕业生的心态,把我们这些尼斯大学/学院天的回忆。好,不觉得太怀旧,来目前天 - 你要学习一些非常令人兴奋的的事情, 所以感觉良好,享受!
国家机器已在谁是谁的计算机科学,因为长。程序员使用它们的模型状态,事件和过渡。这里涉及到三个关键概念:状态:情况事件:一个刺激过渡:从一个"国家"控制转移到另一个,在一些"事件"的后果
{S0}
如上图,控制从"国A""B国"发生"事件1"使用箭头所示的过渡。一些行动后发生触发事件和过渡。 WF的编程解决方案,帮助在状态机,通过提供易于使用的界面设计师活动和编程模型。我们示例方案将开发一个简单的采购订货"的应用程序。每个可以有三种状态;创建授权已发送
将使用WF设计和简单的代码为蓝本,将被添加来说明如何一个程序员的生活是由永丰容易,而编程的事件驱动(状态基于机器)方案。欢迎公平的竞争环境,让我们开始游戏
打开Visual Studio 2005 IDE中中,点击"新工程"。选择"状态机工作流控制台应用程序"作为项目类型。
{S1}
选择一个合适的项目名称(我的是'FirstWFStateMachine")。检查的"位置"磁盘上的驱动器,点击'OK'的项目。 "工作流设计器"将打开。工作流程将目前只有一个"国家活动"。其名称更改"POInitialState"在"属性"对话框。新增三个"国家活动"下降,从工具箱拖动,并将其命名为"POCreated,POAuthorised,POSent"。"POInitialState'右键单击并选择"选择"初始状态",右键单击"POSent",选择"设置为完成国家"。您的屏幕应该看上去像现在以下。
{S2}
做,我们已经定义了我们的计划中的所有四个"国家"。下一步,我们将定义"事件",将在每个国家处理。现在,我们将发挥一些代码在我们的计划。首先定义一个接口为所有三个国家。

[ExternalDataExchange]

public interface IPOService

{

    event EventHandler<POStateChangedEventArgs>

    POCreated;

    event EventHandler<POStateChangedEventArgs>

    POAuthorised;

    event EventHandler<POStateChangedEventArgs>

    POSent;  

}
采购订单,我们将定义我们的类。仅这将有两个属性(保持简单)编号以及由于交货日期。因此,采购订单只产生一个产品。{C}
按住第二这里,让我们想一想,为什么我们添加[Serializable接口][ExternalDataExchange]以上。因为它可能采取小时而不是几天,甚至一些获得授权和发送(经理将赶上前为夏威夷的航班,授权邮政!)PO个月,worflows数据库上得到坚持。要做到这一点行为的先决条件之一是你的类必须是"序列化",从而除了[Serializable接口]指令。 [ExternalDataExchange]必须加入我们的接口来表示它的一个"消息合同"之间的运行时间和工作流程。
的外观再次在IPOService接口。 POStateChangedEventArgs预计有工作流的信息继续。因此宝的对象将传递给它。
[Serializable]



public class POStateChangedEventArgs : ExternalDataEventArgs

{

    public POStateChangedEventArgs(Guid instanceID, PO po)

        : base(instanceID)

    {

        _PO = po;

        WaitForIdle = true;

    }



    private PO _PO;



    public PO PO

    {

        get { return _PO; }

        set { _PO = value; }

    }

}

实例ID为每个工作流实例的GUID(后来又意味着每个采购订单)运行时创建的。
的服务实现的IPOService接口,将引发事件当一个P​​O的变化状态。让我们现在实施,并提供简单的引发事件的方法。
public class POService : IPOService

{

    public event EventHandler<POStateChangedEventArgs> POCreated;

    public event EventHandler<POStateChangedEventArgs> POAuthorised;

    public event EventHandler<POStateChangedEventArgs> POSent;



    public void CreatePO(Guid id, PO po)

    {

        if (POCreated != null)

        { 

            POCreated(null, new POStateChangedEventArgs(id, po));

        }

    }



    public void AuthorisePO(Guid id, PO po)

    {

        if (POAuthorised != null)

        {

            POAuthorised(null, new POStateChangedEventArgs(id, po));

        }

    }



    public void SendPO(Guid id, PO po)

    {

        if (POSent != null)

        {

            POSent(null, new POStateChangedEventArgs(id, po));

        }

    }

}

让我们跳回到现在工作流设计器。我们创建了一个简单的购买订货类,承包之间的工作流程和运行时(IPOService)和事件。现在,让我们选择"事件驱动"活动从工具箱,并在POInitialState"下降。命名为"OnPOCreate"。它应该看起来像这样:
{S3}
"OnPOCreate"应该有一定的一系列活动,此事件时,会被解雇被解雇。为此,双击它,这将打开的活动详情。
LT {S4}
也显示在顶级让屏幕一角的面包屑导航。这里我们可以看到"事件驱动"就像任何其他的顺序工作流,它可容纳人数儿童活动。然而,有一个限制,第一个活动内事件驱动的活动必须延迟,HandleExternalEvent或WebServiceInput活动。这是因为第一个活动必须实施IEventActivity接口,这是只以上的真正提到了三项活动。由于我们需要响应外部事件(以PO了创建!),我们将拖放"HandleExternalEvent"活动。其名称更改为"handlePOCreatedEvent"单击"椭圆上的选择界面"IPOService",从下拉选择"Eventype"下来。
{五}
{中六}
现在,选择"设置状态"活动和拖放设计器窗口。在属性窗口,将"目标国"中的"POCreatedState"。这将创建从"POInitialState"链接"POCreatedState"。
{七}
以下相同的过程,我们将工作流程中的其他状态转换模型。最后,它看起来像以下:

你相信,我们几乎完成了!这个简单的代码只需添加在Program.cs将作为运行时主机。我们将添加简单的Console.ReadLineConsole.WriteLine语句来创建控制台互动的环境,提示用户创建一个采购项目的ID,由于交货日期秩序。然后提示用户是邮政授权,直到她说是宝的状态不会改变。类似的情况下与邮政发送。最后,我们印刷当前和未来可能出现的过渡增加了一个简单的方法每个工作流状态。这是通过使用"PossibleStateTransitions"在工作​​流实例的集合。
private static void DumpStateMachine(WorkflowRuntime runtime, Guid instanceID)

{

    StateMachineWorkflowInstance instance =

        new StateMachineWorkflowInstance(runtime, instanceID);



    Console.WriteLine("Workflow ID: {0}", instanceID);

    Console.WriteLine("Current State: {0}",



        instance.CurrentStateName);



    Console.WriteLine("Possible Transitions: {0}",



        instance.PossibleStateTransitions.Count);

    foreach (string name in instance.PossibleStateTransitions)

    {

        Console.WriteLine("\t{0}", name);

    }

}

以下运行的应用程序的屏幕截图:

什么我们了解到
文章随后迅速启动的方式,探索"状态机"的基础工作流程。我们选择了一个实际问题,并试图解决它使用白表由定义国家(使用国家活动),事件(事件驱动的活动,处理外部事件活动)和转换(SetState活动)。一个简单的控制台应用程序主持我们的工作流运行时提供互动的感觉用户。我可以在哪里查找更多?
希望,点燃你的技术激情,这是足够的,所以这里有更多的甜甜圈为您的味蕾:编程Workflow Foundation的??实用WF的使用技巧与实例XAML和C#K.斯科特艾伦DharmaShukla,BobSchmidt基本的Windows工作流框架。官方网站在网络空间的工作流程基金会! ?搜索和寻找更多的文章/博客文章在技​​术人员舞台上每天出现。

回答

评论会员:cousin_cuzzer 时间:2011/12/14
真正良好的开端,然后变得懒惰!没有说明哪个类的方法,尤其是DumpStateMachine。任何代码,您的文字显示在控制台
评论会员:会员2792123 时间:2011/12/14
您好阿里,UR例如thnx但我有一个问题,但我已实施了相同的步骤,工作流作为URS,当我检查的EventHandler空或不是,例如UR代码的一部分,如果(POCreated!= NULL)
这始终是假的,因为它始终是我空,我不知道为什么还我不明白时,它是intialized或任何不为空。我希望你明白我的问题,如果可以给我任何意见。 thnx
提前
评论会员:davidml 时间:2011/12/14
非常糟糕
评论会员:!wakazula 时间:2011/12/14
。不幸的是,这篇文章是不是几乎一样首次明确:"开始Windows Workflow Foundation的"

我同意与他人。社论更具凝聚力将大大有利于
评论会员:。Indy2005 时间:2011/12/14
你说的文章(图片中,至少有)不配合你的示例代码。试图证明他人的路径是伟大的,但是,混乱和误导他人真的很可怕。
评论会员:大D 时间:2011/12/14
首先,感谢的文章

很新的WF ..
为什么instance.PossibleStateTransitions.Count始终返回1,如果我们执行完整的应用程序,但如果我们在调试模式下执行。
评论会员:marcos2006 时间:2011/12/14
因为只有一个下一个状态到每个国家的
评论会员:ed_cartagena 时间:2011/12/14
多德,你可能想下一次有你的文章通过一些运行,因为它是完全inconstent。首先,你的状态机工作流的截图是不一样的的。一开始你有我们创造的下列活动状态:POIntitialState,POCreated,POAuthorised,POSent。然后在第二个状态机工作流截图命名为:POCreatedState,POAutorisedState,POSentState

这不是太糟糕了,但你作太多的假设你的读者。这是更喜欢"我会告诉你怎么做的A,B,D和Z",我们必须弄清楚之间的。

最后,我下载你的代码,它没有编译。

爱德华
 60; - 十一时十四日(星期二)19日2007年6月,
修改
评论会员:synap 时间:2011/12/14
我第一次使用WF的,我没有问题,在所有后续的文章。这里,我感谢作家写的文章
评论会员:AnugrahAtreya 时间:2011/12/14
,只是把宝,POService,POWorkflow和单独的C#文件的接口IPOService orignal类和一些格式发生变化到输出

我发现很容易理解的代码,现在

{BR]下载到我的博客更新的代码。}
Atreya
评论会员:克里斯邱 时间:2011/12/14
感谢... ,这是一个状态机,是很容易理解和实践最好的例子。
评论会员:Balboos 时间:2011/12/14
这第二部分的逻辑太多的跨越遵循

现在,我试图跟进没有IDE,也许是我的过失。

然而,它的开始,提醒我"山姆在10分钟内学会C"型。推动通过它的特别活动,但是,当一个人需要去为概念,他们是不是真的存在。
投票,日期(3.2)较优秀的一部分,我是特别低,所以也许我不希望返工解释发生了什么事情没有这些经验与SDK所有。
Balboos



"TECHNOCRETIA配发在这里。" - 在等待时
评论会员:!zorgylp 时间:2011/12/14
我同意

它采取了一些努力,获得通过的例子,它根本不会工作没有从源头上复制的代码块较大。

然而,改善应该简单的补充。


评论会员:dcassidy 时间:2011/12/14
商定....{ BR}
这而翔实的第二文章太多的方向熄灭了"赶工"的感觉。整个"点"的文章是介绍"状态机"的概念,但需要太多的跨越式的信仰... ...或逻辑!

难以跟上 - 重写,将是有益的,作为基本的想法是非常好的。