zoukankan      html  css  js  c++  java
  • MVC框架的插件与拦截器基础

    自制MVC框架的插件与拦截器基础

    上篇谈到我自己写的MVC框架,接下来讲讲插件及拦截器!  

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

    1. AspectInterceptor抽象类

      处理动态织入的AOP拦截器,Stephen.View框架中的拦截器抽象类,所有需要动态拦截器必须实现该类,该拦截器原理是通过aspectsharp实现的。该拦截器适用于控制层的拦截,且要使控制器类支持动态拦截必须给控制器加上DynamicAttribute特性

    实现的两个方法

    Proceed(IDictionary myContext) 当拦截的方法处理完以后进行的拦截处理,必须有一个hashtable参数传递

    Entry(IMethodInvocation invocation) 当拦截的方法还未处理以后进行的拦截处理,参数是方法调用的类(aspectsharp框架类)

    配置语法可参见:http://www.cnblogs.com/netcorner/archive/2011/04/01/2911966.html

    拦截器实现示例:

    复制代码
        [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;
            }
            …
    }
    }
    复制代码

    配置拦截器示例:

    复制代码
    <configuration>
        <configSections>
            <section name="aspectsharp" type="AspectSharp.Builder.SectionHandler.AspectSharpConfigurationHandler, AspectSharp"/></configSections>    
        <aspectsharp>
            <configuration>
                aspect processor1 for [Jobmate.Controllers]
                    pointcut method(* Index(*))
                        advice(RandProductInterceptor)
                        advice(ShareInterceptor)
                    end
                end
            </configuration>
        </aspectsharp></configuration>
    复制代码

    对Jobmate.Controllers包中所有名为Index的方法进行拦截处理.

    2. BeforehandCommonAttribute抽象类

      静态织入的AOP拦截器,Stephen.View框架中的拦截器抽象类,所有需要静态拦截器必须实现该类,同时静态拦截器必须可被序列化(类上加Serializable

    特性),该拦截器原理是通过postsharp实现的.拦截器有两种处理方式:

    1).类库生成时必须安装postsharp软件, 且项目类库中加入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

    使用可见:http://www.cnblogs.com/netcorner/p/3756585.html

    3 ProceedPlugin抽象类

     

    使用同BeforehandCommonAttribute,与BeforehandCommonAttribute不一样的地方是它是在控制器方法执行完以后再拦截的。

    演示示例:http://files.cnblogs.com/netcorner/%E7%A4%BA%E4%BE%8B1.rar

     

     
     
     
    标签: MVC插件拦截器
  • 相关阅读:
    模板的一些概念和技巧
    [转] Linux TCP/IP网络小课堂:net-tools与iproute2大比较
    [转] boost库的Singleton的实现以及static成员的初始化问题
    static对象的高级用法
    const中的一些tricky的地方
    delphi软件启动的顺序解密。
    属性名、变量名与 内部关键字 重名 加&
    delphi Inc函数和Dec函数的用法
    Centos 关闭防火墙
    IntelliJ IDEA 启动方法
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3759845.html
Copyright © 2011-2022 走看看