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 }