开发自定义InstanceStore - 错误 [英] Developing of a custom InstanceStore - Errors
问题描述
您好Zeljko,
.NET 4 SDK PurchaseProcess示例包含一个简单的基于XML的实例存储,可以回答你的一些问题。
希望现在有所帮助,
Ruppert
// --------------- -------------------------------------------------- ------------
//版权所有(c)Microsoft Corporation。 保留所有权利。
// ---------------------------------------- -------------------------------------
使用System ;
使用System.Activities.DurableInstancing;
使用System.Collections.Generic;
使用System.IO;
使用System.Runtime.DurableInstancing;
使用System。 Runtime.Serialization;
使用System.ServiceModel.Persistence;
使用System.Xml;
使用System.Xml.Linq;
命名空间Microsoft.Samples .WF.PurchaseProcess
{{/ />
公共类XmlWorkflowInstanceStore:InstanceStore
{
        Guid ownerInstanceID;
        public XmlWorkflowInstanceStore():this(Guid.NewGuid())
{
}
public XmlWorkflowInstanceStore(Guid id)
{
            ownerInstanceID = id;
}
// Begin / EndTryCommand函数的同步版本 protected override bool TryCommand(InstancePersistenceContext context,InstancePersistenceCommand命令,TimeSpan超时)
{
            return EndTryCommand(BeginTryCommand(context,command,timeout,null,null));
}
//持久性引擎将向配置的InstanceStore发送各种命令, //例如CreateWorkflowOwnerCommand,SaveWorkflowCommand和LoadWorkflowCommand。
//此方法是我们处理这些命令的方法
protected override IAsyncResult BeginTryCommand(InstancePersistenceContext context,InstancePersistenceCommand命令,TimeSpan超时,AsyncCallback回调,对象状态)
{
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; IDictionary< XName,InstanceValue> data = null;
// CreateWorkflowOwner命令指示实例存储创建绑定到instanace句柄的新实例所有者
if(命令为CreateWorkflowOwnerCommand)
{
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; context.BindInstanceOwner(ownerInstanceID,Guid.NewGuid());
}
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; // SaveWorkflow命令指示实例存储修改绑定到实例句柄或实例密钥的实例
else if(命令是SaveWorkflowCommand)
{
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; SaveWorkflowCommand saveCommand =(SaveWorkflowCommand)命令;
data = saveCommand.InstanceData;
保存(数据);
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; }
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; // LoadWorkflow命令指示实例存储锁定并加载绑定到实例句柄中标识符的实例
else if(命令是LoadWorkflowCommand)
{
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;字符串文件名= IOHelper.GetFileName(this.ownerInstanceID);
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;尝试
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; {
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;使用(的FileStream的inputStream =新的FileStream(文件名,FileMode.Open))
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP; {
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;数据= LoadInstanceDataFromFile(的inputStream);
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP; //将数据加载到持久性上下文中   ;&NBSP;&NBSP;&NBSP;&NBSP; context.LoadedInstance(InstanceState.Initialized,数据,NULL,NULL,NULL);
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP; }
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; }
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; catch(例外例外)
{
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;抛出新的PersistenceException(exception.Message);
}
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; }
返回新的CompletedAsyncResult< bool>(true,callback,state);
}
受保护的覆盖bool EndTryCommand(IAsyncResult结果)
{
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; return CompletedAsyncResult< bool> .End(result);
}
//从xml文件中读取数据并根据该文件创建字典。
IDictionary< XName,InstanceValue> LoadInstanceDataFromFile(Stream inputStream)
{
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; IDictionary< XName,InstanceValue> data = new Dictionary< 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)
{
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;的XmlElement keyElement =(的XmlElement)instanceElement.SelectSingleNode(QUOT;后代::密钥QUOT);
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;的XName密钥=(的XName)DeserializeObject(S,keyElement);
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; &NBSP;&NBSP;的XmlElement valueElement =(的XmlElement)instanceElement.SelectSingleNode(QUOT;后代::值QUOT);
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP; object value = DeserializeObject(s,valueElement);
InstanceValue instVal =新InstanceValue(值);
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; data.Add(key,instVal);
}
返回数据;
}
object DeserializeObject(NetDataContractSerializer序列化程序,XmlElement元素)
{
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; object deserializedObject = null;
MemoryStream stm = new MemoryStream();
XmlDictionaryWriter wtr = XmlDictionaryWriter.CreateTextWriter(stm);
element.WriteContentTo(WTR);
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; wtr.Flush();
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; stm.Position = 0;
deserializedObject = serializer.Deserialize(stm);
return deserializedObject;
}
//将持久性数据保存到xml文件。
void保存(IDictionary< XName,InstanceValue> instanceData)
{
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; string fileName = IOHelper.GetFileName(this.ownerInstanceID);
XmlDocument doc = new XmlDocument();
doc.LoadXml(QUOT;< InstanceValues />");
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; foreach(KeyValuePair< XName,InstanceValue> instanceData中的valPair)
{
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;的XmlElement的newInstance = doc.CreateElement(QUOT; InstanceValue");
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; &NBSP;&NBSP;的XmlElement则newkey = SerializeObject(QUOT;键" ;, valPair.Key,DOC);
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ; newInstance.AppendChild(newKey);
的XmlElement NEWVALUE = SerializeObject(QUOT;值" ;, valPair.Value.Value,DOC);
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP; newInstance.AppendChild(NEWVALUE);
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; doc.DocumentElement.AppendChild(的newInstance);
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; }
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; doc.Save(文件名);
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; }
XmlElement SerializeObject(string elementName,object o,XmlDocument doc)
{
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; NetDataContractSerializer s = new NetDataContractSerializer();
XmlElement newElement = doc.CreateElement(elementName);
MemoryStream stm = new MemoryStream();
s.Serialize(stm,o);
stm.Position = 0;
StreamReader rdr = new StreamReader(stm);
newElement.InnerXml = rdr.ReadToEnd();
return newElement;
}
&NBSP;&NBSP;&NBSP; }}
Hi Zeljko,
the .NET 4 SDK PurchaseProcess sample contains a simple XML-based instance store, which might answer some of your questions.
Hope that helps for now,
Ruppert
//-----------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------using System;
using System.Activities.DurableInstancing;
using System.Collections.Generic;
using System.IO;
using System.Runtime.DurableInstancing;
using System.Runtime.Serialization;
using System.ServiceModel.Persistence;
using System.Xml;
using System.Xml.Linq;namespace Microsoft.Samples.WF.PurchaseProcess
{public class XmlWorkflowInstanceStore : InstanceStore
{
Guid ownerInstanceID;
public XmlWorkflowInstanceStore() : this(Guid.NewGuid())
{}
public XmlWorkflowInstanceStore(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<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);
}protected override bool EndTryCommand(IAsyncResult result)
{
return CompletedAsyncResult<bool>.End(result);
}//Reads data from xml file and creates a dictionary based off of that.
IDictionary<XName, InstanceValue> LoadInstanceDataFromFile(Stream inputStream)
{
IDictionary<XName, InstanceValue> data = new Dictionary<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");
XName key = (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 = 0;deserializedObject = serializer.Deserialize(stm);
return deserializedObject;
}//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);
}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 = 0;
StreamReader rdr = new StreamReader(stm);
newElement.InnerXml = rdr.ReadToEnd();return newElement;
}
}
}
这篇关于开发自定义InstanceStore - 错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!