ASP.NET MVC框架的ActionInvoker
创始人
2024-04-19 06:51:00
0

对于执行同步Action的SyncMvcHandler,其实现十分简单而直接,以下是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,我之前一直思考着怎么将框架的默认实现,也就是单个方法调用,转化成两个方法(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签名,但是完全可行,不是吗?

  1. publicclassAsyncActionResult:ActionResult  
  2. {  
  3. publicAsyncActionResult(  
  4. IAsyncResultasyncResult,  
  5. Func,ActionResult>endDelegate)  
  6. {  
  7. this.AsyncResult=asyncResult;  
  8. this.EndDelegate=endDelegate;  
  9. }  
  10.  
  11. publicIAsyncResultAsyncResult{get;privateset;}  
  12.  
  13. publicFunc,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参数
  2. ASP.NET MVC执行异步Action
  3. 概述ASP.NET MVC框架
  4. ASP.NET MVC中使用UpdataModel方法
  5. ASP.NET MVC的Action方法

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...