[EntLib]微软企业库5.0 学习之路——第九步、使用PolicyInjection模块进行AOP—PART2——自定义Matching Rule

简介:

    这段时间公司有新项目需要开发,所以这个企业库学习之路有点耽误了,今天继续接着上一篇文章,在上一篇文章中,我介绍了企业库的自带Matching Rule(匹配规则)的基本信息及使用方法,但是在PolicyInjection模块中的Matching Rule(匹配规则)还有2个规则没有介绍,分别是:

1、Custom Attribute Matching Rule——自定义特性匹配规则

2、Custom Matching Rule——自定义匹配规则

今天就主要对这2个匹配规则进行介绍,及有关这2个匹配规则的一些应用例子。

 

一、Custom Attribute Matching Rule——自定义特性匹配规则

这个匹配规则有点类似于Tag Attribute Matching Rule,只不过Tag Attribute Matching Rule已经定死了特性类——TagAttribute,具体匹配需要靠TagAttribute特性类的tag字符串来标识具体的策略名,使用起来不怎么方便,而且使用字符串来标识,可能会写错,不过企业库同样为我们预留了扩展接口,就是这个自定义特性匹配规则——Custom Attribute Matching Rule。

这个匹配规则使用起来很简单,只需自己定义个特性类,然后在企业库配置工具中进行配置既可。

这个匹配规则接收2个参数:Attribute Type Name和Search Inheritance Chain

1、Attribute Type Name,这个意思很明确了,就是特性类的名称,只需点击旁边的选择按钮即可选择到自己定义的特性类。

2、Search Inheritance Chain,这个是表示是否要查询继承关系,默认为false,表示不查询,看下面的代码就可以理解了:

我首先定义了一个自定义的特性类:

1
2
3
4
[AttributeUsage(AttributeTargets.Method)]
public  class  MyCustomAttribute:System.Attribute
{
}

然后在应用到代码中:

1
2
3
4
5
6
7
8
9
10
11
12
13
public  abstract  class  CustomAttrTest : MarshalByRefObject
{
     [MyCustom]
     public  abstract  void  CwInfo( string  aa);
}
 
public  class  ChildCustomerAttrTest :  CustomAttrTest
{
     public  override  void  CwInfo( string  aa)
     {
         Console.WriteLine(aa);
     }
}

可以看到我将MyCustomAttribute应用到了抽象类CustomAttrTest中的抽象方法CwInfo上,然后由子类ChildCustomerAttrTest来实现,如果将Search Inheritance Chain设置为false,则在方法调用的过程中将不会被拦截,因为MyCustomAttribute是应用在抽象类中,而不是应用在实现类中,所以如果想依靠抽象类来定义拦截,则需要将Search Inheritance Chain设置为true。

具体配置图如下:

pic56

 

注:由于PolicyInjection模块的一个BUG问题,在通过PolicyInjection创建对象的时候,如果创建的对象需要指向一个抽象类将会报错,代码如下:

1
CustomAttrTest customAttr = PolicyInjection.Create<ChildCustomerAttrTest, CustomAttrTest>();

具体的问题,可以参考Artech写的这篇文章:这是EnterLib PIAB的BUG吗?,里面介绍了这个问题的产生原因及解决办法。

 

通过Custom Attribute Matching Rule我们可以根据我们自己的具体需求自由建立特性类,比如:异常、权限、日志等等,通过自己来建立特性类,这样我们可以很好的分隔各个功能,在具体的时候过程中我们可以自由组合所需要的功能,如下代码:

我首先定义几个需要使用的特性类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[AttributeUsage(AttributeTargets.Method)]
public  class  ExceptionAttribute : System.Attribute
{
}
[AttributeUsage(AttributeTargets.Method)]
public  class  LoggingAttribute : System.Attribute
{
}
[AttributeUsage(AttributeTargets.Method)]
public  class  SecurityAttribute : System.Attribute
{
}
public  class  MyCommonAttribute : System.Attribute
{
}

然后为每个特性类关联不同处理操作:

pic57最后使用的时候只需根据需要自己为方法添加特性既可:

1
2
3
4
5
6
[MyCustom]
[Logging]
[Exception]
public  void  Delete( int  id)
{
}

 

二、Custom Matching Rule——自定义匹配规则

如果企业库内置的那么多匹配规则都无法达到你想要的话,你可以尝试着自己编写匹配规则,当然企业库也预留了这个接口,就是Custom Matching Rule。如果要自己实现一个Custom Matching Rule,主要分为2步:

