.Net Core 数据校验框架使用

为了提高响应速度和界面可用性,一般在客户端都会对用户填写的数据进行校验,这样不需要把数据发送到服务端,用户就知道数据填写错误。但是也不能完全依赖客户端的校验,不仅因为恶意用户可以绕过客户端校验直接向服务器发送请求,而且服务器端也需要对于客户端开发人员对数据校验不到位的地方做兜底工作。所以,服务器端也应该做数据校验。

.Net Core 框架本身也内置了数据校验,比如必填校验[Require]等,但校验需要写在类本身上,校验规则和模型类具有较高的耦合性,违背单一职责原则,另一方面,内置的校验规则也不够多。

基于以上原因,使用FluentValidation数据校验框架,做数据的校验,下面在.Net Core WebAPI项目中使用框架做数据的校验。

1.创建项目并引用相关的包

fluentvalidation.aspnetcore

2.在Program.cs中添加注册相关服务的代码

builder.Services.AddFluentValidation(fv =>
{
    Assembly assembly = Assembly.GetExecutingAssembly();
    fv.RegisterValidatorsFromAssembly(assembly);
});

RegisterValidatorsFromAssembly方法用于把制定程序集中所有实现了IValidator接口的数据校验类注册到依赖注入容器中。因为本项目所有数据校验类都写到了一个项目中,所以用RegisterValidatorsFromAssembly获取入口项目的程序集。

如果有多个程序集,需要调用RegisterValidatorsFromAssemblies执行这些程序集进行注册。

3.编写模型类

namespace WebApplication1
{
    public record LoginRequest(string Email, string Password, string Password2);
}

4.编写一个数据校验类

using FluentValidation;

namespace WebApplication1
{
    public class LoginRequestVaildator : AbstractValidator<LoginRequest>
    {
        public LoginRequestVaildator()
        {
            RuleFor(x => x.Email).NotNull().EmailAddress()
                .Must(v => v.EndsWith("@qq.com") || v.EndsWith("@163.com"))
                .WithMessage("只支持QQ和163邮箱");

            RuleFor(x => x.Password).NotNull().Length(3, 10)
                .WithMessage("密码必须介于3到10位之间")
                .Equal(x => x.Password2).WithMessage("两次密码必须一致");
        }
    }
}

数据校验类一般集成自AbstractValidator,AbstractValidator是一个泛型类,需要通过泛型参数指定这个数据校验类对哪个类进行校验;校验规则需要写到校验类的构造方法中;

5.编写一个操作方法

        [HttpPost]
        public void dataVaild(LoginRequest login) {
            Console.WriteLine(login.Password);
        }

用LoginRequest作为参数,然后在客户端向这个操作方法对应的路径发送数据。

 

使用FluentValidation后,可以把数据校验的规则写到单独的书校验类中,这样模型类和数据校验类各司其职,符合“单一职责原则”,而且在FluentValidation中编写自定义校验代码也更加简单。

猜你喜欢

转载自blog.csdn.net/liangmengbk/article/details/130813503
今日推荐