快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
if (controllerFactoryType == null) {
         throw new ArgumentNullException ("controllerFactoryType");
       }
       if (!typeof(IControllerFactory).IsAssignableFrom (controllerFactoryType)) {
         throw new ArgumentException(
           String.Format(
             CultureInfo.CurrentUICulture,
             MvcResources.ControllerBuilder_MissingIControllerFactory,
             controllerFactoryType),
           "controllerFactoryType");
       }

       _factoryThunk = delegate() {
         try {
           return (IControllerFactory)Activator.CreateInstance (controllerFactoryType);
         }
         catch (Exception ex) {
           throw new InvalidOperationException(
             String.Format(
               CultureInfo.CurrentUICulture,
               MvcResources.ControllerBuilder_ErrorCreatingControllerFactory,
               controllerFactoryType),
             ex);
         }
       };
     }

只需要将我们自定义并继承自IControllerFactory接口的类的一个实例或type传入就 可以。

4. 根据controll name创建controller对象

IController controller = factory.CreateController(RequestContext,  controllerName);

调用DefaultControllerFactory类中的CreateController方法创建controller类。 CreateController(…)方法的具体代码如下:

public virtual IController CreateController(RequestContext  requestContext, string controllerName)
     {
       if (requestContext == null)
       {
         throw new ArgumentNullException("requestContext");
       }
       if (String.IsNullOrEmpty(controllerName))
       {
         throw new ArgumentException (MvcResources.Common_NullOrEmpty, "controllerName");
       }
       RequestContext = requestContext;
       Type controllerType = GetControllerType(controllerName);
       IController controller = GetControllerInstance (controllerType);
       return controller;
     }

这里比较简单,首先执行GetControllerType(controllerName)找到对应的controll type, 再调用GetControllerInstance(controllerType) 反射出具体的controll类,先来 看看GetControllerType(…)方法中的代码:

protected internal virtual Type GetControllerType(string  controllerName)
     {
       if (String.IsNullOrEmpty(controllerName))
       {
         throw new ArgumentException (MvcResources.Common_NullOrEmpty, "controllerName");
       }

       // first search in the current route''s namespace  collection
       object routeNamespacesObj;
       Type match;
       if (RequestContext != null &&  RequestContext.RouteData.DataTokens.TryGetValue("Namespaces", out

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号