如何在 MVC 控制器中通过 DI 以通用方式使用 FluentValidation

How to use FluentValidation in a generic way with DI in MVC controllers

我实施了流畅的验证规则。我正在通过 angular 请求以 json 格式向我的控制器 api 端点发送请求。

当我收到数据并填充模型参数时,我想使用流畅的验证来验证发送的数据。

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

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

return Ok();

    }

如何使用依赖注入以通用方式实例化和访问对象并传递正确的请求?

创建基础抽象 class:

 public abstract class BaseApiRequest
{
}

用这个抽象继承你的模型class

public class YourModel : BaseApiRequest
{

}

之后创建一个扩展方法:

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

现在,您可以使用以下方式验证您的请求:

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

我最终使用注入 IValidator 实例并调用它: var result = _validator.Validate(实例);其中实例是已注册的 AbstractValidator

的 T