本文例子下载:

http://files.cnblogs.com/foundation/WorkflowInspectionServicesSample.rar

WorkflowInspectionServices 类

WorkflowInspectionServices可以得到流程中的Activity,

由于WF4.0的ActivityTree相对复杂,并不是象WF3.X的结构那样清晰,

在WF4.0中Activitys,Body,Implementation等了Activity属性比效多,要循环Activity就要做很多判断,这时可以使用WorkflowInspectionServices得到ActivityTree上的所有Activity.

WorkflowInspectionServices可自动判断Activitys,Body,Implementation等

与自已实现递归相比,自已实现递归可以操作更多细节,WorkflowInspectionServices则可以快速得到全部Activity

注意:由于WorkflowInspectionServices只得到Activity,所以流程图中的

  • FlowNode
  • FlowStep
  • FlowSwitch
  • FlowDecision

不是从Activity中继承的,所以WorkflowInspectionServices无法得到这些元素,但这些元素中所包含的Activity可以得到

静态方法 GetActivities

基本功能

基于XAML文件名得到Activity

static Activity getActivity(string filePathName)

{

string valueString = "";

using (System.IO.FileStream fileStream = new System.IO.FileStream(filePathName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read))

{

using (System.IO.StreamReader streamReader = new System.IO.StreamReader(fileStream))

{

valueString = streamReader.ReadToEnd();

}

}

System.IO.StringReader stringReader = new System.IO.StringReader(valueString);

Activity activity = System.Activities.XamlIntegration.ActivityXamlServices.Load(stringReader);

WorkflowInspectionServices.CacheMetadata(activity);

return activity;

}

GetActivities方式

static void printActivityTree(Activity activity,string tag)

{

Console.WriteLine(tag + "{0},type:{1}", activity.DisplayName, activity.GetType());

System.Collections.Generic.IEnumerator<Activity> list = WorkflowInspectionServices.GetActivities(activity).GetEnumerator();

while (list.MoveNext())

{

printActivityTree(list.Current," "+ tag );

}

}

递归方式

static void printActivityStruce(Activity activity, string tag)

{

System.Console.WriteLine(tag + "{0},Type:{1}", activity.DisplayName, activity.GetType());

//如果是表达式

VisualBasicValue<string> a = activity as VisualBasicValue<string>;

if (a != null)

{

System.Console.WriteLine(tag + a.ExpressionText);

}

//如果是[DynamicActivity]

DynamicActivity dynamicActivity = activity as DynamicActivity;

if (dynamicActivity != null)

{

System.Console.WriteLine(tag + " Properties:");

foreach (var item in dynamicActivity.Properties)

{

System.Console.WriteLine(tag + " Name:{0}, Type:{1}", item.Name, item.Type);

}

System.Console.WriteLine(tag + " Implementation:");

tag = tag + " ";

printActivityStruce(dynamicActivity.Implementation(), tag);

}

//如果是[Sequence]

Sequence sequence = activity as Sequence;

if (sequence != null)

{

System.Console.WriteLine(tag + " Variables :");

foreach (var item in sequence.Variables)

{

System.Console.WriteLine(tag + " Name:{0}, Type:{1}, Default:{2}", item.Name, item.Type, item.Default);

}

System.Console.WriteLine(tag + " Activities:");

foreach (var item in sequence.Activities)

{

tag = tag + " ";

printActivityStruce(item, tag);

}

}

}

例子1:Sequence嵌套

static void showTestAWorkflow()

{

Activity wf = getActivity("testAWorkflow.xaml");

printActivityTree(wf, "");

System.Console.WriteLine("=======================");

printActivityStruce(wf, "");

}

例子2:IF容器

static void showTestBWorkflow()

{

Activity wf = getActivity("testBWorkflow.xaml");

printActivityTree(wf, "");

System.Console.WriteLine("=======================");

printActivityStruce(wf, "");

}

例子3:FlowChar

static void showTestCWorkflow()

{

Activity wf = getActivity("testCWorkflow.xaml");

printActivityTree(wf, "");

System.Console.WriteLine("=======================");

printActivityStruce(wf, "");

}

