[EntLib]微软企业库5.0 学习之路——第九步、使用PolicyInjection模块进行AOP—PART3——内置Call Handler介绍

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:

   在前面的Part1Part2中我已经介绍了PolicyInjection模块的内置的Matching Rule和自定义Matching Rule的基本信息及配置使用方法,不过光有Matching Rule进行验证匹配还不够,还必须要有相应的操作——Call Handler,所以今天继续介绍PolicyInjection模块内置的Call Handler。

 

一、PolicyInjection模块内置的Call Handler

通过将Call Handler和Part1Part2中的Matching Rule组合起来,我们就可以实现AOP编程,如果说Matching Rule是为了匹配寻找需要进行AOP操作的对象的话,那Call Handler则是在找到对象后进行的AOP操作。在PolicyInjection模块中内置了以下6种Call Handler:

1、Authorization Call Handler——权限操作

2、Custom Call Handler——自定义操作

3、Exception Handling Call Handler——异常处理操作

4、Logging Call Handler——日志记录操作

5、Performance Counter Call Handler——性能计数器操作

6、Validation Call Handler——验证操作

Part1中已经介绍过,PolicyInjection模块可以和企业库中的其他模块组合起来一起使用,而内置的Call Handler也基本上都是企业库所包含的且适用于AOP编程的模块,具体的Call Handler代码可以在每个模块源码下的PolicyInjection文件夹下找到,比如:Authorization Call Handler就是在Security Application Block\PolicyInjection,主要分为:AuthorizationCallHandler.cs和AuthorizationCallHandlerAttribute.cs。

 

下面我介绍下这6种内置Call Handler的使用及配置方式:

二、Authorization Call Handler——权限操作

Authorization Call Handler主要和Security模块进行关联,通过这个Call Handler来调用已经配置好的Authorization Provider,主要接受3个参数:

1、Authorization Provider,指向的是所配置的具体的Authorization Provider。

2、Operation Name,验证的对象,可以是{method},{type},{namespace},{assembly}和{appdomian}。

3、Order,这个是表示被调用的次序,默认为0(如果制定了次序则将从1开始,0表示不按照次序执行)。

具体配置图如下:

pic59

相对应的如果想通过代码来实现这样的效果,需要进行以下操作:

1、引用:Microsoft.Practices.EnterpriseLibrary.Security.PolicyInjection;

2、为指定方法添加特性:[AuthorizationCallHandler("{method}-具体的验证操作名")]

 

三、Custom Call Handler——自定义操作

这个将在下篇文章中重点介绍

 

四、Exception Handling Call Handler——异常处理操作

Exception Handling Call Handler对应的是Exception Handling模块,接受的参数很简单,只有2个:

1、Expection Policy Name,指向的是具体的Exception处理策略(有关Exception相关的文章可以看学习之路——第三步、为项目加上异常处理(采用自定义扩展方式记录到数据库中))。

2、Order,同上。

具体配置图如下:

pic60

相对应的如果想通过代码来实现这样的效果,需要进行以下操作:

1、引用:Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.PolicyInjection;

2、为指定方法添加特性:[ExceptionCallHandler("Policy-具体异常策略名")]

 

五、Logging Call Handler——日志记录操作

Logging Call Handler对应的是Logging模块,相比前几个Call Handler,Logging Call Handler接受的参数就比较多了,有11个:

1、After/Before Message,类似于Logging模块中的消息配置中的Message Header/Footer,主要是对消息的开始和结尾处加上额外的信息,如:“--Call Handler开始—”。

2、Categories,指向的hi具体的Logging配置,(有关Logging相关的文章可以看学习之路——第三步、为项目加上异常处理(采用自定义扩展方式记录到数据库中))。

3、Event Id,事件ID,默认为0,如果有需要可以指定。

4、Include Call Stack,表示是否在日志记录消息中包含调用栈信息,默认为false,不添加调用栈信息。

5、Include Call Time,表示是否在日志记录消息中包含调用的时间,默认为true,在日志消息中添加调用时间。

6、Include Paramters Values,表示是否在日志记录消息中包含调用的方法中所传递的参数值,默认为true,在日志消息中添加参数值。

7、Log Behavior,日志行为,主要用于设置日志记录的位置,有3个枚举,BeforeAndAfter(之前和之后),Before(之前)和After(之后)。

8、Order,同上。

9、Prority,表示日志消息中异常记录的优先级,默认为-1。

10、Severity,日志级别。

具体配置图如下:

pic61

相对应的如果想通过代码来实现这样的效果,需要进行以下操作:

1、引用:Microsoft.Practices.EnterpriseLibrary.Logging.PolicyInjection;

