在 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 是以零起始的值,指定自變數評估的順序。 根據預設,自變數的評估順序未指定,且等於 UnspecifiedEvaluationOrder 值。 設定 EvaluationOrder 為大於或等於零的值,以指定這個自變數的評估順序。 Windows Workflow Foundation 會以指定的遞增順序來評估引數。 請注意,具有未指定評估順序的參數會被先於那些具有指定評估順序的參數進行評估。
活動作者可以使用強型別機制來公開其參數。 這可藉由宣告InArgument<T>、OutArgument<T>和InOutArgument<T>類型的屬性來完成。 這可讓活動作者建立有關進出活動之數據的特定合約。
定義活動中的參數
在活動中可以透過指定InArgument<T>、OutArgument<T>和InOutArgument<T>類型的屬性來定義參數。 如何定義一個活動的參數,該活動接受用戶顯示的字串並返回包含用戶回應的字串,下列程式碼就是示範。
public class Prompt : Activity
{
public InArgument<string> Text { get; set; }
public OutArgument<string> Response { get; set; }
// Rest of activity definition omitted.
}
備註
傳回單一值的活動可以衍生自 Activity<TResult>、 NativeActivity<TResult>或 CodeActivity<TResult>。 這些活動擁有定義完善的OutArgument<T>,其名稱為Result,其中包含活動的傳回值。
在工作流程中使用變數和自變數
下列範例示範如何在工作流程中使用變數和自變數。 工作流程是宣告三個變數的序列: var1、 var2和 var3。 工作流程中的第一個 Assign 活動是將變數值指派給變數 var1var2的活動。 接著是一個列印 WriteLine 變數值的 var2 活動。 接下來是另一個 Assign 將變數 var2 值指派給 變數 var3的活動。 最後還有另一個WriteLine活動,會顯示var3變數的值。 第一個 Assign 活動會使用 InArgument<string> 和 OutArgument<string> 對象,明確表示活動自變數的系結。
InArgument<string> 用於 Value,因為值透過其 Assign<T> 參數流入 Value 活動,而 OutArgument<string> 用於 To,因為值從 To 參數流出到變數。 第二個 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 活動的方法。 在此範例中,會定義具有兩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);
}
}
如需在程式代碼中使用自變數、變數和表達式的詳細資訊,請參閱 使用命令式程式代碼 和 必要自變數和多載群組撰寫工作流程、活動和表達式。