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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435601.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】C#开发PACS医学影像处理系统(三):界面布局之工具栏

转自&#xff1a;https://www.cnblogs.com/Uncle-Joker/p/13650330.html 工具栏布局采用WPF中Grid作为容器&#xff0c;按钮采用自定义样式和图标&#xff0c;并采用Separator分割线&#xff1a; XAML设计器代码&#xff1a; 其中 Style"{StaticResource ButtonStyle}&…

WinCE6.0 修改开机Logo方法

中秋假期已过&#xff0c;回来继续该博文主题。今天讲解第二种方法&#xff0c;将 Logo 图片的数据写入到 Nand Flash 中&#xff0c;在启动初始化 LCD 的时候&#xff0c;从固定的地址将数据读出并填充到显示缓存中。实验平台&#xff1a;WinCE6.0Android6410 4.3寸CLD。以下内…

【转】DICOM开发工具总结

转自&#xff1a;DICOM开发工具总结_qimo601的专栏-CSDN博客 网上流行的DICOM协议开发工具&#xff1a; 1、DICOM开发类库主要有&#xff1a; &#xff08;1&#xff09;DCMTK(3.6.0), 官方下载网站,&#xff08;如何安装编译DCMTK3.6.0&#xff09; DCMTK实现了对DICOM图像…

【转】CT中的“层“与“排“的区别

转自&#xff1a;CT中的"层"与"排"的区别 自从离开医院&#xff0c;专业培训磁共振&#xff0c;有差不多5年时间没有接触CT了。影像技术及影像医学诊断说到底是一门经验技术累积学科&#xff0c;这种学科的特点就是熟能生巧&#xff0c;几年不碰&#xff0…

修改SMDK6410的调试串口为普通串口(wince系统)

环境&#xff1a; 飞凌OK6410A开发板&#xff0c; Windows CE6.0系统 最近在做GPRS通信&#xff0c;可是手头上的GPRS模块&#xff08;Q2403A&#xff09;是五线串口的&#xff08;RXD、TXD、GND、RCS、CTS&#xff09;&#xff0c;老板又不愿买新的模块。所以考虑将调试串口CO…

【转】CTA图像

转自&#xff1a;CTA图像 CT检查在临床中应用十分广泛&#xff0c;CT以其扫描速度快&#xff0c;对骨头及钙化敏感而具有部分优势。 CTA是CT血管成像&#xff0c;是CT临床应用中一个非常重要的部分&#xff0c;由于血管及其背景软组织自然对比差&#xff0c;常规CT平扫往往难以…

大白话系列之C#委托与事件讲解(一)

从序言中&#xff0c;大家应该对委托和事件的重要性有点了解了吧&#xff0c;虽然说我们现在还是能模糊&#xff0c;但是从我的大白话系列中&#xff0c;我会把这些概念说的通俗易懂的。首先&#xff0c;我们还是先说说委托吧&#xff0c;从字面上理解&#xff0c;只要是中国人…

【转】医学影像处理相关知识整理(一)

转自&#xff1a;医学影像处理相关知识整理&#xff08;一&#xff09; - 知乎 Segmentation to RT structure 近日做医疗影像处理相关的内容&#xff0c;感慨于这方面资料不全、散碎&#xff0c;遂记录自己获得的一些资料以供日后查阅。 DICOM DICOM 是医学图像和相关信息…

【转】软件工程能力漫谈:比质量更重要的,是项目管理能力

转自&#xff1a;软件工程能力漫谈&#xff1a;比质量更重要的&#xff0c;是项目管理能力 | ArchSummit 章淼老师在软件工程能力方面&#xff0c;积累了多年的经验&#xff0c;这个话题他之前也分享过多次&#xff0c;整体上内容有修改调整。 章老师博士毕业后在清华待了 12…

【转】DICOM文件格式剖析(初识)

转自&#xff1a;DICOM文件格式剖析&#xff08;初识&#xff09;_MoreThinker的博客-CSDN博客_dicom格式 初识DICOM&#xff08;适合初学者&#xff09; 初识DICOM文件&#xff0c;发现网上的资料有点少&#xff0c;大部分的资料都不全&#xff0c;在这里做一下总结&#xf…

【转】进阶 JavaScript 必知的 33 个点【进阶必备】

