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

Workflow 以编程方式在流程图工作流中创建分配,workflow,workflow-foundation,workflow-foundation-4,workflow-activity,Workflow,Workflow Foundation,Workflow Foundation 4,Workflow Activity,我需要以编程方式定义一个可序列化的流程图Windows工作流,它接受输入参数并返回结果。我知道如何使用设计器创建这些工作流,但我需要在代码中这样做,并使流程图工作流可序列化(因此没有lambda表达式) 我在获取分配的“收件人”字段时遇到问题。下面的代码创建了一个WriteLine的流程图工作流,后跟一个Assign var ab = new ActivityBuilder<string> { Name = "ActivityBuilt", Implementatio

我需要以编程方式定义一个可序列化的流程图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;
    }
}
var ab=新建ActivityBuilder{
Name=“ActivityBuild”,
实施=新流程图{
StartNode=新流程步骤{
Action=newwriteline{Text=newvisualbasicvalue(“问候”)},
下一步=新流程步骤{
动作=新分配{
DisplayName=“设置结果”,
To=新的输出参数(新的VisualBasicReference{
ExpressionText=“results”}),
值=新的VisualBasicValue(“再见”)
}
}
}
}
};
ab.Properties.Add(新的DynamicActivityProperty{
Name=“问候语”,
类型=类型(无粘性),
Value=“hello”});
ab.Properties.Add(新的DynamicActivityProperty{
Name=“结果”,
Type=typeof(OutArgument),
Value=“bye”});
//将ActivityBuilder转换为可调用的活动
使用(var sw=new StringWriter()){
使用(var xw=ActivityXamlServices.CreateBuilderWriter(新的XamlXmlWriter(sw,新的XamlSchemaContext())){
XamlServices.Save(xw,LastCreated);
}
使用(var sr=newStringReader(sw.ToString())){
var wf=ActivityXamlServices.Load(sr);
返回wf;
}
}
当我尝试从ActivityBuilder转换为Activity时,上面的代码失败,并说“无法从文本“bye”创建“OutArgument”。“如果我不使用OutArgument,只需传入内容,则可以正常工作

我的问题是在to属性中放置什么?如何引用添加到ActivityBuilder.Properties的OutArgument?VisualBasicReference不是一个OutArgument。我是不是让这件事变得更加困难了

谢谢你的提示

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

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

我不明白的是如何从工作流中获得结果。我想这涉及到一场争论。如何/在何处向工作流添加OutArgument?我以为我给出的代码片段会给OutArgument赋值,但调用ActivityXamlServices.Load失败,并抱怨无法创建OutArgument

  • 使用ActivityBuilder的方法正确吗
  • 赋值操作的“To”字段是否正确引用了OutArgument
  • 如何使ActivityBuilder知道OutArgument,并且仍然能够转换为活动/工作流

希望这能澄清我的问题。

代码至少有3个问题:

  • 赋值的值必须是InArgument()
  • 您试图读取的值名为“问候”,而不是“再见”
  • 名为“results”的输出参数不能有默认值 请尝试以下代码:

    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);
        }
    }
    
    var ab=新建ActivityBuilder
    {
    Name=“ActivityBuild”,
    实施=新流程图
    {
    StartNode=新流程步骤
    {
    Action=newwriteline{Text=newvisualbasicvalue(“问候”)},
    下一步=新流程步骤
    {
    动作=新分配
    {
    DisplayName=“设置结果”,
    To=新的输出参数(新的VisualBasicReference
    {
    ExpressionText=“结果”
    }),
    值=新的InArgument(新的VisualBasicValue(“问候”))
    }
    }
    }
    }
    };
    ab.Properties.Add(新的DynamicActivityProperty
    {
    Name=“问候语”,
    类型=类型(无粘性),
    Value=“你好”
    });
    ab.Properties.Add(新的DynamicActivityProperty
    {
    Name=“结果”,
    Type=typeof(输出参数)
    });
    //将ActivityBuilder转换为可调用的活动
    使用(var sw=new StringWriter())
    {
    使用(var xw=ActivityXamlServices.CreateBuilderWriter(新的XamlXmlWriter(sw,新的XamlSchemaContext()))
    {
    XamlServices.Save(xw,ab);
    }
    使用(var sr=newStringReader(sw.ToString()))
    {
    var wf=ActivityXamlServices.Load(sr);
    WorkflowInvoker.Invoke(wf);
    }
    }
    
    我看得越多,就越感到困惑。您正在尝试如何处理此工作流?请编辑以添加描述,例如“我正在尝试使用赋值来设置输出参数'foo'值XYZ”,或者您可以只指定“新赋值”