zoukankan      html  css  js  c++  java
  • 可扩展验证框架

    SUMMARY

    • 用途
    • DEMO演示
    • NuGet相关的资料
    • VS工具端的设置

    用途

    数据验证的作用很重要,目前.NET提供的内建验证机制是采用DataAnnotation方式来实现属性的验证,并且也提供了很多验证Attribute,如下图:

     

    不过缺点也有:

    • 没有基于场景的验证支持
      • 如订单Entity
        • 如果是PC录入,则要求验证完整的属性有效性
        • 如果是Mobile录入,则要求验证一部分属性有效性
        • 如果是后台admin录入,则要求最小属性有效性
    • 硬编码导致不灵活
      • 生产环境中的维护成本,重新编译、测试、上线
      • 管理人员无法修改规则,只能通过开发部门

    基于上述2点,做了些改进,填补上述缺点

    DEMO演示

    先建立工程,然后用NuGet工具引用A2DFramework.BusinessExceptionService:

    public class OrderEntity
        {
            [Required]
            [RuleMobileAttribute("PC录入")]  //这个是A2DFramework提供的验证属性,构造函数中标明场景名
            public string FirstName { get; set; }
    
            public string LastName { get; set; }
    
            public string Mobile { get; set; }
    }
    class Program
        {
            static void Main(string[] args)
            {
                A2DFramework.Starter.Init();
                A2DFramework.RuleEngine.Starter.Init();
                A2DFramework.BusinessExceptionService.Starter.Init();
    
                OrderEntity user = new OrderEntity();
                user.FirstName = "";
                Console.WriteLine("=========无场景验证,既执行基本验证==========");
                foreach (var error in user.IsValid ())//基本验证用法,不会验证场景
                {
                    string msg = string.Format("key: {0}, msg: {1}", error.Key, error.Message);
                    Console.WriteLine(msg);
                }
                Console.WriteLine("==========有场景验证 [PC录入]=========");
                foreach (var error in user.IsValid("PC录入") )//场景验证方式,参数中传入场景名
                {
                    string msg = string.Format("key: {0}, msg: {1}", error.Key, error.Message);
                    Console.WriteLine(msg);
                }
    
                Console.ReadKey();
            }
        }

    场景部分验证规则可硬编码在C#代码中,也可以extract到xml中:

    A2D.config:
    <?xml version="1.0" encoding="utf-8" ?>
    <A2D>
        <BusinessExceptionService configSource ="A2D.BusinessExceptionService.config">
        </BusinessExceptionService>
    </A2D>
    
    
    A2D.BusinessExceptionService.config:
    <?xml version="1.0" encoding="utf-8" ?>
    <A2D>
        <BusinessExceptionService>
            <Scene Name="场景1">
                <EntityType Type="ConsoleApplication12.OrderEntity, ConsoleApplication12">
                    <Rule RuleType="PropertyValidator " FailAction="Warning" PropertyName="LastName" ErrorMessage="LastName值不能大于10">
                        <![CDATA[
                                                                                                                    value!=null&&value.length<=10 
                                                                                                                    ]]></Rule>
                    <Rule RuleType="ClassValidator" FailAction="Warning" ErrorMessage="FirstName与LastName不相符">
                        <![CDATA[
                                                                                                                    value!=null
                                                                                                                    &&value.FirstName!=null
                                                                                                                    &&value.LastName!=null
                                                                                                                    &&value.FirstName===value.FirstName 
                                                                                                                    ]]>
                    </Rule>
                </EntityType>
            </Scene>
        </BusinessExceptionService>
    </A2D>

    RuleType允许的值有两种:PropertyValidator和ClassValidator。分别代表验证属性、验证整个Entity。

    Rule内容采用javascript写法,如果当前RuleType为PropertyValidator,则value代表当前属性值

    如果当前RuleType为ClassValidator,则value代表当前Entity

    执行结果:

    NuGet相关的资料

    NuGet学习笔记(1)——初识NuGet及快速安装使用

    http://kb.cnblogs.com/page/143190/

    NuGet学习笔记(2)——使用图形化界面打包自己的类库

    http://kb.cnblogs.com/page/143191/

    NuGet学习笔记(3)——搭建属于自己的NuGet服务器

    http://kb.cnblogs.com/page/143192/

    VS工具端的设置

  • 相关阅读:
    深入理解JavaScript系列(41):设计模式之模板方法
    深入理解JavaScript系列(40):设计模式之组合模式
    深入理解JavaScript系列(39):设计模式之适配器模式
    深入理解JavaScript系列(38):设计模式之职责链模式
    Mysql的用户名密码设置方法
    微信公众平台开发教程新手解惑40则
    自定义菜单的创建及菜单事件响应
    微信接口测试之发送被动响应消息
    QQ表情的发送与接收
    properties文件使用{0}...
  • 原文地址:https://www.cnblogs.com/aarond/p/Validation.html
Copyright © 2011-2022 走看看