1

次の名前のクラスを使用しています。

public class ProcessFlowPersistenceIOParticipant : PersistenceIOParticipant

WF4 フレームワークの System.Activities.Persistence.PersistenceIOParticipant から継承します。

BeginOnLoad(..) メソッドをオーバーライドしたいと思います。

このオーバーライドでは、ワークフロー インスタンスの逆シリアル化をインターセプトし、ビジネス エンティティをエンティティ データベースからエンティティ ワークフロー変数に挿入したいと考えています。

BeginOnLoad は、ワークフロー インスタンスがインスタンス ストアから読み込まれるときに発生します。

経由:workflowApplication.Load(workflowInstanceGuid);

readwritevalues ディクショナリ内にワークフロー GUID が表示されます。

名前空間 "urn:schemas-microsoft-com:System.Activities/4.0/properties" に一致する readWriteValues.Keys でキーを見つけます。

次に、GUIDは内部にあります:

値 = 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 に答える