节主要介绍如何在WF4.0中使用参数,以及在流程启动时传入参数据在流程结束时读取参数
本文例子下载:
http://files.cnblogs.com/foundation/ArgumentsSample.rar
本文例子说明
数据的传递 Arguments 参数
Arguments 参数概述
Arguments是WF的输出和输入接口,在同一个流程内,所有Activity共享一组参数.
参数有如下属性:
Name | 参数的名子 |
Direction | 参数的类型 In Out In/Out Propery |
Argument type | 参数的数据类型 |
Default value | 参数的默认值 In:使用的是表达式 Out,In/Out :无默认值 Propery : 值类型 |
IsRequired | 是否必填 |
添加参数
In参数
System.Activities.InArgument<T>
[In参数]使用说明
1. 可以用VS设计器在xaml中定义[In参数]
2. 在xaml中定义的[In参数],可以在该xaml中被其他Activity用表达式绑定
3. 可以用code方式在code Activity中定义[In参数]
4. 可以在属性框中, 将code Activity中定义的[In参数]绑定到参数或变量
可以用"表达式"方式赋值
5. 运行时,可以用启动参数的方式对[In参数]赋值(xaml与code两种方式都可以)
6. [In参数]不能在实例的[OnCompleted]事件中用[WorkflowApplicationCompletedEventArgs.Outputs]得到
7. 可以使用[Assign] 为 [In参数]赋值
例:XAML方式的[In参数]使用
说明:
1.在xaml格式的workFlow中定义三个[double]型的[In参数]v1,v2,v3
2.启动时为v1,v2赋值
3.在流程内部用[Assign]为v3赋予v1+v2
4.用WriteLine打印v3的值
流程 | |
宿主 | static void startValueInWorkflow() { System.Collections.Generic.Dictionary<string, object> dic = new System.Collections.Generic.Dictionary<string, object>(); dic.Add("v1",123.456); dic.Add("v2",456.789); WorkflowApplication myInstance = new WorkflowApplication(new StartValueInWorkflow(), dic); myInstance.Run(); } |
结果 |
例:Code方式的[In参数]使用
说明:
1. 定一个Activity名为[InArgumentActivity],其具有一个[string]类型 [In参数]myIn
2. 在xaml格式的workFlow中定义一个[string]型的[In参数]myValue
3. 启动时为myValue赋值
4. 在流程内部添加[InArgumentActivity],将[InArgumentActivity.myIn] 绑定到myValue
InArgumentActivity | public sealed class InArgumentActivity : CodeActivity { public System.Activities.InArgument<string> myIn { get; set; }
protected override void Execute(CodeActivityContext context) { string s1 = context.GetValue(this.myIn); string s2 = myIn.Get(context);
System.Console.WriteLine(s1); System.Console.WriteLine(s2); } } |
流程 | |
宿主 | static void inArgumentWorkflow() { System.Collections.Generic.Dictionary<string, object> dic = new System.Collections.Generic.Dictionary<string, object>(); dic.Add("myValue","wxwinter wxd"); WorkflowApplication myInstance = new WorkflowApplication(new InArgumentWorkflow(), dic); myInstance.Run(); } |
结果 |
Out参数
System.Activities.OutArgument<T>
[Out参数]使用说明
1. 可以用VS设计器在xaml中定义[Out参数]
2. 在xaml中定义的[Out参数],可以在该xaml中被其他Activity用表达式绑定
3. 可以用code方式在code Activity中定义[Out参数]
4. 可以在属性框中, 将code Activity中定义的[Out参数]绑定到参数或变量
不能直接对[Out参数]赋值
5. 运行时,不能用启动参数的方式对[Out参数]赋值(xaml与code两种方式都不可以)
6. [Out参数]可在实例的[OnCompleted]事件中用[WorkflowApplicationCompletedEventArgs.Outputs]得到
7. 可以使用[Assign] 为 [Out参数]赋值
例:XAML方式的[Out参数]使用
说明:
1.在xaml格式的workFlow中定义二个[double]型的[In参数]v1,v2
定义一个[double]型的[Out 参数]v3
2.启动时为v1,v2赋值
3.在流程内部用[Assign]为v3赋予v1+v2
4.在[completed]中打印v3的值
流程 | |
宿主 | static void startValueOutWorkflow() { System.Collections.Generic.Dictionary<string, object> dic = new System.Collections.Generic.Dictionary<string, object>(); dic.Add("v1", 123.456); dic.Add("v2", 456.789); WorkflowApplication myInstance = new WorkflowApplication(new StartValueOutWorkflow(), dic); myInstance.Completed = completed; myInstance.Run(); } |
static void completed(WorkflowApplicationCompletedEventArgs e) { System.Console.WriteLine(e.Outputs["v3"].ToString()); } | |
结果 |
例:Code方式的[Out参数]使用
说明:
1. 定一个Activity名为[OutArgumentActivity],其具有一个[string]类型 [Out 参数]myOut
2. 在xaml格式的workFlow中定义一个[string]型的变量 myVariable
3. 在流程内部添加[OutArgumentActivity],将[OutArgumentActivity.myOut]绑定到myVariable
4. 添加[WriteLine],打印[myVariable]
OutArgumentActivity | public sealed class OutArgumentActivity : CodeActivity { public System.Activities.OutArgument<string> myOut { set; get; }
protected override void Execute(CodeActivityContext context) { //1 string s1 = myOut.Get(context); myOut.Set(context, "wxd" + s1);
//2 string s2 = context.GetValue(myOut); context.SetValue(myOut, "lzm" + s2); } } |
流程 | |
宿主 | static void outArgumentWorkflow() { WorkflowApplication myInstance = new WorkflowApplication(new OutArgumentWorkflow());
myInstance.Run(); } |
结果 |
In/Out参数
System.Activities.InOutArgument<T>
[In/Out参数]使用说明
1. 可以用VS设计器在xaml中定义[I民/Out参数]
2. 在xaml中定义的[In/Out参数],可以在该xaml中被其他Activity用表达式绑定
3. 可以用code方式在code Activity中定义[In/Out参数]
4. 可以在属性框中, 将code Activity中定义的[In/Out参数]绑定到参数或变量
不能直接对[In/Out参数]赋值
5. 运行时, 可以用启动参数的方式对[In/Out参数]赋值(xaml与code两种方式都可以)
6. [In/Out参数]可在实例的[OnCompleted]事件中用[WorkflowApplicationCompletedEventArgs.Outputs]得到
7. 可以使用[Assign] 为 [In/Out参数]赋值
例:XAML方式的[In/Out参数]使用
说明:
1.在xaml格式的workFlow中定义三个[string]型的[In/Out参数]v1,v2, v3
2.启动时为v1,v2,v3赋值
3.在流程内部用[Assign]为v3赋予v1 + v2 +v3
4.在[completed]中打印v3的值
流程 | |
宿主 | static void startValueInOutWorkflow() { System.Collections.Generic.Dictionary<string, object> dic = new System.Collections.Generic.Dictionary<string, object>(); dic.Add("v1", "wxd"); dic.Add("v2", "lzm"); dic.Add("v3", "wxwinter"); WorkflowApplication myInstance = new WorkflowApplication(new StartValueInOutWorkflow(), dic); myInstance.Completed = completed; myInstance.Run(); } |
static void completed(WorkflowApplicationCompletedEventArgs e) { System.Console.WriteLine(e.Outputs["v3"].ToString()); } | |
结果 |
例:Code方式的[In/Out参数]使用
说明:
1. 定一个Activity名为[InOutArgumentActivity],其具有一个[string]类型 [In参数]myInOut
2. 在xaml格式的workFlow中定义一个[string]型的变量 myVariable,默认值为"wxwinter"
3. 在流程内部添加[WriteLine],打印myVariable的值
4. 在流程内部添加[InOutArgumentActivity],将[InArgumentActivity. myInOut]绑定到流程的myVariable
5. 在流程内部再添加[WriteLine],打印myVariable的值
InOutArgumentActivity | public sealed class InOutArgumentActivity : CodeActivity { public System.Activities.InOutArgument<string> myInOut { set; get; }
protected override void Execute(CodeActivityContext context) { //1 //string s1 = myInOut.Get(context); //myInOut.Set(context, "wxd:" + s1);
//2 string s2 = context.GetValue(myInOut); context.SetValue(myInOut, "wxd:" + s2); } } |
流程 | |
宿主 | static void inOutArgumentWorkflow() { WorkflowApplication myInstance = new WorkflowApplication(new InOutArgumentWorkflow()); myInstance.Run(); } |
结果 |
勇哥的学习笔记:
勇哥使用vs2013来实验上面教程的例子。
(1) XAML方式的[In参数]使用
流程创建变量v1,v2,v3,这几个变量会被流程内全部活动所共享。
流程Assign看起来貌似就是个表达式赋值。
那么v1,v2在什么时候赋值呢?
答案是在宿主程序这边赋值。
如下面代码,使用Dictionary<string, object>字典来赋值,这个其实是WorkflowApplication的某个构造函数里面参数的规定。
其原型如下:
public WorkflowApplication(Activity workflowDefinition, IDictionary<string, object> inputs);
/// <summary> /// //XAML方式的[In参数]使用 /// </summary> static void test1() { var dic = new Dictionary<string, object>(); dic.Add("v1", 250.0); dic.Add("v2", 350.0); var instance = new WorkflowApplication(new Workflow1(), dic); instance.Run(); }
(2) Code方式的[In参数]使用
先新建一个,代码如下。
它的功能就是获取流程中的参数到当前的代码活动中来。
变量s1,s2演示了两种取得流程参数的写法。
public sealed class CodeActivity1 : CodeActivity { // 定义一个字符串类型的活动输入参数 public InArgument<string> myIn { get; set; } // 如果活动返回值,则从 CodeActivity<TResult> // 派生并从 Execute 方法返回该值。 protected override void Execute(CodeActivityContext context) { // 获取 Text 输入参数的运行时值 string s1 = context.GetValue(this.myIn); string s2 = myIn.Get(context); Console.WriteLine(s1); Console.WriteLine(s2); } }
编译这个代码活动。
新建一个活动,在编辑器页面拖入上面的代码活动。
然后创建这个流程的输入变量myValue。
还没完,一定设置代码活动的属性myIn的值为你刚才创建的流程变量myValue。
接下来的事交给宿主程序了,主要就是启动流程前给myValue赋值。
代码如下:
/// <summary> /// Code方式的[In参数]使用 /// </summary> static void test2() { var dic = new Dictionary<string, object>(); dic.Add("myValue", "www.skcircle.com"); var instance = new WorkflowApplication(new test2(), dic); instance.Run(); }
(3)XAML方式的[Out参数]使用
这种方式跟例子(1)的演示代码差别不大。
宿主程序如下:
/// <summary> /// XAML方式的[Out参数]使用 /// </summary> static void test3() { var dic = new Dictionary<string, object>(); dic.Add("v1", 250.1); dic.Add("v2", 350.2); var instance = new WorkflowApplication(new test3(), dic); instance.Completed = completed; instance.Run(); } static void completed(WorkflowApplicationCompletedEventArgs e) { Console.WriteLine(e.Outputs["v3"].ToString()); }
(4) Code方式的[Out参数]使用
新建一个代码活动,代码如下:
注意代码中红色这个对象,它表示活动输出参数,InArgument则表示输入参数。勇哥这个地方搞错了,一个多小时都不知道为什么运行不出结果!!
public System.Activities.OutArgument<string> myOut{ set; get; }
方法Execute中演示给这个输出参数赋值的方法。
public sealed class CodeActivity2 : CodeActivity { // 定义一个字符串类型的活动输出参数 public System.Activities.OutArgument<string> myOut{ set; get; } // 如果活动返回值,则从 CodeActivity<TResult> // 派生并从 Execute 方法返回该值。 protected override void Execute(CodeActivityContext context) { //// 获取 Text 输入参数的运行时值 //1 string s1 = myOut.Get(context); myOut.Set(context, "wxd" + s1); //2 string s2 = context.GetValue(myOut); context.SetValue(myOut, "lzm" + s2); } }
然后编译这个代码活动。
新建一个新的活动,工作流如下:
同时创建一个变量myVariable。
CodeActivity2的myOut设置为myVariable。
最后在宿主程序里面运行流程。
/// <summary> /// Code方式的[Out参数]使用 /// </summary> static void test4() { var instance = new WorkflowApplication(new test4()); instance.Run(); }
总结:
这个例子讲的out参数指的是在代码活动中通过OutArgument 输出对象绑定到流程中的变量上去的方法。
(5)(6)in/out参数的例子勇哥就不重复了,跟(3)(4)差不多。
了解本节的内容,居然花了一上午的时间,这个算是比较重要的内容。
本节内容总结为一句话: 新建的活动可以设置in、out、in/out参数,新建的代码活动也可以设置in、out、in/out参数两者区别比较大。