1、建立一个类继承自接口IMatchingRule(这个接口是属于Microsoft.Practices.Unity.InterceptionExtension,需要引用Unity.dll),并实现方法bool Matches(System.Reflection.MethodBase member)。

2、为类加上特性[ConfigurationElementType(typeof(CustomMatchingRuleData))](需要引用命名空间Microsoft.Practices.EnterpriseLibrary.Common.Configuration和Microsoft.Practices.EnterpriseLibrary.PolicyInjection.Configuration),标识其继承自CustomMatchingRuleData,可以被企业库配置工具识别到。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using  Microsoft.Practices.Unity.InterceptionExtension;
using  Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using  Microsoft.Practices.EnterpriseLibrary.PolicyInjection.Configuration;
 
namespace  AOPAssembly
{
     [ConfigurationElementType( typeof (CustomMatchingRuleData))]
     public  class  MyCustomMatchRule : IMatchingRule
     {
         NameValueCollection attributes = null ;
         public  MyCustomMatchRule(NameValueCollection attributes)
         {
             this .attributes = attributes;
         }
 
         public  bool  Matches(System.Reflection.MethodBase member)
         {
             bool  result = false ;
             if  ( this .attributes[ "matchname" ] != null )
             {
                 if  ( this .attributes[ "matchname" ] == member.Name)
                 {
                     result = true ;
                 }
             }
             return  result;
         }
     }
}

配置图如下:

pic58

这样就可以在Matches方法中编写匹配方法,我这边写了个简单匹配,对根据方法名进行匹配。

这个匹配是通过配置工具中配置的方法名进行匹配,如果配置的方法名和所调用的方法名相同则返回匹配成功。这里需要注意的是,如果想要在自己实现的自定义匹配类获取到配置工具中所定义的配置,需要定义一个构造函数,接收类型为NameValueCollection的参数,我这边就通过在类中定义一个attributes参数来接收配置工具中所配置的参数,然后在Matches方法中进行处理

 

以上就是本文的所有内容,本文主要介绍了自定义特性匹配规则和自定义匹配规则的创建及使用方法,如有不对之处欢迎大家指出:)

 

微软企业库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/09/20/Learning-EntLib-Ninth-Use-PolicyInjection-Module-AOP-PART2-Custom-Matching-Rule.html,如需转载请自行联系原作者


目录
相关文章
|
5月前
|
Java Spring
spring框架之AOP模块(面向切面),附带通知类型---超详细介绍
spring框架之AOP模块(面向切面),附带通知类型---超详细介绍
52 0
|
5月前
|
Java 编译器 数据安全/隐私保护
自定义注解与AOP结合使用
自定义注解与AOP结合使用
59 0
|
1天前
|
缓存 Java Sentinel
Springboot 中使用 Redisson+AOP+自定义注解 实现访问限流与黑名单拦截
Springboot 中使用 Redisson+AOP+自定义注解 实现访问限流与黑名单拦截
|
17天前
|
存储 关系型数据库 MySQL
【mybatis-plus】Springboot+AOP+自定义注解实现多数据源操作(数据源信息存在数据库)
【mybatis-plus】Springboot+AOP+自定义注解实现多数据源操作(数据源信息存在数据库)
|
1月前
|
存储 数据可视化 Java
自定义注解实现aop切面
自定义注解实现aop切面
24 1
|
3月前
|
Java Maven 数据安全/隐私保护
代码优雅升级,提升开发效率:挖掘Spring AOP配置的学习宝藏!
代码优雅升级,提升开发效率:挖掘Spring AOP配置的学习宝藏!
|
8月前
|
缓存 Java
Jwt使用Aop方式自定义权限注解认证
使用Aop前置通知方式, 在控制层上使用指定切面注解, 并赋予注解参数为访问接口所需角色权限代码, 进行身份认证和权限校验
56 0
|
4月前
|
前端开发 Java 数据库
【Spring AOP + 自定义注解 + 动态数据源 实现主从库切换&读写分离】—— 案例实战(下)
【Spring AOP + 自定义注解 + 动态数据源 实现主从库切换&读写分离】—— 案例实战(下)
|
4月前
|
Java 关系型数据库 MySQL
【Spring AOP + 自定义注解 + 动态数据源 实现主从库切换&读写分离】—— 案例实战(上)
【Spring AOP + 自定义注解 + 动态数据源 实现主从库切换&读写分离】—— 案例实战
|
10月前
|
Java
SpringBoot 自定义注解 + AOP实现参数效验,默认值赋值
SpringBoot 自定义注解 + AOP实现参数效验,默认值赋值
302 2