一、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這么一個委托,它相當于一個Func<HttpContext, Task>對象,它象體現(xiàn)了針對HttpContext所進行的某項操作,實際上體現(xiàn)某個中間件針對請求的處理。那為何我們不直接用一個RequestDelegate對象來表示一個中間件,而將它表示成一個Func<RequestDelegate,RequestDelegate>對象呢?
在大部分應用中,我們會針對具體的請求處理需求注冊多個不同的中間件,這些中間件按照注冊時間的先后順序進行排列進而構(gòu)成管道。對于某個中間件來說,在它完成了自身的請求處理任務之后,需要將請求傳遞給下一個中間件作后續(xù)的處理。Func<RequestDelegate,RequestDelegate>中作為輸入?yún)?shù)的RequestDelegate對象代表一個委托鏈,體現(xiàn)了后續(xù)中間件對請求的處理。一般來說,當某個中間件將自身實現(xiàn)的請求處理任務添加到這個委托鏈中,新的委托鏈將作為這個Func<RequestDelegate,RequestDelegate>對象的返回值。
以下圖所示的管道為例,如果用一個Func<RequestDelegate,RequestDelegate>來表示中間件B,那么作為輸入?yún)?shù)的RequestDelegate對象代表的是C對請求的處理操作,而返回值則代表B和C先后對請求處的處理操作。如果一個Func<RequestDelegate,RequestDelegate>代表第一個從服務器接收請求的中間件(比如A),那么執(zhí)行該委托對象返回的RequestDelegate實際上體現(xiàn)了整個管道對請求的處理。
延伸閱讀
學習是年輕人改變自己的最好方式