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,一经查实,立即删除!

相关文章

Linux 命令平时积累

我是Windows Live Writer 写博客&#xff0c;来记录我平时遇到的一些问题和解决的方法。 记得刚刚接触Linux的时候&#xff0c;自己真是一名不折不扣的菜鸟&#xff0c;通过一年的努力&#xff0c;自己可以单独操作Linux了&#xff0c;我将把以后遇到的比较有用的命令积累在这篇…

【转】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。以下内…

sql 替换text字段中的指定字符

--text不能直接替换 --mbody未目标字段update b_mail set mbodyreplace(convert(varchar(max),mbody),_viewstate,viewstate) where mno124转载于:https://www.cnblogs.com/stealther/archive/2010/04/02/1703191.html

【转】DICOM开发工具总结

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

Wince6.0编译错误经验总结

Wince6.0编译错误经验总结 一 编译wince系统并模拟运行应注意的问题 1&#xff09;&#xff1a; Public目录下的代码最好不要擅自修改。在确认需要修改时&#xff0c;得拷贝出来放到BSP目录下&#xff0c;再根据实际情况进行修改。 另外&#xff0c;编译WinCE系统时&#xff…

使用Combres 库 ASP.NET 网站优化

网站优化理论方面可以看杨正祎同学的文章如何提高网页的效率&#xff08;上篇&#xff09;——提高网页效率的14条准则&#xff0c;如何提高网页的效率&#xff08;下篇&#xff09;——Use YSlow to know why your web Slow&#xff0c;本文给你介绍一个实际的类库帮助你完成网…

【转】foreach for each for_each引发的探讨:c++世界中的循环语句

转自&#xff1a;foreach for each for_each引发的探讨&#xff1a;c世界中的循环语句_w_419675647的博客-CSDN博客 一 背景&#xff1a; 代码中看到 for each&#xff0c;注意&#xff0c;两个单词中间没有下划线&#xff0c;有同事问这个是不是和 for_each一样&#xff1f;…

基于ArcEngine实现分组统计面积的功能

可以使用IQueryFilterDefinition里的PostfixClause来实现SQL语句里的group by, order by等的功能。 例如&#xff1a; IQueryFilter pQueryFilter new QueryFilterClass(); pQueryFilter.subfield"qsdwdm,qsxz,dlbm,sum(mj) as mj,sum(tkmj) as tkmj" pQueryFilter.w…

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

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

交易机项目工作日志--2013-01-30

又是一个不眠之夜。 昨天王哥做的新板子&#xff0c;用我编译的内核无法启动&#xff0c;卡在串口的初始化。但用开发板光盘上自带的内核确可以启动。 对比两个内核的打印信息。 [31m[UART] DMA init CH:0 [0m[31m[UART] DMA init CH:1 [0m [31m[UART] DMA init CH:1 [0m[3…

开机显示c:\windows\windows32\config\system文件损坏或丢失的解决方法(收集)

开机显示"c:\windows\windows32\config\system文件损坏或丢失。提示用软盘或光盘启动&#xff0c;用安装盘。 XP系统system文件损坏的修复 2009-04-15 Cbsi中国PChome.net 类型: 转载 来源: 163博客 责编: 吴宏 [评论1条] 方法一&#xff1a;用原盘XP光驱启动&#xff0c;…

修改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;只要是中国人…

wince的调试串口作为普通串口使用

目前wince的串口0是作为调试串口用的&#xff0c;但是因为我的案子需要3个串口&#xff0c;所以要把它改为普通串口&#xff0c;但是开机时候还是需要打印debug信息&#xff0c;鉴于此&#xff0c;我修改如下&#xff1a;debug.c中加入一行&#xff1a;int DebugConsoleEnabled…

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

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

x210 debug口当普通串口使用

方法共三步&#xff1a; 第一步: 修改文件wince600\platform\smdkv210\common\dbgserial\dbgserial.c中的三个函数 OEMInitDebugSerial() { ... if (g_pUARTReg NULL) { #if (DEBUG_PORT DEBUG_UART0) // UART0 g_pUARTReg (UART_REG *)OALPA…

【转】卷积的本质及物理意义(全面理解卷积)

转自&#xff1a;卷积的本质及物理意义&#xff08;全面理解卷积&#xff09;_彼岸花-CSDN博客_卷积的物理意义 卷积的本质及物理意义 提示&#xff1a;对卷积的理解分为三部分讲解1&#xff09;信号的角度2&#xff09;数学家的理解&#xff08;外行&#xff09;3&#xff0…

对象结构

根对象&#xff1a;领域模型中的聚合根。代表了领域模型中一个完整的领域概念&#xff0c;如订单。子对象&#xff1a;从属于另一个对象&#xff08;父对象&#xff09;&#xff0c;是父对象的一部分。子对象的生命周期小于等于父对象的生命周期&#xff0c;如订单项。友元对象…