//得到当前请求的控制器类型 private Type GetControllerType(SwiftRouteData routeData, string controllerName) { //从路由配置信息里面读取命名空间和程序集 object routeNamespaces = routeData.RouteValue["namespaces"]; object routeAssembly = routeData.RouteValue["assembly"]; //requestContext.RouteData.Values.TryGetValue("namespaces", out routeNamespaces); //requestContext.RouteData.Values.TryGetValue("assembly", out routeAssembly); //通过反射得到控制器的类型 var type = Assembly.Load(routeAssembly.ToString()).GetType(routeNamespaces.ToString() + "." + controllerName + "Controller", false, true); return(type); }
public override void Execute(SwiftRouteData routeData) { //1.得到当前控制器的类型 Type type = this.GetType(); //2.从路由表中取到当前请求的action名称 string actionName = routeData.RouteValue["action"].ToString(); //3.从路由表中取到当前请求的Url参数 object parameter = null; if (routeData.RouteValue.ContainsKey("parameters")) { parameter = routeData.RouteValue["parameters"]; } var paramTypes = new List <Type>(); List <object> parameters = new List <object>(); if (parameter != null) { var dicParam = (Dictionary <string, string>)parameter; foreach (var pair in dicParam) { parameters.Add(pair.Value); paramTypes.Add(pair.Value.GetType()); } } //4.通过action名称和对应的参数反射对应方法。 //这里第二个参数可以不理会action字符串的大小写,第四个参数决定了当前请求的action的重载参数类型 System.Reflection.MethodInfo mi = type.GetMethod(actionName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase, null, paramTypes.ToArray(), null); //5.执行该Action方法 var actionResult = mi.Invoke(this, parameters.ToArray()) as ActionResult; //6.得到action方法的返回值,并执行具体ActionResult的ExecuteResult()方法。 actionResult.ExecuteResult(routeData); }
//通过当前的请求上下文和控制器名称得到控制器的对象 public IController CreateController(SwiftRouteData routeData, string controllerName) { if (routeData == null) { throw new ArgumentNullException("routeData"); } if (string.IsNullOrEmpty(controllerName)) { throw new ArgumentException("controllerName"); } //得到当前的控制类型 Type controllerType = GetControllerType(routeData, controllerName); if (controllerType == null) { return(null); } //得到控制器对象 IController controller = GetControllerInstance(routeData, controllerType); return(controller); }
/// <summary> /// 返回处理当前请求的HttpHandler对象 /// </summary> /// <param name="routeData">当前的请求的路由对象</param> /// <param name="context">当前请求的下文对象</param> /// <returns>处理请求的HttpHandler对象</returns> public System.Web.IHttpHandler GetHttpHandler(SwiftRouteData routeData, HttpContextBase context) { return(new MvcHandler(routeData, context)); }
//得到当前请求的控制器实例 private IController GetControllerInstance(SwiftRouteData routeData, Type controllerType) { var oRes = Activator.CreateInstance(controllerType) as IController; return(oRes); }
public abstract void Execute(SwiftRouteData routeData);
//通过构造函数将两个对象传过来,替代了原来RequestContext的作用 public MvcHandler(SwiftRouteData routeData, HttpContextBase context) { SwiftRouteData = routeData; SwiftContext = context; }