技术积累

明日复明日,明日何其多,我生待明日,万事成蹉跎。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理


其他几个应用程序块的使用说明连接如下:
Enterprise LibraryV1.0-概述  
Enterprise LibraryV1.0-配置应用程序块
Enterprise LibraryV1.0-安全应用程序块使用说明
Enterprise LibraryV1.0-数据应用程序块
Enterprise LibraryV1.0-日志应用程序块使用说明
Enterprise LibraryV1.0-加密应用程序块使用说明

1、简介

只要是编写代码,我们就会面对异常处理的问题。系统预定义异常由于肩负着提示、调试等很多功能,因此当异常发生时,会有非常详细的异常信息。当我们编写商用程序时,如果程序出现运行时异常,显示给用户的信息都要求是user-friendly的,而不是系统级,特别是系统预定义异常会deliver一些敏感信息,如果被别有用心的人获取,是非常危险的,所以当异常出现时,我们要屏蔽掉这些敏感信息。对异常的处理一般有四种方式:
 根据源异常建立一个新异常,重新将此新异常抛出。
 取代源异常,抛出一个别的异常。
 Log异常,用于查看、排错等。
 不做任何处理,只是将传播路径截断。
虽然AOP是异常处理最佳方案,但技术上远未成熟,我们都还是用传统的方式来处理异常。对应这几种情况,我们一般都会这样来处理:

 1) //  提示用户的处理方式,出错后提示用户
try
{
    // 正常执行语句;
}
catch(Exception ex)
{
    String formattedInfo = FormatException(ex);
    Logging.Log(formattedInfo); // 或Logger.Log(e);
Throw new MyException("出错了。");
// 或者直接提示客户
//MessageBox.Show(errorMsg, "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
//lblError.Text = errorMsg;
}
2) // logging,出错后作记录
catch(SomeException e)
{
    string formattedInfo = FormatException(e);
    Logger.Log(e);


    throw e;
}

3) //replace,抛出一个新异常,屏蔽掉敏感信息
catch(SomeException e)
{
    CustomException myException = new CustomException(“XXXXXXXXXXXXXXXXXXXXXX”);

    throw myException;
}
4) //wrapping 包封原来的异常,添加Context信息后,重新抛出
catch(SomeException e)
{
    CustomException myException = new CustomException(e);

    throw myException;
}
5) //propagating 记录后,继续传播之
catch(SomeException e)
{
    // Exception handling code to be done before propagating
    string formattedInfo = FormatException(e);
    Logger.Log(e);

    throw e;
}
一般来说,象上面这样的处理方式都非常不灵活,有极大的代码重复,当要求发生变化时,可能源代码要做大量的机械修改。
异常处理应用程序块在充分满足上述异常处理要求的基础上,使我们在不同项目之间、同一个项目的不同开发人员之间建立起了统一的异常处理策略。当需求发生改变时,我们可以用配置工具进行修改配置文件,不用去修改源码,从而不用重新编译、发布程序。
我们知道,在.Net里一个异常发生时,系统会抛出一个Exception类型或其子代的对象,习惯上我们要对这个对象进行一些处理,以排除错误或提示用户,常见的处理方式有提示用户、包装后重新抛出、用另一个异常对象取而代之、记录等。EHAB就是根据这样的要求而设计的,但她并不负责具体如何处理,而是做了大量基础工作,使对异常的处理非常简单,同时统一了处理策略,增加了灵活性。
下面我们以常用的异常处理方式来说明异常处理应用程序块的用法,来看看使用EHAB是多么简单
2、用配置控制台配置异常处理应用程序块
①添加异常处理应用程序块
添加异常处理应用程序块后,就要添加一个或多个Exception Policy。一个异常处理应用程序块可以维护一个或多个Exception Policy,异常处理策略往往代表了对异常的处理方式,常见的策略有包封、取代、继续传播、处理并继续、记录等等,当然异常处理策略如何分类、有哪些异常处理策略,都是你自己说了算,只是取一个比较有意义的名字就行了。
每种Exception Policy可以管理多种类型的异常,而每种类型的Exception又可以有多个Handler(异常处理器,在Exception类的继承层次结构中,可以针对每种类型的Exception设置一个Handler,这样一个子代Exception就可以有多个Handler)。
②添加Exception Policy
添加几个Policy,适当修改Policy的名称,如Wrap Policy、Replace Policy、Log Policy、Propagate Policy、GlobalPolicy等。
③给每个Policy添加几个Exception
当添加一个Exception类型时,我们不用自己键入,向导会提示我们选一个,这个异常类型可以是系统预定义的,也可以是来自某个程序集的,还可以是我们自己定义的。
我们按自己的需要给每种Policy添加好Exception。然后针对每种类型的Exception设置处理活动PostHandlingAction。PostHandlingAction有三种分别是None、NotifyRethrow、ThrowNewException。
None表示此异常被内部处理掉了,调用者不用再处理了。
NotifyRethrow表示Application.ThreadException事件的处理器将重新抛出异常。
ThrowNewException表示这类异常你可以用一个新的异常类包封或取代之。
④设置Exception的处理器handler
每个Exception一般都会设置一个或多个handler,当然也可以不设。Replace Handler要设置好其取代的异常类型,Wrap Handler也要置好其包封的异常类型,Log Handler要置好LogCategory。
⑤设置完毕,保存。

