初次接触到微软的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。
执行程序就可以达到我们想要的审批效果
一开始:
按任意键(相当于审批操作)后:
就此用书签模拟审批的实现完成了!
下一篇将继续介绍书签,介绍"如何利用多书签实现节点的会签效果"