Esempio n. 1
0
        //得到当前请求的控制器类型
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        //通过当前的请求上下文和控制器名称得到控制器的对象
        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);
        }
Esempio n. 4
0
 /// <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));
 }
Esempio n. 5
0
        //得到当前请求的控制器实例
        private IController GetControllerInstance(SwiftRouteData routeData, Type controllerType)
        {
            var oRes = Activator.CreateInstance(controllerType) as IController;

            return(oRes);
        }
Esempio n. 6
0
 public abstract void Execute(SwiftRouteData routeData);
Esempio n. 7
0
 //通过构造函数将两个对象传过来,替代了原来RequestContext的作用
 public MvcHandler(SwiftRouteData routeData, HttpContextBase context)
 {
     SwiftRouteData = routeData;
     SwiftContext   = context;
 }