1. AspectInterceptor抽象类
处理动态织入的AOP拦截器,Stephen.View框架中的拦截器抽象类,所有需要动态拦截器必须实现该类,该拦截器原理是通过aspectsharp实现的。该拦截器适用于控制层的拦截,且要使控制器类支持动态拦截必须给控制器加上DynamicAttribute特性
实现的两个方法
Proceed(IDictionary myContext) 当拦截的方法处理完以后进行的拦截处理,必须有一个hashtable参数传递
Entry(IMethodInvocation invocation) 当拦截的方法还未处理以后进行的拦截处理,参数是方法调用的类(aspectsharp框架类)
配置语法可参见:
拦截器实现示例:
[Serializable] public class RandProductInterceptor : AspectInterceptor { public override void Proceed(IDictionary myContext) { … } }
控制器实现示例:
namespace Jobmate.Controllers{ [Dynamic] //必须声明,否则无法拦截 public class Default { [MyLogin] public virtual IDictionary Index(IDictionary context) //该方法必须保证为虚方法,否则不能拦截 { return context; } …}}
配置拦截器示例:
… … aspect processor1 for [Jobmate.Controllers] pointcut method(* Index(*)) advice(RandProductInterceptor) advice(ShareInterceptor) end end
对Jobmate.Controllers包中所有名为Index的方法进行拦截处理.
2. BeforehandCommonAttribute抽象类
静态织入的AOP拦截器,Stephen.View框架中的拦截器抽象类,所有需要静态拦截器必须实现该类,同时静态拦截器必须可被序列化(类上加Serializable
特性),该拦截器原理是通过postsharp实现的.拦截器有两种处理方式:
1).类库生成时必须安装软件, 且项目类库中加入PostSharp.Laos.dll、PostSharp.Public.dll,但编译之后发布就不需要安装或引入了。
2).拦截器放在网站站点app_code文件夹中是不需要postsharp编译的。
两者方式是不一样的,第一种采用postsharp代码在编译的时候织入,另外一种采用反射原理拦截,前者的效率要高于后者。
拦截器实现示例:
[Serializable] //声明类必须被序列化,否则无法拦截 public class MyLoginAttribute : BeforehandCommonAttribute { public override void Beforehand(IDictionary myContext) { … } }
控制器示例:
namespace Netcorner.Controllers.integration{public class Commend { [MyLogin(AspectPriority = 1)] [MyRoleCheck(AspectPriority = 0)] public virtual new IDictionary ManageList(IDictionary context) {… }}}
AspectPriority是postsharp类中对多个拦截器进行优先级设定的方式,值越小说明执行优先级越高,反之者越低。
值得注意的是,这个静态织入的拦截器不一定只能放在方法上的特性,还可以放在类上。
[ShareData(AttributeTargetMembers = @"regex:^(?!.*Action).*$")] [MyLogin(AttributeTargetMembers = @"regex:^(?!.*Action).*$", AspectPriority = 1)] [MyRoleCheck(AspectPriority = 0)] public class Administration { [Pagination(AspectPriority = 3, Key = "Jobmate.JM_AM_Employee.Employee")] [QueryData(AspectPriority = 2)] public IDictionary EmployeeManage(IDictionary context) { … } [GUID(AspectPriority = 2)] [FormData(AspectPriority = 1)] [UserLogger] [MyRoleCheck(AspectPriority = 0)] [BreakRomoteURL(AspectPriority = -1)] protected object NewAction(IDictionary context) { … } }
可通过AttributeTargetMembers发生以正则的方式筛选可拦截的方法。如上例中将拦截NewAction方法,而不拦截EmployeeManage
使用可见:
3 ProceedPlugin抽象类
使用同BeforehandCommonAttribute,与BeforehandCommonAttribute不一样的地方是它是在控制器方法执行完以后再拦截的。
演示示例: