MVC5框架解析之Controller的创建

在上一讲中我们介绍了MvcHandler,知道在Handler里面注入两个接口属性分别为IController和IControllerFactory。并且通过IOC容器ControllerBuilder进行创建对应的ControllerFactory,Mvc默认的ControllerFactory为DefaultControllerFactory;我们可以ControllerBuilder类中通过静态字段Current来修改静态属性_instance中的_SetControllerFactory方法对Func<IControllerFactory> _factoryThunk委托进行赋值,从未不会Mvc运行时不会选择默认的控制器工厂。(有点绕,但说的简单一点可能表达的更为模糊。)

得到了IControllerFactory的实例,我们需要通过IControllerFactory.CreateController(RequestContext requestContext, string controllerName)创建对应的IController实例。这是本节需要讲解的问题。

进入主题(Controller的创建):

Controller的创建以及上一节ControllerFactory的创建的核心思想就是IOC的应用,其最主要的解决的问题就是MVC框架的拓展性问题。(1.我们可以写一个继承IControllerFactory接口的类,意思就是我们可以以我们的思路通过自己写的控制工厂去实现控制器的调用,内存的释放等功能。2.在默认的控制器工厂中,MVC又一次使用同样的思想将控制器的创建权限交给了接口类型为IControllerActivator的属性ControllerActivator。)

由接口函数我们知道,IController实例的创建的权限是交给了IControllerFactory接口类型的实例。在这里我们拿MVC5中默认的控制器工厂(DefaultControllerFactory)进行讲解。在DefaultControllerFactory代码当中,我们发现:

        private IResolver<IControllerActivator> _activatorResolver;
        private IControllerActivator _controllerActivator;

 private IControllerActivator ControllerActivator
        {
            get
            {
                if (_controllerActivator != null)
                {
                    return _controllerActivator;
                }
                _controllerActivator = _activatorResolver.Current;
                return _controllerActivator;
            }
        }

protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType)
        {
            if (controllerType == null)
            {
                throw new HttpException(404,
                                        String.Format(
                                            CultureInfo.CurrentCulture,
                                            MvcResources.DefaultControllerFactory_NoControllerFound,
                                            requestContext.HttpContext.Request.Path));
            }
            if (!typeof(IController).IsAssignableFrom(controllerType))
            {
                throw new ArgumentException(
                    String.Format(
                        CultureInfo.CurrentCulture,
                        MvcResources.DefaultControllerFactory_TypeDoesNotSubclassControllerBase,
                        controllerType),
                    "controllerType");
            }
            return ControllerActivator.Create(requestContext, controllerType);
        }

控制的创建交给了接口类型为IControllerActivator的字段_controllerActivator,当字段为空的时候通过简单的类型为IResolver<IControllerActivator>的IOC容器对controllerActivator进行赋值。

分析到这里我们发现,我们基本上了解了Controller的创建的整个流程,我们到默认的接口类为IControllerActivator的DefaultControllerActivator中去MVC真正创建Controller的方法。

DefaultControllerActivator创建Controller代码:

            public IController Create(RequestContext requestContext, Type controllerType)
            {
                try
                {
                    return (IController)(_resolverThunk().GetService(controllerType) ?? Activator.CreateInstance(controllerType));
                }
                catch (Exception ex)
                {
                    throw new InvalidOperationException(
                        String.Format(
                            CultureInfo.CurrentCulture,
                            MvcResources.DefaultControllerFactory_ErrorCreatingController,
                            controllerType),
                        ex);
                }
            }

未完待续..

时间: 2024-11-10 20:02:56

MVC5框架解析之Controller的创建的相关文章

Asp.net MVC5 框架揭秘 S412 实例解析 – 绝妙的扩展 模式的胜利

Asp.net MVC5 框架是个 开源的,处处可扩展的框架. 蒋先生 在他的这本书里 对如何理解框架,如何扩展框架, 给出了大量的说明和实例. 先上效果图 大部分做传统BS 的同学看到这个页面,脑海里的第一反应 就是一堆HTML 一堆控件 然后 后台绑定什么的吧. 但请看页面的代码. @model MvcApp.Models.Employee <html> <head>     <title>编辑员工信息</title> </head> <

学习ASP.NET MVC5框架揭秘笔记-ASP.NET MVC是如何运行的(一)

