2017-02-02 1 views
0

J'ai implémenté des règles de validation courantes. J'envoie une requête à mon point de terminaison api du contrôleur via une requête angulaire au format json.Comment utiliser FluentValidation de manière générique avec DI dans les contrôleurs MVC

Lorsque je reçois des données et que le paramètre du modèle est rempli, je souhaite utiliser la validation courante pour valider les données envoyées.

[Route("")] 
    [HttpPost] 
    public async Task<IActionResult> Post([FromBody]TesViewModel request) 
     { 

        var validator = new TesViewModelValidator(); 
        var result = await validator.ValidateAsync(request); 

return Ok(); 

    } 

Comment puis-je instancier et de l'objet d'accès et de transmettre la demande correcte de manière générique avec l'injection de dépendance?

+0

Utilisez-vous Autofac pour DI? – Amit

+0

J'utilise structuremap –

Répondre

0

J'ai fini par utiliser l'instance IValidator d'injection et l'invoquant avec: var result = _validator.Validate (instance); où instance est T de AbstractValidator enregistré

0

Créer une classe d'abstraction de base:

public abstract class BaseApiRequest 
{ 
} 

Hérite votre modèle avec cette classe d'abstraction

public class YourModel : BaseApiRequest 
{ 

} 

Après cela créer une méthode d'extension:

public static bool IsValidApiRequest<T>(this T entity) 
     where T : BaseApiRequest 
    { 
     var attribute = (ValidatorAttribute)Attribute.GetCustomAttribute(typeof(T), typeof(ValidatorAttribute)); 
     if (attribute != null) 
     { 
      if (entity == null) 
       return false; 
      var validator = attribute.ValidatorType; 
      var instance = Activator.CreateInstance(validator); 
      MethodInfo method = instance.GetType().GetMethod("Validate", new[] { typeof(T) }); 
      object result = method.Invoke(instance, new object[] { entity }); 
      return (bool)result.GetType().GetProperty("IsValid").GetValue(result); ; 
     } 
     return true; 
    } 

Maintenant, vous pouvez valider votre demande en utilisant:

if (!request.IsValidApiRequest()) 
      return BadRequest();