中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

淺從System.Web.Http.Owin的HttpMessageHandlerAdapter看適配器模式

一.寫在前面

 適配器模式(Adapter)

我們提供的服務(wù)有:成都網(wǎng)站設(shè)計、網(wǎng)站制作、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、冷水灘ssl等。為上1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的冷水灘網(wǎng)站制作公司

可用來在現(xiàn)有接口和不兼容的類之間進行適配。有助于避免大規(guī)模改寫現(xiàn)有客戶代碼,其工作機制是對現(xiàn)有類的接口進行包裝,這樣客戶程序就能使用這個并非為其量身打造的類而又無需為此大動手術(shù)。                  ----《JS設(shè)計模式》

將一個類的接口,轉(zhuǎn)換成客戶期望的另一個接口。適配器讓原本接口不兼容的類可以合作無間。

            ----《Head First設(shè)計模式》

這兩本書中對適配器模式定義如此,適配器模式在多種設(shè)計模式當(dāng)中屬于比較容易理解的一種,其目的或者說可以解決的問題是新功能/新類型,不受原有類型/方法/功能的兼容,有了適配器這種巧妙地經(jīng)驗,我們可以保證對修改封閉,對拓展開放。而達到此目的,正需要面向接口,并保持職責(zé)的單一性。也許對C#開發(fā)者來說,見的最多的就是SqlDataAdapter。

     

二.認(rèn)識UseWebApi

本文所涉及OWIN,.NetFramework,Webapi 開源×××地址為:

ht t p s : / /g i t h u b. c o m / as p n e t/ A s p N et K a ta n a

htt p s: / / g i th u b. c o m / AS P - N E T- M V C /a s p n e tw e b s t a ck

h t t p s : / /g i t h u b . c om / d o t ne t / c or e f x  

熟悉OWIN體系的小伙伴們,一定都在Startup.cs中見過也使用過app.UseWebApi吧。app是IAppBuilder的對象

Startup.cs是OWIN katana實現(xiàn)的啟動類,剛說的UseWebApi顧名思義,就是將WebApi作為一個OWIN中間件放在整個處理流程中。app是IAppBuilder的對象,其創(chuàng)建由IAppBuilderFactory負責(zé)。IAppBuilder定義了三個方法,分別為Build,New和Use.   這三個方法分別負責(zé)什么呢?

Build,返回OWIN管道入口點的一個實例,由 Microsoft.Owin.Host.SystemWeb中的Init方法調(diào)用。其返回實例將被轉(zhuǎn)換為AppFun類型,AppFun( using AppFunc = Func<IDictionary<string, object>, Task>;)是什么呢?它是OWIN服務(wù)器與應(yīng)用程序交互的應(yīng)用程序委托,我們看到這個方法在OWIN.Host中調(diào)用,應(yīng)該就能大概猜到個所以然。

New,用于返回一個AppBuilder實例,由IAppBuilderFactory調(diào)用并返回。

Use,就是我們在OWIN體系中,經(jīng)常使用到的方法,我們可以定義自己的OWIN中間件,按照其定義規(guī)范,并Use到處理管道中,比如用戶操作日志中間件,用戶身份校驗中間件等。

說到這里,我們應(yīng)該很清晰的了解到WebApi是OWIN的一個中間件而已了吧。舉個栗子:

