zoukankan      html  css  js  c++  java
  • 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);
    

      这篇算是补发文章吧,基础文章还是慢慢写吧,前面的有些例子比较简单,对于没有用过的可能不是很熟悉,补发之后希望会好一点,文章很基础,高手可忽略,如果你觉得文章对你有所帮助,帮忙给个推荐吧,多谢~

  • 相关阅读:
    洛谷 P1919 【模板】A*B Problem升级版(FFT快速傅里叶)
    Codeforces Goodbye 2018
    ubuntu 百度云
    【UOJ 351】新年的叶子
    【SDOI2008】仪仗队
    NOI 2002 贪吃的九头龙
    最大获利
    codeforces 814E An unavoidable detour for home
    codeforces 814D An overnight dance in discotheque
    bzoj3191 [JLOI2013]卡牌游戏
  • 原文地址:https://www.cnblogs.com/xiaofeixiang/p/3978284.html
Copyright © 2011-2022 走看看