WF4.5 状态机使用WorkflowApplication为工作流添加持久性扩展PersistenceParticipant(六)

为什么要添加持久扩展性?开发工作流,往往一些零时属性需要持久化到数据库中,以便恢复工作流继续执行的时候,使用这些属性。

以下使用WorkflowApplication对象创建工作流实例,在使用不同的WorkflowApplication对象加载实例 执行书签,读取持久扩展属性在控制台出来。

使用工作流如下:

WF4.5 状态机使用WorkflowApplication为工作流添加持久性扩展PersistenceParticipant(六)_第1张图片

使用书签代码:

public class BookMarkActivity : NativeActivity
    {

        #region Public Properties

        /// <summary>
        /// Gets or sets BookmarkName.
        /// </summary>
        public InArgument<string> BookmarkName { get; set; }

        #endregion

        #region Properties

        /// <summary>
        /// Gets a value indicating whether CanInduceIdle.
        /// </summary>
        protected override bool CanInduceIdle
        {
            get
            {
                return true;
            }
        }

        #endregion

        #region Methods

        /// <summary>
        /// The execute.
        /// </summary>
        /// <param name="context">
        /// The context.
        /// </param>
        protected override void Execute(NativeActivityContext context)
        {
            context.CreateBookmark(
                this.BookmarkName.Get(context),
                (activityContext, bookmark, value) =>
                {
                    Console.WriteLine("BookMarkCallBack");
                });
            Console.WriteLine("BookMarkCreate Complete");
        }

        #endregion
    }

添加存储扩展性类DataInfo,继承与PersistenceParticipant

public class DataInfo : PersistenceParticipant

PersistenceParticipant是微软提供的持久型存储扩展类

 

创建需要持久化到数据库的属性:

  public class DataInfo : PersistenceParticipant
    {
        public string Name { get; set; }

        public int Age { get; set; }

    }

创建XNamespace,XNamespace序列化进数据库里的Xml命名空间

Public XNamespace xNS = XNamespace.Get(http://gTest/DateInfo);

重写CollectValues方法,CollectValues方法是持久化数据库时需要保存的属性

protected override void CollectValues(out IDictionary<System.Xml.Linq.XName, object> readWriteValues, out IDictionary<System.Xml.Linq.XName, object> writeOnlyValues)
        {
            readWriteValues = new Dictionary<XName, object>();
            readWriteValues.Add(xNS.GetName("Name"), Name);
            readWriteValues.Add(xNS.GetName("Age"), Age);

            writeOnlyValues = null;
        }

重写PublishValues方法,PublishValues方法是恢复工作流后需要读取的属性

protected override void PublishValues(IDictionary<XName, object> readWriteValues)
        {
            object loadedData;
            if (readWriteValues.TryGetValue(xNS.GetName("Name"), out loadedData))
            {
                this.Name = loadedData.ToString();
            }
            if (readWriteValues.TryGetValue(xNS.GetName("Age"), out loadedData))
            {
                this.Age = (int)loadedData;
            }
        }

添加自定义活动,初始化DataInfo

  public class InitDataInfoActivity : CodeActivity
    {
        protected override void Execute(CodeActivityContext context)
        {
            DataInfo info = context.GetExtension<DataInfo>();
            info.Age = 25;
            info.Name = "liGang";
            Console.WriteLine("Data Info Init Name = {0} age ={1}", info.Name, info.Age);
        }
}

添加自定义活动,查看DataInfo

 public class DisplayDateInfoActivity : CodeActivity
    {
        protected override void Execute(CodeActivityContext context)
        {
            DataInfo info = context.GetExtension<DataInfo>();
            Console.WriteLine("恢复工作流后 Name = {0} age = {1}", info.Name, info.Age);
        }
    }

在状态机中添加这2个活动

在init 中添加InitDataInfoActivity

WF4.5 状态机使用WorkflowApplication为工作流添加持久性扩展PersistenceParticipant(六)_第2张图片

 

在FinalState 中添加DisplayDateInfoActivity活动

 

 

WF4.5 状态机使用WorkflowApplication为工作流添加持久性扩展PersistenceParticipant(六)_第3张图片

 

在Main里创建工作流并运行于调用工作流。

public static class SqlInstanceStore
    {
        static SqlInstanceStore()
        {
            //创建SqlWorkflowInstanceStore持久化实例
            InstanceStore = new SqlWorkflowInstanceStore(@"Data Source=.\SQLEXPRESS;Initial Catalog=SampleInstanceStore;Integrated Security=True;Asynchronous Processing=True");

        }
        public static SqlWorkflowInstanceStore InstanceStore { get; private set; }
    }


    class Program
    {
        static StateMachineWorkFlow context = new StateMachineWorkFlow();
        protected static AutoResetEvent reset = new AutoResetEvent(false);
        static void Main(string[] args)
        {
            WorkflowApplication Host = new WorkflowApplication(context)
            {
                InstanceStore = SqlInstanceStore.InstanceStore,
                Idle = OnIdle,
                PersistableIdle = OnPersistableIdle
            };

            Host.Extensions.Add(new DataInfo());

            Host.Run();

            Console.ReadLine();

        }

        public static void OnIdle(WorkflowApplicationIdleEventArgs args)
        {

            Console.WriteLine("OnIdle");
        }

        public static PersistableIdleAction OnPersistableIdle(WorkflowApplicationIdleEventArgs arg)
        {
            return PersistableIdleAction.Persist;
        }
    }

运行结果:

WF4.5 状态机使用WorkflowApplication为工作流添加持久性扩展PersistenceParticipant(六)_第4张图片

打开sql server 可以看到:

WF4.5 状态机使用WorkflowApplication为工作流添加持久性扩展PersistenceParticipant(六)_第5张图片

InstancesTable表的PrimitiveDataProperties列已经被写上了,持久扩展属性的数据就被序列化到这里面

 

创建新的workFlowApplication获取实例Id 执行书签

在Main函数里面加入下面代码:

/*创建另一个workFlowApplication执行BookMark*/
            WorkflowApplication Host1 = new WorkflowApplication(context)
            {
                InstanceStore = SqlInstanceStore.InstanceStore,
                Idle = OnIdle,
                PersistableIdle = OnPersistableIdle
            };

            Host1.Extensions.Add(new DataInfo());

            Host1.Load(Host.Id);

            Host1.ResumeBookmark("FinalWait", null);

运行结果:

WF4.5 状态机使用WorkflowApplication为工作流添加持久性扩展PersistenceParticipant(六)_第6张图片

源代码:http://files.cnblogs.com/qugangf/TestPersistenceParticipant.rar 

你可能感兴趣的:(application)