MVC中的AOP思想——Filter

     一,AOP(Aspect Oriented Programming)

           在谈AOP之前,我们先来说OOP(Object Oriented Programming),这是接触每一门编程语言的时候,都会先学的东西。众所周知,OOP有三个特征:封装,继承,多态。这是从类的角度来说的,如果我们把系统中的关系用UML图来表示的话,会发现有点儿类似树的结构,这棵树是从上到下的或者是从下到上的,是一个竖直的结构。

          但是AOP不同,AOP是一个水平的结构。在一个系统中,我们可能会遇到这样的情况,当我们写了一大段业务逻辑,之后,在方法结尾,我们要将一些操作记入日志中,然而,我们要记入日志的东西很多,很可能我们很多代码都是这个结构:业务逻辑+日志记录。为解耦业务逻辑跟这些与业务逻辑无关的东西,方便系统维护,提高代码清晰度,我们加入AOP。

          如果说OOP是对系统的纵切的话,那么AOP就是对系统的横切,在横切的同时,加入统一的处理,让我们编码的时候,重点还是放在业务逻辑方面,对系统整体的相似的东西(与业务逻辑无关的东西)在横切的同时统一加入。

      

二,Filter实现简单AOP

          

在ASP.NET MVC框架中,为我们提供了四种类型的Filter类型包括:IAuthorizationFilter、IActionFilter、IResultFilter、IExceptionFilter,执行顺序如下:

  • IAuthorizationFilter    最先执行的,在这些Filter中,我们可以说它的执行优先级是最高的,用于身份验证并对控制器中的action进行授等进行逻辑处理
  • IActionFilter    在IAuthorizationFilter之后执行,包含两个方法,在controller中的action执行之前、执行之后进行逻辑处理
  • IResultFilter    同样包含两个方法,在IActionFilter之后执行,在返回View之前和返回View之后执行逻辑处理
  • IException      主要用于对异常信息进行处理

   下面我们以IActionFilter与IException为例,来看下filter是如何实现AOP的。

    首先是actionFilter:

  public class LoggerFilter:FilterAttribute,IActionFilter
    {
        /// <summary>
        /// 在被拦截action后执行
        /// </summary>
        /// <param name="filterContext">The filter context.</param>
        /// <remarks>创建者:刘慧超; 创建时间:2015-09-13 19:47:23</remarks>
        public void OnActionExecuted(ActionExecutedContext filterContext)
        {
            filterContext.Controller.ViewData["executedLogger"] = "action之后。。——" + DateTime.Now;
        }

        /// <summary>
        /// 在被拦截Action前执行
        /// </summary>
        /// <param name="filterContext">The filter context.</param>
        /// <remarks>创建者:刘慧超; 创建时间:2015-09-13 19:47:00</remarks>
        public void OnActionExecuting(ActionExecutingContext filterContext)
        {
            filterContext.Controller.ViewData["executingLogger"] = "action之前。。——" + DateTime.Now;

        }
    }

   我们建立的类要继承FilterAttribute,实现IActionFilter,重写action执行之前和之后的方法。

   测试,如果要使用我们的filter,只需在返回view的方法上面加上标签即可。

     

     [LoggerFilter()]
        public ActionResult Index()
        {
            System.Threading.Thread.Sleep(2000);
            ViewData["Time"] = DateTime.Now;//当前时间
            System.Threading.Thread.Sleep(2000);

            return View();
        }

然后我们在页面上接收下根据打印的时间来判断执行顺序:

@using System.Web.UI.WebControls
@{
    ViewBag.Title = "Index";
}

<h2>测试ActionFilter</h2>

<p>@ViewData["executingLogger"]</p>

<p></p>
<p>@ViewData["Time"]</p>
<p></p>

<p>@ViewData["executedLogger"]</p>

异常处理:

 

 public class ExceptionFilter:FilterAttribute,IExceptionFilter
    {
        /// <summary>
        /// 异常发生时候被调用
        /// </summary>
        /// <param name="filterContext">The filter context.</param>
        /// <remarks>创建者:刘慧超; 创建时间:2015-09-13 19:52:25</remarks>
        public void OnException(ExceptionContext filterContext)
        {
            filterContext.Controller.ViewData["ErrorMessage"] = filterContext.Exception.Message;  //此处Exception是异常类型实例
            filterContext.Result = new ViewResult()
            {
                ViewName = "ExceptionIndex",  //出错后跳转到的错误页面
                ViewData = filterContext.Controller.ViewData
            };
            filterContext.ExceptionHandled = true; //告诉系统,异常已经处理了,不需要再次处理了

        }
    }

   在代码中,我们定义出现异常之后,跳转到异常出错页面。

 测试方法:

 

  public void TestE()
        {
            throw new Exception("这是个被抛出的异常,啦啦啦。。。");
            return;
            ;
        }

        [ExceptionFilter()]
        public ActionResult ExceptionIndex()
        {
            TestE();
            return View();

        }

页面显示出一次信息:

@{
    ViewBag.Title = "ExceptionIndex";
}

<h2>异常拦截测试</h2>

<p>@ViewData["ErrorMessage"]</p>

        可见filter使用方法类似,首先定义继承相应接口和特性标签的类,之后在要处理的返回视图的方法上加上attribute.

       有点儿类似我们以前经常被问道的页面生命周期,但是又不一样,页面生命周期是类自带的,而filter中方法的执行是后期有选择的加入的,感觉很像方法正在从上到下流畅执行,到了特定地方,被横切一刀,切面编程还是蛮形象的。

     

