2

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

我无法获取分配的“收件人”字段。下面的代码创建了一个 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 说“无法从文本'再见'创建'OutArgument'”时,上面的代码失败。如果我不使用 OutArgument 并且只是传递东西,这很好用。

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

感谢您的任何提示!

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

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

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

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

希望这能澄清我的问题。

4

1 回答 1

4

代码至少有3个问题:

  1. 分配的值需要是一个 InArgument()。
  2. 您尝试读取的值被命名为“greeting”而不是“bye”。
  3. 名为“results”的 OutArgument 不能有默认值。

试试下面的代码:

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);
    }
}
于 2011-06-08T19:58:29.013 回答