WF学习笔试1-HelloWorld
好久都没有接触和学习新技术,要抱怨说公司忙,实在为自己的懒惰找借口。工作的人慢慢的就与学生不太一样,有时抱着得过且过的心态!现在想想还是很怀念以前学生年代深夜敲击键盘的学习劲头!
流程引擎不是第一次接触,在去年的时候与一个同事在外面接了一个万科的OA系统,当时对方指定要使用K2.NET流程引擎开发。并给我们提供了带服务器的虚拟机。那时是我第一次接触流程引擎,对工作流的概念也有了比较直观的认识!。
上周六陪朋友去了书店看书,拿了二本.NET3.0方面的书。其中一本第32章讲到用WF制作订单状态管理工作流。翻开看了一下知道WF,了解到微软现在给VS2008中集成了这样一个框架,个人感觉,它的应用范围应该会越来越广。于是这二天下班回来后开始学习WF。
闲话打住,切入正题。在开始还是先给不明白的朋友介绍一下WF(网上也有称为WWF,不过微软建议称为WF)
WF全称是 Microsoft Windows Workflow Foundation ,它是一个可扩展框架,用于在 Windows 平台上开发工作流解决方案,VS2005下需要安装.NET3.0框架及Visual Studio 2005 Extensions for Windows Workflow Foundation.exe。VS2008中默认集成WF。
我学东西也不大喜欢先搞概念,理论的东西,喜欢比较直观的,看的见的,HelloWorld基本是学每种程序的入门级示例。虽然老套,但我想还是很有用。今天的笔记就写写WF版本的HelloWorld。
第1步:打开VS2008,新建立项目Workflow->顺序工作流控制台程序 WFHelloWorld
建立后项目结构如下:
1.其中Program.cs是宿主程序,也即是控制台程序可以理解为主程序!
2.Workflow1.cs是可视化的workflow工作流设计器,你可以将工具箱里的活动控件拖到该设计器中,这里是你定义工作流的主要地方,该可视化的设计器有自动检测功能,没有通过检测会有叹号做相应提示。
在这里有必要介绍一下WF中的Activity(活动)。
WF主要的组成部件是活动(Activity),活动组成了工作流中的步骤(或任务),也可以说活动定义了工作流.我们按顺序和层次组织活动,然后这些活动将作为指令供工作流引擎执行.WF中所有的活动都继承一个基类-Activity,WF就运作在这些基本活动库中的现成活动之上.Windows Workflow允许开发人员扩展基本活动库的功能,通过创建自定义活动来解决特定领域的问题.
我们可以自己定义Actitvity,微软也为我们提供了一些Actitvity
了解这些后,我们接着做。
第2步:我们往Workflow1.cs中拖入一个CodeActivity,注意图中有个感叹号,这里就是前面说的工作流设计器的检测功能,如下图:
这是因为code活动,我们没有定义他的ExecuteCode(执行代码)
在ExecuteCode中输入一个方法名,程序会自动生成一个事件方法。
//author:fengyan
//blog:http://eflylab.cnblogs.com
//date:2008-06-18 22:43
/***********************************************/
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Drawing;
using System.Linq;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;
namespace WFHelloWorld
{
public sealed partial class Workflow1: SequentialWorkflowActivity
{
public Workflow1()
{
InitializeComponent();
}
private void ExecuteHello(object sender, EventArgs e)
{
System.Console.WriteLine("Hello world");
}
}
}
我们给方法输入一个代码,很简单的输出!
这时我们返回去看Program.cs里面的代码体
{
using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
{
AutoResetEvent waitHandle = new AutoResetEvent(false);
workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) {waitHandle.Set();};
workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
{
Console.WriteLine(e.Exception.Message);
waitHandle.Set();
};
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WFHelloWorld.Workflow1));
instance.Start();
waitHandle.WaitOne();
}
}
这是工具自动生成的先别着急它们的意思,我们在最后稍加修改,
{
//WorkflowRuntime:在工作流的运行环境(宿主)中,为工作流提供运行的引擎。
using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
{
AutoResetEvent waitHandle = new AutoResetEvent(false);
//以下二个事件是引擎中的某个实例完成后和终止后的事件
workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) {waitHandle.Set();};
workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
{
Console.WriteLine(e.Exception.Message);
waitHandle.Set();
};
//WorkflowInstance:是指在工作流引擎中运行的工作流实例。
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WFHelloWorld.Workflow1));
instance.Start();
waitHandle.WaitOne();
//等待用户响应退出
Console.WriteLine("Press any key to exit");
Console.ReadLine();
}
}
在最后加上二行,为方便观看效果!现在可以运行,F5
输入HelloWorld。
这可能是最简单的WFHelloWord了,稍微加修改一下,增加一个简单的互动功能。
我们在Workflow1中添加一个属性UserName
public string UserName
{
get { return username; }
set { username = value; }
}
public Workflow1()
{
InitializeComponent();
}
private void ExecuteHello(object sender, EventArgs e)
{
System.Console.WriteLine("{0},Hello world",username);
}
{
//WorkflowRuntime:在工作流的运行环境(宿主)中,为工作流提供运行的引擎。
using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
{
AutoResetEvent waitHandle = new AutoResetEvent(false);
//以下二个事件是引擎中的某个实例完成后和终止后的事件
workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) {waitHandle.Set();};
workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
{
Console.WriteLine(e.Exception.Message);
waitHandle.Set();
};
Console.WriteLine("Press enter your userName");
Dictionary<string, object> dictionary = new Dictionary<string, object>();
//接收用户输入
string userName = Console.ReadLine();
//注意下面的UserName必须与Workflow1中的属性名完全一致才行
dictionary.Add("UserName", userName);
//WorkflowInstance:是指在工作流引擎中运行的工作流实例。
//利用重载创建
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WFHelloWorld.Workflow1), dictionary);
instance.Start();
waitHandle.WaitOne();
//等待用户响应退出
Console.WriteLine("Press any key to exit");
Console.ReadLine();
}
}