Conversione delle espressioni mediante Strumenti di Gestione flusso di lavoro 1.0

 

I flussi di lavoro ospitati in Progettazione flussi di lavoro 1.0 sono interamente dichiarativi e pertanto possono essere creati solo mediante attività, espressioni e variabili della superficie attendibile.Per ulteriori informazioni sulla superficie attendibile di Gestione flusso di lavoro, vedere Creazione di flussi di lavoro dichiarativi per Workflow Manager 1.0.Le espressioni nei flussi di lavoro vengono convertite in attività di espressione prima che il flusso di lavoro venga caricato in Gestione flusso di lavoro.Per facilitare le operazioni di creazione, Strumenti di Workflow Manager 1.0 per Visual Studio 2012 include un'Expression Translation Build Task e un'Expression Translation API.Gli sviluppatori possono scegliere di usare l'attività di compilazione o l'API per convalidare le espressioni in un flusso di lavoro durante la fase di compilazione.Per istruzioni sull'installazione di Strumenti di Workflow Manager, vedere Installazione di Strumenti di Gestione flusso di lavoro 1.0 per Visual Studio 2012.

Per usare l'attività di compilazione, aggiungere l'elemento Import specificato di seguito al file di progetto csproj (o vbproj).

<Import Project=
"C:\Program Files (x86)\MSBuild\Microsoft\Workflow Service\1.0\Microsoft.WorkflowServiceBuildExtensions.targets"/>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

Per un esempio di file di progetto contenente l'elemento Import, vedere il file ActivityLibrary1.csproj nell'esempio relativo all'utilizzo degli strumenti di Workflow.

Per esaminare il comportamento dell'attività di compilazione, aggiungere un'espressione non supportata, ad esempio un'attività WriteLine con new Guid().ToString() come argomento Text e compilare il progetto.Prendere nota degli errori visualizzati prima e dopo l'importazione del file di destinazione dell'attività di compilazione per la conversione delle espressioni.

Per eseguire la convalida delle espressioni in un flusso di lavoro a livello di codice, è possibile usare il seguente metodo di supporto.

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

Mostra: