前言
目前创新互联建站已为上1000家的企业提供了网站建设、域名、虚拟空间、网站托管、服务器租用、企业网站设计、梁山网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。在上个篇幅中说到从控制器工厂的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滤器系列。
创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。