博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自制MVC框架的插件与拦截器基础
阅读量:5322 次
发布时间:2019-06-14

本文共 3129 字,大约阅读时间需要 10 分钟。

  上篇谈到我自己写的,接下来讲讲插件及拦截器!  
  在处理一些通用的逻辑最好把它封装一个插件或者拦截器,以便日后可以直接拿过来直接使用。在我的框架中可以通过继承以下抽象类来实现插件或者拦截器。

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不一样的地方是它是在控制器方法执行完以后再拦截的。

演示示例:

转载于:https://www.cnblogs.com/netcorner/p/3758420.html

你可能感兴趣的文章
epoll使用具体解释(精髓)
查看>>
AndroidArchitecture
查看>>
安装Endnote X6,但Word插件显示的总是Endnote Web"解决办法
查看>>
python全栈 计算机硬件管理 —— 硬件
查看>>
大数据学习
查看>>
简单工厂模式
查看>>
Delphi7编译的程序自动中Win32.Induc.a病毒的解决办法
查看>>
Objective-C 【关于导入类(@class 和 #import的区别)】
查看>>
倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-点击运行按钮进入到运行状态报错Error starting TwinCAT System怎么办 AdsWarning1823怎么办...
查看>>
【转】javascript 中的很多有用的东西
查看>>
Centos7.2正常启动关闭CDH5.16.1
查看>>
Android 监听返回键、HOME键
查看>>
Android ContentProvider的实现
查看>>
sqlserver 各种判断是否存在(表名、函数、存储过程等)
查看>>
给C#学习者的建议 - CLR Via C# 读后感
查看>>
Recover Binary Search Tree
查看>>
Java 实践:生产者与消费者
查看>>
[转]IOCP--Socket IO模型终结篇
查看>>
js 获取视频的第一帧
查看>>
各种正则验证
查看>>