2012-02-15 2 views
1

Скажем, у меня есть рабочий процесс, созданный progrmatically как этотКак выполнить ActivityBuilder без его сериализации?

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 принимает активность как ввод для выполнения. Могу ли я как-то использовать activityBuilder.Implementation напрямую с WorkflowApplication или WorkflowInvoker?

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

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

+0

По умолчанию VS дизайнер использует ActivityBuilder. Я предполагаю, что вы просматриваете повторную версию; Я никогда не пробовал это, но не могу ли вы просто заставить его использовать DynamicActivity вместо ActivityBuilder? Просто дайте сериализацию пустой DynamicActivity для Designer.Text. – Joao

+0

Ну, еще один способ сделать это во время выполнения - преобразовать ActivityBuilder в DynamicActivity. Это всего лишь несколько строк кода, и вы можете выполнить DynamicActivity, как обычно, с WorklowInvoker/WorkflowApplication. – Joao

+0

Можете ли вы указать мне код, который это делает? Я не могу найти его –

ответ

4

Не нужно использовать 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); 
+0

Мой сценарий немного сложный. Я не могу изменить существующую реализацию. Мне нужны эти динамические свойства, потому что они необходимы для большей картины. Объем переменной будет только внутри последовательности –

+0

Нет проблем, см. Второй пример в обновленном ответе. – Maurice

+0

Спасибо aloooooot –