2、为指定方法添加特性:[LogCallHandler(Categories = new string[] { "Category" })],在LogCallHandler里面还对应着许多可选参数,都可以自定义指定,如不指定则为默认值。

 

六、Performance Counter Call Handler——性能计数器操作

Performance Counter Call Handler与其他几个Call Handler不同,其不对应企业库的其他模块(具体代码可以在PolicyInjection\CallHandlers下找到,分别是PerformanceCounterCallHandler.cs和PerformanceCounterCallHandlerAttribute.cs)

这个Performance Counter Call Handler主要是对所拦截的策略进行性能检测,如果想使用需要以下步骤:

1、企业库配置图:

pic64

主要设置2个属性:

1)Category Name:计数器名——abc

2)Instance Name:实例名——Default

至于其他属性可以不用更改,主要是对性能监视器的一些配置。

 

2、安装性能计数器,需要在项目中引入:System.Configuration.Install

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
private  static  void  InstallCounter()
{
     PerformanceCountersInstaller installer = new  PerformanceCountersInstaller(
         new  SystemConfigurationSource());
   
     IDictionary state = new  System.Collections.Hashtable();
     installer.Context = new  InstallContext();
     installer.Install(state);
     installer.Commit(state);
     Console.WriteLine( "性能计数器已安装完成,输入【enter】继续!" );
     Console.ReadLine();
}

3、调用具体的方法,同时查看其性能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static  void  Main( string [] args)
{
     InstallCounter(); //安装性能计数器
     Demo aop = PolicyInjection.Create<Demo>();
     for  ( int  i = 0; i < 50000; i++) //循环50000次,主要是为了方便监视性能
     {
         System.Threading.Thread.Sleep(50);
         aop.Test( "wozhidao" ); //此处使用的是Member Name Matching Rule,具体可看前一篇文章
     }
     Console.ReadLine();
}
public  class  Demo : MarshalByRefObject
{
     public  void  Test( string  aa)
     {
         string  a = aa;
     }
}
在调用到InstallCounter();时在Console中会出现: pic63这时,打开计算机管理-性能-监视工具-添加,可以看到我们刚才创建的性能计数器已经存在列表当中: pic65添加完成后,我们就可以在性能计数器中看到我们现在所正在运行的方法的性能了: pic664、卸载性能计数器:
1
2
3
4
5
6
7
8
9
private  static  void  RemoveCounters()
{
     PerformanceCountersInstaller installer = new  PerformanceCountersInstaller(
         new  SystemConfigurationSource());
     installer.Context = new  InstallContext();
     installer.Uninstall( null );
     Console.WriteLine( "性能计数器已移除完成,输入【enter】继续!" );
     Console.ReadLine();
}

卸载后,刚才我们所安装的计数器就移除了。

以上性能计数器使用方法参考:Getting started with Enterprise Library Performance Counters

 

 

七、Validation Call Handler——验证操作

Validation Call Handler对应的是Validation模块,这个Call Handler主要接收3个参数:

1、Order,同上。

2、Rule Source,规则来源,有4个枚举可选,分别是:Both(所有来源),Attributes(特性),Configuration(配置)和ParameterAttributesOnly(仅参数特性)。

3、RuleSet,规则集,指向具体的验证配置规则集(有关Validation相关的文章可以看学习之路——第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——上篇中篇下篇学习之路——第六步、使用Validation模块进行服务器端数据验证)。

具体配置图如下:

pic62

同样的Vadidation Call Handler可以不通过配置进行操作,可以直接在代码中通过特性来进行AOP。

1、首先需要引用命名空间:

Microsoft.Practices.EnterpriseLibrary.PolicyInjection; 
Microsoft.Practices.EnterpriseLibrary.PolicyInjection.CallHandlers; 
Microsoft.Practices.EnterpriseLibrary.Validation.Validators; 
Microsoft.Practices.EnterpriseLibrary.Validation.PolicyInjection;

2、为方法添加特性:[ValidationCallHandler],然后为方法参数指定验证特性:[StringLengthValidator(6,16,MessageTemplate="输出的消息长度必须在6-16之间!")]

代码如下:

1
2
3
4
5
6
[ValidationCallHandler]
public  void  abc([StringLengthValidator(6,16,MessageTemplate= "输出的消息长度必须在6-16之间!" )]
     string  cw)
{
     Console.WriteLine(cw);
}

注意:如果需要在代码中使用企业库的验证模块的特性类,需要为项目添加System.ComponentModel.DataAnnotations引用。

 

以上就是本文的所有内容了,本文主要是对Policy Injection模块内置的Call Handler的一些配置进行简单的介绍,如果不对欢迎大家指出,下篇将主要介绍Custom Call Handler的创建及使用方法。

 

