`

微软企业库5.0学习笔记(四十五)实战数据验证模块----高级篇

阅读更多

  1、添加自定义的提示信息

  验证失败的提示信息可以自定义,企业库的验证模块也提供了自定义的功能。是通过读取资源文件的设置来实现的。首先添加资源文件,在项目的右键菜单中选择【属性】,然后点击【资源】添加文件并且定义三个字符串类型的资源。

  

  

  在上一章中的Customer类的attribute上多添加一些参数,引入资源的命名空间,具体如下所示,就是指明要用的资源名称和类型。

  

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->public class Customer 

    [StringLengthValidator(
125
        MessageTemplateResourceType 
= typeof(Resources), 
        MessageTemplateResourceName 
= "FirstNameMessage")] 
    
public string FirstName { getset; } 
    [StringLengthValidator(
125
        MessageTemplateResourceType 
= typeof(Resources), 
        MessageTemplateResourceName 
= "LastNameMessage")] 
    
public string LastName { getset; } 
    [RegexValidator(
@"^\d\d\d-\d\d-\d\d\d\d$"
        MessageTemplateResourceType 
= typeof(Resources), 
        MessageTemplateResourceName 
= "SSNMessage")] 
    
public string SSN { getset; } 
    [ObjectValidator] 
    
public Address Address { getset; } 

 

  继续运行程序,就会发现提示信息变成了自定义的内容。

  2、实现自己验证

  首先在Customer类上添加[HasSelfValidation] 特性(attribute),然后为自验证添加一个方法,参数是ValidationResults .

  

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->using System;
using System.Text.RegularExpressions;
using Microsoft.Practices.EnterpriseLibrary.Validation;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;

namespace ValidationHOL.BusinessLogic
{
    [HasSelfValidation]
    
public class Customer
    {
        
public string FirstName { getset; }
        
public string LastName { getset; }
        
public string SSN { getset; }
        
public Address Address { getset; }

        
static Regex ssnCaptureRegex =
            
new Regex(@"^(?<area>\d{3})-(?<group>\d{2})-(?<serial>\d{4})$");

        [SelfValidation]
        
public void ValidateSSN(ValidationResults validationResults)
        {
            
// validation logic according to 
            
// http://ssa-custhelp.ssa.gov/cgi-bin/ssa.cfg/php/enduser/std_adp.php?p_faqid=425

            Match match 
= ssnCaptureRegex.Match(this.SSN);
            
if (match.Success)
            {
                
string area = match.Groups["area"].Value;
                
string group = match.Groups["group"].Value;
                
string serial = match.Groups["serial"].Value;

                
if (area == "666"
                    
|| string.Compare(area, "772", StringComparison.Ordinal) > 0)
                {
                    validationResults.AddResult(
                        
new ValidationResult(
                            
"Invalid area",
                            
this,
                            
"SSN",
                            
null,
                            
null));
                }
                
else if (area == "000" || group == "00" || serial == "0000")
                {
                    validationResults.AddResult(
                        
new ValidationResult(
                            
"SSN elements cannot be all '0'",
                            
this,
                            
"SSN",
                            
null,
                            
null));
                }
            }
            
else
            {
                validationResults.AddResult(
                    
new ValidationResult(
                        
"Must match the pattern '###-##-####'",
                        
this,
                        
"SSN",
                        
null,
                        
null));
            }
        }
    }
}

 

  3、自定义验证

  继承Validator类,重写里面的方法DoValidate 即可。

  

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> public class SSNValidator : Validator<string>
    {
        
public SSNValidator(string tag)
            : 
this(tag, false)
        {
        }

        
public SSNValidator(string tag, bool ignoreHypens)
            : 
base(string.Empty, tag)
        {
            
this.ignoreHypens = ignoreHypens;
        }

        
static Regex ssnCaptureRegex =
            
new Regex(@"^(?<area>\d{3})-(?<group>\d{2})-(?<serial>\d{4})$");
        
static Regex ssnCaptureNoHypensRegex =
            
new Regex(@"^(?<area>\d{3})(?<group>\d{2})(?<serial>\d{4})$");
        
private bool ignoreHypens;

        
protected override string DefaultMessageTemplate
        {
            
get { throw new NotImplementedException(); }
        }

        
protected override void DoValidate(
            
string objectToValidate,
            
object currentTarget,
            
string key,
            ValidationResults validationResults)
        {
            
// validation logic according to 
            
// http://ssa-custhelp.ssa.gov/cgi-bin/ssa.cfg/php/enduser/std_adp.php?p_faqid=425

            Match match 
=
                (ignoreHypens 
? ssnCaptureNoHypensRegex : ssnCaptureRegex)
                    .Match(objectToValidate);
            
if (match.Success)
            {
                
string area = match.Groups["area"].Value;
                
string group = match.Groups["group"].Value;
                
string serial = match.Groups["serial"].Value;

                
if (area == "666"
                    
|| string.Compare(area, "772", StringComparison.Ordinal) > 0)
                {
                    LogValidationResult(
                        validationResults,
                        
"Invalid area",
                        currentTarget,
                        key);
                }
                
else if (area == "000" || group == "00" || serial == "0000")
                {
                    LogValidationResult(
                        validationResults,
                        
"SSN elements cannot be all '0'",
                        currentTarget,
                        key);
                }
            }
            
else
            {
                LogValidationResult(
                    validationResults,
                    
this.ignoreHypens
                        
? "Must be 9 digits"
                        : 
"Must match the pattern '###-##-####'",
                    currentTarget,
                    key);
            }
        }
    }

 

  继承ValidatorAttribute ,实现一个自定义验证的attribute。

  

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> public class SSNValidatorAttribute : ValidatorAttribute
    {
        
protected override Validator DoCreateValidator(Type targetType)
        {
            
return new SSNValidator(this.Tag);
        }
    }

 

  在属性上添加自定义验证的attribute  

 

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->  [SSNValidator] 
  
public string SSN { getset; } 

 

  4、 通过配置实现自定义的验证

  首先还是要编写自定义的验证类和attribute,然后在配置中添加自定义自定义验证的时候,选择自定义验证类对应的程序集,进而选择程序集中的自定义验证类就可以了。

  5、验证方法的参数

  可以配合CallHandler来实现。

  

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Practices.EnterpriseLibrary.Validation;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;

namespace UnityAOP
{
    
public interface IOutput
    {
        
void Output([StringLengthValidator(510)] string x);
    }
  
    [MyHandler ]
    
public class OutputImplement1 : IOutput
    {
        
#region IOutput Members

        
public void Output([StringLengthValidator (5,10)] string x)
        {
            
throw new Exception();
            Console.WriteLine(
"output : {0}", x);
        }

        
#endregion
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.InterceptionExtension;
using Microsoft.Practices.EnterpriseLibrary.Validation;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;

namespace UnityAOP
{
    
public class MyHandler : ICallHandler
    {
        
#region ICallHandler Members

        
public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
        {
            IMethodReturn retvalue 
= null;
            Console.WriteLine(
"方法名: {0} ", input.MethodBase.Name);
            Console.WriteLine(
"参数:");

            
#region 验证参数
            Validator validator 
= ParameterValidatorFactory.CreateValidator(input.Arguments.GetParameterInfo(0));
            ValidationResults vrs
= validator.Validate(input.Arguments[0]);

            
#endregion

            
for (var i = 0; i < input.Arguments.Count; i++)
            {
                Console.WriteLine(
"{0}: {1}", input.Arguments.ParameterName(i), input.Arguments[i]);
            }
            Console.WriteLine(
"执行");

            retvalue 
= getNext()(input, getNext);

            
if (retvalue.Exception != null)
            {
                Console.WriteLine(
"出现异常");
                
try {

                }
                
catch (Exception ex)
                {
                }

            }
            
else
            {
                Console.WriteLine(
"正常结束");
            }
            
return retvalue;
        }

        
public int Order
        {
            
get;
            
set;
        }

        
#endregion
    }
    
public class MyHandlerAttribute : HandlerAttribute
    {
        
public override ICallHandler CreateHandler(IUnityContainer container)
        {
            
return new MyHandler();
        }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Practices.ObjectBuilder2;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.InterceptionExtension;
using Microsoft.Practices.EnterpriseLibrary.Common;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling;
using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.PolicyInjection;

namespace UnityAOP.Main
{
    
class Program
    {
        
static void Main(string[] args)
        {      
            var container1 
= new UnityContainer()
                .AddNewExtension
<Interception>()
                .RegisterType
<IOutput, UnityAOP.OutputImplement1>();
            container1.Configure
<Interception>()
                .SetDefaultInterceptorFor
<IOutput>(new InterfaceInterceptor());
            var op1 
= container1.Resolve<IOutput>();
            op1.Output(
"1dfsdfssdfsdfsdfdf0");
            Console.ReadLine();
        }
    }
}

 

 

分享到:
评论

相关推荐

    微软企业库5.0_学习之路

    ### 微软企业库5.0缓存模块详解 #### 一、缓存的重要性与应用场景 缓存技术作为提升应用程序性能的重要手段之一,在现代软件开发中占据着举足轻重的地位。合理的缓存策略不仅可以显著提高应用响应速度,还能有效...

    [EntLib]微软企业库5.0 学习之路——第六步、使用Validation模块进行服务器端数据验证

    【微软企业库5.0 学习之路——第六步、使用Validation模块进行服务器端数据验证】 微软企业库5.0是微软提供的一套强大的应用程序框架,用于帮助开发者更有效地实现常见的软件开发任务,如日志记录、配置管理、数据...

    微软企业库5.0【EnterpriseLibrary5.0 – May2011】

    微软企业库(Enterprise Library)是微软提供的一套用于构建企业级应用程序的开发工具集合,它包含了一系列可重用的、预配置的软件组件,旨在帮助开发者解决常见的应用程序设计和实现问题。微软企业库5.0是该系列的...

    微软企业库5.0学习之路

    ### 微软企业库5.0学习之路 #### 第一步:基本入门 企业库是由微软提供的一个强大的开发框架,主要用于解决企业级应用开发中的常见问题。企业库5.0相较于之前的版本进行了诸多改进,其中最重要的一项是引入了依赖...

    微软企业库5.0操作日志和缓存模块

    在微软企业库5.0中,缓存管理模块提供了对数据缓存的支持,允许开发者将常用数据存储在内存中,避免频繁的数据库查询。这降低了系统的I/O负担,提升了用户体验。该模块支持多种缓存提供程序,如System.Web.Caching...

    微软企业库5.0 学习之路(全集)

    微软企业库5.0(Enterprise Library 5.0)是微软公司发布的一套用于.NET Framework的应用程序开发框架,旨在帮助开发者更高效、更规范地管理常见的软件开发问题,特别是关注于应用程序的基础设施部分,如数据访问、...

    [EntLib]微软企业库5.0 学习之路——第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——上篇

    **EntLib.Validation**(微软企业库中的验证模块)便是这样一款工具,它为.NET开发者提供了一套全面的数据验证解决方案。 EntLib.Validation模块不仅支持常见的验证规则,如字符串长度、日期范围、类型转换、正则...

    微软企业库 5.0 源码

    微软企业库(Microsoft Enterprise Library)是微软发布的一套开源软件开发框架,主要目的是为了帮助开发者在.NET平台上更方便地实现一些常见的企业级功能,如日志记录、异常处理、数据访问、缓存管理等。5.0版本是...

    良葛格java jdk 5.0学习笔记

    良葛格java jdk 5.0学习笔记,良葛格java jdk 5.0学习笔记.zip,良葛格java jdk 5.0学习笔记.zip,良葛格java jdk 5.0学习笔记.zip,良葛格java jdk 5.0学习笔记.zip,良葛格java jdk 5.0学习笔记.zip。

    proe5.0学习笔记

    ProE 5.0学习笔记总结 ProE 5.0是一个功能强大且复杂的三维CAD设计软件,对于刚接触ProE的用户来说,学习和掌握它需要投入很多时间和精力。以下是ProE 5.0学习笔记的总结,包括安装方法、基本操作和advanced操作等...

    微软企业库5.0说明文档,英文版

    微软企业库(Microsoft Enterprise Library)是微软公司发布的一套用于.NET Framework的应用程序开发框架,它提供了许多可重用的软件组件,旨在简化常见的应用程序开发任务,尤其是与企业级应用程序相关的复杂性,如...

    良葛格————JavaJDK5.0学习笔记PDF

    良葛格————JavaJDK5.0学良葛格————JavaJDK5.0学习笔记PDF.rar习笔记PDF.rar良葛格良葛格————JavaJDK5.0学习笔记PDF.rar————JavaJDK5.0学习笔记PDF.rar良葛格————JavaJDK5.0学习笔记PDF.rar良...

    Java JDK 5.0学习笔记:TP312JA L393.iso

    Java JDK 5.0学习笔记:TP312JA L393.iso 随书光盘,欢迎大家下载 大家共享^A^

    最新版 Enterprise Library 企业库5.0中文学习手册(Word版本)

    ### 最新版 Enterprise Library 企业库5.0中文学习手册知识点概览 #### 一、Enterprise Library简介 Enterprise Library,简称EntLib,是由微软Patterns & Practices团队开发的一套免费的、可扩展的应用程序块集合...

    微软企业库 5.0 (C#) Enterprise Library 5.0 学习资料

    ☆ 资料如下:☆ ☆ 源代码 ☆ Enterprise Library 5.0.msi Enterprise Library 5.0 - Source Code....[Microsoft Press] Microsoft Enterprise Library 5.0 [Packt Publishing] Microsoft Enterprise Library 5.0

    [EntLib]微软企业库5.0 学习之路——第三步、为项目加上异常处理(采用自定义扩展方式记录到数据库中).doc

    本篇文档将聚焦于如何使用微软企业库5.0来为项目添加异常处理机制,并通过自定义扩展的方式将其记录到数据库中。 首先,异常处理是任何应用程序的关键组成部分,它确保程序在遇到错误时能够优雅地处理并恢复,而...

    JDK 5.0学习笔记

    良葛格Java JDK 5.0学习笔记

    SDK15 蓝牙5.0笔记21:蓝牙数据传输篇

    SDK15 蓝牙5.0笔记22:(蓝牙数据传输篇)蓝牙串口通信详解(改) SDK15 蓝牙5.0笔记23:(蓝牙数据传输篇)蓝牙遥控器 SDK15 蓝牙5.0笔记24:(蓝牙数据传输篇)蓝牙FLASH存储之fstorage SDK15 蓝牙5.0笔记25:...

    良葛格JDK5.0学习笔记

    《良葛格JDK5.0学习笔记》是一份详细记录了Java开发工具包(JDK)5.0版本核心特性和技术要点的学习资料。这份笔记涵盖了Java编程语言的重要更新和改进,对于深入理解JDK5.0及其对Java开发的影响至关重要。 1. **...

    ACCP5.0-S1-C#教程PPT

    ACCP5.0-S1-C#教程PPTACCP5.0-S1-C#教程PPTACCP5.0-S1-C#教程PPTACCP5.0-S1-C#教程PPTACCP5.0-S1-C#教程PPTACCP5.0-S1-C#教程PPTACCP5.0-S1-C#教程PPTACCP5.0-S1-C#教程PPTACCP5.0-S1-C#教程PPTACCP5.0-S1-C#教程...

Global site tag (gtag.js) - Google Analytics