如何在BeginOnLoad / PersistenceIOParticipant中访问工作流程ID?

时间:2012-11-26 00:23:18

标签: workflow-foundation-4 workflow-foundation

我正在使用名为:

的类

公共类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的活动执行上下文。

2 个答案:

答案 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);                       
    }     
}