已經寫了兩篇關於WF4.0的博客,算是基礎博客,如果是WF比較熟悉就直接跳過吧,如果你對工作流不是很熟悉,或者想了解一下基礎的東西,本文還是比較適合你的。工作流中變量,參數,表達式屬於數據模型中概念,變量表示存儲區,參數表示流入和流出活動的數據,通過變量使用表達式可以給參數賦值.
變量
變量是數據的存儲位置,變量被聲明為工作流定義的一部分。變量在運行時獲取值,並將這些值存儲為工作流實例狀態的一部分。變量定義指定了變量的類型,還可指定變量的名稱。首先簡單的看一個小例子,設置一個變量,給變量賦值,然后輸出變量:
從工具箱拖一個Sequence,然后拖入一個Assign,最后拖入一個WriteLine:

同樣的我們可以再后台自己寫代碼實現以上過程,代碼如下:
//定義變量
Variable<string> vars = new Variable<string>
{
Name = "MyName",
};
Sequence sequence = new Sequence()
{
//活動中維護了一個變量組,將變量放入變量組中
Variables = { vars },
Activities =
{
new Assign<string>{
To=vars,
Value="中山郎"
},
//輸出變量
new WriteLine(){
Text=vars
}
}
};
//調用活動
WorkflowInvoker.Invoke(sequence);
變量在運行時的生存期與聲明該變量的活動的生存期相同。活動完成后,其變量將被清除,並且無法再引用。特別說明一下,如果你給變量一個默認值或者希望變量時只讀的,可以進行如下設置:
Variable<string> vars = new Variable<string>
{
Default = "MyName",
Modifiers = VariableModifiers.ReadOnly
};
參數
參數來定義數據流入流出活動的方式,每個參數都有特定的方向,In,Out,InOut;參數是WF的輸出和輸入接口,在同一個流程內,所有Activity共享一組參數.活動作者可使用強類型機制來公開該活動的參數。實現方法是聲明 InArgument、OutArgument 和 InOutArgument類型的屬性。簡單的看一個Demo:
拖Sequence,設置參數argument1,argument2,argument3,賦值,輸出:

后台調用,注意一下這里調用使用的WorkflowApplication而不是WorkflowInvoke,之后的文章會單獨講訴一下兩者的區別:
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("argument1", 21);
dic.Add("argument2", 87);
WorkflowApplication application = new WorkflowApplication(new Argument(), dic);
application.Run();
自定義活動中InArgument,OutArgument的使用:
1.定義一個HelloActivity
public sealed class HelloActivity : CodeActivity
{
// 定義一個字符串類型的活動輸入參數
public InArgument<string> Text { get; set; }
// 定義一個字符串類型的活動輸出參數
public OutArgument<string> OutText { get; set; }
protected override void Execute(CodeActivityContext context)
{
// 獲取 Text 輸入參數的運行時值(兩種不同取值的方式)
string text = context.GetValue(this.Text);
string value = Text.Get(context);
context.SetValue(OutText, "FlyElephant");
Console.WriteLine("姓名:"+text);
Console.WriteLine("姓名:"+value);
}
}
2.流程圖中定義個變量outName,一個輸出參數myValue,將outName賦值給HellActivity的OutText,myValue賦值給Text,流程圖如下:

3.調用方式如下:
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("myValue", "Programer");
WorkflowApplication application = new WorkflowApplication(new In(), dic);
application.Run();
通過以上小例子應該明白的就是InArgument可以接收參數無法傳出,OutArgument無需傳入可以直接傳出;上面如果不是很清晰的話,繼續看一個簡單賦值自定義活動:
定義v1,v2,v3三個變量,然后將v1賦值給v2,v3:
Variable<string> v1 = new Variable<string>()
{
Default = "ASP.NET程序員"
};
Variable<string> v2 = new Variable<string>();
Variable<string> v3 = new Variable<string>();
// 定義工作流
Activity wf = new Sequence
{
Variables = { v1, v2, v3 },
Activities =
{
//關鍵點,InArgument傳入之后賦值給v1,OutArgument傳出之后賦值給v2
new Assign<string>(){
To=new OutArgument<string>(v2),
Value =new InArgument<string>(v1)
},
new WriteLine() { Text = v2 },
new Assign<string>()
{
To = v3,
Value = v2
},
new WriteLine() { Text = v3 }
}
};
WorkflowInvoker.Invoke(wf);
這篇算是補發文章吧,基礎文章還是慢慢寫吧,前面的有些例子比較簡單,對於沒有用過的可能不是很熟悉,補發之后希望會好一點,文章很基礎,高手可忽略,如果你覺得文章對你有所幫助,幫忙給個推薦吧,多謝~