淺從System.Web.Http.Owin的HttpMessageHandlerAdapter看適配器模式

 1 public partial class Startup 2     { 3  4         public void Configuration(IAppBuilder app) 5         { 6             // This must happen FIRST otherwise CORS will not work. 
 7             // 引入OWin.Cors 解決跨域訪問問題 8             app.UseCors(CorsOptions.AllowAll); 9 10             GlobalConfiguration.Configure(WebApiConfig.Register);11             FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);12             13             ConfigureAuth(app);14 15             app.Use<UserContextMiddleware>();16             app.Use<UserOperationMiddleware>();17             app.UseWebApi(GlobalConfiguration.Configuration);18         }19     }

淺從System.Web.Http.Owin的HttpMessageHandlerAdapter看適配器模式

三.UseWebApi的實現(xiàn)

 看到這里你一定會問,為什么IAppBuilder中沒有定義UseWebapi方法呢,UseWebapi的實現(xiàn)在System.Web.Http.Owin的WebApiAppBuilderExtensions.cs中,UseWebApi是一個C# this拓展方法,和你所想到的答案并無差。在其實現(xiàn)中,調(diào)用了  builder.Use(typeof(HttpMessageHandlerAdapter), options);  

到這里,一定要啰嗦幾句不要怪我,Adapter的實現(xiàn)步驟:為了使一個類或者一個功能,兼容已有類/接口,那么

1.被適配器實現(xiàn)目標(biāo)客戶的接口或抽象方法,以便參數(shù)的傳入

2.所實現(xiàn)接口/抽象類的方法中調(diào)用目標(biāo)客戶的方法

HttpMessageHandlerAdapter 這個主角終于出現(xiàn)了,對Adapter模式了解后的小伙伴們也一定能想得到,既然是HttpMessageHandler的Adapter,那么 在其類中 一定定義了一個private的字段,并且類型為HttpMessageHandler,你也一定能想得到這個Adapter繼承了OwinMiddleware這個抽象類型并且實現(xiàn)其Invoke抽象方法,在HttpMessageHandlerAdapter的一個方法中一定調(diào)用了HttpMessageHandler的方法。那么通過源碼我們了解到HttpMessageHandler的字段名為_messageHandler。(是不是和上面所說的Adapter實現(xiàn)方式類似呢,實現(xiàn)方式可能概括的不好,建議參閱更多文章和范例)

Asp.Net Webapi的消息處理管道是由HttpMessageHandler的委托鏈所組成的處理管道

HttpMessageHandler抽象類當(dāng)中頂一個一個唯一的抽象方法用于實現(xiàn),其入?yún)镠ttpRequestMessage,其出參為HttpResponseMessage。

1 protected internal abstract Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken);

DelegatingHandler實現(xiàn)了HttpMessageHandler,其構(gòu)造函數(shù)中傳入HttpMessageHandler,并由同類對象innerHandler構(gòu)成委托鏈。

推薦一篇MS文檔 https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/http-message-handlers,有興趣可以稍微參照下。

淺從System.Web.Http.Owin的HttpMessageHandlerAdapter看適配器模式

 1         protected DelegatingHandler(HttpMessageHandler innerHandler) 2         { 3             InnerHandler = innerHandler; 4         } 5  6         protected internal override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 7         { 8             if (request == null) 9             {10                 throw new ArgumentNullException(nameof(request), SR.net_http_handler_norequest);11             }12             SetOperationStarted();13             return _innerHandler.SendAsync(request, cancellationToken);14         }

淺從System.Web.Http.Owin的HttpMessageHandlerAdapter看適配器模式

中間啰嗦了一串,為了說明HttpMessageHandler的作用,這樣我們能進一步理解,為什么要有HttpMessageHandlerAdapter的存在,并在Use (WebApi中間件)的時候,將該類型傳入。

在HttpMessageHandlerAdapter構(gòu)造函數(shù)中,_messageHandler被包裝為HttpMessageInvoker類型,這個類型的目的是提供一個專門的類,用于調(diào)用SendAsync方法。

剛才我們已經(jīng)了解到HttpMessageHandlerAdapter實現(xiàn)了OWinMiddleware, 那么我們從源碼中了解下,在其實現(xiàn)的抽象方法Invoke中,做了什么事情:其調(diào)用同類下的InvokeCore方法,InvokeCore中Create了HttpRequestMessage,并將其對象作為SendAsync的入?yún)ⅲ詈蟮玫紿ttpResponseMessage對象。

文章名稱:淺從System.Web.Http.Owin的HttpMessageHandlerAdapter看適配器模式
文章來源:http://www.rwnh.cn/article38/jiecpp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、網(wǎng)站改版、商城網(wǎng)站、網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)、營銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)
独山县| 长子县| 灵璧县| 吉安市| 镇巴县| 兴仁县| 乾安县| 镇康县| 灵山县| 伊金霍洛旗| 江山市| 墨竹工卡县| 航空| 三门峡市| 扶风县| 资阳市| 汝城县| 大庆市| 梅河口市| 安庆市| 瑞丽市| 建瓯市| 江山市| 海丰县| 霞浦县| 从化市| 老河口市| 南靖县| 长葛市| 铁岭县| 遵化市| 桐城市| 新野县| 崇仁县| 郴州市| 榆社县| 吉隆县| 满洲里市| 承德县| 光泽县| 扶绥县|