验证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. IOS ARC和非ARC文件混用

    ARC在SDK4.0的时候增加的,因为要和曾经的项目融合,就会有arc和非arc文件的混合. 当然,也就这两种情况: 1.自己的旧项目没有使用ARC,可是引入的第三方库却是使用了ARC的. 2.自己的 ...

  2. Linux命令学习篇0——原产地

    昨天在用curl发送简单的HTTP请求做測试的时候发现自己每次使用的时候都是在网络上查看别人的演示样例才干想起来怎么用,这样效率太低了.尽管有网络依旧在,可是总感觉不是被自己掌握着,心里不踏实,回忆起 ...

  3. 迷宫的最短路径 (BFS)

    N*M的迷宫,从起点到终点,求最短距离 宽度优先搜索按照距开始状态由近及远的顺序进行搜索,因此可以很容易的用来求最短路径,最少操作之类问题的答案.  (可以构造成pair或者编码成int来表达状态) ...

  4. Object.extend

    原文:[转载]Object.extend Object.extend = function (destination, source) { for ( var property in source) ...

  5. 阅读《大数据》Tuzipeizhe

    一本好书.4/5明星. 内容:引进美国和信息,相关历史资料.从建国,为了连任奥巴马. 它是引入大型数据在美国,如何从头开始. 的流逝,到近期几年.这股影响美国的大数据 是怎样走入世界,影响各国的. 英 ...

  6. 各大oj题目分类(转)

    POJ题目分类 | POJ题目分类 | HDU题目分类 | ZOJ题目分类 | SOJ题目分类 | HOJ题目分类 | FOJ题目分类 | 模拟题: POJ1006POJ1008POJ1013POJ1 ...

  7. git_自动同步_sync.sh

    1: 使用方法  sh sync.sh  code_dir 代码 #add echo $1 cd $1 git add . git commit -m "Added notes for $( ...

  8. java_linux_shell_定时kill 启动java程序

    #!/bin/bash #while truedo Process_ID=`ps -ef |grep 'LoginSinaWeiboCookie.jar' |grep -v grep |awk '{p ...

  9. Shuttle ESB

    Shuttle ESB(六)——在项目中的应用 如果说你认真看了前面几篇关于ESB的介绍,我相信,在这一篇文章中,你将会找到很多共鸣. 尽管,市面上开源的ESB确实非常之多,像Java中的Mule E ...

  10. 【转】简述什么是Web服务(Web Service)技术?

          Web Service 是在 Internet 上进行分布式计算的基本构造块,是组件对象技术在 Internet 中的延伸,是一种部署在Web 上的组件.它融合了以组件为基础的开发模式和 ...