以编程方式在流程图工作流中创建分配

时间:2011-06-07 23:00:16

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

我需要以编程方式定义一个可序列化的流程图Windows Workflow,它接受输入参数并返回结果。我理解如何使用设计器创建这些工作流程,但我需要在代码中执行它并使流程图工作流程可序列化(因此没有lambda表达式)。

我无法获取Assign的“To”字段。下面的代码创建了一个WriteLine的流程图工作流,后跟一个Assign。

var ab = new ActivityBuilder<string> {
    Name = "ActivityBuilt",
    Implementation = new Flowchart {
        StartNode = new FlowStep {
            Action = new WriteLine { Text = new VisualBasicValue<string>("greeting") },
            Next = new FlowStep {
                Action = new Assign {
                    DisplayName = "Set result",
                    To = new OutArgument<string>(new VisualBasicReference<string> { 
                        ExpressionText = "results"}),
                    Value = new VisualBasicValue<string>("bye")
                }
            }
        }
    }
};

ab.Properties.Add(new DynamicActivityProperty {
    Name = "greeting", 
    Type = typeof (InArgument<string>),  
    Value = "hello"});
ab.Properties.Add(new DynamicActivityProperty {
    Name = "results",  
    Type = typeof (OutArgument<string>), 
    Value = "bye"});

// Convert the ActivityBuilder to a callable activity
using (var sw = new StringWriter()) {
    using (var xw = ActivityXamlServices.CreateBuilderWriter(new XamlXmlWriter(sw, new XamlSchemaContext()))) {
        XamlServices.Save(xw, LastCreated);
    }

    using (var sr = new StringReader(sw.ToString())) {
         var wf = ActivityXamlServices.Load(sr);
         return wf;
    }
}

当我尝试从ActivityBuilder转换为Activity“无法从文本'bye'创建'OutArgument'时,上述代码失败。”如果我不使用OutArgument并且只是传递内容,这可以正常工作。

我的问题是在To属性中放入什么?如何引用我添加到ActivityBuilder.Properties的OutArgument? VisualBasicReference不是OutArgument。我这让它变得比它需要的更难吗?

感谢任何提示!

编辑:我想以编程方式创建工作流程。工作流需要具有输入参数并返回结果(输出参数)。

我了解如何创建工作流以及如何声明和使用输入参数。我正在使用ActivityBuilder来创建工作流并通过ActivityBuilder的属性设置InArgument。我通过序列化到XAML从ActivityBuilder创建工作流,然后使用ActivityXamlServices.Load反序列化。

我不明白的是如何从工作流程中获得结果。我认为它涉及OutArgument。如何/在何处将OutArgument添加到工作流程?我认为我给出的代码片段会为OutArgument分配一个值,但对ActivityXamlServices.Load的调用失败,并且抱怨它无法创建OutArgument。

  • 使用ActivityBuilder的方法是否正确?
  • “分配”操作的“收件人”字段是否正确引用了OutArgument?
  • 如何让ActivityBuilder了解OutArgument并仍然能够转换为活动/工作流程?

希望这能澄清我的问题。

1 个答案:

答案 0 :(得分:4)

代码至少有3个问题:

  1. 分配的价值必须是InArgument()。
  2. 您尝试阅读的值被命名为“greeting”而不是“bye”。
  3. 名为“results”的OutArgument不能具有默认值。
  4. 请尝试以下代码:

    var ab = new ActivityBuilder<string>
    {
        Name = "ActivityBuilt",
        Implementation = new Flowchart
        {
            StartNode = new FlowStep
            {
                Action = new WriteLine { Text = new VisualBasicValue<string>("greeting") },
                Next = new FlowStep
                {
                    Action = new Assign
                    {
                        DisplayName = "Set result",
                        To = new OutArgument<string>(new VisualBasicReference<string>
                        {
                            ExpressionText = "results"
                        }),
                        Value = new InArgument<string>(new VisualBasicValue<string>("greeting"))
                    }
                }
            }
        }
    };
    
    ab.Properties.Add(new DynamicActivityProperty
    {
        Name = "greeting",
        Type = typeof(InArgument<string>),
        Value = "hello"
    });
    ab.Properties.Add(new DynamicActivityProperty
    {
        Name = "results",
        Type = typeof(OutArgument<string>)
    });
    
    // Convert the ActivityBuilder to a callable activity
    using (var sw = new StringWriter())
    {
        using (var xw = ActivityXamlServices.CreateBuilderWriter(new XamlXmlWriter(sw, new XamlSchemaContext())))
        {
            XamlServices.Save(xw, ab);
        }
    
        using (var sr = new StringReader(sw.ToString()))
        {
            var wf = ActivityXamlServices.Load(sr);
            WorkflowInvoker.Invoke(wf);
        }
    }