时间: 2024-10-04 15:50:49

MVC中的AOP思想——Filter的相关文章

Spring框架与AOP思想的研究与应用

摘要 本文对Spring框架中所包含的AOP思想以及事务管理进行了分析,并通过对一个业务对象实现加锁/解锁的操作,说明了动态代理模式的可行性与有效性. 关键词 AOP:横切关注点:控制反转:动态代理 引言 Aspect Oriented Programming(AOP)是近年来计算机技术中比较热门的话题之一.其发展历史从学术领域和研发机构的运用开始,目前流行的Spring应用程序框架将AOP思想融入了整个框架的设计开发与应用当中.使用Spring框架固然给我们的编程带来了好处与便利,但是同时存在

ASP.NET MVC中的ActionFilter是如何执行的?

在ASP.NET MVC中的四大筛选器(Filter),ActionFilter直接应用在某个Action方法上,它在目标Action方法执行前后对调用进行拦截以执行一些额外的操作.这是一种典型的AOP式的设计,如果我们需要在执行某个Action方法的前后执行一些操作,可以通过定义ActionFilter来实现.本篇文章主要讲述多一个应用到相同Action方法上的ActionFilter的执行机制. 一.ActionFilter ActionFilter允许我们在目标Action方法执行前后对调

asp.net mvc中“Action”的创建

内容概览 本篇主要探讨"Action"的创建过程,为什么要加引号呢?因为我们创建的不 是真正的Action,方法是没法创建的,它是指 ActionDescriptor对象,是对 Action方法描述的一个对象,在mvc中,方法的调用是利用反射来实现的.下面我 们就具体讨论一下这个过程. * 为什么要创建Action? * ControllerDescriptor与ActionDescriptor * ActionMethodSelector是什么? * 获取全部合法的Action 为什

在 ASP.NET MVC 中使用 HTTPS

某些安全性较高的网页,如网上支付或用户登陆页面,可能会使用到https(SSL/TLS)来提高安全性.本文介绍了如何在ASP.NET MVC中强制某action使用https和如何进行向https页面的跳转. 我们先实现强制一个action使用https.这里写了一个RequireHttpsAttribute,它的作用是将非https连接转换成https连接,这样所有使用了RequireHttps这个filter的controller都会强制使用https连接.   1 using System

在nanowar中引入AOP

通过nanocontainer的nanowar和其struts插件完美的实现了IoC模式的透明,但无法在标准的nanowar中引入nanoaop不得不说是一种遗憾.看了一下nanocontainer的代码,决定自己动手给nanowar添加aop的支持.要在组件和实例中支持AOP,首先要引入interceptor chains.可以考虑在XML定义中引入<aspect interceptor='InterceptorName' pointcuts='Filter'/>标签.这个<aspec

ASP.NET MVC中你必须知道的13个扩展点

ScottGu在其最新的博文中推荐了Simone Chiaretta的文章13 ASP.NET MVC extensibility points you have to know,该文章为我们简单介绍了ASP.NET MVC中的13个扩展点.Keyvan Nayyeri(与Simone合著了Beginning ASP.NET MVC 1.0一书)又陆续发表了一些文章,对这13个扩展点分别进行深入的讨论.我将在 以后的随笔中对这些文章逐一进行翻译,希望能对大家有所帮助. ASP.NET MVC设计

Spring中的AOP详解

本文摘自pandonix的博客.   此前对于AOP的使用仅限于声明式事务,除此之外在实际开发中也没有遇到过与之相关的问题.最近项目中遇到了以下几点需求,采用AOP来解决.一方面是为了以更加灵活的方式来解决问题,另一方面是借此机会深入学习Spring AOP相关的内容.本文是权当本人的自己AOP学习笔记,以下需求不用AOP肯定也能解决,至于是否牵强附会,仁者见仁智者见智. 面对需求: ①对部分函数的调用进行日志记录,用于观察特定问题在运行过程中的函数调用情况. ②监控部分重要函数,若抛出指定的异

在ASP.NET MVC中使用IIS级别的URL Rewrite

原文 在ASP.NET MVC中使用IIS级别的URL Rewrite 大约一年半前,我在博客上写过一系列关于URL Rewrite的文章(2.3.4),把ASP.NET平台上进行URL Rewrit的方式和各自地特点进行了较为详细的描述.应该来说,已经讲的非常具体,可以应对90%的情况.其实IIS Rewrite的原理非常容易理解,进行一些简单的变化和推断之后,便可以得出一些问题的原因和解决方案.现在我们就来看一个真实案例:在ASP.NET MVC中使用IIS级别的URL Rewrite. 在

.Net“.NET研究”语言中关于AOP 的实现详解

文章主要和大家讲解开发应用系统时在.Net语言中关于AOP 的实现.LogAspect完成的功能主要是将Advice与业务对象的方法建立映射,并将其添加到Advice集合中.由于我们在AOP实现中,利用了xml配置文件来配置PointCut,因此对于所有Aspect而言,这些操作都是相同的,只要定义了正确的配置文件,将其读入即可.对于Aspect的SyncProcessMessage(),由于拦截和织入的方法是一样的,不同的只是Advice的逻辑而已,因此在所有Aspect的公共基类中已经提供了