前言c#
在上個篇幅中說到從控制器工廠的GetControllerInstance()方法來執行控制器的注入,本篇要講是在GetControllerInstance()方法的默認實現中涉及到的一些對象類型,使用它們來進行控制器注入。框架
對象模型ide
圖1函數
如上圖1,是在控制器(一)中所講,整個的執行過程都包含在DefaultControllerFactory控制器工廠中的GetControllerInstance()方法中,咱們再來看一下IControllerActivator接口類型的定義:ui
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類型,由於它是框架內部的,訪問級別是私有的,因此咱們外部是調用不了的,咱們這裏能夠本身自定義的實現,而且注入到框架中。spa
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()方法中來註冊:it
1 DefaultControllerFactory defaultControllerFactory = 2 new DefaultControllerFactory(new CustomControllerActivator.NinjectControllerActivator()); 3 ControllerBuilder.Current.SetControllerFactory(defaultControllerFactory);
這裏要說的是DefaultControllerFactory類型的構造函數重載中,若是咱們傳入了自定義的IControllerActivator類型則會運行咱們的,若是沒有則框架會使用默認的實現類型。也能夠修改咱們上一篇中定義的自定義控制器工廠,這裏就不做過多的解釋了。io
在圖1能夠清楚的看到DefaultControllerActivator類型的內部實現,在控制器(一)一文中有描述,其中還有IDependencyResolver類型的實現類能夠來實現控制器的注入,方式和上述的幾乎相近。區別就是在於IDependencyResolver類型實現的注入是能夠面向全局的,這是框架提供給咱們的便捷。
到這裏控制器的激活以及控制器的動態注入都講解完畢了,下篇進入過MVC濾器系列。