Magazine Internet

[WF4] Pas facile d’ajouter des contraintes à une activité

Publié le 08 janvier 2010 par Jeremy.jeanson

De WF3 à WF4 pas mal de choses on été changées pour faciliter la vie des développeurs, mais certain points peuvent sembler obscures… comme les contraintes.

L’objectif des contraintes est de forcer l’utilisateur de vos activités à saisir leurs propriétés. En gros il s’agit d’une validation de l’utilisation de votre activité.

La msdn n’étant pas encore très fournie en exemples, la validation de plusieurs propriétés n’est pas forcement facile à mettre ne œuvre. Pour commencer plusieurs questions doivent trouver réponse :

Où se place la validation?

-> Dans le constructeur de l’activité. La classe de base contient une collection de contraintes : base.Constraints.

Comment avoir une validation par activité?

-> en instanciant un objet Constraint<T> avec un DelegateInArgument<T> (avec T étant le type de votre activité) pour chaque propriété à valider

Comment lui indiquer nos propriété à valider? La logique de validation? Le message d’erreur?

-> Votre Constraint<T> a un Handler qui va contenir le nom de la propriété, le message d’erreur à afficher et la logique

Voici donc un petit exemple d’activité qui répond à ces quelques questions.

Note : Cette action permet de lancer un program en fournissant des arguments.

/// <summary>
/// Activité qui permet d'executer un program
/// </summary>
public class ExecuterUnProgram : CodeActivity
{
    #region "Déclarations"

    private String m_Program;
    private String m_Arguments;

    #endregion

    #region "Constructeur / destructeur"

    public ExecuterUnProgram()
    {
        // Context pour la validation
        DelegateInArgument<ValidationContext> validationContext = new DelegateInArgument<ValidationContext>();

        // ------------------------------------------------------------------
        // Activité de validation du program
        DelegateInArgument<ExecuterUnProgram> activityProgram = new DelegateInArgument<ExecuterUnProgram> { Name = "argument" };
        // Contrainte
        Constraint<ExecuterUnProgram> consProgram = new Constraint<ExecuterUnProgram>
        {
            Body = new ActivityAction<ExecuterUnProgram, ValidationContext>
            {
                Argument1 = activityProgram,
                Argument2 = validationContext,
                Handler = new AssertValidation
                {
                    // Message affiché dans le designer de WorkFlow
                    Message = "La propriété [Program] ne dois pas être vide.",
                    // Propériété à mettre en évidence dans le designer
                    PropertyName = "Program",
                    Assertion = new InArgument<Boolean>(
                        (e) => !String.IsNullOrEmpty(activityProgram.Get(e).m_Program))
                }
            }
        };
        // Ajout de la contrainte
        base.Constraints.Add(consProgram);

        // ------------------------------------------------------------------
        // Activité de validation des arguments
        DelegateInArgument<ExecuterUnProgram> activityArgument = new DelegateInArgument<ExecuterUnProgram> { Name = "argument" };
        // Contrainte
        Constraint<ExecuterUnProgram> consArguments = new Constraint<ExecuterUnProgram>
        {
            Body = new ActivityAction<ExecuterUnProgram, ValidationContext>
            {
                Argument1 = activityArgument,
                Argument2 = validationContext,
                Handler = new AssertValidation
                {
                    // Message affiché dans le designer de WorkFlow
                    Message = "La propriété [Arguments] ne dois pas être vide.",
                    // Propériété à mettre en évidence dans le designer
                    PropertyName = "Arguments",
                    Assertion = new InArgument<Boolean>(
                        (e) => !String.IsNullOrEmpty(activityArgument.Get(e).m_Arguments))
                }
            }
        };
        // Ajout de la contrainte
        base.Constraints.Add(consArguments);
    }

    #endregion

    #region "Propriétés"

    /// <summary>
    /// Program à executer
    /// </summary>
    public String Program
    {
        get { return this.m_Program; }
        set { this.m_Program = value; }
    }        

    /// <summary>
    /// Arguments du Program à executer
    /// </summary>
    public String Arguments
    {
        get { return m_Arguments; }
        set { m_Arguments = value; }
    }

    #endregion

    #region "Méthodes"

    /// <summary>
    /// Action  executée par l'acitivité
    /// </summary>
    /// <param name="context"></param>
    protected override void Execute(CodeActivityContext context)
    {
        Process.Start(this.m_Program, this.m_Arguments);
    }

    #endregion

}

Retour à La Une de Logo Paperblog

A propos de l’auteur


Jeremy.jeanson 1573 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte