WF4.0(3)----變量與參數


已經寫了兩篇關於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);

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM