基于WF4.0流程平台开发过程中的知识积累(三)书签实现子流程
2014-04-28 21:05
495 查看
WF4.0中书签是一个看似简单实际上是一个非常有用的功能,灵活的运用书签能实现很多不同的功能。本篇就介绍如何利用书签实现一个主流程动态调用子流程。
首先介绍一下,主流程与子流程的调用关系,如下图:
当主流程发起后,流传到调用子流程节点后,发起子流程。此时流程将在子流程中流程,直至子流程结束后重新流转至主流程。
本文的思路是利用书签,在进入调用子流程节点时,给主流程创建一个书签,让主流程暂停。同时发起另外一个子流程,并将书签的名称作为输入参数传入子流程中。当子流程结束时,利用被输入的书签名称释放主流程的书签,此时子流程结束,主流程恢复进行流转。
下面我们就来实现这个例子,先创建一个名为BookMark3的控制台WorkFlow工程,随后创建一个名为ChildStart的自定义活动,用它来调用子流程,代码如下:
在Execute函数内,首先创建了一个书签,书签名字为Guid(唯一吗)的字符型,随后利用WorkflowApplication发起了一个ChildWF类型的流程,并把 书签名称作为参数输入该流程。
再创建一个名为ChildEnd的自定义流程 ,用它作为子流程的结束节点,代码如下:
在该活动中有一个名为BookMark的输入参数,实际上,子流程将书签的名称传递给了该活动(如何传递看下面介绍),然后该活动利用传入的书签名称,将主流程对应的WorkflowApplication(这里是全局对象)恢复书签,从而让主流程继续执行下去。
完成好自定义活动后,我们来实现主流程的设计,主流程如下图:
其中节点ChildStart是用来发起子流程的。
子流程的设计如下图:
其中ChildEnd节点是用于在子流程结束时恢复主流程的运行,另外我们还增加了一个Delay节点,用来延时10秒,这样我们能看清流程的运行过程,避免一闪而过。
前面提到需要把书签作为参数输入子流程,因此我们还有两步操作
第一步,在流程中建立名为BookMark的输入参数变量,如下图:
第二步,我们还要把这个参数传入ChildEnd节点,ChildEnd节点有一个自定义的属性,名为BookMark。
我们在对应的值中输入BookMark,意味着该属性与流程的输入参数BookMark绑定了。
最后,我们完成主函数代码,代码如下:
就此我们的例子就完成了,运行该工程,执行后的结果如下图:
代码下载
下一篇,我将开始介绍新的一部分内容,如何实现WF4.0的持久化 。
首先介绍一下,主流程与子流程的调用关系,如下图:
当主流程发起后,流传到调用子流程节点后,发起子流程。此时流程将在子流程中流程,直至子流程结束后重新流转至主流程。
本文的思路是利用书签,在进入调用子流程节点时,给主流程创建一个书签,让主流程暂停。同时发起另外一个子流程,并将书签的名称作为输入参数传入子流程中。当子流程结束时,利用被输入的书签名称释放主流程的书签,此时子流程结束,主流程恢复进行流转。
下面我们就来实现这个例子,先创建一个名为BookMark3的控制台WorkFlow工程,随后创建一个名为ChildStart的自定义活动,用它来调用子流程,代码如下:
public sealed class ChildStart : NativeActivity { // 定义一个字符串类型的活动输入参数 public InArgument<string> Text { get; set; } /// <summary> /// 重写这个方法,以便返回true值,true用来控制工作流闲置,可以挂起 /// 默认的情况为false,表示工作流不会挂起执行,因此用户无法和工作流之间进///行交互 /// </summary> protected override bool CanInduceIdle { get { return true; } } // 如果活动返回值,则从 CodeActivity<TResult> http:// // 派生并从 Execute 方法返回该值。 protected override void Execute(NativeActivityContext context) { // 获取 Text 输入参数的运行时值 string text = context.GetValue(this.Text); string strguid = Guid.NewGuid().ToString(); //创建书签 context.CreateBookmark(strguid, new BookmarkCallback(Continue)); Dictionary<string,object> param = new Dictionary<string,object>(); param.Add("BookMark", strguid); WorkflowApplication wa = new WorkflowApplication(new ChildWF(),param); wa.Run(); } //书签恢复后调用的函数 void Continue(NativeActivityContext context, Bookmark bookmark, object obj) { } }
在Execute函数内,首先创建了一个书签,书签名字为Guid(唯一吗)的字符型,随后利用WorkflowApplication发起了一个ChildWF类型的流程,并把 书签名称作为参数输入该流程。
再创建一个名为ChildEnd的自定义流程 ,用它作为子流程的结束节点,代码如下:
public sealed class ChildEnd : NativeActivity { // 定义一个字符串类型的活动输入参数 public InArgument<string> BookMark { get; set; } // 如果活动返回值,则从 CodeActivity<TResult> // 派生并从 Execute 方法返回该值。 protected override void Execute(NativeActivityContext context) { // 获取 Text 输入参数的运行时值 string StrBookMark = context.GetValue(this.BookMark); Program.wa.ResumeBookmark(StrBookMark, null); } }
在该活动中有一个名为BookMark的输入参数,实际上,子流程将书签的名称传递给了该活动(如何传递看下面介绍),然后该活动利用传入的书签名称,将主流程对应的WorkflowApplication(这里是全局对象)恢复书签,从而让主流程继续执行下去。
完成好自定义活动后,我们来实现主流程的设计,主流程如下图:
其中节点ChildStart是用来发起子流程的。
子流程的设计如下图:
其中ChildEnd节点是用于在子流程结束时恢复主流程的运行,另外我们还增加了一个Delay节点,用来延时10秒,这样我们能看清流程的运行过程,避免一闪而过。
前面提到需要把书签作为参数输入子流程,因此我们还有两步操作
第一步,在流程中建立名为BookMark的输入参数变量,如下图:
第二步,我们还要把这个参数传入ChildEnd节点,ChildEnd节点有一个自定义的属性,名为BookMark。
我们在对应的值中输入BookMark,意味着该属性与流程的输入参数BookMark绑定了。
最后,我们完成主函数代码,代码如下:
class Program { public static WorkflowApplication wa; static void Main(string[] args) { wa = new WorkflowApplication(new Workflow1()); wa.Run(); Console.Read(); } }
就此我们的例子就完成了,运行该工程,执行后的结果如下图:
代码下载
下一篇,我将开始介绍新的一部分内容,如何实现WF4.0的持久化 。
相关文章推荐
- 基于WF4.0流程平台开发过程中的知识积累(二)多书签会签
- 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 4.0 最新发布版本 -下载使用说明
- 基于WF设计业务流程平台-架构
- 基于WF设计业务流程平台-架构
- 基于Wiki的网络协作/知识积累试验平台
- 基于模型设计的FPGA开发与实现:基本流程(一)概述
- 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 插件标记实现
- 基于插件开发的Android实现流程
- 基于WF设计业务流程平台_消息收集、通知接口
- 基于微信硬件公众平台的智能控制开发流程
- 基于.NET平台的应用程序开发中实现唯一应用程序运行实例
- 驰骋工作流程引擎案例-水质检测工作流程设计开发实现过程 3ff8
- 一个基于WF的业务流程平台
- 基于WF设计业务流程平台_特定群体与特定人
- 关于[一个基于WF的业务流程平台]表设计的说明
- 基于微信硬件公众平台的智能控制开发流程
- 基于.Net(C#开发)平台的三层框架架构软件的设计与实现
- WF4.0实战(十二):ASP.NET MVC2.0结合WF4.0实现用户多步注册流程
- 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 服务定位器(SL)与AgileEAS.NET中的实现
- windows7平台搭建Python3开发环境(本学习过程全部基于Python3.x)