验证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 ...
随机推荐
- seaJs组建库
seaJs组建库的使用 原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以 ...
- PHP图片等比缩放,并添加Logo水印特定代码和盯
<? php //PHP图片等比缩放,并添加Logo水印 --->百度 "美日汇" /** * 等比缩放函数(以保存的方式实现) * @param string $pi ...
- Claris and XOR
Problem Description Claris loves bitwise operations very much, especially XOR, because it has many b ...
- SSIS从理论到实战,再到应用(6)----SSIS的自带日志功能
原文:SSIS从理论到实战,再到应用(6)----SSIS的自带日志功能 上期回顾: SSIS从理论到实战,再到应用(5)----流程控制之Foreach循环 博主最近新负责了一个ssis大项目的架构 ...
- C#工具类(包含获取枚举描述方法)
//把一个对象转换成功键值对字典格式 var obj = new { CustomerId = customerId }; var dic = obj.ToDictionray(); public s ...
- ChartType属性
xl3DArea:三维面积图 xl3DAreaStacked:三维堆积面积图 xl3DAreaStacked100:三维堆积面积图 xl3DBarClustered:三维簇状条形图 xl3DBarSt ...
- Linux内核和根文件系统引导加载程序
续博文<u-boot之u-boot-2009.11启动过程分析> Linux内核启动及文件系统载入过程 当u-boot開始运行bootcmd命令.就进入Linux内核启动阶段,与u-boo ...
- eclipse 组态xdebug
1.打开浏览器打开phpinfo页面视图PHP版本号.TS(线程安全)版本NTS(非线程安全)版本.以及VC6版本号是VC9版本号 2.和上面版本号相应的xdebug:http://xdebug.or ...
- Android真正简单的教程-第十二枪(ViewFlipper实现滑动效果)
直接看代码 1.MainActivity.java: package org.yayun.demo; import android.app.Activity; import android.os.Bu ...
- Linux下Nagios
Linux下Nagios的安装与配置 一.Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机 ...