.net6 webapi 项目搭建(三、数据校验和Sqlsugar仓储)

1,025 阅读2分钟

一、字段校验和设置请求返回值

FluentValidation是一个用于构建强类型验证规则的 .NET 库

可以对前端传过来的数据进行校验,比如是否是空值和长度限制等。

官网:docs.fluentvalidation.net/en/latest/i…

nuget安装FluentValidation.AspNetCore

新建一个验证类并且继承AbstractValidator,泛型里面放上要验证的对象。验证规则在构造函数里面写上

 public class UsersValidator : AbstractValidator<RegisterUser>
    {
        public UsersValidator()
        {
            //对每个字段进行单独校验

            RuleFor(it => it.UserName)
            .NotNull().WithMessage("请填写用户名").NotEmpty().WithMessage("用户名不能为空");
           
            RuleFor(it => it.Account)
            .NotNull().WithMessage("请填写用户账号").NotEmpty().WithMessage("账号不能为空")
            .MaximumLength(11).WithMessage("账号长度太长");

            RuleFor(it => it.Password)
            .NotNull().WithMessage("请填写用户密码").NotEmpty().WithMessage("密码不能为空")
            .MaximumLength(11).WithMessage("密码长度太长");

        }
    }

新建一个HttpResult类统一响应格式

 public class HttpResult<T>
    {
        public int status { get; set; }

        public string? Message { get; set; }

        public T? Data { get; set; }



        /// <summary>
        /// 统一返回
        /// </summary>
        /// <returns></returns>
        public static HttpResult<T> success(string message)
        {
            return new HttpResult<T>()
            {
                status = 200,
                Message = message
            };
        }
        public static HttpResult<T> success(T data)
        {
            return new HttpResult<T>()
            {
                status = 200,
                Data = data
            };
        }


        /// <summary>
        /// 统一错误
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static HttpResult<T> error(T data)
        {
            return new HttpResult<T>()
            {
                status = 400,
                Data = data
            };
        }
        public static HttpResult<T> error(string message)
        {
            return new HttpResult<T>()
            {
                status = 400,
                Message = message
            };
        }
        public static HttpResult<T> unauthorized(string message)
        {
            return new HttpResult<T>()
            {
                status = 401,
                Message = message
            };
        }
    }

在program.cs里面添加

#region 设置响应错误信息格式
builder.Services.AddMvc().ConfigureApiBehaviorOptions(options =>
{
    options.InvalidModelStateResponseFactory = c =>
    {
        Console.WriteLine(c);
        //处理错误消息拼接成字符串
        var errors = string.Join("&", c.ModelState.Values.Where(v => v.Errors.Count > 0)
          .SelectMany(v => v.Errors).Select(v => v.ErrorMessage).Where(v => v.IndexOf("field is required.") == -1));
        
        return new BadRequestObjectResult(HttpResult<Object>.error(errors));
    };
});
#endregion
#region FluentValidation 字段校验注入

builder.Services.AddFluentValidation(opt =>
{
    opt.RegisterValidatorsFromAssembly(Assembly.Load("验证类所在的位置"));
});
#endregion

二、使用Sqlsugar仓储

官网: www.donet5.com/Home/Doc?ty…

在Repository类库中创建一个BaseRepository类,

using SqlSugar;

namespace skuMall
{
    public class BaseRepository<T> : SimpleClient<T> where T : class, new()
    {
        public BaseRepository(ISqlSugarClient context) : base(context)
        {
           base.Context = context;
        }

        /// <summary>
        /// 扩展方法,自带方法不能满足的时候可以添加新方法
        /// </summary>
        /// <returns></returns>
        public List<T>? CommQuery(string json)
        {
            //base.Context.Queryable<T>().ToList();可以拿到SqlSugarClient 做复杂操作
            return null;
        }

    }
}

在领域模型中新建视图层VO 和数据传输层 DTO

Snipaste_2022-06-26_09-34-50.png

Repository层创建一个接口和实现类

internal interface InterfaceUserRepository
    {
        /// <summary>
        /// 添加
        /// </summary>
        /// <param name="users"></param>
        /// <returns></returns>
        bool Insert(Users users);
    }
public class UserRepository : BaseRepository<Users> , InterfaceUserRepository
    {
    
        public UserRepository(ISqlSugarClient db) : base(db) { }

        /// <summary>
        /// 添加
        /// </summary>
        /// <param name="users"></param>
        /// <returns></returns>
        public override bool Insert(Users users)
        {
            return base.Insert(users);
        }
    }

Snipaste_2022-06-26_09-48-05.png

在services层中同样创建接口和实现类

interface InterfaceUserServices<T>
    {

        /// <summary>
        /// 注册用户
        /// </summary>
        /// <param name="users"></param>
        /// <returns></returns>
        Task<T> registerUser(Users users);

    }
 public async Task<IActionResult> registerUser(Users users)
        {
            try
            {
                if (userRepository.Insert(users))
                {
                    return new OkObjectResult(HttpResult<Users>.success("注册成功"));
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                string err = ex.Message;
                if(ex.Message.Contains("Duplicate entry") && ex.Message.Contains(" for key 'Account'"))
                {
                    err = "账号重复,请换一个试试";
                }
                return new OkObjectResult(HttpResult<Users>.error(err));
            }

            return new BadRequestObjectResult(HttpResult<Users>.error("系统异常"));

        }

三、测试效果

Snipaste_2022-06-26_16-53-20.png

Snipaste_2022-06-26_16-54-28.png