标签:
即将离职,闲来无事回顾下MVC的源码,到了Controller创建这里,由于流程有点复杂,鉴于自己记性不太好,索性就记录一下吧,方便日后参照。
1 public class MvcHandler : IHttpAsyncHandler, IHttpHandler, IRequiresSessionState 2 { 3 //... 4 private ControllerBuilder _controllerBuilder; 5 internal ControllerBuilder ControllerBuilder 6 { 7 get 8 { 9 if (_controllerBuilder == null) 10 { 11 _controllerBuilder = ControllerBuilder.Current; 12 } 13 return _controllerBuilder; 14 } 15 set { _controllerBuilder = value; } 16 } 17 //... 18 protected internal virtual void ProcessRequest(HttpContextBase httpContext) 19 { 20 IController controller; 21 IControllerFactory factory; 22 ProcessRequestInit(httpContext, out controller, out factory); 23 24 try 25 { 26 controller.Execute(RequestContext); 27 } 28 finally 29 { 30 factory.ReleaseController(controller); 31 } 32 } 33 34 private void ProcessRequestInit(HttpContextBase httpContext, out IController controller, out IControllerFactory factory) 35 { 36 // ... 37 // Get the controller type 38 string controllerName = RequestContext.RouteData.GetRequiredString("controller"); 39 40 // Instantiate the controller and call Execute 41 factory = ControllerBuilder.GetControllerFactory(); 42 controller = factory.CreateController(RequestContext, controllerName); 43 //... 44 }
简而言之,controller通过实现IControllerFactory的工厂的CreateController()方法创建,而该工厂通过ControllerBuilder.GetControllerFactory()获得。
标签:
原文地址:http://www.cnblogs.com/chengs/p/4601962.html