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

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

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

前言

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

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

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

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

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

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

圖1

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

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

首先我們來分解圖1,可以把圖1中分為兩個部分,

第一個部分就是HttpConfiguration類型所表示的部分。如圖2

圖2

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

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

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

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

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

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

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

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

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

我們就來看一下控制器選擇器次要功能。

控制器選擇器次要功能

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

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

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

圖3

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

圖4

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

在圖4中我們額外定義了一些控制器類型,然后在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);
            }
        }

并且在注冊端調(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)聽已開啟");
                Console.Read();
            }

結(jié)果如圖5:

圖5

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

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

Writer-->NameSpaceControllerOne->WriterController

      NameSpaceControllerTwo->WriterController

Read-->NameSpaceControllerOne->ReadController

WriterAndRead-->NameSpaceControllerThree->WriterAndReadController

Product-->WebAPIController->ProductController

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

修改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)建過程(二)

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

控制器選擇器主要功能

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

具體生成工作

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

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

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

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

廣告

聲明:本網(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)

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