Как выполнить ActivityBuilder без его сериализации? - PullRequest
1 голос
/ 15 февраля 2012

Допустим, у меня рабочий процесс, созданный программно, как этот

ActivityBuilder<int> ab = new ActivityBuilder<int>();
ab.Name = "Add";
ab.Properties.Add(new DynamicActivityProperty {Name = "Operand1", Type = typeof (InArgument<int>)});
ab.Properties.Add(new DynamicActivityProperty {Name = "Operand2", Type = typeof (InArgument<int>)});
ab.Implementation = new Sequence
        {
            Activities =
                {
                    new WriteLine
                        {
                            Text =
                                new VisualBasicValue<string>(
                                "Operand1.ToString() + \" + \" + Operand2.ToString()")
                        }

                }
        };

Один из способов его выполнения - сначала сериализовать объект ActivityBuilder в XAML. Затем загрузите сериализованный XAML, используя ActivityXamlServices. Создать словарь для параметров. Выполните его, используя WorkflowInvoker или WorkflowApplication

Есть ли способ выполнить этот рабочий процесс без необходимости конвертировать / сериализовать построитель действий в XAML?

WorkflowApplication и WorkflowInvoker принимают Activity в качестве входных данных для выполнения. Можно ли каким-то образом использовать activityBuilder.Implementation напрямую с WorkflowApplication или WorkflowInvoker?

Почему я этого хочу? Потому что у нас есть дизайнер рабочего процесса, который пользователь использует для создания и выполнения рабочего процесса. Пользователь также создает рабочий процесс программно. Рабочий процесс может иметь размер до 80 МБ. Это повреждает память приложения из-за сериализации и десериализации файлов размером 80 МБ в XAML. Я хочу как-то пропустить этот шаг и напрямую выполнить действие.

Имеет ли это смысл?

1 Ответ

4 голосов
/ 15 февраля 2012

Нет необходимости использовать ActivityBuilder, просто создайте нужные действия и выполните их.

var wf = new Sequence()
{
    Variables =
    {
        new Variable<int>("Operand1", 7),
        new Variable<int>("Operand2", 42)
    },
    Activities =
    {
        new WriteLine
        {
            Text =
                new VisualBasicValue<string>(
                "Operand1 & \" + \" & Operand2")
        }
    }
};


WorkflowInvoker.Invoke(wf);

Пример использования DynamicActivityProperty:

    var wf = new DynamicActivity<int>
    {
        Properties =
         {
            new DynamicActivityProperty { Name = "Operand1", Type = typeof(InArgument<int>) },
            new DynamicActivityProperty { Name = "Operand2", Type = typeof(InArgument<int>) }
         },
        Implementation = () => new Sequence()
            {
                Activities =
                {
                    new WriteLine
                    {
                        Text =
                            new VisualBasicValue<string>(
                            "Operand1 & \" + \" & Operand2")
                    },
                    new Assign<int>
                    {
                        To = new ArgumentReference<int> { ArgumentName = "Result" },
                        Value = new VisualBasicValue<int>("Operand1 + Operand2")
                    }
                }
            }
    };

    var inputs = new Dictionary<string, object>();
    inputs["Operand1"] = 7;
    inputs["Operand2"] = 42;
    var output = WorkflowInvoker.Invoke(wf, inputs);
    Console.WriteLine(output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...