中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

ASP.NETMVC控制器激活(一)-創(chuàng)新互聯(lián)

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

前言

創(chuàng)新互聯(lián)是一家專業(yè)提供浠水企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、網(wǎng)站制作、H5響應(yīng)式網(wǎng)站、小程序制作等業(yè)務(wù)。10年已為浠水眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進行中。

在路由的篇章中講解了路由的作用,講著講著就到了控制器部分了,從本篇開始來講解MVC中的控制器,控制器是怎么來的?MVC框架對它做了什么?以及前面有的篇幅所留的疑問將會在這部分里解決掉。

對于控制器激活的總結(jié)

總的來說控制器的激活過程有這么幾個步驟(部分):

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中,具體是在注冊路由的時候,默認的注冊MvcHandler作為請求處理類型,而控制器的就是在這里生產(chǎn)出來的,為什么說是生產(chǎn)?因為系統(tǒng)預(yù)先實現(xiàn)了一個控制器工廠類DefaultControllerFactory(如下的代碼結(jié)構(gòu)),在控制器生成到執(zhí)行的這個過程里涉及到眾多的類型和控制器的對象模型,這些內(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之前的部分粗略的講解一下,請先看如下圖:

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

如上圖,這里先要說的是控制器類型緩存對象ControllerTypeCache,ControllerTypeCache加載所有實現(xiàn)了IController接口的公共類并緩存在MVC-ControllerTypeCache.xml文件里。當(dāng)然了這些都是框架所做的,我們只需了解一下,學(xué)習(xí)其中的思想就行了。

在請求到達默認請求處理程序的時候,由默認的控制器工廠DefaultControllerFactory來根據(jù)RouteData的DataToken【NameSpaces】里的定義的命名空間和Values【controller】的控制器名稱來進行判斷,具體怎么判斷的是由ControllerTypeCache對象來查詢匹配的。

先根據(jù)控制器名稱查詢緩存中是否有對應(yīng)此名稱的控制器,如果有則存放在 ILookup<string, Type>類型對象中,然后根據(jù)RouteData的DataToken【NameSpaces】里的定義的命名空間來和ILookup<string, Type>對象中的控制器類型所在命名空間進行比對,如果是相同的則添加此類型到返回集合,如果不相同則繼續(xù)用RouteData的DataToken【NameSpaces】剩下的命名空間值挨個的進行比對。

根據(jù)返回的類型集合,如果總數(shù)為0返回空,總數(shù)為1返回此集合中的類型,如果大于1則會引發(fā)CreateAmbiguousControllerException類型的異常。

在此時DefaultControllerFactory中已經(jīng)獲取到了控制器類型(Type)。

在總結(jié)中2.2所指部分為IControllerActivator接口類型的實現(xiàn)。

 1     // 摘要:
 2     //     對使用依賴項注入實例化控制器的方式進行精細控制。
 3     public interface IControllerActivator
 4     {
 5         // 摘要:
 6         //     在類中實現(xiàn)時創(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);

這部分的實現(xiàn),可以注入到控制器工廠,而實現(xiàn)的內(nèi)部依然有可擴展注入的地方,在MVC框架中有默認的實現(xiàn),我們先來看一下2.2部分之后的實現(xiàn)概念圖:

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

獲取到了Controller的Type過后,DefaultControllerFactory就可以根據(jù)Type來創(chuàng)建Controller,然而在MVC框架的設(shè)計中,【根據(jù)ControllerType創(chuàng)建Controller的方式】是不會放在DefaultControllerFactory中的,而是通過MVC框架中實現(xiàn)了IControllerActivator接口類型的默認實現(xiàn)類DefaultControllerActivator類型來進行創(chuàng)建IController的,而在DefaultControllerActivator中又是通過DependencyResolver類型來創(chuàng)建一個IDependencyResolver接口的默認實現(xiàn)類來實現(xiàn)的。

在IDependencyResolver接口中,有個GetService()方法,這個方法就是最終要創(chuàng)建類型所用到的方式,也可以自定義來實現(xiàn),這也是擴展點之一。說回接口類型,MVC中有個默認的實現(xiàn)了IDependencyResolver接口的類型DefaultDependencyResolver,在DefaultDependencyResolver類型中GetService()方法的默認實現(xiàn)方式Activator.CreateInstance(serviceType);也就是正常通過反射來創(chuàng)建類型的。

看一下由Handler到Icontroller的一個過程圖:

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

上面的這些以及前面篇幅所講,都是MVC默認實現(xiàn)的方式,每個部分都可以自定義來擴展,MvcHandler、DefaultControllerFactory、DefaultDependencyResolver等等這些類型。

會在后面的篇幅中說明在激活控制器的過程中所有可注入擴展點的。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站題目:ASP.NETMVC控制器激活(一)-創(chuàng)新互聯(lián)
當(dāng)前地址:http://www.rwnh.cn/article48/ccisep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計公司、網(wǎng)站內(nèi)鏈、移動網(wǎng)站建設(shè)建站公司、網(wǎng)站導(dǎo)航、網(wǎng)站營銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計
晋城| 荥阳市| 庆元县| 潢川县| 页游| 景宁| 望奎县| 阿拉善盟| 崇仁县| 永登县| 邯郸县| 灵宝市| 塔城市| 五台县| 宁德市| 黑龙江省| 伊宁市| 宕昌县| 阜城县| 涡阳县| 班戈县| 禹州市| 无极县| 嘉善县| 海丰县| 赫章县| 营口市| 墨江| 安吉县| 临夏县| 漯河市| 武强县| 晋州市| 林口县| 大方县| 中宁县| 武夷山市| 洱源县| 永胜县| 滨州市| 临颍县|