Поделиться через


Переменные и аргументы

В 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.

Среда выполнения рабочего процесса обеспечивает следующие гарантии по таймингу перемещения данных внутрь действий и наружу из них.

  1. При запуске действия вычисляются значения всех входных и выходных аргументов. Например, независимо от того, когда Get вызывается, возвращаемое значение — это значение, вычисляемое средой выполнения до вызова Execute.

  2. При Set вызове среда выполнения немедленно задает значение.

  3. Аргументы могут быть опционально указаны EvaluationOrder. EvaluationOrder — это отсчитываемое от нуля значение, указывающее порядок вычисления аргумента. По умолчанию порядок оценки аргумента не указан и равен значению UnspecifiedEvaluationOrder . Задайте EvaluationOrder значение больше или равно нулю, чтобы указать порядок оценки для этого аргумента. 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.
}

Замечание

Действия, возвращающие одно значение, могут быть производными от Activity<TResult>, NativeActivity<TResult>или CodeActivity<TResult>. Эти действия имеют четко определенный элемент OutArgument<T> с именем Result, который содержит возвращаемое значение действия.

Использование переменных и аргументов в рабочих процессах

В следующем примере показано, как в рабочем процессе используются переменные и аргументы. Рабочий процесс представляет собой последовательность, которая объявляет три переменных: var1, var2и var3. Первое действие в рабочем процессе — это 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 в переменную. Второе 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);
    }
}

Дополнительные сведения о работе с аргументами, переменными и выражениями в коде см. в статье "Создание рабочих процессов, действий и выражений с использованием императивного кода и обязательных аргументов и групп перегрузки".