我正在使用名为:
的类公共类ProcessFlowPersistenceIOParticipant:PersistenceIOParticipant
它继承自WF4框架中的System.Activities.Persistence.PersistenceIOParticipant。
我想覆盖BeginOnLoad(..)方法。
在此覆盖中,我想拦截工作流实例的反序列化,并将业务实体从实体数据库注入实体工作流变量。
从实例存储加载工作流实例时会触发BeginOnLoad。
via:workflowApplication.Load(workflowInstanceGuid);
我可以在readwritevalues字典中看到工作流guid。
在readWriteValues.Keys中找到匹配命名空间的键 “瓮:架构 - 微软-COM:System.Activities / 4.0 /属性”
然后guid在里面:
value = readWriteValues [xName]; _workflowInstanceId =((System.Activities.Runtime.ActivityExecutor)value)。WorkflowInstanceId;
可通过调试器访问,但不能在代码中访问,因为ActivityExecutor是内部类。
那么有没有办法确定在BeginOnLoad中加载什么工作流实例?
任何提示都非常感激。
麦克
此问题与Access workflow id from inside BeginOnSave类似。 但是在BeginOnLoad的情况下,没有可用于获取工作流实例guid的活动执行上下文。
答案 0 :(得分:1)
如果您还在ProcessFlowPersistenceIOParticipant中实现IWorkflowInstanceExtension接口,您应该能够通过WorkflowInstanceProxy函数中的SetInstance()获取工作流ID。
答案 1 :(得分:0)
public class TaskActivity : NativeActivity
{
protected override void Execute(NativeActivityContext context)
{
context.GetExtension<RelevantDataExtensionIO>().WorkflowInstanceId = context.WorkflowInstanceId;
}
}
public class RelevantDataExtensionIO : PersistenceIOParticipant
{
public const string NamespaceWorkflowInstanceId = "WorkflowInstanceId";
public Guid WorkflowInstanceId { get; set; }
public static XNamespace Namespace
{
get { return XNamespace.Get("http://sample.com/RelevantDataIO"); }
}
public RelevantDataExtensionIO()
: base(false, false)
{
}
protected override void CollectValues(out IDictionary<XName, object> readWriteValues, out IDictionary<XName, object> writeOnlyValues)
{
readWriteValues = new Dictionary<XName, object>();
readWriteValues.Add(Namespace.GetName(NamespaceWorkflowInstanceId), this.WorkflowInstanceId);
writeOnlyValues = null;
}
protected override IAsyncResult BeginOnLoad(IDictionary<XName, object> readWriteValues, TimeSpan timeout, AsyncCallback callback, object state)
{
Guid id = this.WorkflowInstanceId;
return base.BeginOnLoad(readWriteValues, timeout, callback, state);
}
}