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

在前面的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表示不按照次序执行)。

具体配置图如下:

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

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的创建及使用方法。

时间: 2024-10-07 07:52:40

微软企业库5.0 学习之路——第九步、使用PolicyInjection模块进行AOP—PART3——内置Call Handler介绍的相关文章

微软企业库5.0学习笔记(10)ASP.NET模块依赖注入

您可以使用HTTP模块,一个到ASP.NET HttpApplicationState类的扩展,在Global.asax编写代码强制ASP.NET在每一个页面请求时自动注入依赖的对象,就像在ASP.NET Web窗体应用程序中讨论的一样. 下列方法显示了一个合适的方法能够获取PreRequestHandlerExecute事件将它自己注入到ASP.NET的执行流水线,在每个页面请求中通过容器的BuildUp方法运行Http模块,并获取OnPageInitComplete事件.当OnPageIni

微软企业库5.0 学习之路——第十步、使用Unity解耦你的系统—PART1——为什么要使用Unity? (转)

http://www.cnblogs.com/kyo-yo/archive/2010/11/01/Learning-EntLib-Tenth-Decoupling-Your-System-Using-The-Unity-PART1-Why-Use-Unity.html

微软企业库5.0 支持 MySql

三步让 企业库支持 mysql 数据库 1.创建 MySqlDatabaseData 类 using Microsoft.Practices.EnterpriseLibrary.Common.Configuration; using Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ContainerModel; using Microsoft.Practices.EnterpriseLibrary.Data; using Mi

微软企业库5.0 调用 MySql 分页存储过程

1.需要完成两个前置条件后才可以使用 微软企业库5.0 调用 MySql 存储过程 微软企业库5.0 支持 MySql MySql 分页存储过程 2.需要添加一个继承 IParameterMapper 接口的类分配查询参数 using System.Data; using System.Data.Common; using Microsoft.Practices.EnterpriseLibrary.Data; using Grass.Extend; namespace Grass.MySqlDa

分享一个大型进销存供应链项目(多层架构、分布式WCF多服务器部署、微软企业库架构)

分享一个大型进销存供应链项目(多层架构.分布式WCF多服务器部署.微软企业库架构) 这是一个比较大型的项目,准备开源了.支持N家门店同时操作.远程WCF+企业库5.0实现. 这块应该算是库存模块中的核心模块了,因为该块的业务逻辑比较多,比较繁琐,大致讲讲业务逻辑吧,大致的逻辑为:出库单/出库单-->填写订单-->出库/入库-->修改库存信息,按照这个顺序来完成入库出库,顺序不能颠倒,同时还要实现订单的删除,修改,在修改库存信息时由于表和表之间有很多的外键关系,所以要同时删除多张表中含有删

使用Microsoft EnterpriseLibrary(微软企业库)日志组件把系统日志写入数据库和xml文件

这里只是说明在项目中如何配置使用微软企业库的日志组件,对数据库方面的配置请参考其他资料. 1.在项目中添加Microsoft.Practices.EnterpriseLibrary.Data.dll.Microsoft.Practices.EnterpriseLibrary.Logging.dll.Microsoft.Practices.EnterpriseLibrary.Logging.Database.dll这三个引用. 2.打开EnterpriseLibrary的配置工具EntLibCon

在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持

在我们开发很多项目中,数据访问都是必不可少的,有的需要访问Oracle.SQLServer.Mysql这些常规的数据库,也有可能访问SQLite.Access,或者一些我们可能不常用的PostgreSQL.IBM DB2.或者国产达梦数据库等等,这些数据库的共同特点是关系型数据库,基本上开发的模型都差不多,不过如果我们基于ADO.NET的基础上进行开发的话,那么各种数据库都有自己不同的数据库操作对象,微软企业库Enterprise Library是基于这些不同数据库的操作做的抽象模型,适合多数据

微软企业库的Cache

微软企业库的Cache 通常,应用程序可以将那些频繁访问的数据,以及那些需要大量处理时间来创建的数据存储在内存中,从而提高性能.基于微软的企业库,我们的快速创建一个缓存的实现. 新建PrismSample.Infrastructure.Cache 新建一个类库项目,将其命名为PrismSample.Infrastructure.Cache,然后从nuget中下载微软企业库的Cache. 然后新建我们的CacheManager类: using Microsoft.Practices.Enterpr

微软企业库研究之日志模块

很久之前研究微软的企业库时候写的,要注意需要引用Microsoft.Practices.EnterpriseLibrary.Logging组件库,因为ASP.NET5出来,微软在.netframework中自带了Logger,所以应该以后也不会用上. using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.T