欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

ASP.NETWebAPI控制器創(chuàng)建過(guò)程(二)-創(chuàng)新互聯(lián)

ASP.NET Web API 控制器創(chuàng)建過(guò)程(二)

成都創(chuàng)新互聯(lián)公司專(zhuān)注為客戶(hù)提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、網(wǎng)站制作、蘭山網(wǎng)絡(luò)推廣、重慶小程序開(kāi)發(fā)、蘭山網(wǎng)絡(luò)營(yíng)銷(xiāo)、蘭山企業(yè)策劃、蘭山品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪(fǎng)、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供蘭山建站搭建服務(wù),24小時(shí)服務(wù)熱線(xiàn):18982081108,官方網(wǎng)址:chinadenli.net

前言

本來(lái)這篇隨筆應(yīng)該是在上周就該寫(xiě)出來(lái)發(fā)布的,由于身體跟不上節(jié)奏感冒發(fā)燒有心無(wú)力,這種天氣感冒發(fā)燒生不如死,也真正的體會(huì)到了什么叫病來(lái)如山倒,病去如抽絲。這兩天狀態(tài)才好了一點(diǎn),讓我理解了什么才是革命的本錢(qián),希望大家也多保重身體。

好了,還是回歸主題,對(duì)于上一篇的內(nèi)容講解的只是ASP.NET Web API控制器創(chuàng)建過(guò)程中的一個(gè)局部知識(shí),在接著上篇內(nèi)容講解的之前,我會(huì)先回顧一下上篇的內(nèi)容,并且在本篇里進(jìn)行整合,讓我們要看到的是一個(gè)整個(gè)的創(chuàng)建過(guò)程。

ASP.NET Web API 控制器創(chuàng)建、激活過(guò)程

ASP.NET Web API 控制器創(chuàng)建過(guò)程(一)

ASP.NET Web API 控制器創(chuàng)建過(guò)程(二)

創(chuàng)建、激活過(guò)程

圖1

ASP.NET Web API 控制器創(chuàng)建過(guò)程(二)

在前面的篇幅中我們說(shuō)過(guò)APIController是由HttpControllerDispatcher類(lèi)型來(lái)創(chuàng)建的,這只是表面上的,圖1中顯示的就是控制器創(chuàng)建的整個(gè)過(guò)程了,我們先來(lái)回顧一下上一篇所講的,不然會(huì)覺(jué)得不連貫,在回顧的同時(shí)也會(huì)對(duì)圖1進(jìn)行講解。

首先我們來(lái)分解圖1,可以把圖1中分為兩個(gè)部分,

第一個(gè)部分就是HttpConfiguration類(lèi)型所表示的部分。如圖2

圖2

ASP.NET Web API 控制器創(chuàng)建過(guò)程(二)

先來(lái)解釋一下HttpConfiguration部分,在HttpConfiguration類(lèi)型中有兩個(gè)屬性,第一個(gè)是ServicesContainer類(lèi)型的屬性Services,第二個(gè)就是IDependencyResolver類(lèi)型的屬性DependencyResolver,對(duì)于Services屬性的類(lèi)型在上篇中我也說(shuō)過(guò)了,就是一個(gè)IoC容器,從HttpConfiguration類(lèi)型角度來(lái)看就是一個(gè)依賴(lài)注入到HttpConfiguration中的IoC容器,對(duì)于DependencyResolver屬性來(lái)說(shuō)也差不多就是這個(gè)意思了。

只不過(guò)Services這個(gè)容器中存放的大多都是ASP.NET Web API框架中做一些基礎(chǔ)工作的類(lèi)型。

就好像上篇中說(shuō)到的,在A(yíng)SP.NET Web API框架中加載控制器所在程序集的時(shí)候我們就是使用自定義的工作項(xiàng)替換掉了Services容器中的默認(rèn)工作項(xiàng):

selfHostServer.Configuration.Services.Replace(typeof(IAssembliesResolver),
                   newCustomAssembliesResolver.LoadSpecifiedAssembliesResolver());

這里從圖2中可以看出默認(rèn)的DefaultAssembliesResolver類(lèi)型來(lái)執(zhí)行這項(xiàng)工作的。

到這里也就是上個(gè)篇幅中的主要內(nèi)容了。下面我們還是繼續(xù)分解圖1,上面說(shuō)了第一部分了下面來(lái)看第二部分,第二個(gè)部分就是HttpControllerDispatcher類(lèi)型到APIController類(lèi)型的生成過(guò)程,也就是圖1了。

