在信息系统的数据保存中,往往对数据的格式或者内容进行校验,成功后再允许保存,往往程序员需要在业务层保存数据前进行校验,需要耗费大量的时间。为了解决团队重复写代码的情况,则在数据层下增加了正则表达式校验的过程,当然不能100%能使用该方法,有些是具有很强的逻辑性的,但从使用效果来看,起码满足95%以上的需求。
思路比较简单,就是在实体上打上校验标签,例如字符串长度限制
在此举例
1、定义校验基类
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
public class CustomValidationAttribute : System.Attribute
{
protected string _regex;
protected string _errMsg;
public CustomValidationAttribute(string regex, string errMsg)
{
_regex = regex;
_errMsg = errMsg;
}
public virtual RValue<bool> IsValid(object value)
{
if (Equals(value, null))
{
return "校验值不能是空值";
}
var b = Regex.IsMatch($"{value}", _regex);
if (b)
return true;
return _errMsg;
}
}
2、定义一个IDCardAttribute,限定字符串是身份证
public class IDCardAttribute : CustomValidationAttribute
{
public IDCardAttribute(string errMsg = "校验的值不是身份证号码") : base(@"(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)", errMsg)
{
}
}
2、定义一个实体
public class Employee
{
public string ID {get;set;}
[IDCard]
public string IDCard {get;set;}
}
3、定义一个校验器DataValidator,这个校验器其实就是对实体进行反射,对每个包含CustomValidationAttribute标注的字段进行校验,调用IsValid(object value)方法,只要返回false,则把校验的消息作为错误提示信息返回给用户。这个类没有设么技术性,就是简单的反射,就不贴代码了。
如果在开发框架中具有数据访问层基类,且
微软也在net5.0(好像是)以后就有自带的类似功能,但是在net461(旧的程序还在用这个东东)只能自己写校验功能了,也为了框架尽量减少引用,例如去掉微软带的MemeoryCache太过于庞大。