验证API

本篇定位在数据入口的验证

  1. 普通的DataAnnotation验证
  2. 基于场景的DataAnnotation验证
  3. 可修改的外置式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的更多相关文章

  1. Javascript高级编程学习笔记(78)—— 表单(6)HTML约束验证API

    自动切换焦点 使用JS可以极大地提升表单的易用性 其中最常用的一种就是当用户填写完当前字段后焦点自动切换到下一个字段 以下方的HTML代码为例: <input type="text&q ...

  2. 银行卡验证API

    一.银联开放平台 https://open.unionpay.com/tjweb/api/detail?apiSvcId=21 应用场景 综合数据服务平台是银联为接入商户提供的综合数据认证服务接口,目 ...

  3. 【Azure API 管理】在APIM中使用客户端证书验证API的请求,但是一直提示错误"No client certificate received."

    API 管理 (APIM) 是一种为现有后端服务创建一致且现代化的 API 网关的方法. 问题描述 在设置了APIM客户端证书,用户保护后端API,让请求更安全. 但是,最近发现使用客户端证书的API ...

  4. Yii学习笔记之四(表单验证 api 翻译)

    1.表单验证 对于用户输入的全部数据,你不能信任,必须加以验证. 全部框架如此.对于yii 能够使用函数  yii\base\Model::validate()  进行验证 他会返回boolean值的 ...

  5. JavaScript 验证API

    约束验证 DOM 方法 Property Description checkValidity() 如果 input 元素中的数据是合法的返回 true,否则返回 false. setCustomVal ...

  6. 吴裕雄--天生自然 JAVASCRIPT开发学习: 验证 API

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> ...

  7. API验证及AES加密

    API验证 API验证: a. 发令牌: 静态 PS: 隐患 key被别人获取 b. 动态令牌 PS: (问题越严重)用户生成的每个令牌被黑客获取到,都会破解 c. 高级版本 PS: 黑客网速快,会窃 ...

  8. 使用Postman验证TFS Rest API

    概述 你可能已经了解到,TFS自2015版本发布以来,开始支持通过REST API的方式提供接口服务,第三方平台可以通过通用的HTTP协议访问TFS系统,获取数据.请求编译等.REST API在原有. ...

  9. CMDB API验证

    CMDB API验证 为什么做API验证 API验证是防止数据在传输的过程中,保证数据不被篡改 如何设计的API验证 灵感来源于Torando中加密Cookie的源码,主要是生成加密的随机字符串. M ...

随机推荐

  1. JS数组学习笔记

    原文:JS数组学习笔记 最近在备课数组,发现很多ES5的方法平时很少用到.细节比较多,自己做了大量例子和整理,希望对大家了解JavaScript中的Array有所帮助. 概念 数组是值的有序集合.每个 ...

  2. HDU 5052 Yaoge’s maximum profit 光秃秃的树链拆分 2014 ACM/ICPC Asia Regional Shanghai Online

    意甲冠军: 特定n小点的树权. 以下n每一行给出了正确的一点点来表达一个销售点每只鸡价格的格 以下n-1行给出了树的侧 以下Q操作 Q行 u, v, val 从u走v,程中能够买一个鸡腿,然后到后面卖 ...

  3. 一起学习android使用一个回调函数onCreateDialog实现负载对话(23)

    效果图: 有时候我们须要去做一个Activity启动时的数据载入对话框,关于对话框的各种实现能够通过一起学android之对话框 Dialog的创建(7)来完毕,在这里另外介绍一个,利用onCreat ...

  4. java_面试_20140402(爬虫面试题)

  5. 【github课程】创建github仓库和库创建一个版本号,并添加到存储库文件的版本号

    首先,需要登录github注册一个帐号:https://github.com/ 注册帐号登录后,.在右上角,"新仓库": 然后会出现例如以下的界面: 仅仅须要输入仓库的名称,描写叙 ...

  6. Oracle分区表转换

    Oracle普通表—>分区表转换(9亿数据量) 背景介绍: 环境:Linux 5.5 + Oracle 10.2.0.4 某普通表T,由于前期设计不当没有分区,如今几年来的数据量已达9亿+, 空 ...

  7. 项目管理实践 -- 健身小管家(Fitness housekeeper)的管理(5)(终结)

    App已经上线了,应用宝上搜索“健身小管家”即可找到,不过存在几个问题:

  8. Hadoop学习之配置Eclipse远程调试Hadoop

    构建完毕Hadoop项目后,接下来就应该跟踪Hadoop的运行情况,比方在命令行运行hadoop namenode–format时运行了Hadoop的那些代码.当然也能够直接通过阅读源码的方式来做到这 ...

  9. 基于HTTP/2和protobuf的RPC框架:GRPC

    谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC Google 刚刚开源了grpc,  一个基于HTTP2 和 Protobuf 的高性能.开源.通用的RPC框架.Protobu ...

  10. 使用jquery实现放大镜效果

    原文:使用jquery实现放大镜效果 实现原理 首先,我们讲解一下放大镜效果的实现方式: 方法一:准备一张高像素的大图,当鼠标放到原图上,加载显示大图的对应位置. 方法二:对原图片进行放大,也就是调整 ...