從本篇開始,將正式講解WF4.0,本文主要涉及如下內容:Activity介紹, WF4.0 中工作流的結構,通過WriteLine演示 InArgument<T>參數的使用
Activity介紹及WriteLine Activity的使用
代碼下載
[WF4.0 基礎篇 (一)開始使用WF] 的代碼
http://files.cnblogs.com/foundation/helloWorkflow.rar
本文代碼
http://files.cnblogs.com/foundation/WriteLineActivitySample.rar
代碼結構說明
什麼是Activity
Activity在WF中是一個最基本的概念.當談及Activity時,通常是指如下兩個概念Activty Class 或 在 工作流中任意Activity派生類的 統稱
一.先說一下Activty Class
這個概念比較簡單,就是指 [System.Activities.Activity] 這個NET4.0 類庫中所帶的類
[System.Activities.Activity]是工作流結構的基類,下圖是[System.Activities.Activity]與派生類的結構
二.再說一下"工作流中任意Activity派生類的統稱"是什麼意思
在很多翻譯文章中,當其要表述"工作流中任意Activity派生類的統稱"這個概念時,會將[Activity]翻譯為[活動],其實我更 喜歡將其翻譯為[節點]
WF4.0的流程結構與我們常用的流程圖很象,下面我們看一下一個流程圖的例子:
(注:從漢語的角度講,[節點]與[結點]是不同的,[節點]是指上圖中的矩形,[結點]則是指上圖中矩形間的連線)
我們再看一下WF4.0流程的例子
我們可以將WF4.0流程中的[活動]理解為流程圖的[節點]
(注: WF4.0流程中只有[節點]沒有[結點],從數據結構的角度講上面的兩個例子分別是[圖結構]和兩種描述方式,第一個例子是([節點] +[結點]),第二個例子是([節點]+ [節點關系自描述]) ,這個概念先講到這裡,後面我會專門寫一篇從數據結構的角度分析WF4.0流程結構的 文章)
WF4.0 中工作流的結構
WF4.0工作流從表現形式上看是圖結構,但其實質上仍是樹結構,有[根],有鮮明的[層次關系]這些都是樹的基本特征.
只不過WF4.0工作流采用了[枝葉樹]的方式,並且提供了FlawCahr這個[活動]用以在其內部實現[圖結構]
下面我具體說明一下枝葉樹結構:
枝葉樹是指在樹結構上存在兩類節點,一類是支節點,一類是葉節點.支節點下可以有支節點也可以有葉節點,葉節點下不能再有任何節點 .這與磁盤結構很象.支節點像文件夾,葉節點像文件.
WF4.0的活動也是這樣.其中[FlowCahr]與[Sequence]是兩個常用的支節點[活動]
[FlowCahr]用於實現一個圖結構的[活動]
[Sequence]則用於實現從上到下順序執行的[活動]
關於這兩個[活動]在後面的文章中會有詳細介紹,下面我們先學習一個簡單的葉節點[活動], WriteLine
WriteLine Activity
WriteLine是一個用於輸出字符串的Activity,在[開始使用WF4.0]一文中,我們已經使用它了,在這量我將對WriteLine的功能做具體講解 ,並引入一個WF4.0中很重要的概念"表達式"
類名 System.Activities.Statements.WriteLine 文件 System.Activities.dll 結構說明 繼承 CodeActivity 是一個 sealed類 定義了[InArgument<string> Text屬性] 與[InArgument<TextWriter> TextWriter屬性] override 了 [CacheMetadata方法] 與 [Execute方法] 功能說明 WriteLine類調用[TextWriter 屬性]所指定的[System.IO.TextWriter 對像]輸出[Text 屬性] 的值 如果沒指定[TextWriter 屬性],默認為控制台輸出[Text 屬性] 的值
Text 屬性
是一個InArgument<string> 類型參數 ,用於接收結果值為[string]的VB表達式
(關於InArgument<T>與WF4.0中的VB表達式會在後面的文章中詳細介紹)
流程
xaml
<Activity mc:Ignorable="sap"
x:Class="WriteLineActivitySample.Workflow1"
mva:VisualBasic.Settings="Assembly references and imported namespaces serialized as XML namespaces"
xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:mv="clr-namespace:Microsoft.VisualBasic;assembly=System"
xmlns:mva="clr-namespace:Microsoft.VisualBasic.Activities;assembly=System.Activities"
xmlns:s="clr-namespace:System;assembly=mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
xmlns:s1="clr-namespace:System;assembly=mscorlib"
xmlns:s2="clr-namespace:System;assembly=System"
xmlns:s3="clr-namespace:System;assembly=System.Xml"
xmlns:s4="clr-namespace:System;assembly=System.Core"
xmlns:sad="clr-namespace:System.Activities.Debugger;assembly=System.Activities"
xmlns:sap="http://schemas.microsoft.com/netfx/2009/xaml/activities/presentation"
xmlns:scg="clr-namespace:System.Collections.Generic;assembly=System"
xmlns:scg1="clr-namespace:System.Collections.Generic;assembly=System.ServiceModel"
xmlns:scg2="clr-namespace:System.Collections.Generic;assembly=System.Core"
xmlns:scg3="clr-namespace:System.Collections.Generic;assembly=mscorlib"
xmlns:sd="clr-namespace:System.Data;assembly=System.Data"
xmlns:sd1="clr-namespace:System.Data;assembly=System.Data.DataSetExtensions"
xmlns:sl="clr-namespace:System.Linq;assembly=System.Core"
xmlns:st="clr-namespace:System.Text;assembly=mscorlib"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<WriteLine
DisplayName="WriteLine的Text屬性演示"
sad:XamlDebuggerXmlReader.FileName="d:\users\wxd\documents\visual studio 2010 \Projects\WriteLineActivitySample\WriteLineActivitySample\Workflow1.xaml"
sap:VirtualizedContainerService.HintSize="213,200"
Text="[String.Format("{0}:{1}", "wxwinter", System.DateTime.Now.ToString())] "
/>
</Activity>
運行工作流
class Program
{
static void Main(string[] args)
{
//WriteLine的Text屬性演示
WorkflowInvoker.Invoke(new Workflow1());
//控制台停屏看效果
System.Console.Read();
}
}
運行結果
TextWriter 屬性
是一個InArgument<TextWriter> 類型參數 ,用於接收結果值為[TextWriter]的VB表達式
自定義TextWriter
public class myTextWriter : System.IO.TextWriter
{
public override Encoding Encoding
{
get { return Encoding.UTF8; }
}
public override void WriteLine(string value)
{
System.Console.WriteLine("wxwinter:" + value);
}
}
流程
xaml
<Activity ...>
<WriteLine DisplayName="WriteLine的TextWriter屬性演示"
Text="wxd"
TextWriter="[New WriteLineActivitySample.myTextWriter()]"
/>
</Activity>
運行工作流
class Program
{
static void Main(string[] args)
{
//WriteLine的TextWriter屬性演示
WorkflowInvoker.Invoke(new Workflow2());
//控制台停屏看效果
System.Console.Read();
}
}
運行結果
在代碼中使用WriteLine
class Program
{
static void Main(string[] args)
{
WriteLine wxwinterActivity = new WriteLine();
InArgument<string> inArgument = new InArgument<string>(getValue("wxd"));
wxwinterActivity.Text = inArgument;
WorkflowInvoker.Invoke(wxwinterActivity);
System.Console.Read();
}
static string getValue(string p)
{
return "wxwinter:" + p;
}
}