更改工作流的定义
Changing the definition of a workflow
我们有一个使用 VS 设计器创建并存储在 .xaml 文件中的 WF 4.5 工作流,我们希望在调用它之前以编程方式更改该文件。我们只想根据服务调用的结果将一个 activity 换成另一个。当我尝试进行概念验证时,无法将更新的定义更新为 运行。
ChangeMe changeMe = new ChangeMe();
DynamicUpdateServices.PrepareForUpdate(changeMe);
var sequence = WorkflowInspectionServices.GetActivities(changeMe).ToArray()[0] as Sequence;
sequence.Activities.RemoveAt(0);
WriteLine writeLine = new WriteLine();
writeLine.Text = new InArgument<string>("after");
sequence.Activities.Insert(0, writeLine);
WorkflowInvoker.Invoke(changeMe);
Console.ReadKey();
ChangeMe
activity 是一个 activity,它有一个 Sequence
,其中包含一个 WriteLine
activity,打印 "before"。我希望能够将那条写行 activity 换成后面写的新行。重要的是换掉它,而不仅仅是更改文本,因为将来我们希望能够使用不同类型的 Activity
。
此代码编译并 运行s,但不是显示 "after",而是显示 "before"。
是否可以按照我的要求做?
谢谢
我明白了。诀窍是使用 XamlServices
创建一个 ActivityBuilder
,然后可以轻松修改它:
string xaml = File.ReadAllText("../../ChangeMe.xaml");
ActivityBuilder ab = XamlServices.Load(ActivityXamlServices.CreateBuilderReader(
new XamlXmlReader(new StringReader(xaml))
)) as ActivityBuilder;
Sequence root = ab.Implementation as Sequence;
WriteLine writeLine = new WriteLine();
writeLine.Text = new InArgument<string>("after");
root.Activities[0] = writeLine;
WorkflowInvoker.Invoke(ab.Implementation);
Console.ReadKey();
我们有一个使用 VS 设计器创建并存储在 .xaml 文件中的 WF 4.5 工作流,我们希望在调用它之前以编程方式更改该文件。我们只想根据服务调用的结果将一个 activity 换成另一个。当我尝试进行概念验证时,无法将更新的定义更新为 运行。
ChangeMe changeMe = new ChangeMe();
DynamicUpdateServices.PrepareForUpdate(changeMe);
var sequence = WorkflowInspectionServices.GetActivities(changeMe).ToArray()[0] as Sequence;
sequence.Activities.RemoveAt(0);
WriteLine writeLine = new WriteLine();
writeLine.Text = new InArgument<string>("after");
sequence.Activities.Insert(0, writeLine);
WorkflowInvoker.Invoke(changeMe);
Console.ReadKey();
ChangeMe
activity 是一个 activity,它有一个 Sequence
,其中包含一个 WriteLine
activity,打印 "before"。我希望能够将那条写行 activity 换成后面写的新行。重要的是换掉它,而不仅仅是更改文本,因为将来我们希望能够使用不同类型的 Activity
。
此代码编译并 运行s,但不是显示 "after",而是显示 "before"。
是否可以按照我的要求做?
谢谢
我明白了。诀窍是使用 XamlServices
创建一个 ActivityBuilder
,然后可以轻松修改它:
string xaml = File.ReadAllText("../../ChangeMe.xaml");
ActivityBuilder ab = XamlServices.Load(ActivityXamlServices.CreateBuilderReader(
new XamlXmlReader(new StringReader(xaml))
)) as ActivityBuilder;
Sequence root = ab.Implementation as Sequence;
WriteLine writeLine = new WriteLine();
writeLine.Text = new InArgument<string>("after");
root.Activities[0] = writeLine;
WorkflowInvoker.Invoke(ab.Implementation);
Console.ReadKey();