快速业务通道

深入分析ASP.NET Mvc 1.0 – 1. 深入MvcHandler

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
    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(…)方法的代码:

ControllerBuilder.cs
public void EnsureInitialized(IBuildManager buildManager) {
       if (_cache == null) {
         lock (_lockObj) {
           if (_cache == null) {
             List<Type> controllerTypes =  GetAllControllerTypes(buildManager);
             var groupedByName = controllerTypes.GroupBy(
               t => t.Name.Substring(0, t.Name.Length -  "Controller".Length),
               StringComparer.OrdinalIgnoreCase);

             _cache = groupedByName.ToDictionary(
               g => g.Key,
               g => g.ToLookup(t => t.Namespace ??  String.Empty, StringComparer.OrdinalIgnoreCase),
               StringComparer.OrdinalIgnoreCase);
           }
         }
       }
     }

这是一个具有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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号