博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
让 ASP.NET MVC 支持 HotSwap
阅读量:4190 次
发布时间:2019-05-26

本文共 3319 字,大约阅读时间需要 11 分钟。

导读:
  
  在HowToStart那帖中,我提到了ASP.NET MVC的问题 :
  如果修改一次Controller的代码,就导致ASP.NET重启一次 , 那么会不会很麻烦?
  有时候一个项目大一点, ASP.NET启动一次需要几十秒, 那样的等待真的很浪费时间.
  与思归的交谈中, 他提到了HotSwap的概念. "热插拔" - 编写代码后不需要重新编译或重启ASP.NET.
  怎样实现这个功能呢? 现在MVC的文档很少. 只能通过Reflector去找答案了.
  一个Request,从Url, 一直到了具体的 Controller , 经过了那些步骤呢?
  下面列出了这个步骤的详细:
  1. Url
  2. RouteTable
  3. MvcRouteHandler
  4. MvcHandler
  5. ControllerBuilder
  6. ControllerFactory
  7. Controller
  这个过程中, MvcRouteHandler 是连接 RouteTable 和 MvcHandler 的桥梁.
  MvcHandler则根据传递过来的信息, 根据某种规则, 从所有的Assembly中找到对应的Controller类
  然后把类型信息传递给 ControllerBuilder/ControllerFactory , 用于指定一个更具体的Controller.
  (类似RuntimeEntity那篇文章说的子类化模式..)
  看来, 需要对MvcHandler下手了. 而 MvcRouteHandler 则就是 MvcHandler 的 Factory.
  所以同时也要编写MvcRouteHandler的实现 :
  public class HotSwapMvcRouteHandler : System.Web.Mvc.MvcRouteHandler
  {
  protected override IHttpHandler GetHttpHandler(System.Web.Mvc.RequestContext requestContext)
  {
  HotSwapMvcHandler handler = new HotSwapMvcHandler();
  handler.RequestContext = requestContext;
  return handler;
  }
  }
  public class HotSwapMvcHandler : System.Web.Mvc.MvcHandler
  {
  protected override Type GetControllerType(string controller)
  {
  string name = controller + "Controller";
  string file = "~/Controllers/" + name + ".cs";
  if (!System.IO.File.Exists(HttpContext.Current.Server.MapPath(file)))
  return base.GetControllerType(controller);
  System.Reflection.Assembly assembly = System.Web.Compilation.BuildManager.GetCompiledAssembly(file);
  return assembly.GetType(name, true, true);
  }
  }
  上面2个类, 写在App_Code里就OK了, 然后, 需要修改一下 RouteTable 的写法:
  RouteTable.Routes.Add(new Route
  {
  Url = "[controller]/[action]/[id]",
  Defaults = new { action = "Index", id = "" },
  RouteHandler = typeof(HotSwapMvcRouteHandler)
  });
  注意一下 , RouteHandler由MvcRouteHandler替换成 HotSwapMvcRouteHandler 了.
  这样HotSwapMvcRouteHandler的代码就能够被执行, 返回HotSwapMvcHandler
  HotSwapMvcHandler 这里得到了一个 controller 的参数, 就是它了.
  我们要做的事情,就是根据它 , 找到我们想要的 Controller
  上面的GetControllerType的具体实现也实在太简单了.
  如果存在 ~/Controllers/XxxControler.cs
  就编译它, 然后直接返回 XxxController 类型.
  否则就按传统的方式去寻找对应的类.
  ----
  OK , 就这样2步, 就实现了在 ~/Controllers/ 中存放Controller代码的目的了.
  重温一下这2步:
  1. App_Code中增加 HotSwapMvcRouteHandler , HotSwapMvcHandler
  2. Global.asax中修改RouteTable的定义
  然后,就可以在 ~/Controllers/ 下增加 TestController.cs , 内容是
  public class TestController : Controller
  {
  [ControllerAction]
  public void Index()
  {
  ViewData["typename"] = this.GetType().AssemblyQualifiedName;
  ViewData["version"] = "version5";
  RenderView("index");
  }
  }
  然后创建对应的 ~/Views/Test/index.aspx 把东西显示出来:
  index.aspx
  

  <%=ViewData["version"] %>
  

  <%=ViewData["typename"] %>
  

  <%=Application["mystr"] = "1" + Application["mystr"]%>
  显示:
  version5
  --------------------------------------------------------------------------------
  TestController, App_Web_testcontroller.cs.39ee6e8a.c0bebgfm, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
  --------------------------------------------------------------------------------
  111
  不断地刷新它, Application["mystr"]就会越来越长.
  然后去修改 TestController.cs 把. 把ViewData["version"] = "version123";
  那么就会立刻生效, 显示version123,而Application["mystr"]没有重置, 证明ASP.NET并没有重启.
  想提高开发的方便性的朋友 , 不妨试试上面的代码.
本文转自

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1929196

你可能感兴趣的文章
ECOIII專欄,第3集
查看>>
ECO技術和高雄/台中ECO/AJAX技術研討會
查看>>
BDS 2006 Hotfix 4铪铪铪铪铪
查看>>
如何重覆使用ECO建立的企業邏輯模型
查看>>
焦油坑与激情
查看>>
项目开发经验谈(二)
查看>>
项目开发经验谈(一)
查看>>
浅谈项目感觉
查看>>
用积木搭出的埃菲尔铁塔
查看>>
IT项目经理是否需要技术能力
查看>>
饮水者才能自知冷暖
查看>>
产品和样品
查看>>
测试Windows Sockets协议
查看>>
浅谈流媒体测试
查看>>
在接口后面能不能使用new操作符
查看>>
在EasyDBO中使用Java注解配置映射的原理及使用
查看>>
Velocity脚本基本语法简介
查看>>
(一)NetBeans IDE上的Java手机游戏例子
查看>>
Java游戏程序部署在不同平台的手机模拟器上
查看>>
用JSP实现基于Web的RSS阅读器
查看>>