使用 Workflow Manager Tools 1.0 转换表达式
Workflow Manager 1.0 中托管的工作流是完全声明性的,因此只能使用受信任图面中的活动、表达式和变量创作。(有关Workflow Manager受信任图面,请参阅 针对 Workflow Manager 1.0 创作声明性工作流。)在工作流上载到 Workflow Manager 之前,工作流中的任何表达式均将转换为表达式活动。为提供更好的创作体验,Workflow Manager Tools 1.0 for Visual Studio 2012 包含了 Expression Translation Build Task 和 Expression Translation API。开发人员可选择使用使用构建任务或 API 在构建时验证工作流中的表达式。有关安装 Workflow Manager Tools 的说明,请参阅 Workflow Manager Tools 1.0 for Visual Studio 2012 安装。
使用表达式转换构建任务
使用表达式转换 API
使用表达式转换构建任务
若要使用构建任务,请将以下 Import 元素添加到项目的 csproj(或 vbproj)文件。
<Import Project=
"C:\Program Files (x86)\MSBuild\Microsoft\Workflow Service\1.0\Microsoft.WorkflowServiceBuildExtensions.targets"/>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
有关包含以前的 Import 元素的示例项目文件,请参阅使用工作流工具示例中的 ActivityLibrary1.csproj 文件。
若要探查构建任务的行为,请添加不支持的表达式(例如,一个将 WriteLine 作为 new Guid().ToString() 参数的 Text 活动),然后生成项目。请注意在导入表达式转换构建任务目标文件之前和之后显示的错误。
使用表达式转换 API
若要以编程方式验证工作流中的表达式,可以使用以下帮助器方法。
public static string TranslateWorkflow(string originalWorkflow)
{
string translatedWorkflowString = null;
using (TextReader inputWorkflowReader = new StringReader(originalWorkflow))
{
using (XamlReader xamlReader = new XamlXmlReader(inputWorkflowReader))
{
try
{
TranslationResults result = ExpressionTranslator.Translate(xamlReader);
if (result.Errors.Count == 0)
{
translatedWorkflowString = CreateXamlString(result.Output);
}
else
{
string errorMessage = string.Format(
"Error: Failed to translate workflow with {0} errors",
result.Errors.Count);
foreach (TranslationError error in result.Errors)
{
errorMessage += string.Format(
"\n Expression: {0}, Message: {1}",
error.ExpressionText, error.Message);
}
return errorMessage;
}
}
catch (Exception e)
{
return "Error: " + e.Message;
}
}
}
return translatedWorkflowString;
}
static string CreateXamlString(XamlReader reader)
{
StringBuilder stringBuilder = new StringBuilder();
using (XmlWriter xmlWriter = XmlWriter.Create(stringBuilder,
new XmlWriterSettings { Indent = true, OmitXmlDeclaration = true }))
{
using (XamlXmlWriter writer = new XamlXmlWriter(xmlWriter, reader.SchemaContext))
{
XamlServices.Transform(reader, writer);
}
}
return stringBuilder.ToString();
}