This sample WF workflow helps to illustrate the functionality of the persistence service. The workflow consists of a sequence of three activities defined in Table 2.
The following code shows a sample persistence service that serializes the workflow instance state to a file.
public class FilePersistenceProvider: StatePersistenceService
{
public FilePersistenceProvider(string basedir)
{
FBaseDir = basedir;
}
private string FBaseDir;
public override void SaveWorkflowInstanceState(Activity rootActivity, bool unlock)
{
ActivityExecutionContextInfo contextInfo = (ActivityExecutionContextInfo)rootActivity.GetValue(Activity.ActivityExecutionContextInfoProperty);
SerializeActivity(rootActivity, contextInfo.ContextGuid);
}
// load workflow instance state
public override Activity LoadWorkflowInstanceState(Guid instanceId)
{
object obj = DeserializeActivity(null, instanceId);
return (Activity)obj ;
}
// unlock workflow instance state.
// instance state locking is necessary when multiple runtimes share instance persistence store
public override void UnlockWorkflowInstanceState(Activity state)
{
//not implemented...
}
// save completed scope activity state
public override void SaveCompletedContextActivity(Activity rootActivity)
{
ActivityExecutionContextInfo contextInfo = (ActivityExecutionContextInfo)rootActivity.GetValue(Activity.ActivityExecutionContextInfoProperty);
SerializeActivity(rootActivity, contextInfo.ContextGuid);
}
// Load completed scope activity state.
public override Activity LoadCompletedContextActivity(Guid activityId, Activity outerActivity)
{
object obj = DeserializeActivity(outerActivity, activityId);
return (Activity)obj ;
}
private void SerializeActivity(Activity RootActivity, Guid id)
{
string filename = FBaseDir + "\\" + id.ToString() + ".bin";
FileStream stream = new FileStream(filename, FileMode.OpenOrCreate);
RootActivity.Save(stream);
stream.Close();
}
private object DeserializeActivity(Activity RootActivity, Guid id)
{
string filename = FBaseDir + "\\" + id.ToString() + ".bin";
FileStream stream = new FileStream(filename, FileMode.Open);
object Result = Activity.Load(stream, RootActivity);
return Result;
}
}
The steps to add this service to the workflow runtime are similar to what we did with the SqlStatePersistenceService. The following code shows how to add the FilePersistenceProvider to the workflow runtime.
WorkflowRuntime workflowRuntime= new WorkflowRuntime();
FilePersistenceProvider customservice = new FilePersistenceProvider("c:\\WF");
workflowRuntime.AddService(customservice);