【发布时间】:2016-05-19 05:50:21
【问题描述】:
在 Windows 工作流基础中, 是否可以从外部文件加载工作流?目的是制作一个通用的工作流控制器,它从文件中获取状态机工作流并加载它。如果我去使用 VS 中可用的设计器,工作流图就会变得固定,只能用于特定的用例,但是,我需要制作一个通用的。
【问题讨论】:
标签: windows workflow workflow-foundation-4 workflow-foundation
在 Windows 工作流基础中, 是否可以从外部文件加载工作流?目的是制作一个通用的工作流控制器,它从文件中获取状态机工作流并加载它。如果我去使用 VS 中可用的设计器,工作流图就会变得固定,只能用于特定的用例,但是,我需要制作一个通用的。
【问题讨论】:
标签: windows workflow workflow-foundation-4 workflow-foundation
是的,您可以使用 XamlActivityServices 和 ActivityBuilder 类型将 XAML 工作流保存到文件或从文件加载。您可以在代码中动态构建工作流,然后使用该服务将其序列化为 XML 以供以后使用。
如果您想允许您的用户创建和编辑工作流,如果您愿意,您也可以直接在您的应用程序中重新托管设计器。
将工作流保存到文件
以下是将工作流保存到文件的一个非常快速的示例:
var activityBuilder = new ActivityBuilder();
activityBuilder.Name = "HelloWorldApp";
activityBuilder.Properties.Add(new DynamicActivityProperty { Name = "UserName", Type = typeof(InArgument<string>) });
activityBuilder.Implementation = new Sequence
{
Activities =
{
new WriteLine
{
Text = new CSharpValue<string>("\"Hello, \" + UserName + \", how are you?\"")
}
}
};
using (var streamWriter = File.CreateText(@"C:\Temp\MyWorkflow.xaml"))
{
using (var xamlWriter = new XamlXmlWriter(streamWriter, new XamlSchemaContext()))
{
using (var builderWriter = ActivityXamlServices.CreateBuilderWriter(xamlWriter))
{
XamlServices.Save(builderWriter, activityBuilder);
}
}
}
上面应该生成一个如下的 XML 文件:
<?xml version="1.0" encoding="utf-8"?>
<Activity x:Class="HelloWorld"
xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities"
xmlns:mca="clr-namespace:Microsoft.CSharp.Activities;assembly=System.Activities"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<x:Members>
<x:Property Name="UserName" Type="InArgument(x:String)" />
</x:Members>
<Sequence>
<WriteLine>
<InArgument x:TypeArguments="x:String">
<mca:CSharpValue x:TypeArguments="x:String">
"Hello, " + UserName + ", how are you?"
</mca:CSharpValue>
</InArgument>
</WriteLine>
</Sequence>
</Activity>
从文件加载 XAML 工作流
以下 sn-ps 显示从文件加载工作流,然后运行水合工作流。
var activityXamlServicesSettings = new ActivityXamlServicesSettings
{
CompileExpressions = true
};
var dynamicActivity = ActivityXamlServices.Load(File.OpenRead(@"C:\Temp\MyWorkflow.xaml"), activityXamlServicesSettings) as DynamicActivity;
var workflowInputs = new Dictionary<string, object>
{
{ "UserName", "Me" }
};
var workflowInvoker = new WorkflowInvoker(dynamicActivity);
workflowInvoker.Invoke(workflowInputs);
【讨论】: