序言
系列文章,将帮助每一个乔从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}
做,我们已经定义了我们的计划中的所有四个"国家"。下一步,我们将定义"事件",将在每个国家处理。现在,我们将发挥一些代码在我们的计划。首先定义一个接口为所有三个国家。
采购订单,我们将定义我们的类。仅这将有两个属性(保持简单)编号以及由于交货日期。因此,采购订单只产生一个产品。{C}[ExternalDataExchange]
public interface IPOService
{
event EventHandler<POStateChangedEventArgs>
POCreated;
event EventHandler<POStateChangedEventArgs>
POAuthorised;
event EventHandler<POStateChangedEventArgs>
POSent;
}
按住第二这里,让我们想一想,为什么我们添加[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接口,将引发事件当一个PO的变化状态。让我们现在实施,并提供简单的引发事件的方法。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工作流框架。官方网站在网络空间的工作流程基金会! ?搜索和寻找更多的文章/博客文章在技术人员舞台上每天出现。