自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

ASP.NET MVC框架的ActionInvoker

開發(fā) 后端
本文介紹ASP.NET MVC框架的ActionInvoker,以及介紹框架內(nèi)部的關(guān)鍵性設(shè)計,也就是從單一的Action方法調(diào)用,轉(zhuǎn)變?yōu)椤胺螦PM的”二段式調(diào)用。

對于執(zhí)行同步Action的SyncMvcHandler,其實現(xiàn)十分簡單而直接,以下是ASP.NET MVC框架的ActionInvoker。

  1. publicclassSyncMvcHandler:IHttpHandler,IRequiresSessionState  
  2. {  
  3. publicSyncMvcHandler(  
  4. IControllercontroller,  
  5. IControllerFactorycontrollerFactory,  
  6. RequestContextrequestContext)  
  7. {  
  8. this.Controller=controller;  
  9. this.ControllerFactory=controllerFactory;  
  10. this.RequestContext=requestContext;  
  11. }  
  12.  
  13. publicIControllerController{get;privateset;}  
  14. publicRequestContextRequestContext{get;privateset;}  
  15. publicIControllerFactoryControllerFactory{get;privateset;}  
  16.  
  17. publicvirtualboolIsReusable{get{returnfalse;}}  
  18.  
  19. publicvirtualvoidProcessRequest(HttpContextcontext)  
  20. {  
  21. try  
  22. {  
  23. this.Controller.Execute(this.RequestContext);  
  24. }  
  25. finally  
  26. {  
  27. this.ControllerFactory.ReleaseController(this.Controller);  
  28. }  
  29. }  

而對于異步Action,我之前一直思考著怎么將框架的默認實現(xiàn),也就是單個方法調(diào)用,轉(zhuǎn)化成兩個方法(BeginXxx/EndXxx)調(diào)用。曾經(jīng)我想過自己實現(xiàn)一個新的ActionInvoker,但是這就涉及到了大量的工作,尤其是如果希望保持ASP.NET MVC框架現(xiàn)有的功能(ActionFilter,ActionSelector等等),最省力的方法可能就是繼承ControllerActionInvoker,并設(shè)法使用框架已經(jīng)實現(xiàn)的各種輔助方法。但是在分析了框架代碼之后我發(fā)現(xiàn)復(fù)用也非常困難,舉例來說,ControllerActionInvoker判定一個方法為Action的依據(jù)之一是這個方法返回的是ActionResult類型或其子類,這意味著我無法直接使用這個方法來獲取一個返回IAsyncResult的BeginXxx方法;同理,對于查找EndXxx方法,我可能需要在請求名為Abc的異步Action時,將EndAbc作為查找依據(jù)交由現(xiàn)成的方法來查詢——但是,如果又有一個請求是直接針對一個名為EndAbc的同步Action的那又怎么辦呢?

由于這些問題存在,我在去年設(shè)法實現(xiàn)異步Action時幾乎重寫了整個ActionInvoker ——其復(fù)雜程度可見一斑。而且那個實現(xiàn)對于一些特殊情況的處理依舊不甚友好,需要開發(fā)人員在一定程度上做出妥協(xié)。這個實現(xiàn)在TechED 2008 China的Session中公布時我就承認它并不能讓我滿意,建議大家不要將其投入生產(chǎn)環(huán)境中。而現(xiàn)在的實現(xiàn),則非常順利地解決了整個問題。雖然從理論上講還不夠“***”,雖然還做出了一些讓步。

帶來如此多問題的原因就在于我們在設(shè)法顛覆框架內(nèi)部的關(guān)鍵性設(shè)計,也就是從單一的Action方法調(diào)用,轉(zhuǎn)變?yōu)椤胺螦PM的”二段式調(diào)用。等等,您是否感覺到了解決問題的關(guān)鍵?沒錯,那就是“符合APM的”。APM要求我們將一個行為分為BeginXxx和EndXxx兩個方法,可是既然ASP.NET MVC框架只能讓我們返回一個ActionResult對象……那么我們?yōu)槭裁床辉谶@個對象里包含方法的引用——也就是一個委托對象呢?這雖然不符合正統(tǒng)的APM簽名,但是完全可行,不是嗎?

  1. publicclassAsyncActionResult:ActionResult  
  2. {  
  3. publicAsyncActionResult(  
  4. IAsyncResultasyncResult,  
  5. Func<IAsyncResult,ActionResult>endDelegate)  
  6. {  
  7. this.AsyncResult=asyncResult;  
  8. this.EndDelegate=endDelegate;  
  9. }  
  10.  
  11. publicIAsyncResultAsyncResult{get;privateset;}  
  12.  
  13. publicFunc<IAsyncResult,ActionResult>EndDelegate{get;privateset;}  
  14.  
  15. publicoverridevoidExecuteResult(ControllerContextcontext)  
  16. {  
  17. context.Controller  
  18. .SetAsyncResult(this.AsyncResult)  
  19. .SetAsyncEndDelegate(this.EndDelegate);  
  20. }  

【編輯推薦】

  1. ASP.NET的AsyncState參數(shù)
  2. ASP.NET MVC執(zhí)行異步Action
  3. 概述ASP.NET MVC框架
  4. ASP.NET MVC中使用UpdataModel方法
  5. ASP.NET MVC的Action方法
責任編輯:佚名 來源: IT168
相關(guān)推薦

2009-07-24 13:20:44

MVC框架ASP.NET

2009-07-22 10:09:59

ASP.NET MVC

2009-07-22 13:24:24

ASP.NET MVC

2009-07-20 10:53:59

ASP.NET MVC

2009-07-22 13:08:55

拯救UpdatePanASP.NET MVC

2010-06-23 15:44:03

ASP.NET MVC

2009-07-20 12:59:53

ASP.NET MVCASP.NET框架的功

2009-06-01 10:23:31

asp.net mvcasp.net mvc.net mvc框架

2009-03-13 10:58:48

ASP.NetMVC框架編程

2014-06-30 09:22:38

ASP.NETBootstrap

2009-07-31 12:43:59

ASP.NET MVC

2009-07-20 15:51:40

FubuMVC核心框架ASP.NET MVC

2009-07-24 10:55:00

asp.net mvc

2009-07-22 09:11:02

Action方法ASP.NET MVC

2009-07-20 15:44:32

ASP.NET MVC

2009-07-24 11:20:43

ASP.NET MVC

2009-07-23 15:44:39

ASP.NET MVC

2009-07-23 14:31:20

ASP.NET MVC

2010-03-23 08:42:26

ASP.NET MVC

2009-12-17 15:07:16

ASP.NET MVC
點贊
收藏

51CTO技術(shù)棧公眾號