验证API
验证API
本篇定位在数据入口的验证
- 普通的DataAnnotation验证
- 基于场景的DataAnnotation验证
- 可修改的外置式DataAnnotation验证
SUMMARY

最终调用时的用法:

class Program
{
static void Main(string[] args)
{
A2DFramework.Starter.Init();
A2DFramework.RuleEngine.Starter.Init();
A2DFramework.BusinessExceptionService.Starter.Init(); User user = new User();
user.FirstName = "aaa";
user.CustomField = "aaron";
foreach (var error in user.IsValid())
{
Console.WriteLine(error.Key);
}
Console.WriteLine("===================");
foreach (var error in user.IsValid("场景1"))
{
Console.WriteLine(error.Key);
Console.WriteLine(error.Message);
} Console.ReadKey();
}
}

原理:
基于场景的验证特性实现,举例:RuleDataTypeAttribute
RuleDataTypeAttribute,也就是DataTypeAttribute的场景支持版:

/// <summary>
/// 支持规则场景的验证基类
/// </summary>
public class RuleValidationAttribute : ValidationAttribute
{
public RuleValidationAttribute()
{
this.RuleName = string.Empty;
} public RuleValidationAttribute(string rule)
{
this.RuleName = rule;
} public string RuleName { get; set; } protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
return base.IsValid(value, validationContext);
}
} public class RuleDataTypeAttribute : RuleValidationAttribute
{
private DataTypeAttribute checker; public RuleDataTypeAttribute(DataType dataType):this(string.Empty, dataType)
{
}
public RuleDataTypeAttribute(string rule, DataType dataType):base(rule)
{
checker = new DataTypeAttribute(dataType);
} public RuleDataTypeAttribute(string rule, string customDataType)
: base(rule)
{
checker = new DataTypeAttribute(customDataType);
} protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
return checker.GetValidationResult(value, validationContext);
}
}

至于基于RuleName的执行验证代码,核心代码:

List<BrokenRule> errors = new List<BrokenRule>();
var descriptor = GetTypeDescriptor(t);
foreach (PropertyDescriptor propertyDescriptor in descriptor.GetProperties())
{
foreach (var validationAttribute in propertyDescriptor.Attributes.OfType<ValidationAttribute>())
{
RuleValidationAttribute baseAttr = validationAttribute as RuleValidationAttribute;
if (baseAttr != null)
{
//支持场景验证
if (baseAttr.RuleName.Equals(scene, StringComparison.OrdinalIgnoreCase))
{
ValidateProperty(o, errors, propertyDescriptor, validationAttribute);
}
}
else
{
//不支持场景的验证
ValidateProperty(o, errors, propertyDescriptor, validationAttribute);
}
}
}
private void ValidateProperty(object o, List<BrokenRule> errors, PropertyDescriptor propertyDescriptor, ValidationAttribute validationAttribute)
{
object obj = propertyDescriptor.GetValue(o);
ValidationContext ctx = new ValidationContext(o, null, null);
ValidationResult result = validationAttribute.GetValidationResult(obj, ctx);
if (result != ValidationResult.Success)
{
BrokenRule error = new BrokenRule();
error.Key = propertyDescriptor.Name;
error.Message = validationAttribute.FormatErrorMessage(propertyDescriptor.Name);
errors.Add(error);
}
}

