Minimal Api<五> 添加模型验证(fluentValidate)
上一节我们跑通了数据库,并向user表中添加了一条用户记录。这一节我们模拟一样用户登录验证。
一、在UserServer中put接口用于用户名和密码的验证。fluentValidate的基本用法自己找资源看吧。
app.MapPut("/api/Login", (Microsoft.AspNetCore.Http.HttpContext ctx, LoginDto user) => { using (var serviceScope = app.ServiceProvider.CreateScope()) { ValidationResult result= ctx.Request.Validate<LoginDto>(user); if (!result.IsValid) { return new HttpResult<Core.Entity.SysUser>() { code = 100, message = string.Join(",", result.Errors.Select(s => s.ErrorMessage).ToList()) }; } sysUserRepository = serviceScope.ServiceProvider.GetRequiredService<ISysUserRepository>(); Core.Entity.SysUser sysUser = sysUserRepository.FindEntity<Core.Entity.SysUser>(u => u.Name == user.UserName && u.Password == user.Password); if (sysUser != null) { return new HttpResult<Core.Entity.SysUser>() { code = 200, message = "登录成功。" }; } else { return new HttpResult<Core.Entity.SysUser>() { code = 101, message = "用户名或者密码错误。" }; } } });
二、给模型添加验证逻辑,演示就先放一个验证用户名为空的验证就好了。简单些。
public class LoginDtoValidator : AbstractValidator<LoginDto> { public LoginDtoValidator() { RuleFor(x => x.UserName).NotNull().NotEmpty().WithMessage("用户不可为空"); } }
三、建一个管道拓展文件,将验证模型类注入到容器
public static class ValidationExtensions { public static IServiceCollection AddValidation(this IServiceCollection services, ConfigurationManager configure) { services.AddScoped<IValidator<LoginDto>, LoginDtoValidator>(); return services; }
builder.Services.AddValidation(builder.Configuration);
四、再在上面的验证拓展中间件中拦截请求并注入一个方法即在请求中注入一个验证模型的实例。
public static class ValidationExtensions { public static IServiceCollection AddValidation(this IServiceCollection services, ConfigurationManager configure) { services.AddScoped<IValidator<LoginDto>, LoginDtoValidator>(); return services; } public static ValidationResult Validate<T>(this HttpRequest request, T model) { var validator = request.HttpContext.RequestServices.GetService<IValidator<T>>(); return validator.Validate(new ValidationContext<T>(model)); } }
五、这样就可以使用request进行验证方法。如下:
ValidationResult result= ctx.Request.Validate<LoginDto>(user); if (!result.IsValid)
六、运行一下试试看,输入上一节新增的用户和密码。excute一下。结果如下是成功的。
七、删掉username ,再点一次访问,提示用户不可空。跟再loginDtoValidator里面设置的为空范围信息一致。