.NET Core中介軟體的註冊和管道的構建(3) ---- 使用Map/MapWhen擴充套件方法

durow發表於2016-08-09

.NET Core中介軟體的註冊和管道的構建(3) ---- 使用Map/MapWhen擴充套件方法

0x00 為什麼需要Map(MapWhen)擴充套件

如果業務邏輯比較簡單的話,一條主管道就夠了,確實用不到Map。不過當業務邏輯比較複雜的時候,有時候我們可能希望根據情況的不同使用特殊的一組中介軟體來處理HttpContext。這種情況下如果只用一條管道,處理起來會非常麻煩和混亂。此時就可以使用Map/MapWhen建立一個分支管道,當條件符合我們的設定時,由這個分支管道來處理HttpContext。使用Map/MapWhen新增分支管道是很容易的,只要提供合適跳轉到分支管道的判斷邏輯,以及分支管道的構建方法就可以了。

0x01 Map擴充套件的原理

前一篇文章中我們說過,中介軟體的註冊和管道的構建都是通過ApplicationBuilder進行的。因此要構建一個分支管道,需要一個新的ApplicationBuilder,並用它來註冊中介軟體,構建管道。為了在分支管道中也能夠共享我們在當前ApplicationBuilder中註冊的服務(或是說共享依賴注入容器,當然共享的並不止這些),在建立新的ApplicationBuilder時並不是直接new一個全新的,而是呼叫當前ApplicationBuilder的New方法在當前的基礎上建立新的,共享了當前ApplicationBuilder的Properties(其中包含了依賴注入容器)。

在使用Map註冊中介軟體時我們會傳入一個Action<IApplicationBuilder>引數,它的作用就是,當我們建立了新的ApplicationBuilder後,使用這個方法對其進行各種設定,最重要的就是在新的ApplicationBuilder上註冊分支管道的中介軟體。配置完成後呼叫分支ApplicationBuilder的Builder方法構建管道,並把第一個中介軟體儲存下來作為分支管道的入口。

在使用Map註冊中介軟體時傳入了一個PathString引數,PathString物件我們可以簡單地認為是string。它用於記錄HttpContext.HttpRequest.Path中要匹配的區段(Segment)。這個字串引數結尾不能是“/”。如果匹配成功則進入分支管道,匹配失則敗繼續當前管道。

新構建的管道和用於匹配的字串儲存為MapOptions物件,儲存了Map規則和分支管道的入口。之後構建MapMiddleware物件,並把它的Invoke方法包裝為RequestDelegate,使用當前ApplicationBuilder的Use方法註冊中介軟體。

下面是Map擴充套件方法:

下面是MapMiddleware的Invoke方法

0x02 MapWhen擴充套件的原理

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

下面是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

相關文章