Metadatatypes con auto-convalida utilizzando blocco applicativo convalida
Domanda
E 'possibile utilizzare l'attributo selfvalidation con i miei convalide situato in una metadatatype? Sto usando di Enterprise Library 5 Validation Application Block.
Soluzione
Come ho spiegato nella mia altra risposta, questo non è supportato dalla scatola. Tuttavia, ciò può essere ottenuto agganciando nell'ambito mediante iniezione di dipendenze e sostituire l'attuazione AttributeValidatorFactory
esistente. Ho scritto un post sul mio blog su come fare questo: miscelazione Validation Application blocco Con DataAnnotation:? What About SelfValidation
Spero che questo aiuta.
Altri suggerimenti
Questo è attualmente non supportata (fuori dalla scatola) di VAB. Guardate ad esempio a questo discussione al forum EntLib. Credo che la ragione principale per questo non è supportato è perché non si può semplicemente inserire il metodo [SelfValidation] sul tipo di dati di meta e si aspettano che questo lavoro. La ragione non funziona è perché i metodi di validazione di auto in genere Convalidare membri del tipo di istanza. La firma del metodo di validazione sé non contiene l'oggetto reale per convalidare.
Un semplice lavoro intorno è chiamata nel tipo di metadati dall'entità. Per esempio:
[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));
}
}
Questo naturalmente non è una soluzione molto pulita. VAB però è molto estensibile e la versione 5.0 solo meglio. Se si vuole si può scambiare AttributeValidationFactory
esistente e sostituirlo con una versione che è in grado di farlo. Non sarà facile però.
Saluti