微软企业库5.0 学习之路系列文章索引:

第一步、基本入门

第二步、使用VS2010+Data Access模块建立多数据库项目

第三步、为项目加上异常处理(采用自定义扩展方式记录到数据库中) 

第四步、使用缓存提高网站的性能(EntLib Caching)

第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——上篇

第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——中篇 

第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——下篇

第六步、使用Validation模块进行服务器端数据验证

第七步、Cryptographer加密模块简单分析、自定义加密接口及使用—上篇

第七步、Cryptographer加密模块简单分析、自定义加密接口及使用—下篇

第八步、使用Configuration Setting模块等多种方式分类管理企业库配置信息

第九步、使用PolicyInjection模块进行AOP—PART1——基本使用介绍

第九步、使用PolicyInjection模块进行AOP—PART2——自定义Matching Rule

第九步、使用PolicyInjection模块进行AOP—PART3——内置Call Handler介绍

第九步、使用PolicyInjection模块进行AOP—PART4——建立自定义Call Handler实现用户操作日志记录 

第十步、使用Unity解耦你的系统—PART1——为什么要使用Unity?

第十步、使用Unity解耦你的系统—PART2——了解Unity的使用方法(1)

第十步、使用Unity解耦你的系统—PART2——了解Unity的使用方法(2)

第十步、使用Unity解耦你的系统—PART2——了解Unity的使用方法(3)

第十步、使用Unity解耦你的系统—PART3——依赖注入

第十步、使用Unity解耦你的系统—PART4——Unity&PIAB

扩展学习:

扩展学习篇、库中的依赖关系注入(重构 Microsoft Enterprise Library)[转]



本文转自kyo-yo博客园博客,原文链接:http://www.cnblogs.com/kyo-yo/archive/2010/10/08/Learning-EntLib-Ninth-Use-PolicyInjection-Module-AOP-PART3-Built-in-Call-Handler-Description.html,如需转载请自行联系原作者


目录
相关文章
|
Java Spring
spring框架之AOP模块(面向切面),附带通知类型---超详细介绍
spring框架之AOP模块(面向切面),附带通知类型---超详细介绍
135 0
|
6月前
|
负载均衡 Java 应用服务中间件
学习aop以及nginx
学习AOP和Nginx的最好方式是通过实践。你可以尝试在你的项目中使用这些技术,或者找一些在线教程进行学习。
40 1
|
7月前
|
XML Java 数据格式
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
63 0
|
8月前
|
Java Maven 数据安全/隐私保护
代码优雅升级,提升开发效率:挖掘Spring AOP配置的学习宝藏!
代码优雅升级,提升开发效率:挖掘Spring AOP配置的学习宝藏!
|
Java Spring 容器
|
XML Java 数据格式
Spring5学习(七):注解方式进行AOP操作 及 多种通知类型的测试
先来介绍一下AOP操作中的几个术语: 1、连接点:指类里面可以被增强的方法 2、切入点:指实际被增强的方法 3、通知:指实际增强的逻辑部分 4、切面:把通知应用到切入点的过程
109 0
Spring5学习(七):注解方式进行AOP操作 及 多种通知类型的测试
|
XML Java 数据格式
spring aop学习
​1.aop和spring aop的关系? aop是一种思想,spring aop是aop的一种实现。 2.Spring aop和AspectJ的关系? 这两种都是实现aop的
99 0
|
Java 微服务 Spring
【学习Seata1.6源码#02】通过Spring AOP 实现声明式事务机制
【学习Seata1.6源码#02】通过Spring AOP 实现声明式事务机制
467 0
|
4月前
Micronaut AOP与代理机制:实现应用功能增强,无需侵入式编程的秘诀
AOP(面向切面编程)能够帮助我们在不修改现有代码的前提下,为应用程序添加新的功能或行为。Micronaut框架中的AOP模块通过动态代理机制实现了这一目标。AOP将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高模块化程度。在Micronaut中,带有特定注解的类会在启动时生成代理对象,在运行时拦截方法调用并执行额外逻辑。例如,可以通过创建切面类并在目标类上添加注解来记录方法调用信息,从而在不侵入原有代码的情况下增强应用功能,提高代码的可维护性和可扩展性。
84 1
|
2月前
|
安全 Java 编译器
什么是AOP面向切面编程?怎么简单理解?
本文介绍了面向切面编程(AOP)的基本概念和原理,解释了如何通过分离横切关注点(如日志、事务管理等)来增强代码的模块化和可维护性。AOP的核心概念包括切面、连接点、切入点、通知和织入。文章还提供了一个使用Spring AOP的简单示例,展示了如何定义和应用切面。
170 1
什么是AOP面向切面编程?怎么简单理解?