2009-12-01 5 views
6

Ich weiß nicht, wann und wie ich Validierung in meinen benutzerdefinierten Aktivitäten/benutzerdefinierte Aktivität Fabriken/benutzerdefinierte Designer in WF 4.0 tun sollte.Was ist das Muster für die Entwurfszeitvalidierung in Workflow Foundation 4.0?

Der einzige Ort innerhalb meiner Aktivität, die Validierungsfehlerunterstützung zu bieten scheint, ist innerhalb der CacheMetadata Methode (ich glaube, dass dies mehrmals während des Designprozesses aufgerufen wird). Soll ich hier meine Validierung durchführen? Gibt es Unterstützung für die Validierung im ActivityDesigner?

+0

Als Hinweis für die Zuschauer funktioniert es nicht immer gut mit WPF. Schließlich habe ich ein Hybridsystem erstellt, bei dem meine Basisklasse (die NativeActivity erweitert) Validierungsfehler von Implementierungen gesammelt und diese sowohl für CacheMetadata-Aufrufe als auch für IDataErrorInfo verwendet hat. – Will

Antwort

3

Ja, CacheMetadata in Ihrer Aktivität ist, wo Sie Ihre Validierung tun sollten. Validierung ist ein Konzept, das sowohl für die Workflow-Laufzeit als auch für den Designer gilt. (Sie können sehen, aus der Tatsache, dass Sie noch Workflows ausführen können versuchen, kompiliert oder deklarative, die Validierungsfehler, aber eine Ausnahme ausgelöst wird, wenn Sie tun.)

Beispiel:

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

(Siehe ActivityMetadata.AddValidationError)

Ihre zweite Frage ist, gibt es Unterstützung für das Hinzufügen von Validierung von der ActivityDesigner Seite? Die Antwort ist "nein, nicht wirklich" - es wäre möglich, eine benutzerdefinierte WPF- und Datenbindung durchzuführen, die eine zusätzliche "benutzerdefinierte Validierung" über dem ActivityDesigner hinzufügt, vielleicht sogar AttachedPropertiesService, um Ihre eigene SatisfiesConstraints-Eigenschaft für Ihre Aktivitätsklasse zu definieren . Aber es ist zusätzliche Arbeit, und es wird nicht konsequent mit der Laufzeitvalidierung verbunden sein, also ist es eine Idee mit begrenztem Wert.

-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

Ihre Antwort sollte eine Erklärung Ihres Codes und eine Beschreibung enthalten, wie er das Problem löst. – AbcAeffchen

Verwandte Themen