public
class
SqlServerWorkflowInstanceStore : InstanceStore
{
public
Guid ownerInstanceID;
public
SqlServerWorkflowInstanceStore() :
this
(Guid.NewGuid())
{
}
public
SqlServerWorkflowInstanceStore(Guid id)
{
ownerInstanceID
=
id;
}
//
Synchronous version of the Begin/EndTryCommand functions
protected
override
bool
TryCommand(InstancePersistenceContext context, InstancePersistenceCommand command, TimeSpan timeout)
{
return
EndTryCommand(BeginTryCommand(context, command, timeout,
null
,
null
));
}
//
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
<
System.Xml.Linq.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);
}
else
if
(command
is
LoadWorkflowCommand)
{
try
{
InstancesTable obj
=
InstancesTableBiz.GetInstancesTable(
this
.ownerInstanceID);
System.Text.UTF8Encoding utf8
=
new
System.Text.UTF8Encoding();
byte
[] bs
=
utf8.GetBytes(obj.InstanceXML);
System.IO.MemoryStream memoryStream
=
new
System.IO.MemoryStream(bs);
data
=
LoadInstanceDataFromFile(memoryStream);
context.LoadedInstance(InstanceState.Initialized, data,
null
,
null
,
null
);
}
catch
(Exception exception)
{
throw
new
PersistenceException(exception.Message);
}
}
return
new
CompletedAsyncResult
<
bool
>
(
true
, callback, state);
}
protected
override
bool
EndTryCommand(IAsyncResult result)
{
return
CompletedAsyncResult
<
bool
>
.End(result);
}
IDictionary
<
System.Xml.Linq.XName, InstanceValue
>
LoadInstanceDataFromFile(Stream inputStream)
{
IDictionary
<
System.Xml.Linq.XName, InstanceValue
>
data
=
new
Dictionary
<
System.Xml.Linq.XName, InstanceValue
>
();
NetDataContractSerializer s
=
new
NetDataContractSerializer();
XmlReader rdr
=
XmlReader.Create(inputStream);
XmlDocument doc
=
new
XmlDocument();
doc.Load(rdr);
XmlNodeList instances
=
doc.GetElementsByTagName(
"
InstanceValue
"
);
foreach
(XmlElement instanceElement
in
instances)
{
XmlElement keyElement
=
(XmlElement)instanceElement.SelectSingleNode(
"
descendant::key
"
);
System.Xml.Linq.XName key
=
(System.Xml.Linq.XName)DeserializeObject(s, keyElement);
XmlElement valueElement
=
(XmlElement)instanceElement.SelectSingleNode(
"
descendant::value
"
);
object
value
=
DeserializeObject(s, valueElement);
InstanceValue instVal
=
new
InstanceValue(value);
data.Add(key, instVal);
}
return
data;
}
object
DeserializeObject(NetDataContractSerializer serializer, XmlElement element)
{
object
deserializedObject
=
null
;
MemoryStream stm
=
new
MemoryStream();
XmlDictionaryWriter wtr
=
XmlDictionaryWriter.CreateTextWriter(stm);
element.WriteContentTo(wtr);
wtr.Flush();
stm.Position
=
;
deserializedObject
=
serializer.Deserialize(stm);
return
deserializedObject;
}
void
Save(IDictionary
<
System.Xml.Linq.XName, InstanceValue
>
instanceData)
{
XmlDocument doc
=
new
XmlDocument();
doc.LoadXml(
"
<InstanceValues/>
"
);
foreach
(KeyValuePair
<
System.Xml.Linq.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);
}
if
(
!
string
.IsNullOrEmpty(InstancesTableBiz.GetInstancesTable(
this
.ownerInstanceID).InstanceXML))
{
InstancesTable obj
=
InstancesTableBiz.GetInstancesTable(
this
.ownerInstanceID);
obj.InstanceXML
=
doc.InnerXml;
InstancesTableBiz.UpdateInstancesTable(obj);
}
else
{
InstancesTable obj
=
new
InstancesTable();
obj.id
=
this
.ownerInstanceID;
obj.InstanceXML
=
doc.InnerXml;
InstancesTableBiz.AddInstancesTable(obj);
}
}
XmlElement SerializeObject(
string
elementName,
object
o, XmlDocument doc)
{
NetDataContractSerializer s
=
new
NetDataContractSerializer();
XmlElement newElement
=
doc.CreateElement(elementName);
MemoryStream stm
=
new
MemoryStream();
s.Serialize(stm, o);
stm.Position
=
;
StreamReader rdr
=
new
StreamReader(stm);
newElement.InnerXml
=
rdr.ReadToEnd();
return
newElement;
}
}