zoukankan      html  css  js  c++  java
  • MVC中的AOP

    一 AOP是什么?

      AOP(Aspect-Oriented Programming),面向切面编程,看着是跟OOP(面向对象编程)挺相近的,但实际上又有什么区别呢?OOP具有封装,继承,多态等东西来定义从上到下这种层次关系,但要想实现从左到右的关系的话就开始有点水土不服了,例如用户的权限控制,操作日志等,这些与我们要实现的核心功能不大有关系的东西散布在我们代码的周边,显示十分不好看。于是我们引入了AOP的模式。

            

      我们通常在实现一个页面逻辑的时候,通常伴随着操作日志,安全监测,事务处理等几个逻辑,在实现逻辑的时候都要写一大堆这种代码。而AOP就是将这些与主体业务无关,但又有为业务提供服务的逻辑代码封装起来,降低模块之间的耦合度。如图所示中的圆柱体好比如我们的业务流程,aop代表的是那个横向的操作,俗称切面编程。或许上面的这些理论有点头疼,对于AOP我的大体理解是:将那些与业务核心不大相关的杂七杂八的东西独立开,每次实现了业务核心之前或之后,调用一下对应的方法。

    二 最基本的例子

      AOP这种切面编程能干很多事情,例如验证登陆,权限,性能检测,错误信息记录等等,AOP的目的就是将这些东西分离开来,让开发人员专注与核心关注点,下面用到一个简单的验证身份的例子。

      在登陆的时候,我们简单的将用户信息放置于session["User"]中,通常在实现一些关键操作的时候,都会记录用户的信息,所以每次都要判断一下session是否过期,但这动作应该由AOP来做

      

      我们新建一个Attribute(特性,关于这个后续再写一篇,敬请期待),用于验证当前session是否过期,过期的话我们将跳转到登陆页

      

     1     public class Authorized: AuthorizeAttribute
     2     {
     3         public override void OnAuthorization(AuthorizationContext filterContext)
     4         {
     5             if (filterContext == null)
     6             {
     7                 throw new ArgumentNullException("filterContext");
     8             }
     9             base.OnAuthorization(filterContext);
    10 
    11             if (filterContext.HttpContext.Session["User"] == null)
    12             {
    13                 filterContext.Result = new RedirectToRouteResult(
    14                     new RouteValueDictionary
    15                     {
    16                         {"controller", "Account"},
    17                         {"action", "Login"},
    18                         {"returnUrl", filterContext.HttpContext.Request.RawUrl}
    19                     });
    20                 return;
    21             }
    22             return;
    23         }
    24     }

      这样的话我们就按照AOP的样子实现了验证身份是否过期,然后我们在控制器使用的时候,只需要在控制器方法头部打上一个便签就可以了,例如:

      

    1         [Authorized]
    2         public ActionResult GetMoreInfo()
    3         {
    4             return new EmptyResult();
    5         }

      这样我们就保证了进来GetMoreInfo这个控制器里面的时候,session不为空!引入了AOP,这样我们就更能专注于核心代码编程!

    作者:PowerDK

    出处:http://www.cnblogs.com/PowerDK/

    联系:bigpower@foxmail.com

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有问题或建议,请多多赐教,非常感谢。

  • 相关阅读:
    LeetCode Array Easy 414. Third Maximum Number
    LeetCode Linked List Medium 2. Add Two Numbers
    LeetCode Array Easy 283. Move Zeroes
    LeetCode Array Easy 268. Missing Number
    LeetCode Array Easy 219. Contains Duplicate II
    LeetCode Array Easy 217. Contains Duplicate
    LeetCode Array Easy 189. Rotate Array
    LeetCode Array Easy169. Majority Element
    LeetCode Array Medium 11. Container With Most Water
    LeetCode Array Easy 167. Two Sum II
  • 原文地址:https://www.cnblogs.com/powerdk/p/4150112.html
Copyright © 2011-2022 走看看