当前位置: 移动技术网 > IT编程>开发语言>.net > ASP.NET MVC 控制器激活(三)

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

2019年05月10日  | 移动技术网IT编程  | 我要评论

在职考研信息网,虚幻彼方,斑衣鱼

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共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网