WF4.0 基础篇 (二十九) WorkflowInspectionServices
本文例子下载:
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相关推荐
- WF4.0 基础篇 (二十八) WF调用PowerShell
PowerShell 提供了命令行管理系统的功能,但通常情况下,操作人员要完成某种业务需要多组PowerShell 命令,这样会很烦琐,错误率也比效高.操作人员可以编写powerShell脚本来组织命 ...
- WF4.0 基础篇 (二十六) Interop调用WF3.X的Activity
本节主要介绍Interop调用WF3.X的Activity 本文例子下载: http://files.cnblogs.com/foundation/InteropSample.rar 本文例子说明 I ...
- WF4.0 基础篇 (二十) ActivityWithResult 有返回值Activity
本节主要介绍WF4 中 有返回值Activity的使用 本文例子下载: http://files.cnblogs.com/foundation/ActivityWithResultSample.rar ...
- WF4.0 基础篇 (三十 完) 对学习WF的一点建议
从09年10月份 NET4.0 Bata 2发布后,我就开始写[WF4.0 基础篇]这个系列,经历了5个多月终于在NET4.0正式发布前将这个系列完成了 这段时间与一些对WF4.0感兴趣的公司与开发人 ...
- WF4.0 基础篇 (二) Activity介绍及WriteLine Activity的使用
从本篇开始,将正式讲解WF4.0,本文主要涉及如下内容:Activity介绍, WF4.0 中工作流的结构,通过WriteLine演示InArgument<T>参数的使用 目录 1 ...
- WF4.0 基础篇 (二十七) WCF Workflow Service 在WCF中使用WF
例子下载: http://files.cnblogs.com/foundation/wcfwfSample.rar 例子说明: WCF Workflow Service 创建启用WF的WCF服务 例1 ...
- C/C++基础讲解(二十九)之数值计算与趣味数学篇(百钱百鸡问题、爱因斯坦的数学题、三色球问题与马克思手稿中的数学题)
C/C++基础讲解(二十九)之数值计算与趣味数学篇(百钱百鸡问题.爱因斯坦的数学题.三色球问题与马克思手稿中的数学题) 程序之美 前言 很多时候,特别是刚步入大学的学子们,对于刚刚开展的计算机课程基本 ...
- android游戏性能测试,评测 篇二十九:用游戏数据来彰显实力,华为nova5i Pro游戏性能篇...
评测 篇二十九:用游戏数据来彰显实力,华为nova5i Pro游戏性能篇 2020-01-02 00:20:00 4点赞 1收藏 2评论 笔者带着大家对华为nova5i Pro做了开箱测试,了解外观与 ...
- [转]WF4.0 基础篇 (一)开始使用WF
本文转自:http://www.cnblogs.com/foundation/archive/2009/10/26/1589993.html 来博客园写WF主题博客已经3年了, 在园子里认识了很多朋友 ...
最新文章
- 12,缓冲运动。匀速运动停止条件
- [WebDev]Web 开发与设计师速查手册大全
- 关于 Git 提交这些规范,你都遵守了吗?
- 【干货】分库分表最佳实践
- javaweb学习总结(十四)——JSP原理
- 最新的20多个JMS面试问答(2020)
- cdn节点人少延迟高_让你刷剧一直爽,CDN原理是什么
- C#LeetCode刷题之#122-买卖股票的最佳时机 II(Best Time to Buy and Sell Stock II)
- 4月14日,微软发布例行月度安全更新
- Android P(3)---Android P 功能和 API
- scla-基础-函数-元组(0)
- 6467t 1080php,DM6467T开发板领航——开发环境的文件配置
- Debian,从安装到喜欢
- 虚拟交换机软件_千兆交换机如何识别优劣,千兆交换机识别方法!
- LeetCode刷题——26. 删除排序数组中的重复项
- latex服务器java_latex入门
- C++ 读取TXT文件
- R语言将两个矩阵数据进行相乘
- 知识付费的痛点:如何让用户持续学习?
- android 3dtouch插件,标注点支持3DTouch效果
热门文章
- JS~~~ 前端开发一些常用技巧 模块化结构 命名空间处理 奇技淫巧!!!!!!...
- Windows XP系统安装SQL Server 2005(开发版)图解
- 条款9:避免隐藏标准形式的new
- HDOJ2567 ( 寻梦 ) 【切水题,很欢乐~】
- Windows下Android开发环境 搭建
- linux服务器 版本 比例,Linux比例近半 服务器操作系统混战开始
- java linearlayout_LinearLayout属性用法和源码分析
- Visual.Assist.X.V10.7.1946的汉化破解补丁
- jeesite的junit,数据没有插入?
- 为何setRequestMethod(GET)不生效