Metadatatypes avec auto-validation à l'aide de bloc d'application de validation
Question
Est-il possible d'utiliser l'attribut selfvalidation avec mes situés dans une validation metadatatype? J'utilise la validation de la bibliothèque Enterprise 5 Application Block.
La solution
Comme je l'ai expliqué dans mon autre réponse, ce n'est pas pris en charge hors de la boîte. Cependant, cela peut être réalisé par accrochage dans le cadre par injection de depedency et remplacer la mise en œuvre de AttributeValidatorFactory
existante. J'écrit un post sur mon blog sur la façon de le faire: mélange Application Validation Avec bloc DataAnnotation: Qu'en est-SelfValidation
J'espère que cette aide.
Autres conseils
actuellement pas pris en charge (hors de la boîte) par VAB. Regardez par exemple ce fil au forum EntLib. Je pense que la principale raison pour laquelle ce n'est pas pris en charge est parce que vous ne pouvez pas simplement placer la méthode [de SelfValidation] sur le méta type de données et attendre à ce que le travail. Raison, il ne fonctionnera pas parce que les méthodes d'auto de validation seront généralement les membres d'instance validate du type. La signature de la méthode d'auto-validation ne contient pas l'objet réel pour valider.
Un travail simple autour de l'appel dans le type de données méta de l'entité. Par exemple:
[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));
}
}
Ce n'est évidemment pas une solution très propre. VAB est cependant très extensible et la version 5.0 ne se sont améliorées. Si vous voulez, vous pouvez échanger existant AttributeValidationFactory
et le remplacer par une version qui est capable de le faire. Il ne sera pas facile cependant.
Vive