浅从System.Web.Http.Owin的HttpMessageHandlerAdapter看适配器模式

  

一。写在前面

,适配器模式(适配器)

可用来在现有接口和不兼容的类之间进行适配。有助于避免大规模改写现有客户代码,其工作机制是对现有类的接口进行包装,这样客户程序就能使用这个并非为其量身打造的类而又无需为此大动手术。,- - - - -《JS设计模式》

将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

, - - - - -《头设计模式》

这两本书中对适配器模式定义如此,适配器模式在多种设计模式当中属于比较容易理解的一种,其目的或者说可以解决的问题是新功能/新类型,不受原有类型/方法/功能的兼容,有了适配器这种巧妙地经验,我们可以保证对修改封闭,对拓展开放。而达到此目的,正需要面向接口,并保持职责的单一性。也许对c#开发者来说,见的最多的就是SqlDataAdapter。

二。认识UseWebApi

本文所涉及OWIN,。NetFramework, Webapi开源×××地址为:

ht t p s://g i t h u b . c o m/p n e t/s p n和K助教n

http p s://g i th u b . c o m/p - n e t - m V c/s p n e tw e b s t ck

h t t p s://g i t h u b。c om/d o f t ne t/c或e x,

熟悉OWIN体系的小伙伴们,一定都在Startup.cs中见过也使用过app.UseWebApi吧.app是IAppBuilder的对象

启动。cs是OWIN刀实现的启动类,刚说的UseWebApi顾名思义,就是将WebApi作为一个OWIN中间件放在整个处理流程中.app是IAppBuilder的对象,其创建由IAppBuilderFactory负责.IAppBuilder定义了三个方法,分别为构建新的和使用。,这三个方法分别负责什么呢?

构建、返回OWIN管道入口点的一个实例,由,Microsoft.Owin.Host.SystemWeb中的初始化方法调用。其返回实例将被转换为AppFun类型,AppFun(,使用AppFunc=Func, Task>;)是什么呢?它是OWIN服务器与应用程序交互的应用程序委托,我们看到这个方法在OWIN。主机中调用,应该就能大概猜到个所以然。

新,用于返回一个AppBuilder实例,由IAppBuilderFactory调用并返回。

使用,就是我们在OWIN体系中,经常使用到的方法,我们可以定义自己的OWIN中间件,按照其定义规范,并使用到处理管道中,比如用户操作日志中间件,用户身份校验中间件等。

说到这里,我们应该很清晰的了解到WebApi是OWIN的一个中间件而已了吧。举个栗子:

浅从System.Web.Http.Owin的HttpMessageHandlerAdapter看适配器模式

<>之前,1,public  partial  class  Startup  2,,,,, {, 3, 4,,,,,,,,, public  void 配置(IAppBuilder 应用程序),5,,,,,,,,,{,6,,,,,,,,,,,,//,却;能够must  happen  FIRST  otherwise  CORS  will  not 工作又是;   ,7,,,,,,,,,,,,//,引入OWin.Cors 解决跨域访问问题,8,,,,,,,,,,,,,app.UseCors (CorsOptions.AllowAll);, 9, 10,,,,,,,,,,,,, GlobalConfiguration.Configure (WebApiConfig.Register); 11,,,,,,,,,,,,, FilterConfig.RegisterGlobalFilters (GlobalFilters.Filters); 12,,,,,,,,,,,,, 13,,,,,,,,,,,,, ConfigureAuth(应用程序),14日,15日,,,,,,,,,,,,,app.Use (); 16,,,,,,,,,,,,, app.Use (); 17,,,,,,,,,,,,, app.UseWebApi (GlobalConfiguration.Configuration); 18,,,,,,,,,} 19个,,,,,}

浅从System.Web.Http.Owin的HttpMessageHandlerAdapter看适配器模式

三.UseWebApi的实现

,看到这里你一定会问,为什么IAppBuilder中没有定义UseWebapi方法呢,UseWebapi的实现在System.Web.Http.Owin的WebApiAppBuilderExtensions。cs中,UseWebApi是一个c#这拓展方法,和你所想到的答案并无差。在其实现中,调用了,builder.Use (typeof (HttpMessageHandlerAdapter)选项);,

到这里,一定要啰嗦几句不要怪我,适配器的实现步骤:为了使一个类或者一个功能,兼容已有类/接口,那么

1。被适配器实现目标客户的接口或抽象方法,以便参数的传入

2。所实现接口/抽象类的方法中调用目标客户的方法

HttpMessageHandlerAdapter 这个主角终于出现了,对适配器模式了解后的小伙伴们也一定能想得到,既然是HttpMessageHandler的适配器,那么在其类中一定定义了一个私人的字段,并且类型为HttpMessageHandler,你也一定能想得到这个适配器继承了OwinMiddleware这个抽象类型并且实现其调用抽象方法,在HttpMessageHandlerAdapter的一个方法中一定调用了HttpMessageHandler的方法。那么通过源码我们了解到HttpMessageHandler的字段名为_messageHandler。(是不是和上面所说的适配器实现方式类似呢,实现方式可能概括的不好,建议参阅更多文章和范例)

浅从System.Web.Http.Owin的HttpMessageHandlerAdapter看适配器模式