前一阵子学习了一下工作流,现在写个总结记录一下这个过程。要弄工作流,首先就要有个界面来画图,做web的,没办法,只能选择javascript和silverlight,找来找去,最后用了Shareidea的和Workflow11的界面,在此对他们表示感谢,界面是在Shareidea上面进行的修改,把Workflow11的很多东西也揉进来了,最后合成的一个杂交体。但是最后因为要玩hadoop,要清理磁盘空间,把工程给误删了,直到现在才发现。。我3个月的业余时间完成的代码全部被干掉了,已经无法挽回了,只能做一下追忆罢了,现在把残存的一些代码给发上来,算是纪念一下。

   这是生成xaml的算法。还想说点什么,但是也没有代码了,说啥啊。。 无代码无真相。。 就说点关于自定义节点的问题吧,用flowchart来构图的话,会遇到一个问题,就是并行节点的处理,在我上面的算法当中,是把并行节点开始到并行结束节点之间的节点视作一个FlowNode,但是如果需要并行之后还有并行这些更复杂的工作流节点的话,可以考虑用NativeActivity,下面是我在写动态修改工作流实例的时候在官网上面找到的一些代码,它是一个并行节点的实现,我觉得是一个很重大的发现。

 public sealed class MyParallelActivity : NativeActivity
     {
         Collection<Activity> branches;

         public Collection<Activity> Branches
         {
             get
             {
                 if (this.branches == null)
                 {
                     this.branches = new Collection<Activity>();
                 }
                 return this.branches;
             }
         }

         protected override void Execute(NativeActivityContext context)
         {
             foreach (Activity branch in this.Branches)
             {
                 context.ScheduleActivity(branch);
             }
         }

         protected override void OnCreateDynamicUpdateMap(NativeActivityUpdateMapMetadata metadata, Activity originalActivity)
         {
             metadata.AllowUpdateInsideThisActivity();
         }

         protected override void UpdateInstance(NativeActivityUpdateContext updateContext)
         {
             // look for new branches that need to be scheduled
             foreach (Activity branch in this.Branches)
             {
                 // NativeActivityUpdateContext.IsNewlyAdded looks for children not present in the original (pre-update) activity
                 if (updateContext.IsNewlyAdded(branch))
                 {
                     updateContext.ScheduleActivity(branch);
                 }
             }
         }
     }

  注意Execute方法中的一句话:context.ScheduleActivity(branch);    --->调度执行子活动,看到这一句之后,我确实是很兴奋的,因为之前也想过自己写一个完整的Activity,但是苦于不知道怎么执行它的下一个活动。所以如果想重新实现的朋友请继承NativeActivity来实现,因为除了原生的类型之后,WF只支持NativeActivity动态修改后面的流程。

再想想,还有什么没交代的。。。想到了一个,就是判断条件的,比如switch的这种开关的判断条件,它的判断条件可以是一个CodeActivity<string>,我们可以继承重写一个,然后就可以在Execute方法当中写判断的代码了,这里主要是要用到CodeDom来在运行时动态计算结果。就说这么多了,没代码,什么都讲不清楚了,说了也白说。

  这个故事告诉我,我需要一个保存代码的服务器了。。。

  最后把我残存的那一点代码放出来吧,在CSDN上下载http://download.csdn.net/detail/cenyuhaiwork/5670947

05-11 10:52