-2

I implemented fluent validation rules. I am sending a request to my controller api endpoint via angular request in json format.

When I receive data and model parameter is populated I want to use fluent validation to validate sent data.

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

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

return Ok();

    }

How can I instantiate and access object and pass correct request in generic way with dependency injection?

sensei
  • 7,044
  • 10
  • 57
  • 125

2 Answers2

1

Create a Base abstraction class:

 public abstract class BaseApiRequest
{
}

Inherit your model with this abstraction class

public class YourModel : BaseApiRequest
{

}

After that create an extension method:

 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;
    }

Now, you can validate your request using:

 if (!request.IsValidApiRequest())
            return BadRequest();
Manprit Singh Sahota
  • 1,279
  • 2
  • 14
  • 37
0

I ended up using injecting IValidator instance and invoking it with: var result = _validator.Validate(instance); where instance is T of registered AbstractValidator

sensei
  • 7,044
  • 10
  • 57
  • 125