详解WF 4.0中如何实现子流程
创始人
2024-06-22 07:31:02
0

在WF 4.0中,存在不同种类的流程。本文将介绍的子流程如何在主流程中实现的原理,希望对大家有所帮助。

工作流服务中,经常会在主流程启用一些子流程。我在审批流程中经常会使用bookmark来暂停流程,这篇文章,将结合bookmark来实现主流程启动子流程。

使用以前的一篇WF4.0自定义持久化中的自定义的持久化。不过数据表中加入了一个字段parentid,用于标识父流程:

代码

下面用一个流程实例为例说明主流程是如何启用子流程,子流程又是如何返回主流程的,主流程如下:

主流程

***个节点“***站审核”和第三个节点“第二站审核”都是BookMark书签,附BookMark的代码如下:

代码

  1. public sealed class Read : NativeActivity  
  2.     {  
  3.         public Read()  
  4.             : base()  
  5.         {  
  6.         }  
  7.  
  8.         public string BookmarkName { get; set; }  
  9.  
  10.         // Define an activity input argument of type string  
  11.         public InArgument Text { get; set; }  
  12. // Must return true for a NativeActivity that creates a bookmark  
  13.         protected override bool CanInduceIdle  
  14.         {  
  15.             get { return true; }  
  16.         }  
  17.  
  18.         protected override void Execute(NativeActivityContext context)  
  19.         {  
  20. context.CreateBookmark(this.BookmarkName, new BookmarkCallback(this.Continue));  
  21.         }  
  22.  void Continue(NativeActivityContext context, Bookmark bookmark, object obj)  
  23.         {  
  24.             this.Result.Set(context, (TResult)obj);  
  25.         } 

第二个节点“启用子流程”,它是一个自定义的节点,代码如下:

代码

  1. public sealed class CallChild : Activity  
  2.    {  
  3.  
  4.        public string FlowName { get; set; }  
  5.  
  6.        public CallChild()  
  7.        {  
  8.   base.Implementation = new Func(CreateBody);  
  9.        }  
  10.  
  11.        public Activity CreateBody()  
  12.        {  
  13.  
  14.            return new Sequence  
  15.            {  
  16.                DisplayName = "子流程",  
  17.                Activities =  
  18.                    {     
  19.                        new ChildCodeActivity  
  20.                        {  
  21.                            FlowName=this.FlowName        
  22.                        }  
  23.                        ,  
  24.                        new Read  
  25.                        {  
  26.                            BookmarkName="CallChild",  
  27.                           
  28.                        }                   
  29.                    }       };        }    } 

注意上面的ChildCodeActivity类,实际上是在ChildCodeActivity中启动子流程的,ChildCodeActivity后面是一个书签,用于暂停主流程。当子流程完成后,在子流程中恢复这个书签,子流程结束,主流程继续往下跑。这个活动中有一个FlowName属性,用于表示是启用哪个子流程。ChildCodeActivity代码如下:

代码

  1. sealed class ChildCodeActivity : CodeActivity  
  2.     {  
  3. // Define an activity input argument of type string  
  4.         public string FlowName { get; set; }  
  5. // If your activity returns a value, derive from CodeActivity  
  6. // and return the value from the Execute method.  
  7.         protected override void Execute(CodeActivityContext context)  
  8.         {  
  9.             Guid ChildGuid;  
  10.             ChildGuid = WorkFlowRun.CreateAndRun(FlowName);  
  11. InstancesTable obj = InstancesTableBiz.GetInstancesTable(ChildGuid);
  12. //取得子流程的id  
  13.             obj.parentid = context.WorkflowInstanceId;  
  14.             InstancesTableBiz.UpdateInstancesTable(obj);//跟新父流程id  
  15.         }  
  16.     } 

WorkFlowRun.CreateAndRun(FlowName)根据FlowName启动相应的子流程,并得到实例的Guid。并将子流程的parentid修改改成主流程的guid。

子流程的示例如下:

子流程的示例

#T#

子流程的***个节点“子流程***站审核”和第二个节点“子流程第二站审核”也都是BookMark书签。

***一个节点是“结束”。这个节点也至关重要,因为我是使用这个节点,从子流程中返回到主流程的。因此,每个子流程都会有End节点,它的代码如下:

代码

  1. public sealed class End : CodeActivity  
  2.   {  
  3.       // Define an activity input argument of type string  
  4.       public InArgument Text { get; set; }  
  5.  
  6.  // If your activity returns a value, derive from CodeActivity  
  7.       // and return the value from the Execute method.  
  8.       protected override void Execute(CodeActivityContext context)  
  9.       {  
  10.           // Obtain the runtime value of the Text input argument  
  11.           string text = context.GetValue(this.Text);  
  12.           Guid id = context.WorkflowInstanceId;  
  13.           InstancesTable Obj = InstancesTableBiz.GetInstancesTable(id);  
  14.           if (Guid.Empty != Obj.parentid)//如果是子流程,返回父流程  
  15.           {  
  16.   WorkFlowRun.Submit(Obj.parentid, "ParentProcess", "returnMain");  
  17.           }  
  18.       }  
  19.   } 

这是我思考出的在WF4.0中一个启用子流程的方案,如果你有什么更好的方案和建议,请给我留言,谢谢。

原文标题:WF4.0中实现子流程

链接:http://www.cnblogs.com/zhuqil/archive/2010/01/31/SubProcessDemo.html

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...