例子4:自定义Activity

static void showTestDWorkflow()

{

Activity wf = getActivity("testDWorkflow.xaml");

printActivityTree(wf, "");

System.Console.WriteLine("=======================");

printActivityStruce(wf, "");

}

public sealed class muActivity : Activity

{

protected override Func<Activity> Implementation

{

get

{

return getActivity;

}

set

{

base.Implementation = value;

}

}

Activity getActivity()

{

return new WriteLine { DisplayName = "wxwinter" };

}

}

操作WCF服务中的工作流

xamlx文件中的工作流,可以用XamlServices.Load得到WorkflowService,WorkflowService的Body就对应WCF服务中的Activity树

FileStream fs = new FileStream("Service1.xamlx", FileMode.Open);

WorkflowService wfs = (WorkflowService)XamlServices.Load(fs);

printActivityTree(wf,"|--");

静态方法 Resolve

返回流程树中指定id的Activity

static void printActivityID(Activity activity, string tag)

{

Console.WriteLine(tag + "{0},{1}", activity.Id, activity.DisplayName);

System.Collections.Generic.IEnumerator<Activity> list = WorkflowInspectionServices.GetActivities(activity).GetEnumerator();

while (list.MoveNext())

{

printActivityID(list.Current, " " + tag);

}

}

static void findActivityByID()

{

Activity wf = getActivity("testAWorkflow.xaml");

printActivityID(wf, "");

System.Console.WriteLine("=======================");

Activity act= WorkflowInspectionServices.Resolve(wf, "1.5");

Console.WriteLine("{0},{1}", act.Id, act.DisplayName);

}

静态方法 CacheMetadata

CacheMetadata 方法用于验证Activity,如果验证不通过会产生异常,所以应该放入TryCatch中

Activity

public sealed class myActivityA : CodeActivity

{

public InArgument<string> myText { get; set; }

protected override void CacheMetadata(CodeActivityMetadata metadata)

{

myText = new VisualBasicValue<string> { ExpressionText = "myIn" };

base.CacheMetadata(metadata);

}

protected override void Execute(CodeActivityContext context)

{

string text = context.GetValue(this.myText);

System.Console.WriteLine("myActivityA:" + text);

}

}

 

static void testCacheMetadata()

{

try

{

System.Console.WriteLine("验证 myActivityA");

WorkflowInspectionServices.CacheMetadata(new myActivityA());

System.Console.WriteLine("验证 myActivityA 通过");

}

catch(System.Exception ex)

{

System.Console.WriteLine(ex.Message);

}

System.Console.WriteLine("/====================================================================");

DynamicActivity dynamicActivity = new DynamicActivity();

dynamicActivity.Properties.Add(new DynamicActivityProperty

{

Name = "myIn",

Type = typeof(InArgument<string>),

Value = new InArgument<string>()

});

dynamicActivity.Implementation =()=>new myActivityA();

try

{

System.Console.WriteLine("验证 dynamicActivity");

WorkflowInspectionServices.CacheMetadata(dynamicActivity);

System.Console.WriteLine("验证 dynamicActivity 通ª过");

}

catch (System.Exception ex)

{

System.Console.WriteLine(ex.Message);

}

}

 

转载于:https://www.cnblogs.com/foundation/archive/2010/04/02/1702762.html

