如何在不序列化的情况下执行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。为参数创建字典。使用WorkflowInvokerWorkflowApplication 执行

有没有任何方法可以在不需要将活动生成器转换/序列化为XAML的情况下执行此工作流?

WorkflowApplication和WorkflowInvoker将活动作为执行的输入。我可以以某种方式将activityBuilder.Implementation直接与WorkflowApplicationWorkflowInvoker一起使用吗?

我为什么要这个?因为我们有一个工作流设计器,用户可以使用它来创建和执行工作流。用户还可以逐步创建工作流。工作流的大小可以高达80MB。由于80MB文件在XAML之间的序列化和反序列化,这会损害应用程序的内存。我想以某种方式跳过这一步,直接执行活动。

这有道理吗?

如何在不序列化的情况下执行ActivityBuilder

无需使用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);