已經寫了兩篇關於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);
這篇算是補發文章吧,基礎文章還是慢慢寫吧,前面的有些例子比較簡單,對於沒有用過的可能不是很熟悉,補發之后希望會好一點,文章很基礎,高手可忽略,如果你覺得文章對你有所幫助,幫忙給個推薦吧,多謝~