首先我們的ASP.NET Web API框架會(huì)從HttpConfiguration中的Services容器中獲取一個(gè)ControllerSelector(控制器選擇器),這個(gè)控制器選擇器呢對(duì)應(yīng)的類(lèi)型大家從圖2中也可以看到,圖1中也有,很明了。

那么ControllerSelector主要干什么呢?肯定是選擇控制器阿,當(dāng)然了根據(jù)請(qǐng)求選擇相應(yīng)的控制器是主要功能,次要功能是啥?次要功能是生成控制器緩存,不然從哪選阿對(duì)不。在A(yíng)SP.NET MVC框架中控制器緩存是存在xml文件中的,現(xiàn)在很好奇在A(yíng)SP.NET Web API框架中控制器緩存是什么樣的存儲(chǔ)方式呢?

我們就來(lái)看一下控制器選擇器次要功能。

控制器選擇器次要功能

首先我們先說(shuō)明一下緩存的類(lèi)型為ConcurrentDictionary<string, HttpControllerDescriptor>類(lèi)型,就是一個(gè)一一對(duì)應(yīng)的鍵值隊(duì),string表示著控制器名稱(chēng),而HttpControllerDescriptor表示著對(duì)應(yīng)控制器的控制器描述類(lèi)型,這個(gè)類(lèi)型很重要稍后再說(shuō),我們先要了解ConcurrentDictionary<string, HttpControllerDescriptor>緩存的由來(lái)。

首先在我們控制器選擇器實(shí)例化的時(shí)候,在控制器選擇器的構(gòu)造函數(shù)中已經(jīng)使用了延遲加載技術(shù)對(duì)控制器緩存進(jìn)行了創(chuàng)建,具體的創(chuàng)建過(guò)程可以在圖1看到,是由DefaultAssembliesResolver類(lèi)型(或者是我們自定義的工作項(xiàng))加載指定的程序集,并且交由DefaultHttpControllerTypeResolver類(lèi)型根據(jù)ASP.NET Web API框架中默認(rèn)的搜索過(guò)濾條件返回加載程序集中的所有符合條件的控制器類(lèi)型(ControllerTypes),來(lái)看示例。

所用項(xiàng)目結(jié)構(gòu)還是上個(gè)篇幅的示例:

圖3

ASP.NET Web API 控制器創(chuàng)建過(guò)程(二)

圖4

ASP.NET Web API 控制器創(chuàng)建過(guò)程(二)

在圖4中我們額外定義了一些控制器類(lèi)型,然后在SelfHost端定義如下示例代碼:

代碼1-1

        staticvoidWriterControllerTypeMessage(HttpSelfHostServerselfHostServer)
        {
 
            ICollection<Type>types=selfHostServer.Configuration.Services.GetHttpControllerTypeResolver().GetControllerTypes(selfHostServer.Configuration.Services.GetAssembliesResolver());
            foreach (Typetypeintypes)
            {
                Console.WriteLine(type.Namespace+"_______"+type.Name);
            }
        }

并且在注冊(cè)端調(diào)用此靜態(tài)函數(shù):

using (HttpSelfHostServerselfHostServer=newHttpSelfHostServer(selfHostConfiguration))
            {
                selfHostServer.Configuration.Routes.MapHttpRoute(
                    "DefaultApi", "api/{controller}/{id}", new { id=RouteParameter.Optional });
 
                selfHostServer.Configuration.Services.Replace(typeof(IAssembliesResolver),
                    newCustomAssembliesResolver.LoadSpecifiedAssembliesResolver());
 
 
                WriterControllerTypeMessage(selfHostServer);
 
                selfHostServer.OpenAsync();
                Console.WriteLine("服務(wù)器端服務(wù)監(jiān)聽(tīng)已開(kāi)啟");
                Console.Read();
            }

結(jié)果如圖5:

圖5

ASP.NET Web API 控制器創(chuàng)建過(guò)程(二)

在我們獲取了ControllerTypes過(guò)后了,ASP.NET Web API框架中有個(gè)HttpControllerTypeCache類(lèi)型的對(duì)象就藏不住了,之前的一些操作都是由HttpControllerTypeCache類(lèi)型去處理的,而在HttpControllerTypeCache獲取了ControllerTypes過(guò)后就要做一個(gè)很重要的工作了,就是對(duì)ControllerTypes進(jìn)行分組操作最后返回一個(gè)Dictionary<string, ILookup<string, Type>>類(lèi)型的對(duì)象,就拿上面的示例來(lái)說(shuō)吧,最后經(jīng)過(guò)分組后的Dictionary<string, ILookup<string, Type>>類(lèi)型值應(yīng)該是:

