AOP in Asp.net MVC

作者: 堅強2002  來源: 博客園  發布時間: 2009-06-09 12:24  閱讀: 2840 次  推薦: 0   原文鏈接   [收藏]  

不同的觀點,開拓迥然不同的世界.

Another point of view can sometimes open up a whole new world.

                                                                                                ---- HSBC

本文內容包括:

  1. SoC
  2. AOP
  3. AOP in Asp.net
  4. AOP in Asp.net MVC

 

SoC

Separation of concerns (SoC) is the process of breaking a computer program into distinct features that overlap in functionality as little as possible.

源文檔 <http://en.wikipedia.org/wiki/Separation_of_concerns>

上面是維基百科中對SoC的定義,在不同的場景中Soc有著不同的含義

  • Soc是一個過程:SoC是一個將功能點分解以盡量減小功能交叉的過程.
  • SoC是軟件開發的一個基本原則
  • SoC是一個指標:關注點的分離度

 

       SoC的實踐體現在不同的編程模型(Programming paradigm),編程模型幫助開發者提高關注點分離度.過程化編程模型把關注點分解成多個過程.在面向對象編程中,關注點抽象為對象/.面向方面編程模型中,將關注點分解為多個"方面".

XOP 

        這里有一個非常有意思的思考,我們回顧一下上面三種編程模型的發展歷程:面向過程編程模型是人們面對復雜問題的一種自然思路:功能分解.需求的不斷變化,功能分解已經不足以應對變化,于是面向對象編程模型的最核心的方法論是抽象.通過在不同視角進行抽象,抽象之后概念視角和規約視角能夠保證相對的穩定,具體實現的變化被隔離開.說到這里我們不厭其煩的再次回首面向對象設計原則:SRP原則和ISP原則.單一職責和接口隔離本質上就是在強調對變化的隔離.再具體一點,MVC設計模式也是在強調一種分離,只不過它的是把內容和展示做了分離.

 

AOP

Aspect-oriented programming (AOP) is a programming paradigm that increases modularity by enabling improved separation of concerns. This entails breaking down a program into distinct parts (so-called concerns, cohesive areas of functionality). All programming paradigms support some level of grouping and encapsulation of concerns into separate, independent entities by providing abstractions (e.g. procedures, modules, classes, methods) that can be used to implement, abstract and compose these concerns. But some concerns defy these forms of implementation and are called crosscutting concerns because they "cut across" multiple abstractions in a program.

源文檔 <http://en.wikipedia.org/wiki/Aspect-oriented_programming>

上面的文字同樣來自維基百科,我們來做細致解讀:

     OOP引入封裝、繼承和多態性等機制來建立一種對象層次結構.當我們需要為分散的對象引入公共行為的時候,00P則顯得無能為力。一個典型的例子:日志功能。日志代碼往往水平地散布在所有對象層次中.而與它所散布到的對象的核心功能毫無關系。對于其他類型的代碼如權限檢查、異常處理也是如此。這種散布在各處的無關的代碼被稱為橫切(crosscutting)代碼,在OOP設計中.它導致了大量代碼的重復,而不利于各個模塊的重用。本質上核心功能和權限檢查之類的功能處于不同的維度,但是在實現的時候所有的代碼都被平鋪在同一個維度上了.簡單看一下下面的示意圖:

de  

      OOP解決橫切代碼的乏力,AOP將散落各處的卻又重復的代碼組織在一起,OOP工作的基礎上進一步完成模塊化.AOP解決這一問題的機制被稱為"橫切技術";橫切技術實現有兩種方式:一是采用動態代理技術,利用截取消息的方式.對該消息進行裝飾,以取代原有對象行為的執行.二是采用靜態織入的方式,引入特

定的語法創建“方面”.從而使得編譯器可以在編譯期間織入有關“方面”的代碼通常將靜態橫切稱為introduce

 

