ASP.NET 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().to(); 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滤器系列。
作者:金源
出处:https://blog.csdn.net/jinyuan0829
本文版权归作者和csdn共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面
推荐阅读
-
ASP.NET MVC5网站开发之实现数据存储层功能(三)
-
ASP.NET在MVC控制器中获取Form表单值的方法
-
利用ASP.NET MVC+Bootstrap搭建个人博客之打造清新分页Helper(三)
-
Asp.net MVC中获取控制器的名称的方法
-
ASP.NET MVC从视图传参到控制器的几种形式
-
详解Asp.Net MVC——控制器与动作(Controller And Action)
-
ASP.NET在MVC控制器中获取Form表单值的方法
-
Asp.net Core MVC中怎么把二级域名绑定到特定的控制器上
-
ASP.NET MVC5基础-控制器(Controller)详解
-
ASP.NET MVC5网站开发之实现数据存储层功能(三)