使用 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 TaskExpression 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();
}