1

我正在使用一个名为:

公共类 ProcessFlowPersistenceIOParticipant : PersistenceIOParticipant

它继承自 WF4 框架中的 System.Activities.Persistence.PersistenceIOParticipant。

我想覆盖 BeginOnLoad(..) 方法。

在这个覆盖中,我想拦截工作流实例的反序列化,并将实体数据库中的业务实体注入到实体工作流变量中。

BeginOnLoad 在从实例存储加载工作流实例时触发。

通过:workflowApplication.Load(workflowInstanceGuid);

我可以在 readwritevalues 字典中看到工作流指南。

在 readWriteValues.Keys 匹配命名空间“urn:schemas-microsoft-com:System.Activities/4.0/properties”中找到键

然后指南在里面:

值 = readWriteValues[xName]; _workflowInstanceId = ((System.Activities.Runtime.ActivityExecutor)value).WorkflowInstanceId;

它可以通过调试器访问,但不能在代码中访问,因为 ActivityExecutor 是一个内部类。

那么有没有办法确定 BeginOnLoad 中正在加载什么工作流实例?

非常感谢任何提示。

麦克风

这个问题类似于BeginOnSave 内部的访问工作流 id。但是,在 BeginOnLoad 的情况下,没有可用于获取工作流实例 guid 的活动执行上下文。

4

2 回答 2

1

如果您还在 ProcessFlowPersistenceIOParticipant 中实现 IWorkflowInstanceExtension 接口,您应该能够通过SetInstance()函数中的WorkflowInstanceProxy获取工作流 ID。

于 2012-11-26T09:53:46.207 回答
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);                       
    }     
}
于 2014-09-24T11:34:14.033 回答