在前面的Part1和Part2中 我已经介绍了PolicyInjection模块的内置的Matching Rule和自定义Matching Rule的基本信息及配置使用方法,不过光有Matching Rule进行验证匹配还不够,还必须要有相应的操作——Call Handler,所以今天继续介绍PolicyInjection模块内置的Call Handler。
一、PolicyInjection模块内置的Call Handler
通过将Call Handler和Part1、Part2中 的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表示不按照次序执行)。
具体配置图如下:
相对应的如果想通过代码来实现这样的效果,需要进行以下操作:
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,同上。
具体配置图如下:
相对应的如果想通过代码来实现这样的效果,需要进行以下操作:
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,日志级别。
具体配置图如下:
相对应的如果想通过代码来实现这样的效果,需要进行以下操作:
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、企业库配置图:
主要设置2个属性:
1)Category Name:计数器名——abc
2)Instance Name:实例名——Default
至于其他属性可以不用更改,主要是对性能监视器的一些配置。
2、安装性能计数器,需要在项目中引入:System.Configuration.Install
代码如下:
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、调用具体的方法,同时查看其性能:
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中会出现: 这时,打开计算机管理-性能-监视工具-添加,可以看到我们刚才创建的性能计数器已经存在列表当中: 添加完成后,我们就可以在性能计数器中看到我们现在所正在运行的方法的性能了: 4、卸载性能计数器:
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模块进行服务器端数据验证)。
具体配置图如下:
同样的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之间!")]
代码如下:
[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的创建及使用方法。