前言
在雷山等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站建設(shè)、做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需求定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)營銷推廣,外貿(mào)網(wǎng)站建設(shè),雷山網(wǎng)站建設(shè)費(fèi)用合理。在之前的篇幅中,用文字和圖像來表示了控制器的激活過程,描述的角度都是從框架默認(rèn)實(shí)現(xiàn)的角度去進(jìn)行描述的,這樣也使得大家都可以清楚的知道激活的過程以及其中涉及到的對(duì)象模型,今天的篇幅就是在激活的過程中,框架提供了哪些可注入點(diǎn),站在一個(gè)使用者的角度來進(jìn)行描述。
激活控制器-注入點(diǎn)入口
如上圖,這是上個(gè)篇幅中描述的控制器激活過程圖,這里引用過來是怕有的朋友忘記了前面的所說和沒看過前面篇幅的朋友。
就從默認(rèn)控制器工廠的實(shí)現(xiàn)來看,在CreateController()方法中,通過GetControllerType()方法來獲取控制器類型(Type),然后傳遞到GetControllerInstance()方法中,通過其中的實(shí)現(xiàn)來完成根據(jù)控制器類型(Type)到IController的生成。而在后續(xù)的注入點(diǎn)也是在GetControllerInstance()方法實(shí)現(xiàn)中來進(jìn)行注入的,GetControllerInstance()方法即是整個(gè)控制器激活過程的入口點(diǎn)。
IoC示例
既然說到了動(dòng)態(tài)注入,想必就要用到IoC框架了,在MVC學(xué)前篇中提到過Ninject的使用,下面這個(gè)示例便是依賴于Ninject的來做的演示:
1 /// <summary> 2 /// 產(chǎn)品實(shí)體類 3 /// </summary> 4 public class Product 5 { 6 public string ID { get; set; } 7 public string Name { get; set; } 8 }
定義一個(gè)數(shù)據(jù)實(shí)體類沒什么好說的,
1 /// <summary> 2 /// 抽象數(shù)據(jù)提取庫 3 /// </summary> 4 public interface IDataStandard 5 { 6 List<Product> GetProducts(); 7 } 8 /// <summary> 9 /// 默認(rèn)實(shí)現(xiàn)--數(shù)據(jù)提取庫 10 /// </summary> 11 public class DataProvide : IDataStandard 12 { 13 14 public List<Product> GetProducts() 15 { 16 List<Product> products = new List<Product>() 17 { 18 new Product(){ ID="1",Name="name1"}, 19 new Product(){ID="2",Name="name2"}, 20 new Product(){ID="3",Name="name3"} 21 }; 22 return products; 23 } 24 }
這里定義的一個(gè)是抽象的數(shù)據(jù)提取庫,和一個(gè)默認(rèn)的實(shí)現(xiàn)作為演示用于提供數(shù)據(jù)用的。
1 /// <summary> 2 /// 抽象數(shù)據(jù)調(diào)用 3 /// </summary> 4 public interface IDataCall 5 { 6 void WriterToMonitor(); 7 } 8 9 /// <summary> 10 /// 默認(rèn)的數(shù)據(jù)調(diào)用實(shí)現(xiàn) 11 /// </summary> 12 public class DefultDataCall:IDataCall 13 { 14 private IDataStandard _DataStandard; 15 16 public DefultDataCall(IDataStandard dataStandard)//使用構(gòu)造函數(shù)方式注入 通過Ninject框架實(shí)現(xiàn) 17 { 18 _DataStandard = dataStandard; 19 } 20 21 public void WriterToMonitor() 22 { 23 foreach(var data in _DataStandard.GetProducts()) 24 { 25 Console.WriteLine("Prodcut ID:" + data.ID + " Name:" + data.Name); 26 } 27 } 28 }
這里定義的是抽象的數(shù)據(jù)調(diào)用和默認(rèn)的實(shí)現(xiàn),我們現(xiàn)在要做的就是通過IoC框架來讓調(diào)用客戶端對(duì)數(shù)據(jù)調(diào)用和數(shù)據(jù)提取解耦,
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 IKernel ninject = new StandardKernel(); 6 ninject.Bind<IDataStandard>().To<DataProvide>(); 7 IDataCall dataCall = ninject.Get(typeof(DefultDataCall)) as IDataCall; 8 if (dataCall != null) 9 { 10 dataCall.WriterToMonitor(); 11 } 12 13 Console.ReadLine(); 14 } 15 }
運(yùn)行這段代碼:
很簡單明了的一個(gè)示例,在MVC的項(xiàng)目中也是這樣運(yùn)行的。
MVC項(xiàng)目中的運(yùn)用
在上面的章節(jié)里說過,入口點(diǎn)在protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType);方法中,我們只需要實(shí)現(xiàn)一個(gè)默認(rèn)的控制器工廠類型,并且重寫一下這個(gè)方法,因?yàn)槲覀円呀?jīng)可以在重寫的方法中獲取到控制器的類型了,有了它就可以按照IoC示例中的那樣來進(jìn)行其它對(duì)象到控制器的一個(gè)動(dòng)態(tài)注入。
我們先要定義一個(gè)控制器,并且要讓它對(duì)上述示例中的抽象提取庫依賴,采取構(gòu)造函數(shù)式注入(依賴)。
看一下示例:
1 public class IoCDemoController : Controller 2 { 3 // 4 // GET: /IoCDemo/ 5 6 private IDataStandard _DataStandard; 7 8 public IoCDemoController(IDataStandard dataStandard) 9 { 10 _DataStandard = dataStandard; 11 } 12 13 public ActionResult Index() 14 { 15 return View(_DataStandard.GetProducts()); 16 } 17 }
在Index方法上右鍵,點(diǎn)擊添加視圖:
點(diǎn)擊添加,并且在視圖中輸入如下代碼:
@model IEnumerable<ConsoleApplication2.Product> @{ ViewBag.Title = "Index"; } <h3>Index</h3> @foreach (var item in Model) { <h4>ID: @item.ID Name:@item.Name</h4> }
再把Global.asax文件中的路由設(shè)置修改一下:
1 routes.MapRoute( 2 "Default", // 路由名稱 3 "{controller}/{action}/{id}", // 帶有參數(shù)的 URL 4 new { controller = "IoCDemo", action = "Index", id = UrlParameter.Optional } // 參數(shù)默認(rèn)值 5 );
這個(gè)時(shí)候準(zhǔn)備工作都做好,可是控制器中所用的數(shù)據(jù)哪里來呢?從我們默認(rèn)實(shí)現(xiàn)的控制器工廠中來:
1 public class NinjectControllerFactory :DefaultControllerFactory 2 { 3 private IKernel _NinjectKernel; 4 5 public NinjectControllerFactory() 6 { 7 _NinjectKernel = new StandardKernel(); 8 _NinjectKernel.Bind<IDataStandard>().To<DataProvide>(); 9 } 10 11 protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) 12 { 13 IController controller = _NinjectKernel.Get(controllerType) as IController; 14 if (controller != null) 15 { 16 return controller; 17 } 18 return null; 19 } 20 21 }
按照上面章節(jié)中的樣式,在NinjectControllerFactory中事先綁定數(shù)據(jù)類型,等到系統(tǒng)執(zhí)行需要用到控制器的時(shí)候會(huì)通過Ninject框架來講數(shù)據(jù)動(dòng)態(tài)的注入到控制器中。
最后還要設(shè)置一項(xiàng):
在Global.asax文件中的Application_Start()方法中要把我們默認(rèn)的實(shí)現(xiàn)的控制器工廠設(shè)置到MVC框架中,
1 protected void Application_Start() 2 { 3 AreaRegistration.RegisterAllAreas(); 4 5 RegisterGlobalFilters(GlobalFilters.Filters); 6 RegisterRoutes(RouteTable.Routes); 7 ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory()); 8 }
添加上代碼的最后一句?,F(xiàn)在我們就可以來看一下最終效果了。
本篇就講到這里,會(huì)在下個(gè)篇幅中繼續(xù)講解其他的注入點(diǎn)。
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。
當(dāng)前文章:ASP.NETMVC控制器激活(二)-創(chuàng)新互聯(lián)
鏈接地址:http://jinyejixie.com/article36/dhodpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、用戶體驗(yàn)、網(wǎng)站收錄、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站策劃、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容