本篇內容介紹了“ASP.NET MVC框架的ActionInvoker是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
對于執行同步Action的SyncMvcHandler,其實現十分簡單而直接,以下是ASP.NET MVC框架的ActionInvoker。
publicclassSyncMvcHandler:IHttpHandler,IRequiresSessionState { publicSyncMvcHandler( IControllercontroller, IControllerFactorycontrollerFactory, RequestContextrequestContext) { this.Controller=controller; this.ControllerFactory=controllerFactory; this.RequestContext=requestContext; } publicIControllerController{get;privateset;} publicRequestContextRequestContext{get;privateset;} publicIControllerFactoryControllerFactory{get;privateset;} publicvirtualboolIsReusable{get{returnfalse;}} publicvirtualvoidProcessRequest(HttpContextcontext) { try { this.Controller.Execute(this.RequestContext); } finally { this.ControllerFactory.ReleaseController(this.Controller); } } }
而對于異步Action,我之前一直思考著怎么將框架的默認實現,也就是單個方法調用,轉化成兩個方法(BeginXxx/EndXxx)調用。曾經我想過自己實現一個新的ActionInvoker,但是這就涉及到了大量的工作,尤其是如果希望保持ASP.NET MVC框架現有的功能(ActionFilter,ActionSelector等等),最省力的方法可能就是繼承ControllerActionInvoker,并設法使用框架已經實現的各種輔助方法。但是在分析了框架代碼之后我發現復用也非常困難,舉例來說,ControllerActionInvoker判定一個方法為Action的依據之一是這個方法返回的是ActionResult類型或其子類,這意味著我無法直接使用這個方法來獲取一個返回IAsyncResult的BeginXxx方法;同理,對于查找EndXxx方法,我可能需要在請求名為Abc的異步Action時,將EndAbc作為查找依據交由現成的方法來查詢——但是,如果又有一個請求是直接針對一個名為EndAbc的同步Action的那又怎么辦呢?
由于這些問題存在,我在去年設法實現異步Action時幾乎重寫了整個ActionInvoker ——其復雜程度可見一斑。而且那個實現對于一些特殊情況的處理依舊不甚友好,需要開發人員在一定程度上做出妥協。這個實現在TechED 2008 China的Session中公布時我就承認它并不能讓我滿意,建議大家不要將其投入生產環境中。而現在的實現,則非常順利地解決了整個問題。雖然從理論上講還不夠“***”,雖然還做出了一些讓步。
帶來如此多問題的原因就在于我們在設法顛覆框架內部的關鍵性設計,也就是從單一的Action方法調用,轉變為“符合APM的”二段式調用。等等,您是否感覺到了解決問題的關鍵?沒錯,那就是“符合APM的”。APM要求我們將一個行為分為BeginXxx和EndXxx兩個方法,可是既然ASP.NET MVC框架只能讓我們返回一個ActionResult對象……那么我們為什么不在這個對象里包含方法的引用——也就是一個委托對象呢?這雖然不符合正統的APM簽名,但是完全可行,不是嗎?
publicclassAsyncActionResult:ActionResult { publicAsyncActionResult( IAsyncResultasyncResult, Func<IAsyncResult,ActionResult>endDelegate) { this.AsyncResult=asyncResult; this.EndDelegate=endDelegate; } publicIAsyncResultAsyncResult{get;privateset;} publicFunc<IAsyncResult,ActionResult>EndDelegate{get;privateset;} publicoverridevoidExecuteResult(ControllerContextcontext) { context.Controller .SetAsyncResult(this.AsyncResult) .SetAsyncEndDelegate(this.EndDelegate); } }
“ASP.NET MVC框架的ActionInvoker是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。