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


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

Данный раздел относится к версии Windows Workflow Foundation 4.

В Windows Workflow Foundation (WF) переменные представляют хранилище данных, а аргументы, представляют поток данных в действие и из действия. Действие имеет набор аргументов, которые составляют сигнатуру действия. Действие может также поддерживать список переменных, к которым разработчик может добавлять или удалять переменные при разработке рабочего процесса. Привязка аргумента выполнена с помощью выражения, возвращающего значение.

Переменные

Переменные представляют собой место хранения данных. Переменные объявляются в составе определения рабочего процесса. Переменные принимают значения во время выполнения, и эти значения сохраняются как часть состояния экземпляра рабочего процесса. Определение переменной указывает тип переменной и, возможно, имя. В следующем коде показано, как объявить переменную, присвоить ей значение с помощью действия Assign, а затем отобразить ее значение на консоли с помощью действия 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, OutArgument и InOutArgument. Благодаря этому для создателя действия обеспечивается возможность установки определенного контракта, касающегося потока данных в действие и из действия.

Определение аргументов для действия

Для действия можно определить аргументы путем указания свойств типа InArgument, OutArgument и InOutArgument. В следующем коде показано определение аргументов для действия Prompt, принимающего строку для отображения для пользователя и возвращающего строку, которая содержит ответ пользователя.

public class Prompt : Activity
{
    public InArgument<string> Text { get; set; }
    public OutArgument<string> Response { get; set; }
    // Rest of activity definition omitted.
}
Dd489456.note(ru-ru,VS.100).gifПримечание
Действия, которые возвращают одно значение, могут быть производными от Activity, NativeActivity или CodeActivity. У этих действий существует полностью определенный аргумент OutArgument с именем Result, который содержит возвращаемое значение действия.

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

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

Использование переменных и аргументов в действиях на основе кода

В предыдущем примере показано использование аргументов и переменных в рабочих процессах и декларативных действиях. Аргументы и переменные также используются в действиях на основе кода. Принципы использования очень схожи. Переменные представляют хранение данных в действии, а аргументы представляют поток данных в действие и из действия и связаны создателем рабочего процесса с другими переменными или аргументами в рабочем процессе, которые представляют местоположения перемещения данных в действия и из действий. Для возврата или задания значения переменной или аргумента в действии необходимо использовать контекст действия, который представляет текущую среду выполнения действия. Он передается методу 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);
    }
}

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