IT技術互動交流平jiao)tai)

凤凰体彩官网

發(fa)布日期(qi)︰2020-02-22 05:26:26

AOP這個詞相信(xin)大家都沒hui)薪喲? 喙  鞘shi)際上你們已經(jing)有所(suo)接觸了,就在設計模(mo)式中(zhong)。AOP所(suo)用的思想其實(shi)和設計模(mo)式是一(yi)樣的mo) ji)在不修(xiu)改原代碼的na)榭魷巒騁yi)增加(jia)或者修(xiu)改功能。還有,AOP大多用在spring里面,但是本文所(suo)寫的只是在MVC中(zhong)的應用,要(yao)注意。


一(yi)、簡介

所(suo)謂(wei)AOP(Aspect Oriented Programming的縮寫)意為

面向切(qie)面的編(bian)程(cheng),通過預編(bian)譯方式和運行期(qi)動態代理實(shi)現程(cheng)序功能的統一(yi)維護的一(yi)種技術。AOP是OOP的延(yan)續(xu),是軟(ruan)件開(kai)發(fa)中(zhong)的一(yi)個熱點,也是Spring框架中(zhong)的一(yi)個重要(yao)內容,是函數式編(bian)程(cheng)的一(yi)種衍生(sheng)範型。利用AOP可以對(dui)業務邏輯的各個部(bu)分進(jin)行隔離,從而使得業務邏輯各部(bu)分之間的耦合度降dang)di),提高(gao)程(cheng)序的可重用性,同時提高(gao)了開(kai)發(fa)的效率。

以上是qian)俁勸倏ke)的官方解釋,但是在我看來,其實(shi)AOP更多的是一(yi)種思想,一(yi)種可以動一(yi)發(fa)而通全身的思想,AOP其實(shi)面對(dui)的更多是一(yi)種同意的功能或者調用過程(cheng)來進(jin)行編(bian)寫的一(yi)種程(cheng)序體(ti),從它的第一(yi)個詞Aspect(切(qie)面)也就是指的一(yi)個方面,也bu)梢粵私(si)獾dao)這種方式也就是針對(dui)一(yi)個方面的實(shi)現,這一(yi)點其實(shi)和mvc中(zhong)的global文件很像,也是Spring框架中(zhong)的一(yi)個重要(yao)內容,是函數式編(bian)程(cheng)的一(yi)種衍生(sheng)範型。利用AOP可以對(dui)業務邏輯的各個部(bu)分進(jin)行隔離,從而使得業務邏輯各部(bu)分之間的耦合度降dang)di),提高(gao)程(cheng)序的可重用性,同時提高(gao)了開(kai)發(fa)的效率。

其次(ci)就是它的預編(bian)譯性質可以很好(hao)的處理一(yi)些錯誤或者是預先(xian)判斷(duan)一(yi)些情況,這也導致了它在設計的時候在判斷(duan)xian)ㄏ蓿 騁yi)輸出某個東西方面變得比(bi)較常見。“可以通過預編(bian)譯方式和運行期(qi)動態代理實(shi)現在不修(xiu)改源(yuan)代碼的na)榭魷賂cheng)序動態統一(yi)添(tian)加(jia)功能的一(yi)種技術。AOP實(shi)際是GoF設計模(mo)式的延(yan)續(xu),設計模(mo)式孜孜不倦追求的是調用者和被調用者之間的解耦,提高(gao)代碼的靈活性和可擴展性,AOP可以說也是這種目標的一(yi)種實(shi)現。”上面這句話(hua)也是對(dui)于AOP的很好(hao)的詮釋。

凤凰体彩官网

說了這麼(me)多了,讓我們來實(shi)戰一(yi)下吧,首(shou)先(xian)我們qie)枰yao)在vs新lu)ㄒyi)個mvc的項目,選擇MVC3或者是4都OK,然(ran)後建立一(yi)個controller,命名隨(sui)意,然(ran)後建立他的視圖,在視圖上寫上最簡單的HelloWorld。

 

<!DOCTYPE html><html><head> <title>Index</title></head><body> <div> <a>Hello! World</a> </div></body></html>


 

右圖是我創建好(hao)的MVC解決方案和添(tian)加(jia)好(hao)的controller還有view,在view中(zhong)寫入(ru)上面的代碼以顯(xian)示Hello!World。

運行之後(不會運行的自行百度)是不是就顯(xian)示出了一(yi)個HelloWorld的字樣在網(wang)頁(ye)cheng)夏

好(hao),接下來ci)頤強kai)始新lu)OP的一(yi)個文件然(ran)後去(qu)使用,首(shou)先(xian)在本項目中(zhong)新添(tian)加(jia)一(yi)個類,名字叫FilterPublic,在引用的地方jiao)tian)加(jia)using System.Web.Mvc這個引用,然(ran)後讓這個類繼承于ActionFilterAttribute,大家要(yao)注意Action這個詞,說明這個東西是基于動作的。

