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 控制器激活的更多相关文章

  1. ASP.NET MVC 控制器激活(一)

    ASP.NET MVC 控制器激活(一) 前言 在路由的篇章中讲解了路由的作用,讲着讲着就到了控制器部分了,从本篇开始来讲解MVC中的控制器,控制器是怎么来的?MVC框架对它做了什么?以及前面有的篇幅 ...

  2. ASP.NET MVC 控制器激活(二)

    ASP.NET MVC 控制器激活(二) 前言 在之前的篇幅中,用文字和图像来表示了控制器的激活过程,描述的角度都是从框架默认实现的角度去进行描述的,这样也使得大家都可以清楚的知道激活的过程以及其中涉 ...

  3. ASP.NET MVC 控制器激活(三)

    ASP.NET MVC 控制器激活(三) 前言 在上个篇幅中说到从控制器工厂的GetControllerInstance()方法来执行控制器的注入,本篇要讲是在GetControllerInstanc ...

  4. 使用Code First建模自引用关系笔记 asp.net core上使用redis探索(1) asp.net mvc控制器激活全分析 语言入门必学的基础知识你还记得么? 反射

    使用Code First建模自引用关系笔记   原文链接 一.Has方法: A.HasRequired(a => a.B); HasOptional:前者包含后者一个实例或者为null HasR ...

  5. asp.net mvc控制器激活全分析

    控制器的激活默认情况下使用反射来实现的,这其中采用了DI,单例等设计模式.对于控制器的主要涉及到如下的类:ControllerBuilder.DefaultControllerFactory.Defa ...

  6. MVC 控制器

    ASP.NET MVC控制器(一) 前言 在路由的篇章中讲解了路由的作用,讲着讲着就到了控制器部分了,从本篇开始来讲解MVC中的控制器,控制器是怎么来的?MVC框架对它做了什么?以及前面有的篇幅所留的 ...

  7. ASP.NET Core MVC 控制器创建与依赖注入

    本文翻译自<Controller activation and dependency injection in ASP.NET Core MVC>,由于水平有限,故无法保证翻译完全准确,欢 ...

  8. ABP文档 - Mvc 控制器

    文档目录 本节内容: 简介 AbpController基类 本地化 其它 过滤 异常处理和结果包装 审计日志 验证 授权 工作单元 反伪造 模型绑定器 简介 ABP通过nuget包Abp.Web.Mv ...

  9. ABP理论学习之MVC控制器(新增)

    返回总目录 本篇目录 介绍 AbpController基类 本地化 异常处理 响应结果的包装 审计日志 授权 工作单元 其他 介绍 ABP通过Abp.Web.Mvc nuget包集成了ASP.NET ...

随机推荐

  1. ASP.NET MVC导出excel

    ASP.NET MVC导出excel 要在ASP.NET MVC站点上做excel导出功能,但是要导出的excel文件比较大,有几十M,所以导出比较费时,为了不影响对界面的其它操作,我就采用异步的方式 ...

  2. 五通信算法:五种编码增益比较matlab模拟

    1. 卷积编码增益性能.BER 信道环境:AWGN 信噪比SNR :0:0.1:6 MATALB仿真架构:源比特 +卷积码 +BPSK +AWGN +Viterbi +BER 说明:卷积编码,不同的R ...

  3. jQuery整理笔记文件夹

    jQuery整理笔记文件夹 jQuery整理笔记一----jQuery開始 jQuery整理笔记二----jQuery选择器整理 jQuery整理笔记三----jQuery过滤函数 jQuery整理笔 ...

  4. windows平台搭建lighttpd+php+sqlite

    (一)php 1. 下载及安装 http://www.appservnetwork.com/ 从上面的网址下载appserv-win32-2.5.10并安装,在安装的时候,仅仅选择安装php. 由于, ...

  5. PL/SQL程序中调用Java代码(转)

    主要是学习PL/SQL调用JAVA的方法. 平台:WINDOWS 1.首先使用IDE写好需要调用的java代码,再添加"create or replace and compile java ...

  6. 使用 CodeIgniter 框架快速开发 PHP 应用(七)

    原文:使用 CodeIgniter 框架快速开发 PHP 应用(七) CodeIgniter 和对象这是玩家章节.它讲述的是 CodeIgniter 的工作原理,也就是揭开CI头上'神秘的面纱'.如果 ...

  7. AspNetPager使用指南

    一.AspNetPager支持两种方式分页: 一种是PostBack方式分页, 一种是通过Url来实现分页以及Url重写功能 二.AspNetPager支持各种数据绑定控件GridView.DataG ...

  8. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1)框架搭建 前言:这 ...

  9. 一起学习android使用一个回调函数onCreateDialog实现负载对话(23)

    效果图: 有时候我们须要去做一个Activity启动时的数据载入对话框,关于对话框的各种实现能够通过一起学android之对话框 Dialog的创建(7)来完毕,在这里另外介绍一个,利用onCreat ...

  10. CSharp设计模式读书笔记(22):策略模式(学习难度:★☆☆☆☆,使用频率:★★★★☆)

    策略模式(Strategy Pattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy). 模式角色与结构: ...