.NET Core中間件的註冊和管道的構建(3) ---- 使用Map/MapWhen擴展方法

.NET Core中間件的註冊和管道的構建(3) ---- 使用Map/MapWhen擴展方法

0x00 爲何須要Map(MapWhen)擴展

若是業務邏輯比較簡單的話,一條主管道就夠了,確實用不到Map。不過當業務邏輯比較複雜的時候,有時候咱們可能但願根據狀況的不一樣使用特殊的一組中間件來處理HttpContext。這種狀況下若是隻用一條管道,處理起來會很是麻煩和混亂。此時就可使用Map/MapWhen創建一個分支管道,當條件符合咱們的設定時,由這個分支管道來處理HttpContext。使用Map/MapWhen添加分支管道是很容易的,只要提供合適跳轉到分支管道的判斷邏輯,以及分支管道的構建方法就能夠了。html

0x01 Map擴展的原理

前一篇文章中咱們說過,中間件的註冊和管道的構建都是經過ApplicationBuilder進行的。所以要構建一個分支管道,須要一個新的ApplicationBuilder,並用它來註冊中間件,構建管道。爲了在分支管道中也可以共享咱們在當前ApplicationBuilder中註冊的服務(或是說共享依賴注入容器,固然共享的並不止這些),在建立新的ApplicationBuilder時並非直接new一個全新的,而是調用當前ApplicationBuilder的New方法在當前的基礎上建立新的,共享了當前ApplicationBuilder的Properties(其中包含了依賴注入容器)。git

在使用Map註冊中間件時咱們會傳入一個Action<IApplicationBuilder>參數,它的做用就是,當咱們建立了新的ApplicationBuilder後,使用這個方法對其進行各類設置,最重要的就是在新的ApplicationBuilder上註冊分支管道的中間件。配置完成後調用分支ApplicationBuilder的Builder方法構建管道,並把第一個中間件保存下來做爲分支管道的入口。github

在使用Map註冊中間件時傳入了一個PathString參數,PathString對象咱們能夠簡單地認爲是string。它用於記錄HttpContext.HttpRequest.Path中要匹配的區段(Segment)。這個字符串參數結尾不能是「/」。若是匹配成功則進入分支管道,匹配失則敗繼續當前管道。測試

新構建的管道和用於匹配的字符串保存爲MapOptions對象,保存了Map規則和分支管道的入口。以後構建MapMiddleware對象,並把它的Invoke方法包裝爲RequestDelegate,使用當前ApplicationBuilder的Use方法註冊中間件。ui

下面是Map擴展方法:spa

下面是MapMiddleware的Invoke方法3d

0x02 MapWhen擴展的原理

Map主要經過URL中的Path來判斷是否須要進入分支管道,但有時候咱們極可能會有別的需求,例如我想對全部Method爲DELETE的請求用特殊管道處理。這時候就須要用MapWhen了。MapWhen是一種通用的Map,能夠由使用者來決定何時進入分支管道何時不進入。能夠說Map是MapWhen的一種狀況,由於這種狀況太常見了,因此官方實現了一個。這樣看來MapWhen就很簡單了,在Map中咱們傳入參數PathString來進行HttpRequest.Path的匹配,在MapWhen中咱們傳入Func<HttpContext,bool>參數,有咱們自行指定,當返回true時進入分支管道,返回false則繼續當前管道。htm

下面是MapWhen擴展方法:中間件

 

下面是MapWhenMiddleware的Invoke方法:對象

0x03 順便提一下Run擴展

還有一個註冊中間件的擴展方法是Run,由於很是簡單,因此在最後提一下。Run就是用Use註冊一箇中間件,最後不調用下一個中間件直接返回。因此使用Run擴展方法註冊中間件永遠都是直接返回的,後面的中間件都不會被調用。

0x04 寫在最後

Map/MapWhen和Run都很簡單就不寫測試了。到此爲止中間件的註冊和管道的構建主題就寫完了。剛開始是出於對中間件有些地方的迷惑開始的,搞明白了後本想着寫一篇博客分享下本身的心得,沒想到越寫越多,一篇分紅兩篇,到如今寫了三篇。我這些也只是寫了些大概,不少細節沒寫到,有興趣的能夠去github上看一下代碼,管道和中間件相關的都在這個倉庫:https://github.com/aspnet/HttpAbstractions。

0x05 相關文章

.NET Core中間件的註冊和管道的構建(1)---- 註冊和構建原理

.NET Core中間件的註冊和管道的構建(2)---- 用UseMiddleware擴展方法註冊中間件類

.NET Core中間件的註冊和管道的構建(3) ---- 使用Map/MapWhen擴展方法

 


更多內容歡迎訪問個人博客:http://www.durow.vip

相關文章
相關標籤/搜索