[WF4] Ajouter des variables lors du design

Publié le 02 février 2010 par Jeremy.jeanson

Voici une petite extension de ma classe VariableHelper qui permet d’ajouter une variable à une activité durant le Design du Workflow.

Comme dans mon précédent post on passe par le ModeItem du designer d’activité pour trouver le conteneur de variables de l’activité et y ajouter notre variable (j’utilise aussi ma méthode de recherche de variable accessible GetVariables() ).

L’argument variableName de la méthode AddVariable() est en fait le nom initialement souhaiter. Si l’activité à déjà accès à une variable de même nom, il cherchera un autre nom disponible (ex :variableName + “1”).

C#

internal static class VariablesHelper
{
    // Nom de la propriété "Varaibles" (Collection des varaibles d'une séquence
    public const String VariablesPropertyName = "Variables";

 
    #region "Manipulation de variables"

    /// <summary>
    /// Ajout d'une variable à un ModelItem
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="modelItem"></param>
    /// <param name="variableName"></param>
    /// <returns></returns>
    public static Variable<T> AddVariable<T>(ModelItem modelItem, String variableName)
    {
        return AddVariable<T>(modelItem, variableName, default(T));
    }

    /// <summary>
    /// Ajout d'une variable à un ModelItem en spécifiant une valeur par défaut
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="variableName"></param>
    /// <param name="defaultValue"></param>
    /// <returns></returns>
    public static Variable<T> AddVariable<T>(ModelItem modelItem, String variableName, T defaultValue)
    {
        Int32 i = 1;
        String variableToAddName;
        // Retrouver le liste des variables accessible via le ModelItem
        List<Variable> variables = GetVariables(modelItem);

        try
        {
            // Recherche d'un nom de variable disponible
            do
            {
                variableToAddName = String.Concat(variableName, i.ToString());
                i++;
            }
            while (variables.Any(c => c.Name == variableToAddName));

            // Test du conteneur de variables de la séquence courante            
            if (modelItem.Properties
                .Any(c =>
                    c.Name == VariablesHelper.VariablesPropertyName
                    & c.PropertyType == typeof(Collection<Variable>)))
            {
                // Création d'une nouvelel variable
                Variable<T> variable = new Variable<T>(variableToAddName, defaultValue);

                // Ajout de la nouvelle variable
                modelItem.Properties[VariablesHelper.VariablesPropertyName].Collection.Add(variable);

                // Retourner la varariable créé
                return variable;
            }
            else
            {
                return null;
            }
        }
        catch (Exception ex)
        {
            Trace.TraceError(ex.Message);
            return null;
        }
        finally
        {
            // Libération des ressoruces
            variables = null;
            variableToAddName = null;
        }
    }

    #endregion
}