2009-12-01 9 views
6

Je ne sais pas quand et comment je devrais faire la validation dans mes activités personnalisées/usines d'activités personnalisées/concepteurs personnalisés dans WF 4.0.Quel est le modèle de validation au moment du design dans Workflow Foundation 4.0?

Le seul endroit dans mon activité qui semble fournir une prise en charge des erreurs de validation se trouve dans la méthode CacheMetadata (je crois que cela est appelé plusieurs fois au cours du processus de conception). Est-ce là où je devrais faire ma validation? Existe-t-il un support pour la validation dans ActivityDesigner?

+0

Comme une note pour les téléspectateurs, il ne fonctionne pas toujours bien avec WPF. J'ai finalement créé un système hybride où ma classe de base (extension de NativeActivity) rassemblait les erreurs de validation des implémentations et les utilisait à la fois pour les appels CacheMetadata et pour IDataErrorInfo. – Will

Répondre

3

Oui, CacheMetadata dans votre activité est l'endroit où vous devriez effectuer votre validation. La validation est un concept qui s'applique à l'exécution du workflow ainsi qu'au concepteur. (Vous pouvez voir cela du fait que vous pouvez essayer d'utiliser les flux de travail, compilés ou déclaratives, qui ont des erreurs de validation, mais une exception sera levée lorsque vous faites.)

Exemple:

protected override void CacheMetadata(ActivityMetadata metadata) 
{ 
    if (this.Body == 0) metadata.AddValidationError(
    new ValidationError(
     "You forgot to supply a body for (this activity)", 
     /*iswarning = */ true, 
     "Body")); 
} 

(Voir ActivityMetadata.AddValidationError)

Votre question secondaire est de savoir s'il est possible d'ajouter une validation du côté de ActivityDesigner? La réponse est 'non, pas vraiment' - il serait possible de faire un WPF personnalisé et une liaison de données qui ajoute une 'validation personnalisée' au dessus de ActivityDesigner, peut-être même utiliser AttachedPropertiesService pour définir votre propre propriété SatisfiesConstraints sur votre classe d'activité . Mais c'est un travail supplémentaire, et cela ne va pas être lié à la validation de l'exécution de manière cohérente, donc c'est une idée de valeur limitée.

-1
public class SalesCommissionValidation : CodeActivity<decimal> 
{ 
    public decimal NetSales { get; set; } 
    public decimal Percentage { get; set; } 

    protected override decimal Execute(CodeActivityContext context) 
    { 
     var commission = NetSales * (Percentage/100); 
     return commission; 
    } 

    protected override void CacheMetadata(CodeActivityMetadata metadata) 
    { 
     base.CacheMetadata(metadata); 

     if (NetSales <= 0) 
      metadata.AddValidationError("Sales cannot be less than 0!"); 
     else if (Percentage <= 0) 
      metadata.AddValidationError("Sales percentgage cannot be less than 0!"); 
     else 
     { 
      if (Percentage > 20) 
       metadata.AddValidationError(string.Format("Sales percentgage {0} cannot be greater than 20%", Percentage)); 
     } 

    } 
} 
+0

Votre réponse doit contenir une explication de votre code et une description de la façon dont il résout le problème. – AbcAeffchen