using System; using System.Workflow.Runtime.Hosting; using System.Workflow.ComponentModel; using System.IO; namespace FilePersisetenceService { public class FileWorkFlowPersisetenceService: WorkflowPersistenceService { private string fBaseDir; public FileWorkFlowPersisetenceService(string basedir) { this.fBaseDir = basedir; } protected override Activity LoadCompletedContextActivity(Guid scopeId, Activity outerActivity) { object obj = DeserializeActivity(outerActivity, scopeId); return (Activity)obj; } protected override Activity LoadWorkflowInstanceState(Guid instanceId) { object obj = DeserializeActivity(null, instanceId); return (Activity)obj; } protected override void SaveCompletedContextActivity(Activity activity) { Guid contextGuid = (Guid)activity.GetValue(Activity.ActivityContextGuidProperty); SerializeActivity(activity, contextGuid); } protected override void SaveWorkflowInstanceState(Activity rootActivity, bool unlock) { Guid contextGuid = (Guid)rootActivity.GetValue(Activity.ActivityContextGuidProperty); SerializeActivity(rootActivity, contextGuid); } protected override bool UnloadOnIdle(Activity activity) { return true; } protected override void UnlockWorkflowInstanceState(Activity rootActivity) { //empty } private void SerializeActivity(Activity RootActivity, Guid id) { string filename = GetFileName(id); using (FileStream stream = new FileStream(filename, FileMode.OpenOrCreate)) { RootActivity.Save(stream); stream.Close(); } } private object DeserializeActivity(Activity RootActivity, Guid id) { string filename = GetFileName(id); object result; using (FileStream stream = new FileStream(filename, FileMode.Open)) { result = Activity.Load(stream, RootActivity); stream.Close(); } return result; } private string GetFileName(Guid id) { return Path.Combine(this.fBaseDir, id.ToString() + ".bin"); } } }