//Saves the persistance data to an xml file. void Save(IDictionary <XName, InstanceValue> instanceData) { string fileName = IOHelper.GetFileName(this.ownerInstanceID); XmlDocument doc = new XmlDocument(); doc.LoadXml("<InstanceValues/>"); foreach (KeyValuePair <XName, InstanceValue> valPair in instanceData) { XmlElement newInstance = doc.CreateElement("InstanceValue"); XmlElement newKey = SerializeObject("key", valPair.Key, doc); newInstance.AppendChild(newKey); XmlElement newValue = SerializeObject("value", valPair.Value.Value, doc); newInstance.AppendChild(newValue); doc.DocumentElement.AppendChild(newInstance); } doc.Save(fileName); }
//The persistence engine will send a variety of commands to the configured InstanceStore, //such as CreateWorkflowOwnerCommand, SaveWorkflowCommand, and LoadWorkflowCommand. //This method is where we will handle those commands protected override IAsyncResult BeginTryCommand(InstancePersistenceContext context, InstancePersistenceCommand command, TimeSpan timeout, AsyncCallback callback, object state) { IDictionary <XName, InstanceValue> data = null; //The CreateWorkflowOwner command instructs the instance store to create a new instance owner bound to the instanace handle if (command is CreateWorkflowOwnerCommand) { context.BindInstanceOwner(ownerInstanceID, Guid.NewGuid()); } //The SaveWorkflow command instructs the instance store to modify the instance bound to the instance handle or an instance key else if (command is SaveWorkflowCommand) { SaveWorkflowCommand saveCommand = (SaveWorkflowCommand)command; data = saveCommand.InstanceData; Save(data); } //The LoadWorkflow command instructs the instance store to lock and load the instance bound to the identifier in the instance handle else if (command is LoadWorkflowCommand) { string fileName = IOHelper.GetFileName(this.ownerInstanceID); try { using (FileStream inputStream = new FileStream(fileName, FileMode.Open)) { data = LoadInstanceDataFromFile(inputStream); //load the data into the persistence Context context.LoadedInstance(InstanceState.Initialized, data, null, null, null); } } catch (Exception exception) { throw new PersistenceException(exception.Message); } } return(new CompletedAsyncResult <bool>(true, callback, state)); }