然(ran)後我們qie)慈ru)以下代碼︰

 

 public string Message { get; set; } public override void OnActionExecuting(ActionExecutingContext filterContext) {  base.OnActionExecuting(filterContext);  filterContext.HttpContext.Response.Write("Action執行之前(qian)" + Message + "<br />"); } public override void OnActionExecuted(ActionExecutedContext filterContext) {  base.OnActionExecuted(filterContext);  filterContext.HttpContext.Response.Write("Action執行之後" + Message + "<br />"); } public override void OnResultExecuting(ResultExecutingContext filterContext) {  base.OnResultExecuting(filterContext);  filterContext.HttpContext.Response.Write("返回Result之前(qian)" + Message + "<br />"); } public override void OnResultExecuted(ResultExecutedContext filterContext) {  base.OnResultExecuted(filterContext);  filterContext.HttpContext.Response.Write("返回Result之後" + Message + "<br />"); }

這個里面就是Filter觸發(fa)的各種動作,然(ran)後我們在controller里面的na) 戲椒ㄗ 韻灤xiu)改mo)p> 

 

 [FilterPublic(Message = "Action")] public ActionResult Index() {  HttpContext.Response.Write("Action正(zheng)在執行···<br />");  return Content("正(zheng)在返回Result···<br />"); }

然(ran)後在controller的class類上面也添(tian)加(jia)一(yi)句[FilterPublic(Message = "Controller")],然(ran)後運行,會出現什麼(me)結果呢?

 

 

Action執行之前(qian)ActionAction正(zheng)在執行···Action執行之後Action返回Result之前(qian)Action正(zheng)在返回Result···返回Result之後Action

 

可以看到(dao)controller里面的方法在執行之前(qian)會去(qu)先(xian)執行以下我們設置的FilterPublic里面的代碼,而且隨(sui)著里面動作發(fa)生(sheng)時間不同也bu)梢鑰闖雋碩際悄na)個方法被觸發(fa)了。

但是在controller上面寫的基于controller的方法卻沒hui)寫?fa),這是為什麼(me)呢?

其實(shi)這個問題(ti)很簡單,就是我們在設置我們的AOP程(cheng)序的時候沒hui)薪jin)行參(can)數的設置,沒hui)腥ilter進(jin)行疊加(jia)的運行,這個時候我們只要(yao)在寫的FilterPublic類的上面加(jia)上︰[AttributeUsage(AttributeTargets.All, AllowMultiple = true)],就可以讓你設置的各種filter或者疊加(jia)的filter進(jin)行觸發(fa)了,這個時候我們再運行一(yi)下試試︰

 

Action執行之前(qian)ControllerAction執行之前(qian)ActionAction正(zheng)在執行···Action執行之後ActionAction執行之後Controller返回Result之前(qian)Controller返回Result之前(qian)Action正(zheng)在返回Result···返回Result之後Action返回Result之後Controller

這樣一(yi)來,在controller上xi)ilter也被觸發(fa)了,所(suo)以我們使用AOP的方法只需要(yao)在我們自己的寫的方法或者頁(ye)面默認xi)募jia)載方法上面寫上一(yi)個filter類的標簽就可以了。

 

那(na)麼(me),如(ru)果我們有個功能需要(yao)所(suo)有的頁(ye)面都ji)?fa),這樣豈不是也很麻煩麼(me)?別擔(dan)心mo) 飧鍪焙蚓吐值dao)我們的global文件發(fa)揮(hui)作用了。在global.asax文件下面的RegisterGlobalFilters方法下面注冊自己寫的Filter就可以了︰

 

public static void RegisterGlobalFilters(GlobalFilterCollection filters){ filters.Add(new HandleErrorAttribute()); //把(ba)自己的filter定義成(cheng)全局的filter filters.Add(new FilterPublic() { Message = "全局<br/>" });}

然(ran)後運行,看結果︰

 

 

Action執行之前(qian)全局Action執行之前(qian)ControllerAction執行之前(qian)ActionAction正(zheng)在執行···Action執行之後ActionAction執行之後ControllerAction執行之後全局返回Result之前(qian)全局返回Result之前(qian)Controller返回Result之前(qian)Action正(zheng)在返回Result···返回Result之後Action返回Result之後Controller返回Result之後全局

這樣全局的觸發(fa)也就做好(hao)了(filter中(zhong)的message只是用于標識層級的mo) zheng)式用的時候可以不hui)枚ㄒ濉#p> 

這樣一(yi)看,如(ru)果想要(yao)快(kuai)速的添(tian)加(jia)一(yi)個全局都jia)玫姆椒  恍枰yao)新lu)ㄒyi)個Filter,然(ran)後再改一(yi)下global文件就可以辦到(dao)了,是不是很方便呢。


以上均(jun)為本人對(dui)于AOP的一(yi)些淺淺的研究(jiu),如(ru)有錯誤的地方還請(qing)讀者指正(zheng)。

Tag標簽︰切(qie)面  簡介  
  • 凤凰体彩官网

  • 李華明iOS-Cocos2d游戲開(kai)發(fa)專題(ti)
  • 本教(jiao)程(cheng)為 李華明 編(bian)著的iOS-Cocos2d游戲開(kai)發(fa)系(xi)列教(jiao)程(cheng)︰教(jiao)程(cheng)涵蓋關于i...... 詳細
About IT165 - 廣(guang)告服務 - 隱私(si)聲(sheng)明 - 版權申(shen)明 - 免責條款 - 網(wang)站地圖 - 網(wang)友投稿(gao) - 聯系(xi)方式
本站內容來自于互聯網(wang),僅供用于網(wang)絡技術學(xue)習,學(xue)習中(zhong)請(qing)遵循相關法律(lv)法規
凤凰体彩官网 | 下一页