MVC 控制器激活
MVC 控制器激活
ASP.NET MVC 控制器激活(三)
前言
在上个篇幅中说到从控制器工厂的GetControllerInstance()方法来执行控制器的注入,本篇要讲是在GetControllerInstance()方法的默认实现中涉及到的一些对象类型,使用它们来进行控制器注入。
对象模型
图1

如上图1,是在控制器(一)中所讲,整个的执行过程都包含在DefaultControllerFactory控制器工厂中的GetControllerInstance()方法中,我们再来看一下IControllerActivator接口类型的定义:

1 public interface IControllerActivator
2 {
3 // 摘要:
4 // 在类中实现时创建控制器。
5 //
6 // 参数:
7 // requestContext:
8 // 请求上下文。
9 //
10 // controllerType:
11 // 控制器类型。
12 //
13 // 返回结果:
14 // 创建的控制器。
15 IController Create(RequestContext requestContext, Type controllerType);
16 }

会发现在里面的定义的Create()方法的签名和DefaultControllerFactory控制器工厂中的GetControllerInstance()方法签名相同,这就对了,这就是在GetControllerInstance()方法中的另一个注入点,而在框架默认的执行中,会有一个默认的实现类实现了IControllerActivator接口类型的DefaultControllerActivator类型,因为它是框架内部的,访问级别是私有的,所以我们外部是调用不了的,我们这里可以自己自定义的实现,并且注入到框架中。
IControllerActivator类型实现的注入
先看一下我们自定义的实现:

