MVC中的AOP

1、 AOP是什么?编程

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

AOP是一种编程范式,提供从另外一个角度来考虑程序结构以完善面向对象编程(OOP)。session

AOP为开发者提供了一种描述横切关注点的机制,并可以自动将横切关注点织入到面向对象的软件系统中,从而实现了横切关注点的模块化。ide

AOP可以将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理、日志管理、权限控制等,封装起来,便于减小系统的重复代码,下降模块间的耦合度,并有利于将来的可操做性和可维护性。模块化

2、 AOP能干什么,也是AOP带来的好处性能

  1. 下降模块的耦合度
  2. 使系统容易扩展
  3. 设计决定的迟绑定:使用AOP,设计师能够推迟为未来的需求做决定,由于它能够把这种需求做为独立的方面很容易的实现。
  4. 更好的代码复用性

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

3、 AOP的基础实现设计

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

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

咱们新建一个Attribute,用于验证当前session是否过时,过时的话咱们将跳转到登录页

using System;
using System.Web.Mvc;
using System.Web.Routing;

public class Authorized : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }
        base.OnAuthorization(filterContext);

        if (filterContext.HttpContext.Session != null && filterContext.HttpContext.Session["User"] == null)
        {
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary
                    {
                        {"controller", "Account"},
                        {"action", "Login"},
                        {"returnUrl", filterContext.HttpContext.Request.RawUrl}
                    });
            return;
        }
        return;
    }
}

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

[Authorized]
public ActionResult GetMoreInfo()
{
    return new EmptyResult();
}

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

相关文章
相关标签/搜索