• 构建ASP.NET MVC3 控制器


    MvcRouteHandler是默认的标准路由处理器类,它将创建一个MvcHandler实例对象,而MvcHandler又是默认的MVC Handler处理类

    它只有一个构造器,且要传递RequestContext类型作为参数,因此它是不能注册到站点的处理程序列表中的。

    MVC模式下,实现IControllerFactory接口的类来获取当前的请求控制器对象

    而 MvcHandler 通过ControllerBuilder类来获取实现IControllerFactory接口的控制器工厂

    详细如下

      MvcHandler的ProcessRequestInit方法代码:

    private void ProcessRequestInit(HttpContextBase httpContext, out IController controller, out IControllerFactory factory)
    {
        
    if (ValidationUtility.IsValidationEnabled(HttpContext.Current) == true)
        {
            ValidationUtility.EnableDynamicValidation(HttpContext.Current);
        }
        
    this.AddVersionHeader(httpContext);
        
    this.RemoveOptionalRoutingParameters();
        
    string requiredString = this.RequestContext.get_RouteData().GetRequiredString("controller");
        factory 
    = this.ControllerBuilder.GetControllerFactory();
        controller 
    = factory.CreateController(this.RequestContext, requiredString);
        
    if (controller == null)
        {
            
    throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, MvcResources.ControllerBuilder_FactoryReturnedNull, new object
    [] { factory.GetType(), requiredString }));
        }

    }

     IControllerFactory接口:

    public interface IControllerFactory
    {
        
    // Methods
        IController CreateController(RequestContext requestContext, string controllerName);
        SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, 
    string controllerName);
        
    void ReleaseController(IController controller);
    }

     DefaultControllerFactory:

    View Code
    public class DefaultControllerFactory : IControllerFactory
    {
        
    // Fields
        private IResolver<IControllerActivator> _activatorResolver;
        
    private IBuildManager _buildManager;
        
    private IControllerActivator _controllerActivator;
        
    private ControllerBuilder _controllerBuilder;
        
    private ControllerTypeCache _instanceControllerTypeCache;
        
    private static readonly ConcurrentDictionary<Type, SessionStateBehavior> _sessionStateCache;
        
    private static ControllerTypeCache _staticControllerTypeCache;

        
    // Methods
        static DefaultControllerFactory();
        
    public DefaultControllerFactory();
        
    public DefaultControllerFactory(IControllerActivator controllerActivator);
        
    internal DefaultControllerFactory(IControllerActivator controllerActivator, IResolver<IControllerActivator> activatorResolver, IDependencyResolver dependencyResolver);
        
    internal static InvalidOperationException CreateAmbiguousControllerException(RouteBase route, string controllerName, ICollection<Type> matchingTypes);
        
    public virtual IController CreateController(RequestContext requestContext, string controllerName);
        
    protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType);
        
    protected internal virtual SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, Type controllerType);
        
    protected internal virtual Type GetControllerType(RequestContext requestContext, string controllerName);
        
    private Type GetControllerTypeWithinNamespaces(RouteBase route, string controllerName, HashSet<string> namespaces);
        
    public virtual void ReleaseController(IController controller);
        SessionStateBehavior IControllerFactory.GetControllerSessionBehavior(RequestContext requestContext, 
    string controllerName);

        
    // Properties
        internal IBuildManager BuildManager { getset; }
        
    private IControllerActivator ControllerActivator { get; }
        
    internal ControllerBuilder ControllerBuilder { getset; }
        
    internal ControllerTypeCache ControllerTypeCache { getset; }

        
    // Nested Types
        private class DefaultControllerActivator : IControllerActivator
        {
            
    // Fields
            private Func<IDependencyResolver> _resolverThunk;

            
    // Methods
            public DefaultControllerActivator();
            
    public DefaultControllerActivator(IDependencyResolver resolver);
            
    public IController Create(RequestContext requestContext, Type controllerType);
        }
    }

     

     ControllerBuilder:

    public class ControllerBuilder
    {
        
    // Fields
        private Func<IControllerFactory> _factoryThunk;
        
    private static ControllerBuilder _instance;
        
    private HashSet<string> _namespaces;
        
    private IResolver<IControllerFactory> _serviceResolver;
       
    // Methods
        static ControllerBuilder();
        
    public ControllerBuilder();
        
    internal ControllerBuilder(IResolver<IControllerFactory> serviceResolver);
        
    public IControllerFactory GetControllerFactory();
        
    public void SetControllerFactory(Type controllerFactoryType);
        
    public void
     SetControllerFactory(IControllerFactory controllerFactory);
       
    // Properties
        public static ControllerBuilder Current { get; }
        
    public HashSet<string> DefaultNamespaces { get; }
    }

    具体流程如下:

    MvcHander-->ControllerBuilder-->IControllerFactory-->Controller
  • 相关阅读:
    ubuntu14.4开启ftp服务
    ubuntu14.4安装gtx970显卡驱动的艰辛历程
    jquery.dataTables的用法
    win7上安装theano keras深度学习框架
    使用BeanUtils设置属性转换String到Date类型
    keras在win7下环境搭建
    Python-try except else finally有return时执行顺序探究
    MySQL-EXPLAIN用法详解
    PHP-Windows下搭建Nginx+PHP环境
    PHP-php.ini中文版
  • 原文地址:https://www.cnblogs.com/jeriffe/p/2095524.html
Copyright © 2020-2023  润新知