Windows Workflow Foundation (WF) では、変数はデータの格納を表し、引数はアクティビティとの間のデータ フローを表します。 アクティビティには一連の引数があり、アクティビティのシグネチャを構成します。 さらに、アクティビティは変数の一覧を保持でき、開発者はワークフローの設計時に変数を追加または削除できます。 引数は、値を返す式を使用してバインドされます。
変数
変数は、データの格納場所です。 変数は、ワークフローの定義の一部として宣言されます。 変数は実行時に値を受け取り、これらの値はワークフロー インスタンスの状態の一部として格納されます。 変数定義では、変数の型と、必要に応じて名前を指定します。 次のコードは、変数を宣言し、 Assign<T> アクティビティを使用して変数に値を割り当て、 WriteLine アクティビティを使用してその値をコンソールに表示する方法を示しています。
// Define a variable named "str" of type string.
Variable<string> var = new Variable<string>
{
Name = "str"
};
// Declare the variable within a Sequence, assign
// a value to it, and then display it.
Activity wf = new Sequence()
{
Variables = { var },
Activities =
{
new Assign<string>
{
To = var,
Value = "Hello World."
},
new WriteLine
{
Text = var
}
}
};
WorkflowInvoker.Invoke(wf);
既定値の式は、必要に応じて変数宣言の一部として指定できます。 変数には修飾子を含めることもできます。 たとえば、変数が読み取り専用の場合、読み取り専用 VariableModifiers 修飾子を適用できます。 次の例では、既定値が割り当てられた読み取り専用変数が作成されます。
// Define a read-only variable with a default value.
Variable<string> var = new Variable<string>
{
Default = "Hello World.",
Modifiers = VariableModifiers.ReadOnly
};
変数スコープ
実行時の変数の有効期間は、変数を宣言するアクティビティの有効期間と同じです。 アクティビティが完了すると、その変数はクリーンアップされ、参照できなくなります。
論争
アクティビティ作成者は、引数を使用して、アクティビティとの間のデータ フローの方法を定義します。 各引数には、指定した方向 ( In、 Out、または InOut) があります。
ワークフロー ランタイムは、アクティビティとの間のデータ移動のタイミングについて、次の保証を行います。
アクティビティの実行が開始されると、そのすべての入力引数と入力/出力引数の値が計算されます。 たとえば、 Get が呼び出されるタイミングに関係なく、返される値は、
Execute
の呼び出しの前にランタイムによって計算されます。Setが呼び出されると、ランタイムは値をすぐに設定します。
必要に応じて、引数の EvaluationOrder を指定できます。 EvaluationOrder は、引数が評価される順序を指定する 0 から始まる値です。 既定では、引数の評価順序は指定されておらず、 UnspecifiedEvaluationOrder 値と等しくなります。 EvaluationOrderを 0 以上の値に設定して、この引数の評価順序を指定します。 Windows Workflow Foundation は、指定された評価順序で引数を昇順で評価します。 評価順序が指定されていない引数は、指定された評価順序を持つ引数より前に評価されることに注意してください。
アクティビティ作成者は、厳密に型指定されたメカニズムを使用してその引数を公開できます。 これを行うには、 InArgument<T>、 OutArgument<T>、および InOutArgument<T>型のプロパティを宣言します。 これにより、アクティビティ作成者は、アクティビティとの間で送受信されるデータに関する特定のコントラクトを確立できます。
アクティビティの引数の定義
引数は、 InArgument<T>、 OutArgument<T>、および InOutArgument<T>の型のプロパティを指定することで、アクティビティで定義できます。 次のコードは、ユーザーに表示する文字列を受け取り、ユーザーの応答を含む文字列を返す Prompt
アクティビティの引数を定義する方法を示しています。
public class Prompt : Activity
{
public InArgument<string> Text { get; set; }
public OutArgument<string> Response { get; set; }
// Rest of activity definition omitted.
}
注
1 つの値を返すアクティビティは、 Activity<TResult>、 NativeActivity<TResult>、または CodeActivity<TResult>から派生できます。 これらのアクティビティには、アクティビティの戻り値を含むOutArgument<T>という名前の明確に定義されたResultがあります。
ワークフローでの変数と引数の使用
次の例は、ワークフローで変数と引数がどのように使用されるかを示しています。 ワークフローは、 var1
、 var2
、 var3
の 3 つの変数を宣言するシーケンスです。 ワークフローの最初のアクティビティは、変数Assign
の値を変数var1
に割り当てるvar2
アクティビティです。 その後に、WriteLine
変数の値を出力するvar2
アクティビティが続きます。 次に、変数Assign
の値を変数var2
に割り当てる別のvar3
アクティビティです。 最後に、WriteLine
変数の値を出力する別のvar3
アクティビティがあります。 最初の Assign
アクティビティでは、アクティビティの引数のバインドを明示的に表す InArgument<string>
オブジェクトと OutArgument<string>
オブジェクトが使用されます。
InArgument<string>
は、値がValue引数を介してAssign<T>活動に流れ込むためValueに使用され、値がOutArgument<string>
引数から変数に流れ出すためToがToに使用されます。 2 番目の Assign
アクティビティでは、暗黙的なキャストを使用する、よりコンパクトでありながら同等の構文で同じことを実行します。
WriteLine
アクティビティでは、コンパクト構文も使用されます。
// Declare three variables; the first one is given an initial value.
Variable<string> var1 = new Variable<string>()
{
Default = "one"
};
Variable<string> var2 = new Variable<string>();
Variable<string> var3 = new Variable<string>();
// Define the workflow
Activity wf = new Sequence
{
Variables = { var1, var2, var3 },
Activities =
{
new Assign<string>()
{
Value = new InArgument<string>(var1),
To = new OutArgument<string>(var2)
},
new WriteLine() { Text = var2 },
new Assign<string>()
{
Value = var2,
To = var3
},
new WriteLine() { Text = var3 }
}
};
WorkflowInvoker.Invoke(wf);
Code-Based アクティビティでの変数と引数の使用
前の例では、ワークフローと宣言型アクティビティで引数と変数を使用する方法を示します。 引数と変数は、コード ベースのアクティビティでも使用されます。 概念的には、使用方法は非常によく似ています。 変数はアクティビティ内のデータ ストレージを表し、引数はアクティビティとの間のデータ フローを表し、ワークフロー作成者によって、データのフロー先またはソースを表すワークフロー内の他の変数または引数にバインドされます。 アクティビティ内の変数または引数の値を取得または設定するには、アクティビティの現在の実行環境を表すアクティビティ コンテキストを使用する必要があります。 これは、ワークフロー ランタイムによってアクティビティの Execute メソッドに渡されます。 この例では、2 つのAdd
引数を持つカスタム In アクティビティが定義されています。 引数の値にアクセスするために、 Get メソッドが使用され、ワークフロー ランタイムによって渡されたコンテキストが使用されます。
public sealed class Add : CodeActivity<int>
{
[RequiredArgument]
public InArgument<int> Operand1 { get; set; }
[RequiredArgument]
public InArgument<int> Operand2 { get; set; }
protected override int Execute(CodeActivityContext context)
{
return Operand1.Get(context) + Operand2.Get(context);
}
}
コードでの引数、変数、および式の操作の詳細については、「命令型コードと必須引数とオーバーロード グループを使用したワークフロー、アクティビティ、および式の作成」を参照してください。
.NET