3、写代码
String policy = “Wrap Policy”;
Try
{
// 。。。。。。。
}
catch (Exception ex)
{
    if (ExceptionPolicy.HandleException(ex, policy))
    throw;
}
其他类型Policy的代码与此类似,但异常的PostHandlingAction设为NotifyRethrow时,我们要将定义一个异常处理handler,并挂接到Application.ThreadException事件上。我们可以看到,对异常的不同处理方式其代码是一致的,而不象开始时我们列出的代码,不同的处理方式代码是不同的。

2005-08-06 14:35 作者: 生活、工作 【评论:2】【阅读: 675】

Enterprise Library FAQ V0.1

声明:本人并非Enterprise Library的专家,只是众多爱好者中的一员。学习Enterprise Library 是想开发出
      更高质量的应用程序。非常希望大家提出建议,来共同维护这个Faq,共同学习,共同进步。

[Common]
1.什么是Enterprise Library?
  Enterprise Library 由一组应用程序块组成(Application Block),每个应用程序块旨在解决开发企业级应用程序
  时的某一方面
2.Enterprise Library 有什么用?
  提高企业级应用程序的可维护性和扩展性。
  最大限度的重用,可作为公司的积累。
  这些是微软的基准代码,可以通过学习源代码,提高编程能力。
  建立更优雅更灵活的企业级应用程序.
3.Enterprise Library 由哪些部分组成?
  目前的Enterprise由七个部分组成。它们分别:
  1). 配置应用程序块
  2). 数据访问应用程序块
  3). 安全应用程序块
  4). 加密应用程序块
  5). 缓存应用程序块
  6). 异常处理应用程序块
  7). 日志应用程序块
4.为什么要使用Enterprise Library?
  可以说它涵盖了开发任何企业级应用都要用到的基础部分,是最佳实践。
  它的源代码是可以修改和扩展而不用遵照任何协议。这样就可以定制自己的应用程序块。
 
5.所使用的.Net 框架版本?
  当前的两个版本支持.net框架1.1版本。
6.目前的Enterprise Library版本?
  目前有两个版本,即EnterpriseLibraryJan1.0版和EnterpriseLibraryJune版
7.EnterpriseLibrary六月版下载地址
  http://www.microsoft.com/downloads/details.aspx?FamilyId=A7D2A109-660E-444E-945A-6B32AF1581B3&displaylang=en
  需要注册下载的,里面包含了帮助文件和每个程序块的源代码和QuickStart.