AOP in Asp.net

      AOP真的離我們很遠么?舉兩個現實中Asp.net的例子:

  1. 我們要在用戶訪問若干頁面的時候檢查是否具有對該頁面的權限
  2. 我們要為頁面做內容的繁簡體轉換

     上面的兩個問題你打算怎么解決?在每一個頁面的Page_Load里面都做一下權限檢查么?然后在頁面事件的最后做一下繁簡體轉換?

   是的,我們的解決方法是做了HTTPModule.通過對用戶請求的攔截,做權限檢查.在頁面輸出到客戶端之前獲取控制權完成頁面繁簡體轉換.我們發現這樣做的好處是:1.對頁面核心代碼沒有任何修改 2.控制靈活:一旦不需要做權限檢查了,只需要注釋掉Web.config對應的配置節就可以了.之所以能夠獲得這樣的便利,本質上是因為我們做到了權限檢查代碼的模塊化.我們將權限檢查的功能和核心業務成功的分離開,而權限檢查功能的切入方式就是通過消息攔截.

    我們把HTTPMoudle理解為一種動態橫切,Web應用程序生命周期中的特定事件就是Join point.HTTPModule中對特定事件的綁定就是PointCut,執行邏輯是Advice,一個HTTPModule代表一個Aspect.也許有學院派的朋友會不同意我的看法.我個人的看法是AOP是一種思想,這種思想還沒有一個嚴格的定義,AOP需要更多的實踐可能性來豐富,它不拘泥于AspectJ或者Aspect#.

    在享受HTTPMoudle便利的同時,我們也發現了這種方案的特點:應用程序生命周期中所暴露的事件就是可利用的Join Point,由于在應用程序級實施橫切,橫切功能的粒度是應用程序級的.我們思考的方向自然走到這里:Asp.net是不是可以有一個更細粒度的橫切實踐?嗯哼,Asp.net MVC出現了.

 

AOP in Asp.net MVC

 上回書我們已經討論過了Asp.netMVC生命周期,我們截取請求處理的其中一個片段,我們從ActionInvoker.InvokeAction方法開始討論.基于上面對于AOP的思考,當我們再次審視下圖的時候,呈現在我們面前的已經是一個個Join Point.下圖中核心的代碼執行邏輯是Action Execution-->ActionResult Execution -->View.Render.在這些核心功能的執行前后會成為我們的切入點,類似于應用程序事件的PrePost一樣,我們看到了OnActionExecuting ,OnActionExecuted,OnResultExecuting,OnResultExecuted.

partlife 

    OutputCache是一個典型的方面應用,我們通過OutputCacheAttribute這樣一個系統的默認實現來做具體分析:

 

OutputCacheAttribute

 

下面對OutputCacheAttribute的特點做一個歸納:

  1.  OuputCache標簽是應用在Controller級別上的,由于一個Controller可以對應多個View,所以它的粒度介于應用程序級和頁面級之間
  2.  OuputCache標簽是靜態引入到Controller,在編譯時完成OutputCache的引入而非運行時,是一種靜態橫切的實現
  3. OuputCache標簽的執行的PointCut是OnResultExecuting
  4. OutputCacheAttribute的繼承關系是:OutputCacheAttribute -----> ActionFilterAttribute----->  FilterAttribute, IActionFilter, IResultFilter

我們今天的主角出現了,看一下ActionFilterAttribute的代碼:

 

 1/* ****************************************************************************
 2 *
 3 * Copyright (c) Microsoft Corporation. All rights reserved.
 4 *
 5 * This software is subject to the Microsoft Public License (Ms-PL). 
 6 * A copy of the license can be found in the license.htm file included 
 7 * in this distribution.
 8 *
 9 * You must not remove this notice, or any other, from this software.
10 *
11 * ***************************************************************************/

12
13namespace System.Web.Mvc {
14    using System;
15
16    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
17    public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter {
18
19        // The OnXxx() methods are virtual rather than abstract so that a developer need override
20        // only the ones that interest him.
21
22        public virtual void OnActionExecuting(ActionExecutingContext filterContext) {
23        }

24
25        public virtual void OnActionExecuted(ActionExecutedContext filterContext) {
26        }

27
28        public virtual void OnResultExecuting(ResultExecutingContext filterContext) {
29        }

30
31        public virtual void OnResultExecuted(ResultExecutedContext filterContext) {
32        }

33    }

34}

35

 

 

   ActionFilterAttribute定義的實際上定義了四個PoinCut,可以看到這四個pointCut是虛方法,注釋里面解釋了這樣做的緣由:可以按照需要來重寫感興趣的方法,就是編寫Advice代碼了;Asp.net HTTPModule實現本質上是讀HTTP請求的攔截,而在Asp.net框架中通過ActionFilterAttribute定義了PointCut,從而創建了更多擴展的機會.除此之外,Asp.net MVC框架還提供了AuthorizeAttribute,HandleErrorAttribute等等常規"方面"默認實現,我們同樣可以進行擴展.

    比較一下Asp.netAsp.netMVCAOP實現上的不同:

 

Asp.net

Asp.net MVC

AOP粒度

應用程序級

靈活的粒度控制

AOP實現方法

動態橫切

靜態橫切

 

      Asp.net MVC繼承了Asp.net的優良傳統,同時Asp.net MVC框架承諾的更靈活,擴展性更好在這里有一個更好的體現.當我們耐心的做一下比較,我們發現這不是一句空話,而今天我們看到的靈活性和擴展性,也僅僅是一個"方面"而已.

 

嗯哼,全文完.

寫東西,越來越慢,越來越慢

 

 HSBC 

0
0
 
標簽:MVC
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()