Windows Workflow のアーキテクチャ

このトピックの内容は、Windows Workflow Foundation 4 に該当します。

Windows Workflow Foundation (WF) は、実行時間の長いインタラクティブ アプリケーションの開発用に抽象化のレベルを引き上げます。作業単位はアクティビティとしてカプセル化されます。アクティビティが実行される環境には、フロー制御、例外処理、エラー伝達、状態データの永続化、動作中のワークフローのメモリへの読み込みやアンロード、追跡、トランザクション フローに対応する機能が備わっています。

アクティビティのアーキテクチャ

アクティビティは、ActivityCodeActivity、または NativeActivity から派生する CLR 型として開発されたり、値 ActivityCodeActivity、または NativeActivity、を返す CLR 型の変化形として開発されます。Activity から派生するアクティビティを開発すると、ユーザーは既存の WorkflowElement オブジェクトを組み合わせて、ワークフロー環境で実行される作業単位をすばやく作成できます。一方、CodeActivity では、主にアクティビティ引数にアクセスするために CodeActivityContext を使用してマネージ コードで作成される実行ロジックが有効になります。NativeActivity から派生するアクティビティを開発すると、ActivityExecutionContext を通じてランタイムにアクセスし、子のスケジュール設定、ブックマーク作成、非同期の作業の呼び出し、トランザクションの登録などの機能を使用できます。

Activity から派生するアクティビティの作成は宣言型です。また、これらのアクティビティは XAML で作成できます。次の例では、Prompt というアクティビティが、実行の本体用に他のアクティビティを使用して作成されます。

<Activity x:Class='Prompt'
  xmlns:x='https://schemas.microsoft.com/winfx/2006/xaml'
    xmlns:z='https://schemas.microsoft.com/netfx/2008/xaml/schema'
xmlns:my='clr-namespace:XAMLActivityDefinition;assembly=XAMLActivityDefinition'
xmlns:s="clr-namespace:System;assembly=mscorlib"
xmlns="https://schemas.microsoft.com/2009/workflow">
<z:SchemaType.Members>
    <z:SchemaType.SchemaProperty Name='Text' Type=' InArgument(s:String)' />
  <z:SchemaType.SchemaProperty Name='Response' Type='OutArgument(s:String)' />
</z:SchemaType.Members>
  <Sequence>
    <my:WriteLine Text='[Text]' />
    <my:ReadLine Bookmark='r1' Result='[Response]' />
  </Sequence>
</Activity>

アクティビティ実行コンテキスト

ActivityExecutionContext は、アクティビティ作成者のワークフロー ランタイムへのインターフェイスであり、ランタイムのさまざまな機能にアクセスできます。次の例では、ブックマーク (データをアクティビティに渡してホストが再開できる、実行の継続点をアクティビティが登録できる仕組み) を作成する実行コンテキストを使用するアクティビティが定義されています。

public class SimpleReadLine : WorkflowElement
{
    protected override void Execute(ActivityExecutionContext context)
    {
        context.CreateBookmark(this. DisplayName,
                new ActivityExecutionCallback(OnReadComplete));
    }

    void OnReadComplete(ActivityExecutionContext context, object state)
    {
        string dataRead = (string)state;
        Console.WriteLine("You entered: {0}", dataRead);
    }
}

アクティビティのライフサイクル

アクティビティのインスタンスは、Executing 状態で開始します。例外が検出された場合を除き、すべての子アクティビティが実行を終了し、他の保留中の作業 (Bookmark オブジェクトなど) が完了するまでこの状態が維持されてから、Closed 状態に移行します。 アクティビティ インスタンスの親は子にキャンセルを要求できます。子がキャンセル可能な場合、子は Canceled 状態で完了します。 実行中に例外がスローされた場合は、ランタイムは WorkflowElement を Faulted 状態にし、アクティビティの親チェーンの上方向に例外を伝達します。アクティビティの 3 つの完了状態を次に示します。

  • Closed: アクティビティは作業を完了し、終了しました。

  • Canceled: アクティビティは作業を正常に中断し、終了しました。この状態に移行した場合、作業は明示的にロール バックされません。

  • Faulted: アクティビティがエラーを検出し、作業を完了せずに終了しました。

アクティビティは、永続化またはアンロードされても Executing 状態を維持します。