Я реализовал продвижение участников постоянного рабочего процесса, как показано здесь на веб-сайте Microsoft: http://msdn.microsoft.com/en-us/library/ee364726%28VS.100%29.aspx и пока все выглядит так, как будто все работает.Я не вижу сохранения данных в базе данных при запросе?Я думаю, что пропустил шаг или Microsoft пропустил что-то.
Я использую службу .xamlx приложения рабочего процесса, и я переопределил WorkflowServiceHost.Кажется, все это работает нормально, поэтому я не уверен, где может быть проблема?
Так что мой вопрос здесь: есть ли у кого-нибудь реальный рабочий пример того, как реализовать участника с постоянством?
Я попробовал несколько разных вариантов этого
Но я просто не могупохоже, что это работает.
Просто к сведению: этот код работает, когда я изменил пространства имен для соответствия.Спасибо Морису
WorkflowServiceHost Код:
public class ServiceHostFactory :WorkflowServiceHostFactory
{
private static readonly string m_connectionString =
"Data Source=localhost;Initial Catalog=WorkflowInstanceStore;Integrated Security=True";
protected override WorkflowServiceHost CreateWorkflowServiceHost(Activity activity, Uri[] baseAddresses)
{
return base.CreateWorkflowServiceHost(activity, baseAddresses);
}
protected override WorkflowServiceHost CreateWorkflowServiceHost(WorkflowService service, Uri[] baseAddresses)
{
WorkflowServiceHost host = base.CreateWorkflowServiceHost(service, baseAddresses);
host.DurableInstancingOptions.InstanceStore = SetupInstanceStore();
SqlWorkflowInstanceStoreBehavior sqlWorkflowInstanceStoreBehavior = new SqlWorkflowInstanceStoreBehavior(m_connectionString);
XNamespace xNS = XNamespace.Get("http://contoso.com/DocumentStatus");
List<XName> variantProperties = new List<XName>()
{
xNS.GetName("UserName"),
xNS.GetName("ApprovalStatus"),
xNS.GetName("DocumentId"),
xNS.GetName("LastModifiedTime")
};
sqlWorkflowInstanceStoreBehavior.Promote("DocumentStatus", variantProperties, null);
host.Description.Behaviors.Add(sqlWorkflowInstanceStoreBehavior);
//Add persistence extension here:
host.WorkflowExtensions.Add<DocumentStatusExtension>(()=>new DocumentStatusExtension());;
host.Description.Behaviors.Add(new ServiceMetadataBehavior() { HttpGetEnabled = true });
// Handle the UnknownMessageReceived event.
host.UnknownMessageReceived += delegate(object sender, UnknownMessageReceivedEventArgs e)
{
Console.WriteLine(string.Format(CultureInfo.InvariantCulture, "Unknow Message Recieved:{0}", e.Message));
};
return host;
}
private static SqlWorkflowInstanceStore SetupInstanceStore()
{
SqlWorkflowInstanceStore sqlWorkflowInstanceStore = new SqlWorkflowInstanceStore(m_connectionString)
{
InstanceCompletionAction = InstanceCompletionAction.DeleteAll,
InstanceLockedExceptionAction = InstanceLockedExceptionAction.BasicRetry,
HostLockRenewalPeriod = System.TimeSpan.Parse("00:00:05")
};
InstanceHandle handle = sqlWorkflowInstanceStore.CreateInstanceHandle();
//InstanceHandle handle = sqlWorkflowInstanceStore.CreateInstanceHandle();
//InstanceView view = sqlWorkflowInstanceStore.Execute(handle, new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(30));
//handle.Free();
//sqlWorkflowInstanceStore.DefaultInstanceOwner = view.InstanceOwner;
return sqlWorkflowInstanceStore;
}
DocumentStatusExtension Код:
public string DocumentId;
public string ApprovalStatus;
public string UserName;
public DateTime LastUpdateTime;
private XNamespace xNS = XNamespace.Get("http://contoso.com/");
protected override void CollectValues(out IDictionary<XName, object> readWriteValues, out IDictionary<XName, object> writeOnlyValues)
{
readWriteValues = new Dictionary<XName, object>();
readWriteValues.Add(xNS.GetName("UserName"), this.UserName);
readWriteValues.Add(xNS.GetName("ApprovalStatus"), this.ApprovalStatus);
readWriteValues.Add(xNS.GetName("DocumentId"), this.DocumentId);
readWriteValues.Add(xNS.GetName("LastModifiedTime"), this.LastUpdateTime);
writeOnlyValues = null;
}
protected override IDictionary<XName, object> MapValues(IDictionary<XName, object> readWriteValues, IDictionary<XName, object> writeOnlyValues)
{
return base.MapValues(readWriteValues, writeOnlyValues);
}
UpdateExtension Код:
public sealed class UpdateExtension : CodeActivity
{
// Define an activity input argument of type string
public InArgument<string> Text { get; set; }
// If your activity returns a value, derive from CodeActivity<TResult>
// and return the value from the Execute method.
protected override void Execute(CodeActivityContext context)
{
// Obtain the runtime value of the Text input argument
context.GetExtension<DocumentStatusExtension>().DocumentId = Guid.NewGuid().ToString();
context.GetExtension<DocumentStatusExtension>().UserName = "John Smith";
context.GetExtension<DocumentStatusExtension>().ApprovalStatus = "Approved";
context.GetExtension<DocumentStatusExtension>().LastUpdateTime = DateTime.Now;
}
}