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

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

前言

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

 

对象模型

图1

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  using  System.Web.Mvc;
  using  Ninject;
  using  ConsoleApplication2;
 
  namespace  MvcApplication.CustomControllerActivator
  6 {
  7      public  class  NinjectControllerActivator:IControllerActivator
  8     {
 
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
2
3
1 DefaultControllerFactory defaultControllerFactory =
2                  new  DefaultControllerFactory( new  CustomControllerActivator.NinjectControllerActivator());
3 ControllerBuilder.Current.SetControllerFactory(defaultControllerFactory);

这里要说的是DefaultControllerFactory类型的构造函数重载中,如果我们传入了自定义的IControllerActivator类型则会运行我们的,如果没有则框架会使用默认的实现类型。也可以修改我们上一篇中定义的自定义控制器工厂,这里就不作过多的解释了。

 

在图1可以清楚的看到DefaultControllerActivator类型的内部实现,在控制器(一)一文中有描述,其中还有IDependencyResolver类型的实现类可以来实现控制器的注入,方式和上述的几乎相近。区别就是在于IDependencyResolver类型实现的注入是可以面向全局的,这是框架提供给我们的便捷。

到这里控制器的激活以及控制器的动态注入都讲解完毕了,下篇进入过MVC滤器系列。

 



     本文转自jinyuan0829 51CTO博客,原文链接:http://blog.51cto.com/jinyuan/1425580,如需转载请自行联系原作者






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值