2009-08-14 5 views
3

Ich frage mich, ob jemand weiß, ob xVal wie erwartet funktioniert, wenn ich meine system.componentmodel.dataannotations Attribute auf Schnittstellen definieren, die von meinen Modellklassen implementiert werden, anstatt direkt auf die konkreten Modellklassen.Funktioniert xVal, wenn die Attribute auf Interfaces definiert sind?

public interface IFoo 
{ 
    [Required] [StringLength(30)] 
    string Name { get; set; } 
} 

und dann in meinem Modell Klasse gäbe es keine Validierung sein Attribut ...

public class FooFoo : IFoo 
{ 
    public string Name { get; set; } 
} 

Wenn ich versuche, eine FooFoo mit xVal zu validieren, wird es die attribs von seiner Schnittstelle verwenden?

Antwort

4

Momentan betrachtet xVal.RuleProviders.DataAnnotationsRuleProvider nur Eigenschaften, die für die Modellklasse selbst definiert sind. Sie können dies in der Methode GetRulesFromProperty in der Regel Anbieter Basisklasse siehe PropertyAttributeRuleProviderBase:

protected virtual IEnumerable<Rule> GetRulesFromProperty(
    PropertyDescriptor propertyDescriptor) 
{ 
    return from att in propertyDescriptor.Attributes.OfType<TAttribute>() 
      from validationRule in MakeValidationRulesFromAttribute(att) 
      where validationRule != null 
      select validationRule; 
} 

Der propertyDescriptor Parameter stellt eine Eigenschaft in Ihrer Modell-Klasse und ihre Attributes Eigenschaft stellt nur die direkt auf dem Grundstück selbst definierten Attribute.

Sie könnten jedoch natürlich DataAnnotationsRuleProvider erweitern und die entsprechende Methode überschreiben, um es zu tun, was Sie wollen: Extrahieren Sie Validierungsattribute von implementierten Schnittstellen. Sie dann registrieren, die Regel-Anbieter mit xVal:

ActiveRuleProviders.Providers.Clear(); 
ActiveRuleProviders.Providers.Add(new MyDataAnnotationsRuleProvider()); 
ActiveRuleProviders.Providers.Add(new CustomRulesProvider()); 

Um Attribute von Eigenschaften in implementierten Schnittstellen zu erhalten, sollten Sie DataAnnotationsRuleProvider erweitern und GetRulesFromTypeCore außer Kraft setzen. Es wird ein Parameter des Typs System.Type mit einer Methode GetInterfaces abgerufen.

+0

Danke für die detaillierte Antwort !! Ich denke, die nächste Frage ist: Gibt es eine einfache Möglichkeit, die Schnittstellen einer Klasse zu durchlaufen? Sie müssten dies tun, um PropertyDescriptors für jede Eigenschaft auf den Schnittstellen zu erhalten. – NathanD

+0

Ich habe einige weitere Informationen darüber hinzugefügt, wie man die implementierten Schnittstellen eines Typs bekommt. –

+0

Sieht ziemlich einfach aus, Vielen Dank! – NathanD