原来做的OA项目中用的公务审批这样的工作流。我们自己写的程序来实现。现在微软有了WWF工作流。研究了一下果然很好。里面也有好多好的机制。
WWF工作流有两种:顺序工作流和状态机工作流
一般OA系统或者其他系统的审批流程都是对应微软工作流的状态机工作流,状态机工作需要事件驱动而且一般都有外界用户交互的界面。
这个例子就是简单状态机工作流例子,学会以后自己添加业务处理方法进去来实现自己的审批业务流程
开发工具:vs2005.和wf扩展工具For vs2005。(直接使用vs2008也ok)
建立了两个项目:
1。window应用程序,来工作流和外界用户的交互
2.状态机工作流类库。
先完成状态机工作流类库
1.添加接口文件。在接口文件里面完成工作流将要调用的事件。
using System;
using System.Collections.Generic;
using System.Text;
using System.Workflow;
using System.Workflow.Runtime;
using System.Workflow.Activities;
namespace Workflow
{
[System.Workflow.Activities.ExternalDataExchange]
public interface IEventProcess//接口类。定义了两个方法。开始和处理方法
{
event EventHandler<EventProcessArgs> StartEvent;
event EventHandler<EventProcessArgs> ProcessEvent;
}
[Serializable]//事件传递的参数。是个类继承ExternalDataEventArgs,并且要序列化
public class EventProcessArgs : System.Workflow.Activities.ExternalDataEventArgs
{
public EventProcessArgs(Guid guid)
: base(guid)
{
}
private string message;
public string Message
{
get { return message; }
set { message = value; }
}
}
public class EventProcess : IEventProcess//实现类继承接口。里面有两个方法调用事件。在window程序中就是调用这个两个方法来触发状态机工作流中的事件驱动
{
public void RaiseStart(string gid,string message )
{
Guid guid = new Guid(gid);
EventProcessArgs args = new EventProcessArgs(guid);
args.Message = message;
StartEvent(null, args);
}
public void RaiseProcess(string gid,string message)
{
Guid guid = new Guid(gid);
EventProcessArgs args = new EventProcessArgs(guid);
args.Message = message;
ProcessEvent(null, args);
}
#region IEventProcess 成员
public event EventHandler<EventProcessArgs> StartEvent;
public event EventHandler<EventProcessArgs> ProcessEvent;
#endregion
}
}
2添加状态机工作流文件。
从工具箱拉三个StateActiviey。前两个里面再拖入EventActivity。实例图如下:
第一个EventDrivenAtiviey双击。然后拖入一个handleExternalEventActivity1。配置他的属性:就是接口类型和事件名称。
然后拖拉一个setStateActiviey设置他的目标状态指向第二个state
重复上步操作设置第二个enentActivity。最后图示:
然后编译这个类库文件。
二。打开window应用程序。添加这个类库文件的引用。然后再添加在net栏目下面添加三个工作流相关的dll。
放四个按钮控件:创建工作流引擎,创建工作流实例,触发开始事件,触发处理事件
整个类文件如下。主要是4个按钮事件
namespace WindowsApplication5ForState
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
System.Workflow.Runtime.WorkflowRuntime runtime = null;
//System.Threading.AutoResetEvent autoEvent = new AutoResetEvent(false);
Workflow.EventProcess process = null;
System.Workflow.Runtime.WorkflowInstance instance = null;
private void button1_Click(object sender, EventArgs e)
{
runtime = new WorkflowRuntime();
runtime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>(runtime_WorkflowCompleted);
runtime.WorkflowCreated += new EventHandler<WorkflowEventArgs>(runtime_WorkflowCreated);
runtime.WorkflowIdled += new EventHandler<WorkflowEventArgs>(runtime_WorkflowIdled);
runtime.WorkflowTerminated += new EventHandler<WorkflowTerminatedEventArgs>(runtime_WorkflowTerminated);
ExternalDataExchangeService changeService = new ExternalDataExchangeService();
runtime.AddService(changeService);
process = new Workflow.EventProcess();
changeService.AddService(process);
runtime.StartRuntime();
//autoEvent.WaitOne();
MessageBox.Show("工作流已经完成");
}
void runtime_WorkflowTerminated(object sender, WorkflowTerminatedEventArgs e)
{
MessageBox.Show("工作流引擎被结束");
}
void runtime_WorkflowIdled(object sender, WorkflowEventArgs e)
{
MessageBox.Show("工作流引擎现在处于空闲状态");
}
void runtime_WorkflowCreated(object sender, WorkflowEventArgs e)
{
MessageBox.Show("工作流引擎已经创建");
}
void runtime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)
{
MessageBox.Show("工作流引擎完成");
//autoEvent.Set();
}
private void button2_Click(object sender, EventArgs e)
{
instance = runtime.CreateWorkflow(typeof(Workflow.Workflow1));
instance.Start();
}
private void button3_Click(object sender, EventArgs e)
{
process.RaiseStart(instance.InstanceId.ToString(), "Start event !!");
}
private void button4_Click(object sender, EventArgs e)
{
process.RaiseProcess(instance.InstanceId.ToString(), "Process event !!");
}
}
}
这样就ok了。首先实例化工作流引擎。然后创建一个工作流实例,然后就开始运行工作指定的流程。先是引发开始事件。然后,引发处理事件。整个工作流就完成了
本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。