中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-07-04 11:08:51 來源:網絡 閱讀:1105 作者:jinyuan0829 欄目:編程語言

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

前言

在上個篇幅中說到從控制器工廠的GetControllerInstance()方法來執行控制器的注入,本篇要講是在GetControllerInstance()方法的默認實現中涉及到的一些對象類型,使用它們來進行控制器注入。

 

對象模型

圖1

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

如上圖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濾器系列。

 

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武平县| 米泉市| 祁门县| 日土县| 繁峙县| 利津县| 涡阳县| 盐山县| 贺州市| 建平县| 平邑县| 麻阳| 启东市| 荔波县| 东光县| 高安市| 龙州县| 甘肃省| 军事| 杭州市| 西平县| 桂平市| 巴东县| 自治县| 普格县| 宁乡县| 吉安市| 普兰店市| 乌海市| 板桥市| 马山县| 光山县| 清水河县| 昌江| 盐边县| 高安市| 安宁市| 赣榆县| 望城县| 萨嘎县| 滨海县|