WF4.0 基础篇 (二十九) WorkflowInspectionServices相关推荐

  1. WF4.0 基础篇 (二十八) WF调用PowerShell

    PowerShell 提供了命令行管理系统的功能,但通常情况下,操作人员要完成某种业务需要多组PowerShell 命令,这样会很烦琐,错误率也比效高.操作人员可以编写powerShell脚本来组织命 ...

  2. WF4.0 基础篇 (二十六) Interop调用WF3.X的Activity

    本节主要介绍Interop调用WF3.X的Activity 本文例子下载: http://files.cnblogs.com/foundation/InteropSample.rar 本文例子说明 I ...

  3. WF4.0 基础篇 (二十) ActivityWithResult 有返回值Activity

    本节主要介绍WF4 中 有返回值Activity的使用 本文例子下载: http://files.cnblogs.com/foundation/ActivityWithResultSample.rar ...

  4. WF4.0 基础篇 (三十 完) 对学习WF的一点建议

    从09年10月份 NET4.0 Bata 2发布后,我就开始写[WF4.0 基础篇]这个系列,经历了5个多月终于在NET4.0正式发布前将这个系列完成了 这段时间与一些对WF4.0感兴趣的公司与开发人 ...

  5. WF4.0 基础篇 (二) Activity介绍及WriteLine Activity的使用

    从本篇开始,将正式讲解WF4.0,本文主要涉及如下内容:Activity介绍, WF4.0 中工作流的结构,通过WriteLine演示InArgument<T>参数的使用 目录 1     ...

  6. WF4.0 基础篇 (二十七) WCF Workflow Service 在WCF中使用WF

    例子下载: http://files.cnblogs.com/foundation/wcfwfSample.rar 例子说明: WCF Workflow Service 创建启用WF的WCF服务 例1 ...

  7. C/C++基础讲解(二十九)之数值计算与趣味数学篇(百钱百鸡问题、爱因斯坦的数学题、三色球问题与马克思手稿中的数学题)

    C/C++基础讲解(二十九)之数值计算与趣味数学篇(百钱百鸡问题.爱因斯坦的数学题.三色球问题与马克思手稿中的数学题) 程序之美 前言 很多时候,特别是刚步入大学的学子们,对于刚刚开展的计算机课程基本 ...

  8. android游戏性能测试,评测 篇二十九:用游戏数据来彰显实力,华为nova5i Pro游戏性能篇...

    评测 篇二十九:用游戏数据来彰显实力,华为nova5i Pro游戏性能篇 2020-01-02 00:20:00 4点赞 1收藏 2评论 笔者带着大家对华为nova5i Pro做了开箱测试,了解外观与 ...

  9. [转]WF4.0 基础篇 (一)开始使用WF

    本文转自:http://www.cnblogs.com/foundation/archive/2009/10/26/1589993.html 来博客园写WF主题博客已经3年了, 在园子里认识了很多朋友 ...

最新文章

  1. 12,缓冲运动。匀速运动停止条件
  2. [WebDev]Web 开发与设计师速查手册大全
  3. 关于 Git 提交这些规范,你都遵守了吗?
  4. 【干货】分库分表最佳实践
  5. javaweb学习总结(十四)——JSP原理
  6. 最新的20多个JMS面试问答(2020)
  7. cdn节点人少延迟高_让你刷剧一直爽,CDN原理是什么
  8. C#LeetCode刷题之#122-买卖股票的最佳时机 II(Best Time to Buy and Sell Stock II)
  9. 4月14日,微软发布例行月度安全更新
  10. Android P(3)---Android P 功能和 API
  11. scla-基础-函数-元组(0)
  12. 6467t 1080php,DM6467T开发板领航——开发环境的文件配置
  13. Debian,从安装到喜欢
  14. 虚拟交换机软件_千兆交换机如何识别优劣,千兆交换机识别方法!
  15. LeetCode刷题——26. 删除排序数组中的重复项
  16. latex服务器java_latex入门
  17. C++ 读取TXT文件
  18. R语言将两个矩阵数据进行相乘
  19. 知识付费的痛点:如何让用户持续学习?
  20. android 3dtouch插件,标注点支持3DTouch效果

热门文章

  1. JS~~~ 前端开发一些常用技巧 模块化结构 命名空间处理 奇技淫巧!!!!!!...
  2. Windows XP系统安装SQL Server 2005(开发版)图解
  3. 条款9:避免隐藏标准形式的new
  4. HDOJ2567 ( 寻梦 ) 【切水题,很欢乐~】
  5. Windows下Android开发环境 搭建
  6. linux服务器 版本 比例,Linux比例近半 服务器操作系统混战开始
  7. java linearlayout_LinearLayout属性用法和源码分析
  8. Visual.Assist.X.V10.7.1946的汉化破解补丁
  9. jeesite的junit,数据没有插入?
  10. 为何setRequestMethod(GET)不生效