转自&#xff1a;进阶 JavaScript 必知的 33 个点【进阶必备】 进阶 JavaScript 必知的 33 个点【进阶必备】 Original 前端小菜鸡之菜鸡互啄 前端开发爱好者 2022-04-11 08:32 收录于话题#javaScript进阶1个 点击下方“前端开发爱好者”&#xff0c;选择“设为星标” 第一…

【转】自动化构建、自动化部署发布一览

转自&#xff1a;自动化构建、自动化部署发布一览 - 知乎 在软件系统开发的过程中&#xff0c;一个项目工程通常会包含很多的代码文件、配置文件、第三方文件、图片、样式文件等等&#xff0c;是如何将这些文件有效的组装起来最终形成一个可以流畅使用的应用程序的呢&#xff…

承博士:让云计算落地生根的中国云计算平台

2010-01-22 09:48:41 [0评论 ] 金蝶中间件秉承自主创新&#xff0c;努力打造自主知识产权的云计算平台;金蝶Apusic云计算解决方案是为大型企业和组织提供私有云的解决方案&#xff0c;通过云计算中间件平台&#xff0c;为云计算提供落地的务实价值。金蝶中间件与国际厂商合作&…

Microsoft Windows CE .NET 中的中断体系结构

概述 通过 Microsoft Windows CE .NET&#xff0c;Microsoft 已经升级了 Windows CE 的中断体系结构。该操作系统 (OS) 所具有的处理共享中断的能力极大地扩展了 Windows CE .NET 支持许多中断体系结构的能力。本文从原始设备制造商 (OEM) 和应用程序开发人员的角度探讨了处理…

微软企业库5.0学习笔记(三十三)数据访问模块

前言 鉴于企业库5.0已经发布正式版&#xff0c;同时有广大读者的要求&#xff08;臭屁一下&#xff0c;o(∩_∩)o...&#xff09;&#xff0c;后面文章的内容和代码将基于Enterprise Library5.0和Unity2.0来写&#xff0c;感谢大家的一贯支持。 正文 数据库访问模块都能实现哪些…

ARM中断分析之一:中断控制器和CPU、外设的关系

“中断控制器”也是CPU众多外设中的一个&#xff0c;不同的是&#xff0c;它一方面接收其它外设中断引脚的输入&#xff0c;另一方面&#xff0c;它会发出中断信号给CPU。下图是一张中断控制器外设的框图&#xff0c;s3c2410的框图。 为了把中断控制器、CPU、外设联系起来&…

【转】Jenkins项目常用三种构建类型风格详解

转自&#xff1a;Jenkins项目常用三种构建类型风格详解_ぃ小小宇宙的博客-CSDN博客_jenkins项目类型 Jenkins构建的项目类型介绍 jenkins 的安装配置请参考&#xff1a;《jenkins war包安装部署&#xff0c;tomcatJDKmaven》 Jenkins中自动构建项目的类型有很多&#xff0c;…

ARM中断分析之二:裸机下面的中断处理

EINT4中断的裸机处理 这是基于S3C2410的EINT4中断的裸机处理&#xff0c;当中断发生时就把LED灯取反显示。下面是电路图。 上面是外部KEY连接到CPU的EINT4引脚上面&#xff0c;即&#xff1a;按下键就会产生一个中断。 按照先前介绍的&#xff0c;中断处理流程来介绍&#xff0…

【转】Jenkins 构建触发器操作详解

转自&#xff1a;Jenkins 构建触发器操作详解 - 习久性成 - 博客园 前言 触发远程构建 【https://www.cnblogs.com/Rocky_/p/8297260.html】 例如&#xff0c;使用脚本&#xff1a;通过一个网址的访问来触发构建&#xff0c;这样就不需要登录jenkins系统也能触发构建了。 示…

ARM中断分析之三:WinCE驱动的中断分析

现在有许多高端的ARM芯片&#xff0c;像苹果、三星、华为都采用ARM芯片做为智能手机芯片。 这篇文章介绍基于ARM的WinCE操作系统的驱动的中断分析。WinCE驱动分为两类&#xff0c;这里介绍流驱动&#xff0c;流驱动比较简单。 关于流驱动&#xff0c;下面是一张框图&#xff0c…