8.各个应用程序块的依赖关系.
   
   可以看到Enterprise Library的核心是Configuration Application Block.其它应用程序块都对它有依赖.
9.如何开始?
  1).从前面的地址下载EnterpriseLibrary,安装,运行QuickStart.通过这个可以获得一些直观印象.
  2).开始学习Configuration Application Block.阅读Configuration Application Block文档
  3).从http://www.msdnwebcast.com 下载视频讲座
  4).观看视频讲座,单步调试Configuration Application Block的QuickStart 项目.
  5).自己动手从头做一个自己的例子.
  6).开始学习别的Application Block.
  7).将Application Block应用到项目中.
 
10.学习Enterprise Library 所需要的基础.
  了解C#.net 或 VB.net,面向对象编程基础,XML基础.
 
11.参考资源
  1). MSDN Enterprise Library
 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag2/html/entlib.asp
  2). Enterprise Library: Home
      http://practices.gotdotnet.com/entlib
  3). Enterprise Library 视频学习资料
      可以到http://www.msdnwebcast.com 上下载视频和ppt以及示例代码资料.
      推荐初学者可以先从看这些微软讲师的视频讲解比较好.

[Configuration Application Block]

[Data Access Application Block]

[Security Application Block]

[Cryptography Application Block]

[Caching Application Block]

[Exception Handling Application Block]

[Logging and Instrumentation Application Block]

2005-08-04 12:40 作者: Clamphammer 【评论:21】【阅读: 588】

Enterprise LibraryV1.0-概述

看到不少EL的文档,也来凑凑热闹。
Enterprise LibraryV1.0中的7个应用程序块的使用说明我已全部写完,现在逐步贴上来。

概述
         Enterprise Library是微软Patterns & Practices 项目组 推出的公共模块解决方案,用来解决我们在企业级开发中遇到公共问题,如配置管理、数据访问、缓存管理、记录操作日志、异常管理、加密解密、权限管理等。Enterprise Library体现了微软对软件开发技术的最新实践,对于我们在软件开发中应该使用哪些技术、各种问题的解决方案都有很好的参考意义。同时Enterprise Library是最佳实践,而不是理论,是对很多有影响力的软件企业通过多年的开发实践积累下来的技术的整合。Enterprise Library在实现上主要是基于Martin Flower的Plagin设计模式,大量使用了Factory、Facade、Singleton等模式,虽然不知是否用了agile的开发方法,但是代码有明显不断Refactoring的痕迹。在设计上,Enterprise Library主要有三种类:Provider、Factory、ProviderData。

  • Provider是我们所需功能的提供者。我们所需要的数据访问、记录日志、加密解密等功能都有这些类提供。在具体使用时,一般不是直接者用这些类,而是使用对这些类的功能进一步封装的Facade类。
  • Factory用于创建我们所需要的Provider。当我们要消费某项功能时,就要用到某个Provider来提供这项功能,所以我们要先建立一个Provider,建立(实例化)Provider的任务就由Factory对象来完成,我们可以看到很多对Factory做了进一步封装的类提供了一些静态方法来建立Provider对象。
  • ProviderData是对配置数据进行访问接口。当我们用Factory时建立Provider时, 到底建立类似功能的哪个Provider,是由ProviderData决定的。Enterprise Library在设计时对各种功能的配置数据都有一个单独得配置文件保存(或者更通用的说,都有一个单独的物理位置及格式进行存储),对配置数据首先封装成一些Settings类, 如ConfigurationSettings、LoggingSettings、DatabaseSettings、SecuritySettings、CacheManagerSettings、ExceptionHandlingSettings、DistributorSettings、CryptographySettings等8个,然后对这些Settings类进一步定制、分解,构成各种ProviderData类。

下面将详细分析每个应用程序块的实现情况和使用步骤。
(本人水平有限,错误之处请各位指出)