可扩展验证框架 - A2DFramework验证框架使用介绍

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工具端的设置

 

 

posted @ 2014-03-18 08:31  McKay  阅读(1787)  评论(5编辑  收藏  举报