Writer-->NameSpaceControllerOne->WriterController

      NameSpaceControllerTwo->WriterController

Read-->NameSpaceControllerOne->ReadController

WriterAndRead-->NameSpaceControllerThree->WriterAndReadController

Product-->WebAPIController->ProductController

這個(gè)時(shí)候的值并不是最終的緩存類(lèi)型,而是通過(guò)我們的控制器選擇器根據(jù)HttpControllerTypeCache類(lèi)型所生成的Dictionary<string,ILookup<string, Type>>類(lèi)型值來(lái)生成ConcurrentDictionary<string, HttpControllerDescriptor>緩存類(lèi)型,還是根據(jù)上面的示例,我們看一下最后生成的緩存類(lèi)型值。

修改1-1如下示例代碼:

代碼1-2

staticvoidWriterControllerTypeMessage(HttpSelfHostServerselfHostServer)
        {
 
            ICollection<Type>types=selfHostServer.Configuration.Services.GetHttpControllerTypeResolver().GetControllerTypes(selfHostServer.Configuration.Services.GetAssembliesResolver());
            foreach (Typetypeintypes)
            {
                Console.WriteLine(type.Namespace+"_______"+type.Name);
            }
 
 
 
            //Dictionary<string,ILookup<string, Type>> controllertypecache = types.GroupBy<Type,string>(t => t.Name,StringComparer.OrdinalIgnoreCase).ToDictionary<IGrouping<string,Type>, string, ILookup<string, Type>>
            //        (g => g.Key,
            //        g => g.ToLookup<Type,string>(t => (t.Namespace ?? string.Empty),StringComparer.OrdinalIgnoreCase), StringComparer.OrdinalIgnoreCase);
 
            //foreach(var value in controllertypecache)
            //{
            //    foreach (var val in value.Value)
            //    {
                   
            //    }
            //}
 
            IDictionary<string, HttpControllerDescriptor>mapping=selfHostServer.Configuration.Services.GetHttpControllerSelector().GetControllerMapping();
 
            foreach (varmeginmapping)
            {
                Console.WriteLine("ControllerName:"+meg.Key+".ControllerTypeName:"+meg.Value.ControllerType.Name);
            }
 
        }

結(jié)果如圖6:

圖6

ASP.NET Web API 控制器創(chuàng)建過(guò)程(二)

(在代碼1-2中注釋掉的部分就是可以查看對(duì)ControllerTypes進(jìn)行分組操作返回Dictionary<string, ILookup<string, Type>>類(lèi)型的值)。

控制器選擇器主要功能

次要功能看完之后,主要功能想必大家也是很明了吧,在有了控制器緩存對(duì)象過(guò)后,控制器選擇器則會(huì)根據(jù)HttpRequestMessage對(duì)象中的路由數(shù)據(jù)對(duì)象獲取控制器名稱(chēng),然后從緩存中獲取到對(duì)應(yīng)的HttpControllerDescriptor類(lèi)型實(shí)例。

具體生成工作

在獲取到了HttpControllerDescriptor類(lèi)型實(shí)例過(guò)后生成IHttpController的工作就變得很簡(jiǎn)單了,還是從HttpConfiguration中的Services容器中獲得對(duì)應(yīng)的負(fù)責(zé)控制器生成激活的工作項(xiàng),在圖1中可以明確的看出是DefaultHttpControllerActivator類(lèi)型,在DefaultHttpControllerActivator類(lèi)型工作的時(shí)候它會(huì)從HttpConfiguration中獲取DependencyResolver屬性對(duì)應(yīng)的容器,如果這里的情況不滿(mǎn)足才會(huì)調(diào)用后面的TypeActivator來(lái)生成激活I(lǐng)HttpController(通過(guò)反射)。

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

本文名稱(chēng):ASP.NETWebAPI控制器創(chuàng)建過(guò)程(二)-創(chuàng)新互聯(lián)
URL標(biāo)題:http://chinadenli.net/article8/degpip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、云服務(wù)器網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站全網(wǎng)營(yíng)銷(xiāo)推廣、品牌網(wǎng)站建設(shè)

廣告

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

外貿(mào)網(wǎng)站建設(shè)