深入分析ASP.NET Mvc 1.0 – 1. 深入MvcHandler
return matchingTypes[0]; default: // multiple matching types // we need to generate an exception containing all the controller types StringBuilder sb = new StringBuilder(); foreach (Type matchedType in matchingTypes) { sb.AppendLine(); sb.Append(matchedType.FullName); } throw new InvalidOperationException( String.Format( CultureInfo.CurrentUICulture, MvcResources.DefaultControllerFactory_ControllerNameAmbiguous, controllerName, sb)); } } 首先将执行ControllerTypeCache.EnsureInitialized(BuildManager); 他的作用是 将程序中所以assembly中所有以Controller结尾的类放在缓存中,看一下 EnsureInitialized(…)方法的代码:
这是一个具有2级结构的缓存, 以controll name为key, 以Lookup<string, Type>对象为值保存到缓存中,而Lookup<string, Type>的结构是以namespace 为key, 以 controller type为值的键值集合,这个2级结构的作用就是上面提到的用来解决不同 namespace中同名controller的问题。 GetControllerTypeWithinNamespaces(string controllerName, HashSet<string> namespaces) 方法中: ControllerTypeCache.GetControllerTypes(controllerName, namespaces) 就是去找 具有相同controllerName的controller type,不过这里有个问题就是如果没有在 Global中或其它地方提供默认的namespace而不同namespace下存在同名的controller ,就导致GetControllerTypes(…)方法返回的controller数量大于1,这时程序会在 switch语句处抛出一个异常,所里一定要注意,尽量不要在不同的namespace中定义同 名的controller 当找到一个对应的 controller type后,就将这个type返回给上面的 CreateController(RequestContext requestContext, string controllerName) 方法中 调用 GetControllerType(controllerName); 方法的地方, 然后再调用 GetControllerInstance(controllerType); 方法将方法反射成具体的controller类并返 回到ProcessRequest(&h |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |