如何在不序列化的情况下执行ActivityBuilder
本文关键字:情况下 执行 ActivityBuilder 序列化 | 更新日期: 2023-09-27 18:24:33
假设我有一个像一样以渐进方式创建的工作流
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
。接下来,使用ActivityXamlServices
加载序列化的XAML
。为参数创建字典。使用WorkflowInvoker
或WorkflowApplication
执行
有没有任何方法可以在不需要将活动生成器转换/序列化为XAML的情况下执行此工作流?
WorkflowApplication和WorkflowInvoker将活动作为执行的输入。我可以以某种方式将activityBuilder.Implementation
直接与WorkflowApplication
或WorkflowInvoker
一起使用吗?
我为什么要这个?因为我们有一个工作流设计器,用户可以使用它来创建和执行工作流。用户还可以逐步创建工作流。工作流的大小可以高达80MB。由于80MB文件在XAML
之间的序列化和反序列化,这会损害应用程序的内存。我想以某种方式跳过这一步,直接执行活动。
这有道理吗?
无需使用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);