- 浏览: 496205 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1028)
- [发布至博客园首页] (826)
- [随笔分类]个人生活随笔 (14)
- [网站分类]首页候选区 (26)
- [网站分类]SharePoint (15)
- [网站分类]其他技术区 (6)
- [随笔分类]批处理技巧 (6)
- [随笔分类].net 2.0 (3)
- [随笔分类]SharePoint2007(MOSS2007) (0)
- [网站分类].NET新手区 (6)
- [网站分类]ASP.NET (6)
- [网站分类]架构设计 (18)
- [网站分类]程序人生 (2)
- [网站分类]SQL Server (2)
- WCF (3)
- 编程技巧 (2)
- 模式架构 (2)
- 分析设计 (4)
- 生活随笔 (0)
- 软件工程 (1)
- Android实例 (2)
最新评论
-
zilong0536:
楼主您好:
请问发表博文支持图片的功能怎么实现啊,一直没有思路 ...
新浪微博开放平台开发-android客户端(3) -
nicegege:
小弟 学习了
帮助中国移动设计10086的排队小模块 -
zl7824516:
用什么技术没说啊
通告(公告),消息(站内短信),提醒的设计:通告 -
virusswb:
源码下载: SinaWeibo2 源码下载之后,将后缀改为ra ...
新浪微博开放平台开发-android客户端(3) -
Jimmyxu0311:
找不到源码下载
新浪微博开放平台开发-android客户端(3)
1、添加自定义的提示信息
验证失败的提示信息可以自定义,企业库的验证模块也提供了自定义的功能。是通过读取资源文件的设置来实现的。首先添加资源文件,在项目的右键菜单中选择【属性】,然后点击【资源】添加文件并且定义三个字符串类型的资源。
在上一章中的Customer类的attribute上多添加一些参数,引入资源的命名空间,具体如下所示,就是指明要用的资源名称和类型。
代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->public class Customer
{
[StringLengthValidator(1, 25,
MessageTemplateResourceType = typeof(Resources),
MessageTemplateResourceName = "FirstNameMessage")]
public string FirstName { get; set; }
[StringLengthValidator(1, 25,
MessageTemplateResourceType = typeof(Resources),
MessageTemplateResourceName = "LastNameMessage")]
public string LastName { get; set; }
[RegexValidator(@"^\d\d\d-\d\d-\d\d\d\d$",
MessageTemplateResourceType = typeof(Resources),
MessageTemplateResourceName = "SSNMessage")]
public string SSN { get; set; }
[ObjectValidator]
public Address Address { get; set; }
}
{
[StringLengthValidator(1, 25,
MessageTemplateResourceType = typeof(Resources),
MessageTemplateResourceName = "FirstNameMessage")]
public string FirstName { get; set; }
[StringLengthValidator(1, 25,
MessageTemplateResourceType = typeof(Resources),
MessageTemplateResourceName = "LastNameMessage")]
public string LastName { get; set; }
[RegexValidator(@"^\d\d\d-\d\d-\d\d\d\d$",
MessageTemplateResourceType = typeof(Resources),
MessageTemplateResourceName = "SSNMessage")]
public string SSN { get; set; }
[ObjectValidator]
public Address Address { get; set; }
}
继续运行程序,就会发现提示信息变成了自定义的内容。
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 { get; set; }
public string LastName { get; set; }
public string SSN { get; set; }
public Address Address { get; set; }
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));
}
}
}
}
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 { get; set; }
public string LastName { get; set; }
public string SSN { get; set; }
public Address Address { get; set; }
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);
}
}
}
{
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);
}
}
{
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 { get; set; }
public string SSN { get; set; }
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(5, 10)] 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();
}
}
}
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(5, 10)] 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();
}
}
}
发表评论
-
NET 应用架构指导 V2 学习笔记(十六) 服务层设计指导
2010-06-04 00:13 548如果你的应用是通 ... -
NET 应用架构指导 V2 学习笔记(十七) 组件设计指导
2010-06-05 00:48 672组件提供了一种将 ... -
NET 应用架构指导 V2 学习笔记(十八) 表现层组件设计指导
2010-06-05 21:09 528本章讲述的是你在设计用户界面组件和表现层逻辑组件的时候应该 ... -
NET 应用架构指导 V2 学习笔记(十九) 表现层组件设计指导
2010-06-06 06:15 5945 决定数据绑定的 ... -
NET 应用架构指导 V2 学习笔记(二十) 业务组件设计指导
2010-06-07 06:58 616前言 业务组件 ... -
微软企业库5.0学习笔记(四十二)异常处理模块
2010-06-14 00:04 839企业库的异常处理 ... -
关于程序员在30岁、35岁之后怎么办的新思考
2010-06-14 10:40 625首先给大家问个好 ... -
NET 应用架构指导 V2 学习笔记(二十四) 跨层关注问题
2010-06-17 20:00 595概况 大部分的 ... -
微软企业库5.0学习笔记(四十三)数据验证模块
2010-06-19 08:07 997概况 任何接受用户或者是其他系统输入的应用,一定要确保 ... -
关于项目进度慢的思考----如何提高整体开发效率
2010-06-21 23:42 805我们都是软件行业 ... -
微软企业库5.0学习笔记(四十四)实战数据验证模块
2010-06-23 19:22 8421 在业务对象上添加验证 添加对程序集【Microso ... -
面向对象类设计的五大原则(一)单一职责原则Single Responsibility Principle
2010-06-29 15:45 778引言 面向对象类设计,或者说是面向对象设计,有五大原则 ... -
《深入浅出设计模式-中文版》读书笔记 开篇乱弹(一)
2010-07-01 06:42 650oreilly的《Head.First ... -
《深入浅出设计模式-中文版》读书笔记-继承与组合(三)
2010-07-03 16:53 605经过上一次的改造 ... -
《深入浅出设计模式-中文版》读书笔记-观察者模式(四)
2010-07-06 06:34 635今天要接触的是观 ... -
利用attribute实现简单的ORM
2010-07-09 15:27 683我不知道NH的ORM具 ... -
系统内部模块(子系统)之间的耦合以及模块(子系统)划分
2010-07-14 13:02 807题外话 最近已经在努力学习了,学习基本功,学习设计模式 ... -
《深入浅出设计模式-中文版》读书笔记-工厂模式(五)
2010-07-16 12:46 699今天给大家带来的是:工厂模式。 我们在代码中创建一个对 ... -
Head.First.Object-Oriented.Design.and.Analysis《深入浅出面向对象的分析与设计》读书笔记(一)
2010-07-18 21:47 671题外话 又是一本Head.First系列的书,这个系列 ... -
Head.First.Object-Oriented.Design.and.Analysis《深入浅出面向对象的分析与设计》读书笔记(二)
2010-07-20 07:18 683今天的话题是收集需求。 Gathering Requi ...
相关推荐
### 微软企业库5.0缓存模块详解 #### 一、缓存的重要性与应用场景 缓存技术作为提升应用程序性能的重要手段之一,在现代软件开发中占据着举足轻重的地位。合理的缓存策略不仅可以显著提高应用响应速度,还能有效...
【微软企业库5.0 学习之路——第六步、使用Validation模块进行服务器端数据验证】 微软企业库5.0是微软提供的一套强大的应用程序框架,用于帮助开发者更有效地实现常见的软件开发任务,如日志记录、配置管理、数据...
微软企业库(Enterprise Library)是微软提供的一套用于构建企业级应用程序的开发工具集合,它包含了一系列可重用的、预配置的软件组件,旨在帮助开发者解决常见的应用程序设计和实现问题。微软企业库5.0是该系列的...
### 微软企业库5.0学习之路 #### 第一步:基本入门 企业库是由微软提供的一个强大的开发框架,主要用于解决企业级应用开发中的常见问题。企业库5.0相较于之前的版本进行了诸多改进,其中最重要的一项是引入了依赖...
在微软企业库5.0中,缓存管理模块提供了对数据缓存的支持,允许开发者将常用数据存储在内存中,避免频繁的数据库查询。这降低了系统的I/O负担,提升了用户体验。该模块支持多种缓存提供程序,如System.Web.Caching...
微软企业库5.0(Enterprise Library 5.0)是微软公司发布的一套用于.NET Framework的应用程序开发框架,旨在帮助开发者更高效、更规范地管理常见的软件开发问题,特别是关注于应用程序的基础设施部分,如数据访问、...
**EntLib.Validation**(微软企业库中的验证模块)便是这样一款工具,它为.NET开发者提供了一套全面的数据验证解决方案。 EntLib.Validation模块不仅支持常见的验证规则,如字符串长度、日期范围、类型转换、正则...
微软企业库(Microsoft Enterprise Library)是微软发布的一套开源软件开发框架,主要目的是为了帮助开发者在.NET平台上更方便地实现一些常见的企业级功能,如日志记录、异常处理、数据访问、缓存管理等。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。
ProE 5.0学习笔记总结 ProE 5.0是一个功能强大且复杂的三维CAD设计软件,对于刚接触ProE的用户来说,学习和掌握它需要投入很多时间和精力。以下是ProE 5.0学习笔记的总结,包括安装方法、基本操作和advanced操作等...
微软企业库(Microsoft Enterprise Library)是微软公司发布的一套用于.NET Framework的应用程序开发框架,它提供了许多可重用的软件组件,旨在简化常见的应用程序开发任务,尤其是与企业级应用程序相关的复杂性,如...
良葛格————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 随书光盘,欢迎大家下载 大家共享^A^
### 最新版 Enterprise Library 企业库5.0中文学习手册知识点概览 #### 一、Enterprise Library简介 Enterprise Library,简称EntLib,是由微软Patterns & Practices团队开发的一套免费的、可扩展的应用程序块集合...
☆ 资料如下:☆ ☆ 源代码 ☆ 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
本篇文档将聚焦于如何使用微软企业库5.0来为项目添加异常处理机制,并通过自定义扩展的方式将其记录到数据库中。 首先,异常处理是任何应用程序的关键组成部分,它确保程序在遇到错误时能够优雅地处理并恢复,而...
良葛格Java JDK 5.0学习笔记
SDK15 蓝牙5.0笔记22:(蓝牙数据传输篇)蓝牙串口通信详解(改) SDK15 蓝牙5.0笔记23:(蓝牙数据传输篇)蓝牙遥控器 SDK15 蓝牙5.0笔记24:(蓝牙数据传输篇)蓝牙FLASH存储之fstorage SDK15 蓝牙5.0笔记25:...
《良葛格JDK5.0学习笔记》是一份详细记录了Java开发工具包(JDK)5.0版本核心特性和技术要点的学习资料。这份笔记涵盖了Java编程语言的重要更新和改进,对于深入理解JDK5.0及其对Java开发的影响至关重要。 1. **...
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#教程...