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);
    

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

  • 相关阅读:
    Palindrome Partitioning
    triangle
    Populating Next Right Pointers in Each Node(I and II)
    分苹果(网易)
    Flatten Binary Tree to Linked List
    Construct Binary Tree from Inorder and Postorder Traversal(根据中序遍历和后序遍历构建二叉树)
    iOS系统navigationBar背景色,文字颜色处理
    登录,注销
    ios 文字上下滚动效果Demo
    经常崩溃就是数组字典引起的
  • 原文地址:https://www.cnblogs.com/xiaofeixiang/p/3978284.html
Copyright © 2011-2022 走看看