前言
南宮網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,南宮網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為南宮1000多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請找那個(gè)售后服務(wù)好的南宮做網(wǎng)站的公司定做!
在路由的篇章中講解了路由的作用,講著講著就到了控制器部分了,從本篇開始來講解MVC中的控制器,控制器是怎么來的?MVC框架對它做了什么?以及前面有的篇幅所留的疑問將會在這部分里解決掉。
對于控制器激活的總結(jié)
總的來說控制器的激活過程有這么幾個(gè)步驟(部分):
1.根據(jù)當(dāng)前路由信息獲取控制器名稱
2.獲取當(dāng)前系統(tǒng)的控制器工廠(用來生成控制器)
2.1 據(jù)控制器名稱生成和當(dāng)前系統(tǒng)的請求上下文參數(shù)生成控制器類型(Type)
2.1.1 根據(jù)當(dāng)前的路由信息判斷選擇控制器所在命名空間
2.1.2 返回控制器類型(Type)
2.2 根據(jù)控制器類型(Type)和請求上下文參數(shù)生成控制器類型(IController)
2.3 返回控制器類型(IController)
3.獲取由控制器工廠生成的控制器(IController)
4.執(zhí)行IController.Execute()
控制器的由來
前面都有講到MVC的入口在Module中,具體是在注冊路由的時(shí)候,默認(rèn)的注冊MvcHandler作為請求處理類型,而控制器的就是在這里生產(chǎn)出來的,為什么說是生產(chǎn)?因?yàn)橄到y(tǒng)預(yù)先實(shí)現(xiàn)了一個(gè)控制器工廠類DefaultControllerFactory(如下的代碼結(jié)構(gòu)),在控制器生成到執(zhí)行的這個(gè)過程里涉及到眾多的類型和控制器的對象模型,這些內(nèi)容在后面篇幅會一一講解。
DefaultControllerFactory類型的結(jié)構(gòu):
1 public class DefaultControllerFactory : IControllerFactory 2 { 3 public DefaultControllerFactory(); 4 public DefaultControllerFactory(IControllerActivator controllerActivator); 5 6 public virtual IController CreateController(RequestContext requestContext, string controllerName); 7 protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType); 8 protected internal virtual SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, Type controllerType); 9 protected internal virtual Type GetControllerType(RequestContext requestContext, string controllerName); 10 public virtual void ReleaseController(IController controller); 11 }
本篇先將上面總結(jié)中的2.1.2之前的部分粗略的講解一下,請先看如下圖:
如上圖,這里先要說的是控制器類型緩存對象ControllerTypeCache,ControllerTypeCache加載所有實(shí)現(xiàn)了IController接口的公共類并緩存在MVC-ControllerTypeCache.xml文件里。當(dāng)然了這些都是框架所做的,我們只需了解一下,學(xué)習(xí)其中的思想就行了。
在請求到達(dá)默認(rèn)請求處理程序的時(shí)候,由默認(rèn)的控制器工廠DefaultControllerFactory來根據(jù)RouteData的DataToken【NameSpaces】里的定義的命名空間和Values【controller】的控制器名稱來進(jìn)行判斷,具體怎么判斷的是由ControllerTypeCache對象來查詢匹配的。
先根據(jù)控制器名稱查詢緩存中是否有對應(yīng)此名稱的控制器,如果有則存放在 ILookup<string, Type>類型對象中,然后根據(jù)RouteData的DataToken【NameSpaces】里的定義的命名空間來和ILookup<string, Type>對象中的控制器類型所在命名空間進(jìn)行比對,如果是相同的則添加此類型到返回集合,如果不相同則繼續(xù)用RouteData的DataToken【NameSpaces】剩下的命名空間值挨個(gè)的進(jìn)行比對。
根據(jù)返回的類型集合,如果總數(shù)為0返回空,總數(shù)為1返回此集合中的類型,如果大于1則會引發(fā)CreateAmbiguousControllerException類型的異常。
在此時(shí)DefaultControllerFactory中已經(jīng)獲取到了控制器類型(Type)。
在總結(jié)中2.2所指部分為IControllerActivator接口類型的實(shí)現(xiàn)。
1 // 摘要: 2 // 對使用依賴項(xiàng)注入實(shí)例化控制器的方式進(jìn)行精細(xì)控制。 3 public interface IControllerActivator 4 { 5 // 摘要: 6 // 在類中實(shí)現(xiàn)時(shí)創(chuàng)建控制器。 7 // 8 // 參數(shù): 9 // requestContext: 10 // 請求上下文。 11 // 12 // controllerType: 13 // 控制器類型。 14 // 15 // 返回結(jié)果: 16 // 創(chuàng)建的控制器。 17 IController Create(RequestContext requestContext, Type controllerType);
這部分的實(shí)現(xiàn),可以注入到控制器工廠,而實(shí)現(xiàn)的內(nèi)部依然有可擴(kuò)展注入的地方,在MVC框架中有默認(rèn)的實(shí)現(xiàn),我們先來看一下2.2部分之后的實(shí)現(xiàn)概念圖:
獲取到了Controller的Type過后,DefaultControllerFactory就可以根據(jù)Type來創(chuàng)建Controller,然而在MVC框架的設(shè)計(jì)中,【根據(jù)ControllerType創(chuàng)建Controller的方式】是不會放在DefaultControllerFactory中的,而是通過MVC框架中實(shí)現(xiàn)了IControllerActivator接口類型的默認(rèn)實(shí)現(xiàn)類DefaultControllerActivator類型來進(jìn)行創(chuàng)建IController的,而在DefaultControllerActivator中又是通過DependencyResolver類型來創(chuàng)建一個(gè)IDependencyResolver接口的默認(rèn)實(shí)現(xiàn)類來實(shí)現(xiàn)的。
在IDependencyResolver接口中,有個(gè)GetService()方法,這個(gè)方法就是最終要?jiǎng)?chuàng)建類型所用到的方式,也可以自定義來實(shí)現(xiàn),這也是擴(kuò)展點(diǎn)之一。說回接口類型,MVC中有個(gè)默認(rèn)的實(shí)現(xiàn)了IDependencyResolver接口的類型DefaultDependencyResolver,在DefaultDependencyResolver類型中GetService()方法的默認(rèn)實(shí)現(xiàn)方式Activator.CreateInstance(serviceType);也就是正常通過反射來創(chuàng)建類型的。
看一下由Handler到Icontroller的一個(gè)過程圖:
上面的這些以及前面篇幅所講,都是MVC默認(rèn)實(shí)現(xiàn)的方式,每個(gè)部分都可以自定義來擴(kuò)展,MvcHandler、DefaultControllerFactory、DefaultDependencyResolver等等這些類型。
會在后面的篇幅中說明在激活控制器的過程中所有可注入擴(kuò)展點(diǎn)的。
新聞名稱:ASP.NETMVC控制器激活(一)
分享路徑:http://aaarwkj.com/article36/gpgjsg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、網(wǎng)站內(nèi)鏈、App設(shè)計(jì)、微信小程序、虛擬主機(jī)、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)