浅析 自定义PersistenceService类

转载并用C#语言重写,文章很简单,学习用

该例自定义了一个将实例持久化到磁盘文的操作,分两部分
第一部分是实现PersistenceService类,第二部分是操作磁盘的功能类

实现PersistenceService类

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.Specialized;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;
using System.Workflow.ComponentModel;
using System.Windows.Forms;

namespace WorkflowLibrary1
{
    public class 自定义Persistence服务 : WorkflowPersistenceService
    {
        /*
         当实例进入Idle状态时,引擎是否自动调用unload
         为True 时,当实例进入Idle状态时,引擎自动调用实例的unload方法,
         具体见 SqlWorkflowPersistenceService类 的
        */
        private bool unloadOnIdleValue = false;

        /// <summary>
        /// 注本服务默认为进入Idle状态的的实例不被引擎自动调用unload方法
        /// </summary>
        public 自定义Persistence服务()
        {
        }

        /// <summary>
        /// 跟据传入的参数,操作当前实例的操作模式值:unloadOnIdleValue
        /// </summary>
        /// <param name="unloadOnIdle"></param>
        public 自定义Persistence服务(bool unloadOnIdle)
        {
            unloadOnIdleValue = unloadOnIdle;
        }

        /// <summary>
        /// 载入已完成的activity
        /// </summary>
        /// <param name="scopeId"></param>
        /// <param name="outerActivity"></param>
        /// <returns></returns>
        protected override Activity LoadCompletedContextActivity(Guid scopeId, Activity outerActivity)
        {
            System.Collections.ArrayList a = new System.Collections.ArrayList();

            a.Add("实例:" + scopeId.ToString());

            MessageBox.Show("准备:载入已完成的activity:LoadCompletedContextActivity", a.ToString());

            object obj = 磁盘文件操作.加载(scopeId, outerActivity);

            return obj as Activity;
        }

        /// <summary>
        /// 载入实例
        /// </summary>
        /// <param name="instanceId"></param>
        /// <returns></returns>
        protected override Activity LoadWorkflowInstanceState(Guid instanceId)
        {
            System.Collections.ArrayList a = new System.Collections.ArrayList();

            a.Add("实例:" + instanceId.ToString());

            MessageBox.Show("准备:载入实例:LoadWorkflowInstanceState", a.ToString());

            object obj = 磁盘文件操作.加载(instanceId, null);

            return obj as Activity;
        }

        /// <summary>
        /// 保存已完成的状态
        /// </summary>
        /// <param name="activity"></param>
        protected override void SaveCompletedContextActivity(Activity activity)
        {
            Guid contextGuid = new Guid();

            contextGuid = (Guid)activity.GetValue(Activity.ActivityContextGuidProperty);

            System.Collections.ArrayList a = new System.Collections.ArrayList();

            a.Add("实例:" + contextGuid.ToString());

            磁盘文件操作.保存(activity, contextGuid, true);
        }

        /// <summary>
        /// 保存实例
        /// </summary>
        /// <param name="rootActivity"></param>
        /// <param name="unlock"></param>
        protected override void SaveWorkflowInstanceState(Activity rootActivity, bool unlock)
        {
            Guid contextGuid = new Guid();

            contextGuid = (Guid)rootActivity.GetValue(Activity.ActivityContextGuidProperty);

            System.Collections.ArrayList a = new System.Collections.ArrayList();

            a.Add("实例:" + contextGuid.ToString());

            a.Add("unlock:" + unlock.ToString());

            MessageBox.Show("准备:保存调理:SaveWorkflowInstanceState", a.ToString());

            磁盘文件操作.保存(rootActivity, contextGuid, unlock);
        }

        /// <summary>
        /// 返回对进入IDLE状态的实例的解决模式
        /// </summary>
        /// <param name="activity"></param>
        /// <returns></returns>
        protected override bool UnloadOnIdle(Activity activity)
        {
            //为True 时,当实例进入Idle状态时,引擎自动调用实例的unload方法,
            Guid contextGuid = new Guid();

            contextGuid = (Guid)activity.GetValue(Activity.ActivityContextGuidProperty);

            System.Collections.ArrayList a = new System.Collections.ArrayList();

            a.Add("模式值:" + unloadOnIdleValue.ToString());
           
            a.Add("实例:" + contextGuid.ToString());

            MessageBox.Show("返回对进入IDLE状态的实例的解决模式:UnloadOnIdle", a.ToString());

            return unloadOnIdleValue;
        }