1 using System.Web.Mvc;
2 using Ninject;
3 using ConsoleApplication2;
4
5 namespace MvcApplication.CustomControllerActivator
6 {
7 public class NinjectControllerActivator:IControllerActivator
8 {
9
10 private IKernel _NinjectKernel;
11
12 public NinjectControllerActivator()
13 {
14 _NinjectKernel = new StandardKernel();
15 _NinjectKernel.Bind<IDataStandard>().To<DataProvide>();
16 }
17
18 public IController Create(System.Web.Routing.RequestContext requestContext, Type controllerType)
19 {
20 IController controller = _NinjectKernel.Get(controllerType) as IController;
21 if (controller != null)
22 {
23 return controller;
24 }
25 return null;
26 }
27 }

实现的方式和上一篇中的几乎相同,现在只要在框架初始化的时候把它的实例注册到框架中就可以了。还是再Global.asax中的Application_Start()方法中来注册:
1 DefaultControllerFactory defaultControllerFactory =
2 new DefaultControllerFactory(new CustomControllerActivator.NinjectControllerActivator());
3 ControllerBuilder.Current.SetControllerFactory(defaultControllerFactory);
这里要说的是DefaultControllerFactory类型的构造函数重载中,如果我们传入了自定义的IControllerActivator类型则会运行我们的,如果没有则框架会使用默认的实现类型。也可以修改我们上一篇中定义的自定义控制器工厂,这里就不作过多的解释了。
在图1可以清楚的看到DefaultControllerActivator类型的内部实现,在控制器(一)一文中有描述,其中还有IDependencyResolver类型的实现类可以来实现控制器的注入,方式和上述的几乎相近。区别就是在于IDependencyResolver类型实现的注入是可以面向全局的,这是框架提供给我们的便捷。
到这里控制器的激活以及控制器的动态注入都讲解完毕了,下篇进入过MVC滤器系列。
MVC 控制器激活的更多相关文章
- ASP.NET MVC 控制器激活(一)
ASP.NET MVC 控制器激活(一) 前言 在路由的篇章中讲解了路由的作用,讲着讲着就到了控制器部分了,从本篇开始来讲解MVC中的控制器,控制器是怎么来的?MVC框架对它做了什么?以及前面有的篇幅 ...
- ASP.NET MVC 控制器激活(二)
ASP.NET MVC 控制器激活(二) 前言 在之前的篇幅中,用文字和图像来表示了控制器的激活过程,描述的角度都是从框架默认实现的角度去进行描述的,这样也使得大家都可以清楚的知道激活的过程以及其中涉 ...
- ASP.NET MVC 控制器激活(三)
ASP.NET MVC 控制器激活(三) 前言 在上个篇幅中说到从控制器工厂的GetControllerInstance()方法来执行控制器的注入,本篇要讲是在GetControllerInstanc ...
- 使用Code First建模自引用关系笔记 asp.net core上使用redis探索(1) asp.net mvc控制器激活全分析 语言入门必学的基础知识你还记得么? 反射
使用Code First建模自引用关系笔记 原文链接 一.Has方法: A.HasRequired(a => a.B); HasOptional:前者包含后者一个实例或者为null HasR ...
- asp.net mvc控制器激活全分析
控制器的激活默认情况下使用反射来实现的,这其中采用了DI,单例等设计模式.对于控制器的主要涉及到如下的类:ControllerBuilder.DefaultControllerFactory.Defa ...
- MVC 控制器
ASP.NET MVC控制器(一) 前言 在路由的篇章中讲解了路由的作用,讲着讲着就到了控制器部分了,从本篇开始来讲解MVC中的控制器,控制器是怎么来的?MVC框架对它做了什么?以及前面有的篇幅所留的 ...
- ASP.NET Core MVC 控制器创建与依赖注入
本文翻译自<Controller activation and dependency injection in ASP.NET Core MVC>,由于水平有限,故无法保证翻译完全准确,欢 ...
- ABP文档 - Mvc 控制器
文档目录 本节内容: 简介 AbpController基类 本地化 其它 过滤 异常处理和结果包装 审计日志 验证 授权 工作单元 反伪造 模型绑定器 简介 ABP通过nuget包Abp.Web.Mv ...
- ABP理论学习之MVC控制器(新增)
返回总目录 本篇目录 介绍 AbpController基类 本地化 异常处理 响应结果的包装 审计日志 授权 工作单元 其他 介绍 ABP通过Abp.Web.Mvc nuget包集成了ASP.NET ...
随机推荐
- Installing IIS 8.5 on Windows Server 2012 R2
原文 Installing IIS 8.5 on Windows Server 2012 R2 Introduction This document describes how to install ...
- Codeforces 383C . Propagating tree【树阵,dfs】
标题效果: 有一棵树,有两种操作模式对本树:1:表示为(1 x val),在NOx加在节点上val,然后x每个节点加上儿子- val.给每个儿子一个儿子在一起-(- val),加到没有儿子为止.2:表 ...
- HTC T328W刷机包 仿三星S5 UI美化 精简 S5落下
ROM介绍 1.三星移植TouchWiz接口; 2.三星增加S4壁纸和图标美化; 3.正确ROM呈流线型; 4.正确ROM优化; 5.完成ROOT权限; 6.短信支持来信息亮屏功能(在短信设置里设置) ...
- 产品 线上 保持 和 支持 服务 (Support and maintenance solutions)
Maintenance and support are the key factors for the smooth functioning of ERP solutions. ERP mainten ...
- 手机新闻网站,手持移动新闻,手机报client,jQuery Mobile手机新闻网站,手机新闻网站demo,新闻阅读器开发
我们坐在地铁.经常拿出新浪手机查看新闻.腾讯新闻,或者看新闻,等刷微信功能.你有没有想过如何实现这些目标. 移动互联网.更活泼. 由于HTML5未来,jQuery Moblie未来. 今天我用jqm的 ...
- cocos2dx 3.1.1移植安卓apk (lua交叉编译器项目 mac环境)
cocos2dx 3.1.1 lua项目安卓交叉编译 mac环境 本文基于ant,sdk,ndk,adt等软件和环境已经事前设置好 1\新建项目 在mac的终端下输入命令: cocos new t ...
- Microsoft Build 2015
Microsoft Build 2015 汇总 简要概括(GitHub 完成约 45%): Visual Studio Code Preview Visual Studio 2015 RC Vis ...
- ArcGIS API for Silverlight 使用GP服务实现要素裁剪功能
原文:ArcGIS API for Silverlight 使用GP服务实现要素裁剪功能 昨天一QQ好友问了一个关于裁剪的问题,感觉自己也没有帮上什么忙,之后自己做了一个裁剪的例子,不过在做这个例子的 ...
- 给Notepad++ 6.7 加右键菜单带图标
使用的是Notepad++ 6.7,下载 NppShell64.dll 和 NppShell.dll方法:将BAT文件和下载的NppShell64.dll 和 NppShell.dll放置Notepa ...
- Javascript规范
本文地址: http://www.hicss.net/evolve-your-javascript-code/ 方才在程序里看到一段JS代码,写法极为高明,私心想着若是其按照规范来写,定可培养对这门语 ...