我們一致在說(shuō) ASP.NET Core廣泛地使用到了依賴注入,通過(guò)前面兩個(gè)系列的介紹,相信讀者朋友已經(jīng)體會(huì)到了這一點(diǎn)。由于前面兩章已經(jīng)涵蓋了依賴注入在管道構(gòu)建過(guò)程中以及管道在處理請(qǐng)求過(guò)程的應(yīng)用,但是內(nèi)容相對(duì)分散和零碎,我們有必要針對(duì)這個(gè)主題作一個(gè)歸納性的介紹。采用依賴注入的服務(wù)均由某個(gè)ServiceProvider來(lái)提供,但是在ASP.NET Core管道涉及到兩個(gè)不同的ServiceProvider,其中一個(gè)是在管道成功構(gòu)建后創(chuàng)建并綁定到WebHost上的ServiceProvider,對(duì)應(yīng)著WebHost的Services屬性。另一個(gè)ServiceProvider則是在管道處理每個(gè)請(qǐng)求時(shí)即時(shí)創(chuàng)建的,它綁定當(dāng)表示當(dāng)前請(qǐng)求上下文上,對(duì)應(yīng)著HttpContext的RequestServices屬性,兩個(gè)ServiceProvider之間存在著父子關(guān)系。[本文已經(jīng)同步到《ASP.NET Core框架揭秘》之中]
目錄
一、WebHost的ServiceProvider
二、HttpContext的ServiceProvider
原理分析
實(shí)例證明
兩個(gè)ServiceProvider具有“父子”關(guān)系
ServiceProvidersFeature特性
RequestServicesContainerMiddleware中間件
AutoRequestServicesStartupFilter
一、WebHost的ServiceProvider
ASP.NET Core的依賴注入框架其實(shí)很簡(jiǎn)單,其中僅僅涉及ServiceCollection和ServiceProvider這兩個(gè)核心對(duì)象。我們預(yù)先將服務(wù)描述信息注冊(cè)到ServiceCollection之上,然后利用ServiceCollection來(lái)創(chuàng)建ServiceProvider,并最終利用后者根據(jù)指定的服務(wù)類型來(lái)提供對(duì)應(yīng)的服務(wù)實(shí)例。接下來(lái)我們以這兩個(gè)對(duì)象作為唯一的關(guān)注點(diǎn)來(lái)回顧一下管道的創(chuàng)建流程。ASP.NET Core管道的創(chuàng)建也僅僅涉及到兩個(gè)核心對(duì)象,作為應(yīng)用宿主的WebHost對(duì)象和創(chuàng)建它的WebHostBuilder。下圖基本揭示了WebHostBuilder創(chuàng)建WebHost,以及WebHost在開(kāi)啟過(guò)程針對(duì)依賴注入這兩個(gè)核心對(duì)象的使用。
ASP.NET Core管道在構(gòu)建過(guò)程中會(huì)使用同一個(gè)ServiceCollection,所有注冊(cè)的服務(wù)都被添加到這個(gè)對(duì)象上。這個(gè)ServiceCollection對(duì)象最初由WebHostBuilder創(chuàng)建。在WebHost的創(chuàng)建過(guò)程中,WebHostBuilder需要向這個(gè)ServiceCollection對(duì)象注冊(cè)兩種類型的服務(wù):一種是確保管道能夠被成功構(gòu)建并順利處理請(qǐng)求所必需的服務(wù),我們不妨將它們稱為系統(tǒng)服務(wù);另一種則是用戶通過(guò)調(diào)用ConfigureServices方法自行注冊(cè)的服務(wù),我們姑且稱它們?yōu)?span>用戶服務(wù)。
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無(wú)線安全]玩轉(zhuǎn)無(wú)線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問(wèn)題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來(lái)看看(二) 2017-07-26