如何重构空值或空字符串校验代码 使其更精简整洁?
方案1:使用ASP.NET Core内置数据注解校验(最推荐,零冗余代码)
你只需要在Account模型的对应属性上加[Required]注解即可,框架会自动完成校验,校验失败会自动返回400 BadRequest,不需要手动写任何判断逻辑:
public class Account { [Required(ErrorMessage = "Name is required")] public string Name { get; set; } [Required(ErrorMessage = "Nationality is required")] public string Nationality { get; set; } [Required(ErrorMessage = "Phone is required")] public string Phone { get; set; } // 其余7个属性同理加对应注解即可 }
ASP.NET Core 2.0+版本默认已经开启了自动模型校验,只要接口参数上加[FromBody]等绑定特性即可,原有接口里的所有校验代码都可以完全删掉:
public IActionResult CreateAccount([FromBody] Account account) { // 不需要写任何空校验代码,框架校验不通过会自动返回400 // 直接写后续业务逻辑即可 }
如果是旧版本或者手动关闭了自动校验,也只需要加一行判断即可:
if (!ModelState.IsValid) return BadRequest(ModelState);
方案2:遍历校验规则集合(适合自定义校验场景)
如果不想用数据注解,或者有自定义的特殊校验规则,可以把需要校验的属性和对应的错误提示封装成元组集合,统一遍历判断,10个属性也只需要不到10行核心代码:
var validationRules = new List<(Func<string> valueGetter, string errorMessage)> { (() => account.Name, "Name is required"), (() => account.Nationality, "Nationality is required"), (() => account.Phone, "Phone is required"), // 其余7个属性直接加一行到这个集合里即可 }; foreach (var rule in validationRules) { if (string.IsNullOrEmpty(rule.valueGetter())) { return BadRequest(rule.errorMessage); } }
这个方案的好处是所有校验规则统一维护,新增校验项只需要加一行到集合里,不需要重复写if判断逻辑。
方案3:使用FluentValidation库(适合复杂校验场景)
如果你的校验规则比较复杂,除了非空还有长度、格式、跨字段关联校验等需求,可以用FluentValidation库,实现校验逻辑和业务逻辑完全分离:
首先定义校验器:
public class AccountValidator : AbstractValidator<Account> { public AccountValidator() { RuleFor(x => x.Name).NotEmpty().WithMessage("Name is required"); RuleFor(x => x.Nationality).NotEmpty().WithMessage("Nationality is required"); RuleFor(x => x.Phone).NotEmpty().WithMessage("Phone is required"); // 其余属性直接加校验规则即可 } }
在Program.cs里注册全局自动校验后,接口里同样不需要写任何校验代码,框架会自动触发校验返回错误信息。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

