MVC中的AOP思想——Filter
来源:互联网 发布:pdm软件排名 编辑:程序博客网 时间:2024/06/13 13:03
一,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中方法的执行是后期有选择的加入的,感觉很像方法正在从上到下流畅执行,到了特定地方,被横切一刀,切面编程还是蛮形象的。
- MVC中的AOP思想——Filter
- Java技术积累——AOP思想之Filter的使用
- ASP.NET MVC AOP-Filter
- MVC过滤器-AOP思想初探
- Spring中的AOP思想
- Filter,一种aop编程思想的体现
- IOS中的MVC思想
- 【AOP系列】(五)—Filter
- Filter过滤器(拦截器)实现AOP思想
- 【ASP.NET专题】(7)——ASP.NET MVC中的过滤器Filter
- Attribute(二)——自定义特性+Asp.net MVC中的filter详解
- Attribute(二)——自定义特性+Asp.net MVC中的filter详解
- spring中的AOP编程思想详解
- spring 3.1.0.M 注解MVC + filter + AOP
- spring 3.1.0.M 注解MVC + filter + AOP + memcache + C3P0
- spring 3.1.0.M 注解MVC + filter + AOP + memcache + C3P0
- 浅谈spring——AOP思想(五)
- 浅谈spring——AOP思想(五)
- iOS之OC随笔-Model数据类型
- unpipc.h下载和编译
- 数据结构学习2--线性表的设计与实现(二)
- 自定义 View 3d翻转动画 android
- OpenWRT安装完后make menuconfig失败
- MVC中的AOP思想——Filter
- notepad++快捷键
- 2015华为Word Maze 是一个网络小游戏,你需要找到以字母标注的食物
- iOS软件开发 获取相册图片或照相
- UNIX 高手的 10 个习惯 http://www.ibm.com/developerworks/cn/aix/library/au-badunixhabits.html
- Lua动态生成代码
- java文件图标变成空心J
- netstate 与 tcpdump
- SweepGradient扫描渲染