从自定义活动获取和设置工作流变量,Windows Workflow Foundation





3.00/5 (2投票s)
如何在 Windows Workflow Foundation (WF) 工作流的自定义活动中访问工作流变量。
引言
在构建工作流时,您不可避免地会遇到标准活动无法满足需求的情况。在这种情况下,您将创建自定义活动来执行您需要的任何复杂业务逻辑。在创建此类活动的过程中,您将添加一些属性、依赖项属性,这些属性允许工作流将数据传递给活动。那么,如果您想朝相反的方向发展呢?如何读取或更改工作流变量的值?这两个方法将帮助您实现这一点。
Using the Code
第一种方法,GetValueOfWorkflowVariable
,接受一个活动和一个路径,并将该值作为对象返回。
public static object GetValueOfWorkflowVariable(Activity activity, string valueName)
{
object value = null;
if (activity != null)
{
try
{
ActivityBind workflowActivityBind = new ActivityBind();
workflowActivityBind.Name = activity.Name;
workflowActivityBind.Path = valueName;
value = workflowActivityBind.GetRuntimeValue(activity);
}
catch
{ }
if (value == null)
value = GetValueOfWorkflowVariable(activity.Parent, valueName);
}
return value;
}
为了获取工作流变量的值,您必须创建一个ActivityBind
对象。有了它,您可以传递活动的名称,然后传递您要访问的变量的路径(或名称)。由于工作流只是一种活动类型(确切地说,是SequentialWorkflowActivity
),因此这将会起作用。
然而,从活动中获取变量的值并不是难点。难点在于找到哪个活动才是实际的工作流。由于我们无法从活动内部轻松访问工作流本身,我们只能引用活动的父级,而父级可能是一个序列活动、活动或其他任何复合活动。因此,在此代码中,如果我们找不到相关变量,我们就会搜索父级。我们不断向上遍历树,直到找到匹配的变量。如果我们一直到达顶部(或者活动为null
),并且仍然没有找到它,我们只需返回null
。
这是一个使用它的示例
String activityValue = "";
activityValue = GetValueOfWorkflowVariable(this.Parent, "ActivityValue").ToString();
在此示例中,我传递this.Parent
作为活动,因为我知道此活动本身不是工作流...所以它的父级可能是。
设置工作流变量的值与此类似,代码量略少。这是该方法,SetValueOfWorkflowVariable
public static void SetValueOfWorkflowVariable
(Activity activity, string valueName, object value)
{
if (activity != null)
{
try
{
ActivityBind workflowActivityBind = new ActivityBind();
workflowActivityBind.Name = activity.Name;
workflowActivityBind.Path = valueName;
workflowActivityBind.SetRuntimeValue(activity, value);
}
catch
{}
SetValueOfWorkflowVariable(activity.Parent, valueName, value);
}
}
同样,我们创建一个ActivityBind
对象并遍历树,直到成功设置变量的值。如果出于某种原因我们找不到它,我们将退出该函数,且不报错。
这是一个使用它的示例
String activityValue = "Some Value";
SetValueOfWorkflowVariable(this.Parent, activityValue);
就是这样,现在无论何时您需要访问某个工作流变量来读取或更改,您只需要包含这些方法并调用它们即可。
历史
- 2009年5月19日:初始发布