当前位置: 首页 > news >正文

也谈实体验证(Entity Validation)

出处:http://www.cnblogs.com/tristanguo/archive/2009/05/15/1457197.html

环境:

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了。

然后编写一个验证类:

然后看下修改后的Check()方法,这个验证类的作用就一目了然了:

不用解释吧?其实也是链起来,同时返回验证错误信息集合,看看结果:

看到这里,你可能会说:搞什么啊,不就消除了个if嘛,有什么大不了的。

呃。。是的。。确实如此。。。雕虫小技,如有雷同,纯属巧合。

C#语言参考:

2008-05-21 16:38

在迭代器块中用于向枚举数对象提供值或发出迭代结束信号。它的形式为下列之一:

yield return <expression>;
yield break;
备注

计算表达式并以枚举数对象值的形式返回;expression 必须可以隐式转换为迭代器的 yield 类型。

yield 语句只能出现在 iterator 块中,该块可用作方法、运算符或访问器的体。这类方法、运算符或访问器的体受以下约束的控制:

  • 不允许不安全块。

  • 方法、运算符或访问器的参数不能是 refout

yield 语句不能出现在匿名方法中。有关更多信息,请参见匿名方法(C# 编程指南)

当和 expression 一起使用时,yield return 语句不能出现在 catch 块中或含有一个或多个 catch 子句的 try 块中。有关更多信息,请参见异常处理语句(C# 参考)

示例

在下面的示例中,迭代器块(这里是方法 Power(int number, int power))中使用了 yield 语句。当调用 Power 方法时,它返回一个包含数字幂的可枚举对象。注意 Power 方法的返回类型是 IEnumerable(一种迭代器接口类型)。

// yield-example.cs
using System;
using System.Collections;
public class List
{
    public static IEnumerable Power(int number, int exponent)
    {
        int counter = 0;
        int result = 1;
        while (counter++ < exponent)
        {
            result = result * number;
            yield return result;
        }
    }

    static void Main()
    {
        // Display powers of 2 up to the exponent 8:
        foreach (int i in Power(2, 8))
        {
            Console.Write("{0} ", i);
        }
    }
}

输出

2 4 8 16 32 64 128 256

相关文章:

  • LeetCode -- Symmetric Tree
  • 越狱 第五季 Microsoft复活
  • LeetCode -- Trap Water Rain
  • leetcode -- Unique Binary Search Trees II
  • WCF中神秘的“8731“端口和“Design_Time_Addresses”
  • LeetCode -- Unique Paths II
  • LeetCode -- Valid Anagram
  • 金旭亮博客之“分布式系统技术”资源主页
  • LeetCode -- Valid Palindrome
  • 中国联通正式公布3G资费标准
  • LeetCode -- Valid Parentheses
  • 手机无线连接(GSM/GPRS)方式
  • LeetCode -- First Missing Positive
  • 3G门户手机浏览器试用感受
  • LeetCode -- Valid Sudoku
  • 【个人向】《HTTP图解》阅后小结
  • angular组件开发
  • Fabric架构演变之路
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Java深入 - 深入理解Java集合
  • JS字符串转数字方法总结
  • MySQL用户中的%到底包不包括localhost?
  • Python 基础起步 (十) 什么叫函数?
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 安卓应用性能调试和优化经验分享
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 多线程事务回滚
  • 什么是Javascript函数节流?
  • linux 淘宝开源监控工具tsar
  • Mac 上flink的安装与启动
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 从如何停掉 Promise 链说起
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​香农与信息论三大定律
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #define与typedef区别
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (31)对象的克隆
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (二)斐波那契Fabonacci函数
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (十) 初识 Docker file
  • (学习日记)2024.01.09
  • .equals()到底是什么意思?
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .net core Swagger 过滤部分Api
  • .NET Core WebAPI中封装Swagger配置
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET 解决重复提交问题
  • .net6 webapi log4net完整配置使用流程
  • .NET单元测试