asp.net mvc控制器激活全分析
控制器的激活默认情况下使用反射来实现的,这其中采用了DI,单例等设计模式。对于控制器的主要涉及到如下的类:
ControllerBuilder、DefaultControllerFactory、DefaultControllerActivator(实现了IControllerActivator接口)、DependencyResolver(并没有实现IDependencyResolver,但是有这个接口对象实例)、DefaultDependencyResolver(实现了IDependencyResolver接口,默认采用此类来解析控制器对象)
如上的几个类是控制器激活最重要的类。大概说说过程,备忘,当然也说不了多具体,有个大概思路就好,网上已经很多介绍的文章了。DefaultControllerFactory并不是构造控制器的地方,控制器的构造实在ControllerBuilder中,具体涉及到SetControllerFactory以及GetControllerFactory两个方法,我们可以通过SetControllerFactory来拓展自己的IOC容器,这是第一个可供拓展点。
DefaultControllerActivator类用来激活控制器,我们一般创建自己的MVC框架的时候,都是在这个类实现的ICOntrollerActivator接口的Create方法中,通过获取的控制器对象使用反射来创建控制器实例。当然这是在我们自己创建自己的MVC框架以及不使用第三方IOC容器的时候,就是使用该方法来创建的,而在MVC框架中,控制器实例的创建是延迟到了efaultDependencyResolver类中。这也是第二个可拓展的地方,我们可以在第三方IOC容器中,实现IControllerActivator接口来创建控制器对象。
DefaultDependencyResolver类实现了IDependencyResolver接口,默认的MVC框架实现的IOC容器(基于DI模式)设计的容器。我们就是在这里构造了我们的IOC容器,不过通过阅读源码你会发现,该IOC容器源码其实就是默认使用反射来创建控制器对象。这与上面的DefaultControllerActivator类的作用是一样的。可以参考源码:
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);
}
}
可以看到上面的try语句里面的代码,通过调用GetService()方法,默认使用MVC自己的IOC容器(即DefaultDependencyResolver类)。在这里我们可以基于第三方的IOC来拓展我们自己的设计逻辑,这也是第三个可拓展点。
<<asp.net mvc5框架揭秘>>一书中详细说了三个可拓展的地方就是如上的描述。上面的描述就是我自己看源码以及资料的一个总结,当你看MVC源码的时候,你会有自己的收获,我也没有全部铺开来,仅仅就是自己的心得笔记。
asp.net mvc控制器激活全分析的更多相关文章
- 使用Code First建模自引用关系笔记 asp.net core上使用redis探索(1) asp.net mvc控制器激活全分析 语言入门必学的基础知识你还记得么? 反射
使用Code First建模自引用关系笔记 原文链接 一.Has方法: A.HasRequired(a => a.B); HasOptional:前者包含后者一个实例或者为null HasR ...
- ASP.NET MVC 控制器激活(一)
ASP.NET MVC 控制器激活(一) 前言 在路由的篇章中讲解了路由的作用,讲着讲着就到了控制器部分了,从本篇开始来讲解MVC中的控制器,控制器是怎么来的?MVC框架对它做了什么?以及前面有的篇幅 ...
- ASP.NET MVC 控制器激活(二)
ASP.NET MVC 控制器激活(二) 前言 在之前的篇幅中,用文字和图像来表示了控制器的激活过程,描述的角度都是从框架默认实现的角度去进行描述的,这样也使得大家都可以清楚的知道激活的过程以及其中涉 ...
- ASP.NET MVC 控制器激活(三)
ASP.NET MVC 控制器激活(三) 前言 在上个篇幅中说到从控制器工厂的GetControllerInstance()方法来执行控制器的注入,本篇要讲是在GetControllerInstanc ...
- MVC 控制器激活
MVC 控制器激活 ASP.NET MVC 控制器激活(三) 前言 在上个篇幅中说到从控制器工厂的GetControllerInstance()方法来执行控制器的注入,本篇要讲是在GetControl ...
- 学习ASP.NET MVC(二)——我的第一个ASP.NET MVC 控制器
MVC全称是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范,用一种业务逻辑和数据显示分离的方法组织代码,将 ...
- Asp.Net MVC 控制器
原文链接:http://www.asp.net/learn/mvc/ 这篇教程探索了ASP.NET MVC控制器(controller).控制器动作(controller action)和动作结果(a ...
- 详解ASP.NET MVC 控制器
1 概述 在阅读本篇博文时,建议结合上篇博文:详解ASP.NET MVC 路由 一起阅读,效果可能会更好些. Controller(控制器)在ASP.NET MVC中负责控制所有客户端与服务端的 ...
- 【ASP.NET MVC系列】浅谈ASP.NET MVC 控制器
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
随机推荐
- 2、MyEclipse和Eclipse调优,MyEclipse配置(tomcat和jdk的内存设置),jar引入相关知识点,将Java项目编程web项目的办法
1.WindowàPreferenceàGeneralàWorkspaceàText file encoding都改成UTF-8 2.WindowàPreferenceàGeneralàEdito ...
- EasyUI表单验证,自定义插件验证,自定义js插件验证,远程验证,常见手机号,中英文,qq等验证规则验证
{ field : 'startPort', title : "起始端口", editor: "text", width : 50, editor: { ...
- android fragement报nullexcption错误
,这题目起的够骚情了,原创傲慢的上校哦,转载请标明:http://blog.csdn.net/aomandeshangxiao/article/details/7753421 其实有些方法也是从网上找 ...
- UNIX网络编程——经常使用的套接字选项
1.设置/获取套接字选项 int setsockopt(int socket, int level, int option_name, const void *option_value, sockle ...
- RAMCloud:内存云存储的内存分配机制
现在全闪存阵列已经见怪不怪了,EMC的XtremIO,还有VNX-F(Rockies),IBM FlashSystem.全闪存真正为效率而生,重新定义存储速度.凭借极致性能,高可用性,为您极大提高企业 ...
- 当freemarker中EL表达式的值为空时出现异常的解决方法
<#list pageView.list as msg> <form name="msgForm" id="msgForm" ...
- sed在行首或者行尾添加内容
原文地址:http://www.cnblogs.com/ITEagle/archive/2013/06/20/3145546.html 用sed命令在行首或行尾添加字符的命令有以下几种: 假设处理的文 ...
- bootmgr解压缩
主要参考以下两个文章: 1. http://bbs.wuyou.com/forum.php?mod=viewthread&tid=211314 2. http://reboot.pro/f ...
- ubuntu14下mysql忘记密码的处理
ubuntu14下mysql忘记密码的处理 ubuntu14.04忘记了mysql的用户(root)的密码.接下来: 1) 停止mysql服务 $ sudo stop mysql 2) 启动mysql ...
- C++ Primer 有感(异常处理)(三)
先看下面的代码: [cpp] view plaincopy int main() { int *i=new int(10); /* 这中间的代码出现异常 */ delete i; return 0; ...