上述代码是实现C#硬编码的验证逻辑,关于外置验证逻辑其实就是上述的另外一份拷贝,只是把里面的某些函数redirect到xml中,略。
具体文本验证逻辑的执行是通过调用js引擎实现,都比较简单。
稍微修改就能实现分布式和统一管理。
验证API的更多相关文章
- Javascript高级编程学习笔记(78)—— 表单(6)HTML约束验证API
自动切换焦点 使用JS可以极大地提升表单的易用性 其中最常用的一种就是当用户填写完当前字段后焦点自动切换到下一个字段 以下方的HTML代码为例: <input type="text&q ...
- 银行卡验证API
一.银联开放平台 https://open.unionpay.com/tjweb/api/detail?apiSvcId=21 应用场景 综合数据服务平台是银联为接入商户提供的综合数据认证服务接口,目 ...
- 【Azure API 管理】在APIM中使用客户端证书验证API的请求,但是一直提示错误"No client certificate received."
API 管理 (APIM) 是一种为现有后端服务创建一致且现代化的 API 网关的方法. 问题描述 在设置了APIM客户端证书,用户保护后端API,让请求更安全. 但是,最近发现使用客户端证书的API ...
- Yii学习笔记之四(表单验证 api 翻译)
1.表单验证 对于用户输入的全部数据,你不能信任,必须加以验证. 全部框架如此.对于yii 能够使用函数 yii\base\Model::validate() 进行验证 他会返回boolean值的 ...
- JavaScript 验证API
约束验证 DOM 方法 Property Description checkValidity() 如果 input 元素中的数据是合法的返回 true,否则返回 false. setCustomVal ...
- 吴裕雄--天生自然 JAVASCRIPT开发学习: 验证 API
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> ...
- API验证及AES加密
API验证 API验证: a. 发令牌: 静态 PS: 隐患 key被别人获取 b. 动态令牌 PS: (问题越严重)用户生成的每个令牌被黑客获取到,都会破解 c. 高级版本 PS: 黑客网速快,会窃 ...
- 使用Postman验证TFS Rest API
概述 你可能已经了解到,TFS自2015版本发布以来,开始支持通过REST API的方式提供接口服务,第三方平台可以通过通用的HTTP协议访问TFS系统,获取数据.请求编译等.REST API在原有. ...
- CMDB API验证
CMDB API验证 为什么做API验证 API验证是防止数据在传输的过程中,保证数据不被篡改 如何设计的API验证 灵感来源于Torando中加密Cookie的源码,主要是生成加密的随机字符串. M ...
随机推荐
- Weka初步
从前年開始使用weka最数据挖掘方面的研究,到如今有一年半的时间了.看到我们同组的兄弟写了关于weka方面的总结.我也想整理一下.由于网上的资料实在是太少.记得刚接手的时候,真是硬着头皮看代码.只是到 ...
- Struts1和Struts2对照
最近学习Struts1和Struts2.好多人.提到非常多的信息. Struts2不从Struts1进化. Struts2的前身WebWork. 呢,看了一些资料,下边就来比較比較. 一.架构分析 S ...
- android download学习记录
东西拼凑,最终弄出来能够用的代码 [1].[代码] [Java]代码 跳至 [1] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...
- 沃森Mysql数据库修复工具
华信Mysql数据库修复程序是由北京华信数据恢复中心独立研发.主要针对Mysql数据库损坏的恢复. 本程序可用于因为各种误操作而导致数据丢失的恢复,以及因为断电.陈列损坏.硬盘坏道等各种原因导致数据库 ...
- jquery选择器基础知识
$("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个id值是myElement所以得到的是唯一的元素 $("di ...
- 【源代码】StringBuilder和StringBuffer震源深度分析
//------------------------------------------------------------------------ 写篇博客不easy.请尊重作者劳动成果. 转载请注 ...
- TFTP server组态
TFTP server组态 2014-10-31北京海淀区 张俊浩 一.TFTP(Trivial File Transfer Protocol,简单文件传输协议或称小型文件传输协议) 是一种简化的文 ...
- Windows系统下Redis的安装
Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博.Github.StackOverflow 等大型应用中都用其作为缓存,Redis的官网为http://redis.io/. 最近 ...
- Python学习笔记16:标准库多线程(threading包裹)
Python主要是通过标准库threading包来实现多线程. 今天,互联网时代,所有的server您将收到大量请求. server要利用多线程的方式的优势来处理这些请求,为了改善网络port读写效率 ...
- c语言复杂声明解析
这是个好东西,接触c语言好几年了,第一次看到这东西,惊喜万分. 先提供个分析案例,以后看方便 vector <int> * (*seq_array[]) (int )={func1,fun ...