可扩展验证框架 - 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 @   McKay  阅读(1787)  评论(5编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示