WWF之简单的状态机工作流例子

原来做的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注册。

posted @ 2008-01-18 19:23  音乐啤酒  阅读(940)  评论(0编辑  收藏  举报