一、ApplicationBuilder——用于注冊中間件并創(chuàng)建管道

我們所說的ApplicationBuilder是對所有實現(xiàn)了IApplicationBuilder接口的所有類型及其對象的統(tǒng)稱。用于創(chuàng)建WebHost的WebHostBuilder具有一個用于管道定值的Configure方法,它利用作為參數(shù)的ApplicationBuilder對象進行中間件的注冊。由于ApplicationBuilder與組成管道的中間件具有直接的關(guān)系,所以我們得先來說說中間件在管道中究竟體現(xiàn)為一個怎樣的對象。

中間件在請求處理流程中體現(xiàn)為一個類型為Func<RequestDelegate,RequestDelegate>的委托對象,對于很多剛剛接觸請求處理管道的讀者朋友們來說,可能一開始對此有點難以理解,所以容來略作解釋。我們上面已經(jīng)提到過RequestDelegate這么一個委托,它相當(dāng)于一個Func<HttpContext, Task>對象,它象體現(xiàn)了針對HttpContext所進行的某項操作,實際上體現(xiàn)某個中間件針對請求的處理。那為何我們不直接用一個RequestDelegate對象來表示一個中間件,而將它表示成一個Func<RequestDelegate,RequestDelegate>對象呢?

在大部分應(yīng)用中,我們會針對具體的請求處理需求注冊多個不同的中間件,這些中間件按照注冊時間的先后順序進行排列進而構(gòu)成管道。對于某個中間件來說,在它完成了自身的請求處理任務(wù)之后,需要將請求傳遞給下一個中間件作后續(xù)的處理。Func<RequestDelegate,RequestDelegate>中作為輸入?yún)?shù)的RequestDelegate對象代表一個委托鏈,體現(xiàn)了后續(xù)中間件對請求的處理。一般來說,當(dāng)某個中間件將自身實現(xiàn)的請求處理任務(wù)添加到這個委托鏈中,新的委托鏈將作為這個Func<RequestDelegate,RequestDelegate>對象的返回值。

以下圖所示的管道為例,如果用一個Func<RequestDelegate,RequestDelegate>來表示中間件B,那么作為輸入?yún)?shù)的RequestDelegate對象代表的是C對請求的處理操作,而返回值則代表B和C先后對請求處的處理操作。如果一個Func<RequestDelegate,RequestDelegate>代表第一個從服務(wù)器接收請求的中間件(比如A),那么執(zhí)行該委托對象返回的RequestDelegate實際上體現(xiàn)了整個管道對請求的處理。

網(wǎng)友評論