日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

AOP in Asp.net MVC

發(fā)布時(shí)間:2025/3/8 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AOP in Asp.net MVC 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

不同的觀點(diǎn),開拓迥然不同的世界.

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

??????????????????????????????????????????????????????????????????????????????????????????????? ---- HSBC

本文內(nèi)容包括:

  • SoC
  • AOP
  • AOP in Asp.net
  • 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>

    上面是維基百科中對(duì)SoC的定義,在不同的場(chǎng)景中Soc有著不同的含義

    • Soc是一個(gè)過程:SoC是一個(gè)將功能點(diǎn)分解以盡量減小功能交叉的過程.
    • SoC是軟件開發(fā)的一個(gè)基本原則
    • SoC是一個(gè)指標(biāo):關(guān)注點(diǎn)的分離度

    ?

    ?????? SoC的實(shí)踐體現(xiàn)在不同的編程模型(Programming paradigm),編程模型幫助開發(fā)者提高關(guān)注點(diǎn)分離度.過程化編程模型把關(guān)注點(diǎn)分解成多個(gè)過程.在面向?qū)ο缶幊讨?/span>,關(guān)注點(diǎn)抽象為對(duì)象/.面向方面編程模型中,將關(guān)注點(diǎn)分解為多個(gè)"方面".

    ?

    ????????這里有一個(gè)非常有意思的思考,我們回顧一下上面三種編程模型的發(fā)展歷程:面向過程編程模型是人們面對(duì)復(fù)雜問題的一種自然思路:功能分解.需求的不斷變化,功能分解已經(jīng)不足以應(yīng)對(duì)變化,于是面向?qū)ο缶幊棠P偷淖詈诵牡姆椒ㄕ撌浅橄?/span>.通過在不同視角進(jìn)行抽象,抽象之后概念視角和規(guī)約視角能夠保證相對(duì)的穩(wěn)定,具體實(shí)現(xiàn)的變化被隔離開.說到這里我們不厭其煩的再次回首面向?qū)ο笤O(shè)計(jì)原則:SRP原則和ISP原則.單一職責(zé)和接口隔離本質(zhì)上就是在強(qiáng)調(diào)對(duì)變化的隔離.再具體一點(diǎn),MVC設(shè)計(jì)模式也是在強(qiáng)調(diào)一種分離,只不過它的是把內(nèi)容和展示做了分離.

    ?

    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>

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

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

    ??

    ???? ?OOP解決橫切代碼的乏力,AOP將散落各處的卻又重復(fù)的代碼組織在一起,OOP工作的基礎(chǔ)上進(jìn)一步完成模塊化.AOP解決這一問題的機(jī)制被稱為"橫切技術(shù)";橫切技術(shù)實(shí)現(xiàn)有兩種方式:一是采用動(dòng)態(tài)代理技術(shù),利用截取消息的方式.對(duì)該消息進(jìn)行裝飾,以取代原有對(duì)象行為的執(zhí)行.二是采用靜態(tài)織入的方式,引入特

    定的語法創(chuàng)建“方面”.從而使得編譯器可以在編譯期間織入有關(guān)“方面”的代碼通常將靜態(tài)橫切稱為introduce

    ?

    AOP in Asp.net

    ????? AOP真的離我們很遠(yuǎn)么?舉兩個(gè)現(xiàn)實(shí)中Asp.net的例子:

  • 我們要在用戶訪問若干頁面的時(shí)候檢查是否具有對(duì)該頁面的權(quán)限
  • 我們要為頁面做內(nèi)容的繁簡(jiǎn)體轉(zhuǎn)換
  • ?????上面的兩個(gè)問題你打算怎么解決?在每一個(gè)頁面的Page_Load里面都做一下權(quán)限檢查么?然后在頁面事件的最后做一下繁簡(jiǎn)體轉(zhuǎn)換?

    ???是的,我們的解決方法是做了HTTPModule.通過對(duì)用戶請(qǐng)求的攔截,做權(quán)限檢查.在頁面輸出到客戶端之前獲取控制權(quán)完成頁面繁簡(jiǎn)體轉(zhuǎn)換.我們發(fā)現(xiàn)這樣做的好處是:1.對(duì)頁面核心代碼沒有任何修改?2.控制靈活:一旦不需要做權(quán)限檢查了,只需要注釋掉Web.config對(duì)應(yīng)的配置節(jié)就可以了.之所以能夠獲得這樣的便利,本質(zhì)上是因?yàn)槲覀冏龅搅藱?quán)限檢查代碼的模塊化.我們將權(quán)限檢查的功能和核心業(yè)務(wù)成功的分離開,而權(quán)限檢查功能的切入方式就是通過消息攔截.

    ????我們把HTTPMoudle理解為一種動(dòng)態(tài)橫切,Web應(yīng)用程序生命周期中的特定事件就是Join point.HTTPModule中對(duì)特定事件的綁定就是PointCut,執(zhí)行邏輯是Advice,一個(gè)HTTPModule代表一個(gè)Aspect.也許有學(xué)院派的朋友會(huì)不同意我的看法.我個(gè)人的看法是AOP是一種思想,這種思想還沒有一個(gè)嚴(yán)格的定義,AOP需要更多的實(shí)踐可能性來豐富,它不拘泥于AspectJ或者Aspect#.

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

    ?

    AOP in Asp.net MVC

    ?上回書我們已經(jīng)討論過了Asp.netMVC生命周期,我們截取請(qǐng)求處理的其中一個(gè)片段,我們從ActionInvoker.InvokeAction方法開始討論.基于上面對(duì)于AOP的思考,當(dāng)我們?cè)俅螌徱曄聢D的時(shí)候,呈現(xiàn)在我們面前的已經(jīng)是一個(gè)個(gè)Join Point.下圖中核心的代碼執(zhí)行邏輯是Action Execution-->ActionResult Execution -->View.Render.在這些核心功能的執(zhí)行前后會(huì)成為我們的切入點(diǎn),類似于應(yīng)用程序事件的PrePost一樣,我們看到了OnActionExecuting?,OnActionExecuted,OnResultExecuting,OnResultExecuted.

    ?

    ??? OutputCache是一個(gè)典型的方面應(yīng)用,我們通過OutputCacheAttribute這樣一個(gè)系統(tǒng)的默認(rèn)實(shí)現(xiàn)來做具體分析:

    ?

    OutputCacheAttribute

    ?

    下面對(duì)OutputCacheAttribute的特點(diǎn)做一個(gè)歸納:

  • ?OuputCache標(biāo)簽是應(yīng)用在Controller級(jí)別上的,由于一個(gè)Controller可以對(duì)應(yīng)多個(gè)View,所以它的粒度介于應(yīng)用程序級(jí)和頁面級(jí)之間
  • ?OuputCache標(biāo)簽是靜態(tài)引入到Controller,在編譯時(shí)完成OutputCache的引入而非運(yùn)行時(shí),是一種靜態(tài)橫切的實(shí)現(xiàn)
  • OuputCache標(biāo)簽的執(zhí)行的PointCut是OnResultExecuting
  • OutputCacheAttribute的繼承關(guān)系是:OutputCacheAttribute?----->?ActionFilterAttribute----->??FilterAttribute, IActionFilter, IResultFilter
  • 我們今天的主角出現(xiàn)了,看一下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定義的實(shí)際上定義了四個(gè)PoinCut,可以看到這四個(gè)pointCut是虛方法,注釋里面解釋了這樣做的緣由:可以按照需要來重寫感興趣的方法,就是編寫Advice代碼了;Asp.net HTTPModule實(shí)現(xiàn)本質(zhì)上是讀HTTP請(qǐng)求的攔截,而在Asp.net框架中通過ActionFilterAttribute定義了PointCut,從而創(chuàng)建了更多擴(kuò)展的機(jī)會(huì).除此之外,Asp.net MVC框架還提供了AuthorizeAttribute,HandleErrorAttribute等等常規(guī)"方面"默認(rèn)實(shí)現(xiàn),我們同樣可以進(jìn)行擴(kuò)展.

    ????比較一下Asp.netAsp.netMVCAOP實(shí)現(xiàn)上的不同:

    ?

    Asp.net

    Asp.net MVC

    AOP粒度

    應(yīng)用程序級(jí)

    靈活的粒度控制

    AOP實(shí)現(xiàn)方法

    動(dòng)態(tài)橫切

    靜態(tài)橫切

    ????? Asp.net MVC繼承了Asp.net的優(yōu)良傳統(tǒng),同時(shí)Asp.net MVC框架承諾的更靈活,擴(kuò)展性更好在這里有一個(gè)更好的體現(xiàn).當(dāng)我們耐心的做一下比較,我們發(fā)現(xiàn)這不是一句空話,而今天我們看到的靈活性和擴(kuò)展性,也僅僅是一個(gè)"方面"而已.

    ?

    嗯哼,全文完.

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

    ???????????

    ??

    總結(jié)

    以上是生活随笔為你收集整理的AOP in Asp.net MVC的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。