好久都沒有接觸和學習新技術,要抱怨說公司忙,實在為自己的懶惰找借口。工作的人慢慢的就與學生不太一樣,有時抱著得過且過的心態!現在想想還是很懷念以前學生年代深夜敲擊鍵盤的學習勁頭!
流程引擎不是第一次接觸,在去年的時候與一個同事在外面接了一個萬科的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裡面的代碼體static void Main(string[] args)
{
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();
}
}
這是工具自動產生的先別著急它們的意思,我們在最後稍加修改,
static void Main(string[] args)
{
//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
private string 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);
}
修改Program.cs中 static void Main(string[] args)
{
//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();
}
}
運行效果
DownLaod Demo