环境:
Windows 2008, VS 2008 SP1, Asp.Net Mvc 1.0
------------------------------------------------------------------------------
今晚喝茶看片之时,脑子里忽然闪过一个念头,于是打开VS简单的做了一个实现,于是有了本文...是关于实体验证的,嗯,从头开始说吧。
一. 可能是最原始的验证代码
为了让问题尽量简单,我们就拿一个简单得不能再简单的User类开刀吧。
现在我们要在User类里面加一个方法用于验证User实例的合法性,相信很多人写过如下类似的代码:
Check()方法很单纯的为User类的属性应用各种规则,然后返回非法的提示信息集。
验证的时候只是简单的调用一下实体的Check()方法即可:
好吧,我承认,一般情况下这个方法似乎够用了,只不过,很多人看到一连串的if可能会开始抓狂了,是呀,我也不喜欢,那就想个最即便的办法消除它们吧。
二. 基于C#3.0新特性的尝试
为了消除if,考虑把那些验证规则用一条线链起来,于是:
编写实体类的验证扩展方法如下:
那么实体的Check()方法相应改为:
这样,我们通过扩展方法,消除了if,但是我们把验证规则链了起来,并已异常的方式来抛出实体非法信息,那么每次验证只能得到一条验证信息,这显然往往不符合实际情况。想想..
三. 继续演进
接上,为了得到验证错误信息集合,改进:
为了让代码看起来更像那么回事,给实体加个基类吧,就叫EntityBase了。
然后编写一个验证类:
注意:这里的predicate改为使Property非法的Criteria,与前面的方法刚好相反,这样是为了保证当UserName为null时,不至于把"The length of User name should not exceed 10 chars"的信息也抛出。
然后看下修改后的Check()方法,这个验证类的作用就一目了然了:
不用解释吧?其实也是链起来,同时返回验证错误信息集合,看看结果:
看到这里,你可能会说:搞什么啊,不就消除了个if嘛,有什么大不了的。
呃。。是的。。确实如此。。。雕虫小技,如有雷同,纯属巧合。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?