Metadatatypes mit Selbstvalidierung mit Validierung Anwendungsblock
Frage
Ist es möglich, das selfvalidation Attribut mit meinem Validierungen in einem MetadataType gelegen zu benutzen? Ich verwende Enterprise Library 5 Validation Application Block.
Lösung
Wie ich in meiner anderen Antwort erklärt, dies ist nicht die Box unterstützt werden. depedency Injektion mit und ersetzen Sie die vorhandene AttributeValidatorFactory
Implementierung Dies kann jedoch durch Einhaken in den Rahmen erreicht werden. Ich geschrieben einen Beitrag auf meinem Weblog, wie dies zu tun: Mixing Validierung Application Block mit DataAnnotation: Was über SelfValidation
Ich hoffe, das hilft.
Andere Tipps
Dies wird derzeit nicht unterstützt (aus der Box) von VAB. Schauen Sie zum Beispiel unter diesem Thread am EntLib Forum. Ich denke, der Hauptgrund, warum dies wird nicht unterstützt, da dadurch die [SelfValidation] Methode auf dem Meta-Datentyp nicht einfach platzieren und erwarten, dass diese an der Arbeit. Grund wird es nicht funktionieren, weil Selbstvalidierungsmethoden werden in der Regel Validate Instanz Mitglieder des Art. Die Unterschrift des Selbstvalidierungsmethode nicht das eigentliche Objekt zu validieren enthält.
Eine einfache Arbeit ist um Anruf in den Meta-Datentyp aus der Einheit. Zum Beispiel:
[MetadataType(typeof(InvoiceMetaData))]
[HasSelfValidation]
public partial class Invoice
{
public string Name{ get; set; }
public int Price { get; set; }
[SelfValidation]
public void CustomValidate(ValidationResults results)
{
// Call into the meta data class
InvoiceMetaData.Validate(this, results);
}
}
public class InvoiceMetaData
{
[StringLengthValidator(1, 10, Tag = "Name")]
string Name { get; set; }
[RangeValidator(0, RangeBoundaryType.Inclusive, 0,
RangeBoundaryType.Ignore, Tag = "Price")]
int Price { get; set; }
public static void CustomValidate(Invoice instance,
ValidationResults results)
{
results.AddResult(new ValidationResult("ErrorMessage1",
instance, "", "", null));
}
}
Das ist natürlich nicht eine sehr saubere Lösung. VAB ist jedoch sehr erweiterbar und Version 5.0 nur besser. Wenn Sie möchten, können Sie tauschen AttributeValidationFactory
bestehende und ersetzen Sie es mit einer Version, die dies tun kann. Es wird nicht leicht sein, aber.
Prost