Программно создать назначение в рабочем потоке - PullRequest
2 голосов
/ 08 июня 2011

Мне нужно программно определить сериализуемую потоковую диаграмму Windows Workflow, которая принимает входные аргументы и возвращает результат.Я понимаю, как создавать эти рабочие процессы с помощью конструктора, но мне нужно сделать это в коде, чтобы рабочий процесс потоковой диаграммы был сериализуемым (чтобы не было лямбда-выражений).

У меня проблемы с получением поля «Кому»Назначения.Приведенный ниже код создает рабочий поток потоковой диаграммы WriteLine с последующим назначением.

var ab = new ActivityBuilder<string> {
    Name = "ActivityBuilt",
    Implementation = new Flowchart {
        StartNode = new FlowStep {
            Action = new WriteLine { Text = new VisualBasicValue<string>("greeting") },
            Next = new FlowStep {
                Action = new Assign {
                    DisplayName = "Set result",
                    To = new OutArgument<string>(new VisualBasicReference<string> { 
                        ExpressionText = "results"}),
                    Value = new VisualBasicValue<string>("bye")
                }
            }
        }
    }
};

ab.Properties.Add(new DynamicActivityProperty {
    Name = "greeting", 
    Type = typeof (InArgument<string>),  
    Value = "hello"});
ab.Properties.Add(new DynamicActivityProperty {
    Name = "results",  
    Type = typeof (OutArgument<string>), 
    Value = "bye"});

// Convert the ActivityBuilder to a callable activity
using (var sw = new StringWriter()) {
    using (var xw = ActivityXamlServices.CreateBuilderWriter(new XamlXmlWriter(sw, new XamlSchemaContext()))) {
        XamlServices.Save(xw, LastCreated);
    }

    using (var sr = new StringReader(sw.ToString())) {
         var wf = ActivityXamlServices.Load(sr);
         return wf;
    }
}

Приведенный выше код завершается ошибкой, когда я пытаюсь преобразовать ActivityBuilder в Activity, говоря «Не удалось создать OutArgument из текста».до свидания'."Это прекрасно работает, если я не использую OutArgument и просто передаю вещи.

Мой вопрос: что добавить в свойство To?Как мне ссылаться на OutArgument, который я добавляю в ActivityBuilder.Properties?VisualBasicReference не является OutArgument.Я делаю это более сложным, чем нужно?

Спасибо за любые подсказки!

Редактировать: Я хочу создать рабочий процесс программно.Рабочий процесс должен иметь входные аргументы и возвращать результаты (выходные аргументы).

Я понимаю, как создать рабочий процесс и как объявлять и использовать входные аргументы.Я использую ActivityBuilder для создания рабочего процесса и для установки InArgument через свойства ActivityBuilder.Я создаю рабочий процесс из ActivityBuilder путем сериализации в XAML, а затем десериализации с использованием ActivityXamlServices.Load.

Я не понимаю, как получить результат из рабочего процесса.Я предполагаю, что это включает OutArgument.Как / где я могу добавить OutArgument в рабочий процесс?Я думал, что фрагмент кода, который я дал, назначит значение OutArgument, но вызов ActivityXamlServices.Load завершается неудачно с жалобой на то, что он не может создать OutArgument.

  • Является ли подход использования ActivityBuilder правильным?
  • Правильно ли указано поле "Кому" действия Assign, ссылающегося на OutArgument?
  • Как сделать ActivityBuilderзнаете об OutArgument и все еще сможете конвертировать в Activity / workflow?

Надеюсь, это прояснит мою проблему.

1 Ответ

4 голосов
/ 08 июня 2011

Есть не менее 3 проблем с кодом:

  1. Значение Assign должно быть InArgument ().
  2. Значение, которое вы пытаетесь прочитать, называется«приветствие» не «пока».
  3. OutArgument с именем «results» не может иметь значение по умолчанию.

Попробуйте следующий код:

var ab = new ActivityBuilder<string>
{
    Name = "ActivityBuilt",
    Implementation = new Flowchart
    {
        StartNode = new FlowStep
        {
            Action = new WriteLine { Text = new VisualBasicValue<string>("greeting") },
            Next = new FlowStep
            {
                Action = new Assign
                {
                    DisplayName = "Set result",
                    To = new OutArgument<string>(new VisualBasicReference<string>
                    {
                        ExpressionText = "results"
                    }),
                    Value = new InArgument<string>(new VisualBasicValue<string>("greeting"))
                }
            }
        }
    }
};

ab.Properties.Add(new DynamicActivityProperty
{
    Name = "greeting",
    Type = typeof(InArgument<string>),
    Value = "hello"
});
ab.Properties.Add(new DynamicActivityProperty
{
    Name = "results",
    Type = typeof(OutArgument<string>)
});

// Convert the ActivityBuilder to a callable activity
using (var sw = new StringWriter())
{
    using (var xw = ActivityXamlServices.CreateBuilderWriter(new XamlXmlWriter(sw, new XamlSchemaContext())))
    {
        XamlServices.Save(xw, ab);
    }

    using (var sr = new StringReader(sw.ToString()))
    {
        var wf = ActivityXamlServices.Load(sr);
        WorkflowInvoker.Invoke(wf);
    }
}
...