ASP.NET MVC是如何运行的 ASP.NET由于采用了管道式设计,所以具有很好的扩展性,整个ASP.NET MVC应用框架就是通过扩展ASP.NET实现的.通过上面对ASP.NET管道设计的介绍我们知道,ASP.NET 的扩展点主要体现在HttpModule和HttpHandler这两个核心组件之上,整个ASP.NET MVC框架就是通过自定义的HttpModule和HttpHandler建立起来的. 接下来我们通过自定义组件来模拟ASP.NET MVC的运行原理. 1.4.1建立在迷你版

Android 的媒体路由功能应用与框架解析

一.功能描述 Android 的媒体路由API被设计用来允许多种媒体(视频.音乐.图片)在与ANDROID设备连接(无线或有线)的辅助设备(如电视.立体声.家庭戏院系统.音乐播放机)上显示和播放,使用该框架和API,允许Android用户立即在辅助设备上显示图片.播放音乐.共享视频等. 媒体路由框架提供两种播放输出类型:远端播放和辅助输出.远端播放类型指的是辅助设备处理媒体内容的接收.解码和回放,而Android设备(如手机)只起远程控制作用,如ANDROID应用使用该类型用来支持Google

(一)FlexViewer之整体框架解析

1.FlexViewer简介 FlexViewer框架为Esri提供的可以高效开发基于WEB的地理信息应用系统的一种完全免费的应用程序框架.目前有两种版本,一种是针对非开发人员的版 本,即编译后的发布(release)版本:一种是供开发人员在源框架的基础上,通过修改代码和配置文件等,来实现定制业务. 这里我要跟大家一起探讨的是面向开发人员的FlexViewer版本. 2.FlexViewer框架的组成 当我们从网上下载到FlexViewer的源码,通过eclipse加载后便可以看到该框架的组成结

前端网页开发经常用到的框架解析

前端网页开发经常用到的框架解析?个人感觉这分为两种情况,一种是能力超强,时间够用的情况,另外一种就是用前端网页框架,可以节约开发时间和减少工作量,这可以根据自身的情况作出正确的判断,并不是别人说什么就是什么. 小项目到底用不用前端网页框架? 小项目本身就是做的事情比较多,但是成本还小,如果让开发人员不停写代码可能会花很多的时间去做,这需要考虑到这个小项目开发时间和成本的.如果用前端网页框架相信大家都知道,可能会考虑到浏览器兼容性,还有功能不够自己用,我想这都不用担心,从QUICKUI开发以来,体

利用Digester框架解析Xml

一:首先Digester要应用的Jar包如下: commons-beanutils-1.7.0.jar commons-digester3-3.2.jar commons-logging-1.2.jar 可以自行下载 二:本文要解析的Xml文件如下: <?xml version="1.0" encoding="utf-8"?> <remote> <protocol>xxx</protocol> <display&

iOS 10 UserNotifications 框架解析

iOS 10 中以前杂乱的和通知相关的 API 都被统一了,现在开发者可以使用独立的 UserNotifications.framework 来集中管理和使用 iOS 系统中通知的功能.在此基础上,Apple 还增加了撤回单条通知,更新已展示通知,中途修改通知内容,在通知中展示图片视频,自定义通知 UI 等一系列新功能,非常强大. 对于开发者来说,相较于之前版本,iOS 10 提供了一套非常易用通知处理接口,是 SDK 的一次重大重构.而之前的绝大部分通知相关 API 都已经被标为弃用 (dep

ASP.NET WebAPI框架解析第一篇

原文:ASP.NET WebAPI框架解析第一篇 ASP.NET WebAPI有两种寄宿模式,一种是WebHost,一种是SelfHost,为什么可以有两种模式的原因在于WebAPI有一个相对独立的消息处理管道,只要给这个消息管道传递一个封装好的对象,便可以得到处理好的结果.而怎么去封装这个对象,如何得到这个对象就不是WebAPI所关心的了.在WebHost模式下,这个对象是由IIS+ASP.NET框架共同完成的,在SelfHost模式下,可以是任何可以完成HTTP消息响应和接收的应用程序,比如

SSM框架搭建(二) 创建MAVEN项目

SSM框架搭建(一) JDK和MAVEN环境搭建 SSM框架搭建(二) 创建MAVEN项目 一:创建Maven 项目 注意选择是webapp的哪一个 我创建的默认JRE是1.5的,所以需要修改一下 选中项目,alt+enter(等于右键Properties) 1:修改java Bulid Path 2:修改java Compiler,改为自己的电脑最高版本jdk 3:修改 Project Facets,改为自己的电脑最高版本jdk 4:Dynamic Web Module,应该改为3.0的但是我