已经写了两篇关于WF4.0的博客,算是基础博客,如果是WF比较熟悉就直接跳过吧,如果你对工作流不是很熟悉,或者想了解一下基础的东西,本文还是比较适合你的。工作流中变量,参数,表达式属于数据模型中概念,变量表示存储区,参数表示流入和流出活动的数据,通过变量使用表达式可以给参数赋值.
变量
变量是数据的存储位置,变量被声明为工作流定义的一部分。变量在运行时获取值,并将这些值存储为工作流实例状态的一部分。变量定义指定了变量的类型,还可指定变量的名称。首先简单的看一个小例子,设置一个变量,给变量赋值,然后输出变量:
从工具箱拖一个Sequence,然后拖入一个Assign,最后拖入一个WriteLine:
同样的我们可以再后台自己写代码实现以上过程,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
//定义变量
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);
|
变量在运行时的生存期与声明该变量的活动的生存期相同。活动完成后,其变量将被清除,并且无法再引用。特别说明一下,如果你给变量一个默认值或者希望变量时只读的,可以进行如下设置:
1
2
3
4
5
|
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,之后的文章会单独讲诉一下两者的区别:
1
2
3
4
5
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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.调用方式如下:
1
2
3
4
|
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
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);
|
本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/3978284.html,如需转载请自行联系原作者