FluentValidation règle pour objet null
J'ai essayé de travailler sur la façon de créer un FluentValidation règle qui vérifie si l'instance d'un objet, c'est la validation n'est pas null, avant la validation de ses propriétés.
Je préfère encapsuler cette null validation dans le Validateur, plutôt que de le faire dans le code appelant.
Voir l'exemple de code ci-dessous avec les commentaires où la logique requise est nécessaire:
namespace MyNamespace
{
using FluentValidation;
public class Customer
{
public string Surname { get; set; }
}
public class CustomerValidator: AbstractValidator<Customer>
{
public CustomerValidator()
{
//Rule to check the customer instance is not null.
//Don't continue validating.
RuleFor(c => c.Surname).NotEmpty();
}
}
public class MyClass
{
public void DoCustomerWork(int id)
{
var customer = GetCustomer(id);
var validator = new CustomerValidator();
var results = validator.Validate(customer);
var validationSucceeded = results.IsValid;
}
public Customer GetCustomer(int id)
{
return null;
}
}
}
Donc ma question est comment puis-je vérifier dans le CustomerValidator() constructeur que l'instance actuelle de la clientèle n'est pas null et abandonner autre règle de traitement si elle est nulle?
Merci d'avance.
- Remplacer le
Validate
méthode? - Afin de disposer d'une extension de la méthode qui vérifie si elle est null premier avant d'appeler la base de Valider() la méthode?
- Non, voir ma réponse ci-dessous. Vous appelez ça comme vous le feriez pour tout autre programme de validation.
- La dernière réponse à cette question est de remplacer la PreValidate() la méthode. Exemple de Code ci-dessous.
Vous devez vous connecter pour publier un commentaire.
Vous devriez être en mesure de remplacer la
Validate
méthode dans votreCustomerValidator
classe.Validate
ne pas le feu puisque vous serait celui de l'appel de la méthode de validation.ValidateAndThrow
méthode d'extension. Il explose avant même de faire mon substituéeValidate
méthode..Validate()
ne sera pas appelé.PreValidate()
méthode si vous souhaitez mettre en œuvre une logique personnalisée pour gérer la valeur null modèles qui sont passé au validateur.Je ne peux pas vraiment tester ce droit maintenant, mais vous pouvez essayer de remplacer
Validate
, ou de comprendre les règles dans leWhen
bloc:RuleFor(x => x).NotNull().WithMessage("Customer does not exist");
, mais à l'extérieur de laWhen
bloc?Validate
est la meilleure façon d'aller iciPour ceux qui utilisent une version >6.2.1 vous avez besoin de remplacer cette signature au lieu de cela, dans le but de réaliser la même chose que @chrispr:
J'ai hérité de la fluidité de la AbstractValidator et créé un NullReferenceAbstractValidator classe à la place:
et puis héritée de la classe avec chaque validateur qui avait besoin d'une référence null check:
Que les solutions ci-dessus ne fonctionne pas pour moi (FluentValidation, Version=6.2.1.0 pour Net45), je vous poste ce que j'ai fait.
C'est juste un simple remplacement/wrapper pour
ValidateAndThrow
méthode d'extension.Utilisation du mode Cascade.
Voici l'exemple de la la documentation.
Également de la documentation:
Remplacer EnsureInstanceNotNull comme ci-dessous
Par le biais de la Coutume(). Il peut être également très utile lors de la validation d'un autre champ est basé sur la validation de votre domaine.
C'est un vieux post, mais souhaitez mettre à jour les réponses à inclure les éléments suivants à partir de la FluentValidation documentation:
À L'Aide De PreValidate
Si vous avez besoin pour l'exécution de code spécifique à chaque fois qu'un validateur est invoquée, vous pouvez le faire en remplaçant la PreValidate méthode. Cette méthode prend un ValidationContext ainsi qu'un résultat validationresult, que vous pouvez utiliser pour personnaliser le processus de validation.
https://fluentvalidation.net/start#using-prevalidate