ASP.NET MVC 控制器啟用(三)

來源:互聯網
上載者:User

標籤:asp.net mvc controll   asp.net mvc   .net   asp.net   c#   

 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<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 DefaultControllerFactory defaultControllerFactory =2                 new DefaultControllerFactory(new CustomControllerActivator.NinjectControllerActivator());3 ControllerBuilder.Current.SetControllerFactory(defaultControllerFactory);

這裡要說的是DefaultControllerFactory類型的建構函式重載中,如果我們傳入了自訂的IControllerActivator類型則會運行我們的,如果沒有則架構會使用預設的實作類別型。也可以修改我們上一篇中定義的自訂控制器工廠,這裡就不作過多的解釋了。

 

在圖1可以清楚的看到DefaultControllerActivator類型的內部實現,在控制器(一)一文中有描述,其中還有IDependencyResolver類型的實作類別可以來實現控制器的注入,方式和上述的幾乎相近。區別就是在於IDependencyResolver類型實現的注入是可以面向全域的,這是架構提供給我們的便捷。

到這裡控制器的啟用以及控制器的動態注入都講解完畢了,下篇進入過MVC濾器系列。

 

 

 

 

金源

出處:http://blog.csdn.net/jinyuan0829

本文著作權歸作者和CSDN共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.