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,這樣咱們就更能專一於核心代碼編程!

相關文章
相關標籤/搜索