        /// <summary>
        /// 对锁定的实例解锁,使实例可被操作
        /// </summary>
        /// <param name="rootActivity"></param>
        protected override void UnlockWorkflowInstanceState(Activity rootActivity)
        {
            Guid contextGuid;

            contextGuid = (Guid)rootActivity.GetValue(Activity.ActivityContextGuidProperty);

            System.Collections.ArrayList a = new System.Collections.ArrayList();

            a.Add("被解锁的实例:" + contextGuid.ToString());

            MessageBox.Show("准备:对锁定的实例解锁:UnlockWorkflowInstanceState", a.ToString());

            磁盘文件操作.UnLock(contextGuid);
        }
    }
}

 

操作磁盘的功能类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.IO.Compression;
using System.Collections.Specialized;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;
using System.Workflow.ComponentModel;
using System.Windows.Forms;

namespace WorkflowLibrary1
{

    /// <summary>
    /// 该类是将工作流实例保存到磁盘、从磁盘上加载的实体操作类
    /// </summary>

    class 磁盘文件操作
    {
        static FileStream 流 = null;

        static string 文件名 = null;

        /// <summary>
        /// 保存activity实例状态到文件
        /// </summary>
        /// <param name="rootActivity">活动对象</param>
        /// <param name="id">Instance的Guid</param>
        /// <param name="unlock">是否锁</param>
        public static void 保存(Activity rootActivity, Guid id, bool unlock)
        {
            //以当前工作流的实例ID为文件名
            文件名 = id.ToString();

            try
            {
                //如果存在该文件,就删除
                if (File.Exists(文件名))
                    File.Delete(文件名);

                //新建流
                流 = new FileStream(文件名, FileMode.CreateNew, FileAccess.Write, FileShare.None);

                //将工作流实例写入流
                rootActivity.Save(流);
            }
            catch
            {

            }
            finally
            {
                if (!(流 == null))
                    流.Close();
            }

            MessageBox.Show("磁盘文件操作-保存", "保存完成:" + 文件名.ToString());
        }

        /// <summary>
        ///
        /// </summary>
        /// <param name="id">Instance实例ID</param>
        /// <param name="outerActivity"></param>
        public static object 加载(Guid id, Activity outerActivity)
        {
            文件名 = id.ToString();

            Object obj = null;
            try
            {
                //从磁盘新建流
                流 = new FileStream(文件名, FileMode.Open, FileAccess.Read, FileShare.Read);

                //从磁盘载入流
                流.Seek(0, SeekOrigin.Begin);

                obj = Activity.Load(流, outerActivity);

                MessageBox.Show("磁盘文件操作-加载", "保存完成:" + 文件名.ToString());

               
            }
            catch
            {
            }
            finally
            {
                流.Close();
            }

            return obj;
        }

        /// <summary>
        /// 该段代码用于实现对磁盘文件的解锁,如果上面提供了对磁盘文件的锁定操作
        /// </summary>
        /// <param name="id"></param>
        public static void UnLock(Guid id)
        {
            try
            {
                文件名 = id.ToString();
                流 = new FileStream(文件名, FileMode.Open);
                File.SetAttributes(文件名, FileAttributes.Normal);
            }
            catch
            {

            }
            finally
            {
                流.Close();
            }

            MessageBox.Show("磁盘文件操作-解锁", "解锁完成:" + 文件名.ToString());
        }
    }
}

 

然后象加载SqlWorkflowPersistenceService类一样使用就可以了

WorkflowRuntime 引擎 = new WorkflowRuntime();
object 自定义PS = new WorkflowLibrary1.自定义Persistence服务(true);
引擎.AddService(自定义PS);

posted @ 2009-02-04 11:01  除了这些,还有。。。  阅读(330)  评论(0编辑  收藏  举报