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

时间:2012-02-15 09:13:36

标签: c# workflow workflow-foundation-4 workflow-activity

假设我有一个像这样的程序创建的工作流程

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。为参数创建字典。使用WorkflowInvokerWorkflowApplication

执行此操作

有没有办法在不需要将活动构建器转换/序列化为XAML的情况下执行此工作流程?

WorkflowApplication和WorkflowInvoker将Activity作为执行的输入。我可以以activityBuilder.ImplementationWorkflowApplication直接使用WorkflowInvoker吗?

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

有意义吗?

1 个答案:

答案 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);