前言
在上個(gè)篇幅中說(shuō)到從控制器工廠的GetControllerInstance()方法來(lái)執(zhí)行控制器的注入,本篇要講是在GetControllerInstance()方法的默認(rèn)實(shí)現(xiàn)中涉及到的一些對(duì)象類型,使用它們來(lái)進(jìn)行控制器注入。
對(duì)象模型
圖1
如上圖1,是在控制器(一)中所講,整個(gè)的執(zhí)行過(guò)程都包含在DefaultControllerFactory控制器工廠中的GetControllerInstance()方法中,我們?cè)賮?lái)看一下IControllerActivator接口類型的定義:
1 public interface IControllerActivator 2 { 3 // 摘要: 4 // 在類中實(shí)現(xiàn)時(shí)創(chuàng)建控制器。 5 // 6 // 參數(shù): 7 // requestContext: 8 // 請(qǐng)求上下文。 9 // 10 // controllerType: 11 // 控制器類型。 12 // 13 // 返回結(jié)果: 14 // 創(chuàng)建的控制器。 15 IController Create(RequestContext requestContext, Type controllerType); 16 }
會(huì)發(fā)現(xiàn)在里面的定義的Create()方法的簽名和DefaultControllerFactory控制器工廠中的GetControllerInstance()方法簽名相同,這就對(duì)了,這就是在GetControllerInstance()方法中的另一個(gè)注入點(diǎn),而在框架默認(rèn)的執(zhí)行中,會(huì)有一個(gè)默認(rèn)的實(shí)現(xiàn)類實(shí)現(xiàn)了IControllerActivator接口類型的DefaultControllerActivator類型,因?yàn)樗强蚣軆?nèi)部的,訪問(wèn)級(jí)別是私有的,所以我們外部是調(diào)用不了的,我們這里可以自己自定義的實(shí)現(xiàn),并且注入到框架中。
IControllerActivator類型實(shí)現(xiàn)的注入
先看一下我們自定義的實(shí)現(xiàn):
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 }
實(shí)現(xiàn)的方式和上一篇中的幾乎相同,現(xiàn)在只要在框架初始化的時(shí)候把它的實(shí)例注冊(cè)到框架中就可以了。還是再Global.asax中的Application_Start()方法中來(lái)注冊(cè):
1 DefaultControllerFactory defaultControllerFactory = 2 new DefaultControllerFactory(new CustomControllerActivator.NinjectControllerActivator()); 3 ControllerBuilder.Current.SetControllerFactory(defaultControllerFactory);
這里要說(shuō)的是DefaultControllerFactory類型的構(gòu)造函數(shù)重載中,如果我們傳入了自定義的IControllerActivator類型則會(huì)運(yùn)行我們的,如果沒(méi)有則框架會(huì)使用默認(rèn)的實(shí)現(xiàn)類型。也可以修改我們上一篇中定義的自定義控制器工廠,這里就不作過(guò)多的解釋了。
在圖1可以清楚的看到DefaultControllerActivator類型的內(nèi)部實(shí)現(xiàn),在控制器(一)一文中有描述,其中還有IDependencyResolver類型的實(shí)現(xiàn)類可以來(lái)實(shí)現(xiàn)控制器的注入,方式和上述的幾乎相近。區(qū)別就是在于IDependencyResolver類型實(shí)現(xiàn)的注入是可以面向全局的,這是框架提供給我們的便捷。
到這里控制器的激活以及控制器的動(dòng)態(tài)注入都講解完畢了。
編輯:hfy
-
控制器
+關(guān)注
關(guān)注
112文章
16461瀏覽量
179583
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
如何通過(guò)為TC332微控制器注入ECC錯(cuò)誤來(lái)測(cè)試RAM錯(cuò)誤?
正弦信號(hào)注入PFC控制環(huán)路的方法
使用諧波注入法降低PFC諧波并改善THD的方法
基于信號(hào)注入的永磁同步電機(jī)控制方法
基于信號(hào)注入的永磁同步電機(jī)控制方法
NandFlash控制器的FPGA實(shí)現(xiàn)方法技巧
基于信號(hào)注入的永磁同步電機(jī)控制方法
電動(dòng)汽車用電機(jī)控制器設(shè)計(jì)方法與實(shí)踐
基于分?jǐn)?shù)階微積分的PID控制器方法
![基于分?jǐn)?shù)階微積分的PID<b class='flag-5'>控制器</b><b class='flag-5'>方法</b>](https://file.elecfans.com/web2/M00/49/4E/poYBAGKhwJ2AUorZAAAQ8OGOoAM712.jpg)
門禁控制器常見(jiàn)故障排除方法
![門禁<b class='flag-5'>控制器</b>常見(jiàn)故障排除<b class='flag-5'>方法</b>](https://file.elecfans.com/web1/M00/45/15/o4YBAFphQyiAKsqEAABIl4-yK9Q135.jpg)
基于模糊PID控制器的VRV空調(diào)系統(tǒng)設(shè)計(jì)方法
無(wú)葉風(fēng)扇控制器怎么調(diào) 無(wú)葉風(fēng)扇控制器怎么接線
壓力控制器的正確接線方法
瞬態(tài)響應(yīng)與紋波——遲滯控制器中使用的紋波注入技術(shù)分析
![瞬態(tài)響應(yīng)與紋波——遲滯<b class='flag-5'>控制器</b>中使用的紋波<b class='flag-5'>注入</b>技術(shù)分析](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評(píng)論