假设我有一个像这样的程序创建的工作流程
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
吗?
为什么我要这个?因为我们有一个工作流设计器,用户可以用它来创建和执行工作流。用户还可以逐步创建工作流程。工作流程最大可达80MB。由于80MB文件与XAML
之间的序列化和反序列化,这会损害应用程序的内存。我想以某种方式跳过这一步并直接执行活动。
有意义吗?
答案 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);