2009-12-01 23 views
6

WF 4.0'daki özel etkinliklerim/özel etkinlik fabrikaları/özel tasarımcılar için doğrulama işlemini ne zaman ve nasıl yapmam gerektiği konusunda net değilim.Workflow Foundation 4.0'da tasarım zamanı doğrulaması için desen nedir?

Etkinliğim içinde doğrulama hatası desteği sağlanıyor gibi görünen tek yer, CacheMetadata yönteminde (buna tasarım sürecinde birden çok kez çağrıldığına inanıyorum). Doğrulama yaptığım yer burası mı? ActivityDesigner'da doğrulama desteği var mı?

+0

Görüntüleyenlere not olarak, WPF ile her zaman iyi çalışmaz. Sonunda temel sınıfımın (NativeActivity'ı genişleten) uygulamalardan doğrulama hatalarını topladığı ve bunları hem CacheMetadata çağrıları hem de IDataErrorInfo için kullandığı bir karma sistem oluşturdum. – Will

cevap

3

Evet, etkinliğinizdeki CacheMetadata, doğrulama işleminizi gerçekleştirmeniz gereken yerdir. Doğrulama, iş akışı çalışma zamanına ve tasarımcıya uygulanan bir kavramdır. (Onu halen bunu yaptığında bir istisna atılacaktır doğrulama hataları sahip iş akışları, derlenmiş veya bildirime, çalıştırma girişiminde, ancak aslında bu görebilirsiniz.)

Örnek:

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

(Bkz. ActivityMetadata.AddValidationError)

İkincil sorumuz, ActivityDesigner tarafından doğrulama ekleme desteği var mı? Cevap 'hayır, gerçekten değil' - ActivityDesigner'ın üstüne bir miktar 'özel doğrulama' ekleyen bazı özel WPF ve veri bağlamasının yapılması mümkün olabilir, hatta kendi etkinlik sınıfınızda kendi SatisfiesConstraints özelliğinizi tanımlamak için AttachedPropertiesService özelliğini kullanabilir . Fakat bu ekstra bir iştir ve çalışma zamanı doğrulamasıyla tutarlı bir şekilde bağlanmayacak, bu yüzden sınırlı bir değer fikri.

-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

Cevabınız, kodunuzun açıklamasını ve sorunun nasıl çözüldüğünü açıklayan bir açıklama içermelidir. – AbcAeffchen

İlgili konular