AOP思想体现者-FilterAttribute

  今天要说的内容是FilterAttribute,重要介绍AuthorizeAttributeActionFilterAttributeHandleErrorAttributeFilterAttribute做为一种特性它在Asp.net MVC中是AOP思想的重要体现者。(针对Attribute特性,可以自己去扩展,这里不做介绍)。

在介绍FilterAttribute之前,简单说说AOPAOP是面向切面编程,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。举一个业务例子:

  我们有一个扣款业务,有各种版本的扣款,需要根据地区设置扣款方法,那么我们将不“稳定”的扣款方式剥离出来,封装一个“稳定”的扣款类,在这个类前根据版本的不同,采取不同的扣款方式,任你变化。如果“稳定”的扣款是执行“编译”,那么“未编译”前的各种判断就是“预编译”

   

  好了,现在开始介绍FilterAttribute

   

AuthorizeAttribute

  我们主要通过重写OnAuthorization方法,比如进行一些权限认证,登陆时的用户名密码等等,该方法的参数是AuthorizationContext类型,该类型的数据可以获取到用户请求的一切信息

   

在需要用到此特性的地方加上标签

   

ActionFilterAttribute

  ActionFilterAttribute这个特性比较细腻,做的事情相对较多,它分四个阶段:

   

  它们依次执行的顺序如下:

 

  四个阶段中,OnResultExecuted是最后再执行,等页面渲染完成后执行。

  作用:写日志,性能监控...在具有规模的异常处理系统,它发挥的作用很大。在这里可不要做权限认证,因为已经有专门权限认证的的AuthorizeAttribute了,在这里做权限认证就晚了一些,不是不能做,只是针对架构布局的理解来说不太好。

  我们可以利用Http的特点,在返回流中加入一些我们约定的东西,例如:返回的是压缩文件,在客户端再解压缩,这样就可以达到节省带宽的目的,还有在这里针对访问某个方法时做一些跨域。我们以压缩为例:

   

  目的是让客户端解压缩,所以我们得判断一下客户端支持的压缩格式。

  OnResultExecutingOnResultExeculted发生在渲染的时候,例如:我们在Controller中的某个方法执行后返回return View();这是就开始返回渲染,里面执行rander,当返回渲染后最后执行OnResultExeculted方法。这里我们可以精细到整个渲染所需要的时间,在性能监控方面具有很好的体现。

HandlerFilterAttribute

  在我们执行Controller时,凡是在这里发生的任何异常,都是可以被HandlerFilterAttribute捕获到的,它贯穿我们Controller的全部而且记录的非常精细,例如某个方法执行异常。

 

  重写OnException方法,里面的ExceptionContext类型同样有许多重要信息,在执行某个异常时,首先判断一下这个异常是否处理了(ExceptionHandled)

  这里的异常处理是发生在Controller实例化后,如果Controller实例化的时候就发生错误了,HandlerFilterAttribute是捕获不到的(需要在Global文件中的全局处理异常捕获)。

  通过代码看内部

  首先创建Controller实例,这里没有FilterAttribute任何事情。

   

  接下来需要获取方法名

   

然后执行InvokeAction方法

   

  首先查找是否有Filter,有的话再判断有没有授权的Filter,在Filter里面最先查找的就是授权Filter,这也正好符合AOP思想。

  利用AOP思想去写代码,运用范围可大可小,网大了说可以做整个系统的异常处理系统,日志管理系统,性能分析系统等等;往小里说就是开场说到的扣款业务逻辑。在Asp.Net MVC里面内置好的FilterAttribute实现AOP,让整个系统变的业务清晰,可维护性更高。

猜你喜欢

转载自www.cnblogs.com/qiyinke/p/10000051.html