基于WF4.0流程平台开发过程中的知识积累(一)书签的初级应用

初次接触到微软的WF4.0就被其强大的功能所吸引,然而学习的过程充满了曲折,不得不承认,相比.NET的其他技术来言,学习WF技术还是具有一定的挑战性和艰巨性。
自从接触WF以来,在我脑海中有一个想法逐渐出现并成形。经过断断续续一年多的学习,我觉得时机已经成熟,我决定将一直在脑海中构思的东西付诸成现实,开发一款基于WF4.0的流程平台!
它应该具备如下功能:
1 可视化的流程设计
2 提供具有会签,抢占式签署,逻辑分支等功能的流程节点
3 具备流程执行,打回,撤销,终止,跟踪等基本功能
4 基于WCF,以服务的形式开放接口
5 灵活的基于XML的业务数据解析和存储
在开发流程平台的过程中,我将撰写一系列的WF知识点应用,将开发涉及到的知识点与各位共享和交流,如有错误的地方也请各位指出。
(注意 本系列主要注重应用而非理论,每一篇都将贯穿一个实例进行介绍)
现在就开始本系列开篇"基于WF4.0流程平台开发过程中的知识积累(一)书签的初级应用“
书签是WF4.0一个非常实用的功能,它可以让活动在书签的位置挂起,等待恢复。当我们给一个活动注册一个书签后,流程走到该活动就被会挂起,只有当用户恢复书签后,活动才会继续执行,这有点像流程中的断点。
书签的这个功能正好能符合流程审批功能的需求,当流程走到审批节点后挂起,只用当审批人执行审批操作后,流程才继续执行。
首先打开VS2010,创建一个工作流控制台程序BookMarl1
接下来我们创建一个自定义的审批节点,在工程中右键,新建一个WorkFlow的代码活动,命名为ApproveNode,下面是初始的代码:

public sealed class ApproveNode : CodeActivity
    {
        // 定义一个字符串类型的活动输入参数
        public InArgument<string> Text { get; set; }

        // 如果活动返回值,则从 CodeActivity<TResult>
        // 派生并从 Execute 方法返回该值。
        protected override void Execute(CodeActivityContext context)
        {
            // 获取 Text 输入参数的运行时值
            string text = context.GetValue(this.Text);
        }
    }

将其改为:

public sealed class ApproveNode : NativeActivity
    {
        // 定义一个字符串类型的活动输入参数
        public InArgument<string> Text { get; set; }

        // 如果活动返回值,则从 CodeActivity<TResult>
        // 派生并从 Execute 方法返回该值。
        protected override void Execute(NativeActivityContext context)
        {
            // 获取 Text 输入参数的运行时值
            string text = context.GetValue(this.Text);
            //创建书签
            context.CreateBookmark("HELLO", new BookmarkCallback(Continue));
        }
        //书签恢复后调用的函数
        void Continue(NativeActivityContext context, Bookmark bookmark, object obj)
        {
            
        }  
    }
至于NativeActivity与CodeActivity的区别我这里就不多说了,网上有很多资料进行介绍 ,这里只说明一下,只有继承NativeActivity类的活动才支持创建书签。
context.CreateBookmark("HELLO", new BookmarkCallback(Continue));

这段代码创建了一个名为"HELLO"的书签,当书签被恢复后,会调用函数 void Continue(NativeActivityContext context, Bookmark bookmark, object obj),当书签恢复后,想做某些处理时,可以在该函数中添加代码。

我们生成一下工程,将新的节点拖拽到流程图设计器中,形成下图的流程


接下来,我们实现恢复书签的代码

在Program.cs中原先的代码是这样的

using System;
using System.Linq;
using System.Activities;
using System.Activities.Statements;

namespace BookMark1
{

    class Program
    {
        static void Main(string[] args)
        {
            WorkflowInvoker.Invoke(new Workflow1());
        }
    }
}
为了实现恢复书签功能,这里我们不用WorkflowInvoker,而是改用更高端的WorkflowApplication,至于它们区别网上资料也是很多的。

using System;
using System.Linq;
using System.Activities;
using System.Activities.Statements;

namespace BookMark1
{

    class Program
    {
        static void Main(string[] args)
        {
            WorkflowApplication wa = new WorkflowApplication(new Workflow1());
            wa.Run();
            System.Console.Read();
            wa.ResumeBookmark("HELLO", null);
            for (int i=0; i < 100; )
            {
            }
        }
    }
}
通过WorkflowApplication中的函数ResumeBookmark,恢复名为HELLO的书签,并传递参数给前面提到的Continue函数,这里设置成NULL。

执行程序就可以达到我们想要的审批效果

一开始:


按任意键(相当于审批操作)后:


就此用书签模拟审批的实现完成了!

源代码下载

下一篇将继续介绍书签,介绍"如何利用多书签实现节点的会签效果"






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值