65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (2投票s)

2009 年 5 月 19 日

CPOL

2分钟阅读

viewsIcon

45999

如何在 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日:初始发布
© . All rights reserved.