为什么要添加持久扩展性?开发工作流,往往一些零时属性需要持久化到数据库中,以便恢复工作流继续执行的时候,使用这些属性。
以下使用WorkflowApplication对象创建工作流实例,在使用不同的WorkflowApplication对象加载实例 执行书签,读取持久扩展属性在控制台出来。
使用工作流如下:
使用书签代码:
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
在FinalState 中添加DisplayDateInfoActivity活动
在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; } }
运行结果:
打开sql server 可以看到:
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);
运行结果:
源代码:http://files.cnblogs.com/qugangf/TestPersistenceParticipant.rar