2

XOML ファイルを動的にロードし、そこからアクティビティ ツリーをインスタンス化し、それを唯一の子として使用できる InvokeWorkflow に似たアクティビティを実装しようとしています。

これは InvokeWorkflow と似ていますが、動的に読み込まれるアクティビティがメイン ワークフローにインライン化される点が異なります (これは、監視の観点から優れています)。

これを行うための潜在的な方法として XamlReader を調べましたが、ワークフローの読み込みには適していないようです (UI のみ)。

ありがとう、ジュリアン

4

2 に答える 2

2

ここで目標を達成するのはかなり難しいかもしれませんが、簡単なことから始めましょう:-

WorkflowMarkupSerializer名前空間で見つかったものを使用して、XOMLからワークフローを再構築できSystem.Workflow.ComponentModel.Serializationます。

var serializer = new WorkflowMarkupSerializer();
object root = serializer.Deserialize(myXmlReader);

同様に、を使用して、CompositeActivityから継承するもので保持されているアクティビティの「スニペット」を再構築できますCompostiteActivityMarkupSerializer

ただし、新しいルートアクティビティを現​​在実行中のワークフローに統合するには、より多くの作業が必要です。WorkflowChanges現在のインスタンスで使用されているワークフロー定義を変更して、クラスのインスタンスを使用して新しいアクティビティを作成する必要があります。

さて、ドキュメンテーションは、この主題に関していくらか大ざっぱで、少しでも回避的です。ただし、2つの重要なポイントを収集できます。-

  1. 最終的にはへの呼び出しApplyWorkflowChangesが必要であり、このメンバーはprotectedアクセス可能です。
  2. ドキュメントは、これがワークフローのルートアクティビティで発生する必要があることを示しています。

したがって、少なくともこの要件を支援するには、カスタムルートアクティビティが必要であると推測できます。

これを構造化する方法はおそらく他にもありますがSequenceActivity、ワークフローの変更を実行するカスタムの「InvokeWorkflow」アクティビティがあり、結果の新しいアクティビティをこの包含シーケンスの最後に配置する予定であると仮定します。

まず、カスタムルートアクティビティに実装できるインターフェイス定義が必要です。-

internal interface IModifiableWorkflow
{
     void ApplyWorkflowChanges(WorkflowChanges workflowChanges);
}

カスタムルートアクティビティでは、このインターフェイスを明示的に実装します。-

public class CustomSequentialActivity : SequentialWorkflowActivity, IModifiableWorkflow
{
    void IModifiableWorkflow.ApplyWorkflowChanges(WorkflowChanges workflowChanges)
    {
        base.ApplyWorkflowChanges(workflowChanges);
    }
}

Executeカスタムの「InvokeWorkflow」アクティビティのメソッド:-

// Get root activity     
var root = this.Parent;
while (root.Parent != null) { root = root.Parent; }

// Create an instance of WorkflowChanges based on the root activity
var changes = new WorkflowChanges(root);

//Find the parent sequence activity in the transient workflow definition
var target = changes.TransientWorkflow.GetActivityByName(this.Parent.Name);

Activity newActivity = YourCodeToLoadActivityDetailsFromXoml();

target.Activities.Add(newActivity);

//Apply the new changes
((IModifiableWorkflow)root).ApplyWorkflowChanges(changes);

私は実際にこれをテストしていないことに注意してください。ドキュメントに埋め込まれた情報の断片から一緒に石畳になっています。

于 2009-11-21T18:46:02.170 に答える
1

どうもありがとうアンソニー。

ダイナミックなワークフローの変更は素晴らしいと言わざるを得ませんが、少し怖かったです。Jon Flander の CallWorkflowActivity の修正を使用して、ワークフローを構成することになりました。

実行時に読み込まれる XOML のみのワークフロー (WF 3.5 を使用) で学んだいくつかのトリック:

  • XOML 内の x:Class 属性を削除します

  • コード ビハインド ファイルを削除する

  • VS デザイナーが機能するには、これらの XOML ファイルを独自のプロジェクトに分離する必要があります (XOML が配置されているプロジェクトには、基本アクティビティや共通タイプなどのコードはありません)。

  • XOML を VS のコンテンツとしてマークし、常にコピーして、バイナリと共に配置されるようにします。

  • それでも、VS 2008 では通常、新しく変更された XOML ファイルを適切にコピーするために完全な再構築が必要です...

  • こちらで説明されているように、ブレークポイントを手動で設定する必要がある場合があります

于 2009-11-26T20:37:54.090 に答える