快捷搜索:

理解和用好System.Web.Abstractions.dll

ASP.NET中,所有的高低文工具(HttpContext,HttpReqeust,HttpResponse…)都没有进行抽象,而 且它们都是自我封闭的工具,我们无法对它进行扩展和改动。虽然它们都供给公有构造器,我们可能也可 以追溯到哀求管道的泉源,去自己实例化HttpContext,可是它们的大年夜部分措施都是封闭的,弗成重写的 ,这样使得我们在做多事情的时刻无法遂心如愿,以致于四处碰鼻。

ASP.NET MVC因为要前进可扩展性的可测试性,这就要求这些高低文情况中在测试情况中可以被模拟, 以致于在Web情况中也必要被调换,是以在ASP.NET MVC正式版出来之前的.NET 3.5中,微软率先在 Framewrok中增添了ASP.NET MVC所依附的路由组件(System.Web.Routing.dll),同时也增添了一个对原 有ASP.NET高低文工具进行抽象和包装的法度榜样集,这便是System.Web.Abstractions.dll。这个法度榜样集本身 的代码异常简单,只是对这些工具的现有接口的抽象和适配包装,然则它对付我们今后对MVC法度榜样的扩展 却有着至关紧张的影响。在MVC法度榜样中,我们应只管即便少用或不用原生的高低文工具,转而应用新包装过的 HttpContextBase,HttpRequestBase之类的工具,削减对WEB情况的依附,这样可以大年夜大年夜前进可测试性, 同时也可以扩展我们法度榜样的可扩展性。

下面是在Kooboo中,必要调换哀求高低文工具的一个例子。在Kooboo中,根据要求,我们必要在路由 解析之前做一些工作,改动响应的哀求情况,是以我们必要调换和改动 HttpRequestBase工具,这个工具 是被包孕在HttpContextBase中实例化,是以我们只要调换HttpContextBase这个工具的实现(默认实例为 :HttpContextWrapper),接下来的工作就都在我们的掌控之中。

首先我们找到实例化 HttpContextWrapper的泉源之地,在System.Web.Routing.UrlRoutingModule中 ,我们可以找到实例化 HttpContextWrapper的代码,并且我们也可以看到在它的 PostResolveRequestCache函数中,它头一句代码便是去解析路由,以下是 System.Web.Routing.UrlRoutingModule的完备代码:

001 [AspNetHostingPermission(SecurityAction.InheritanceDemand,  Level=AspNetHostingPermissionLevel.Minimal), AspNetHostingPermission (SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)]

002 public  class UrlRoutingModule : IHttpModule

003 {

004     // Fields

005      private static readonly object _requestDataKey = new object();

006      private RouteCollection _routeCollection;

007

008     // Methods

009      protected virtual void Dispose()

010     {

011     }

012

013      protected virtual void Init(HttpApplication application)

014      {

015         application.PostResolveRequestCache += new EventHandler (this.OnApplicationPostResolveRequestCache);

016          application.PostMapRequestHandler += new EventHandler (this.OnApplicationPostMapRequestHandler);

017     }

018

019     private  void OnApplicationPostMapRequestHandler(object sender, EventArgs e)

020      {

021         HttpContextBase context = new HttpContextWrapper (((HttpApplication) sender).Context);

022         this.PostMapRequestHandler (context);

023     }

024

025     private void  OnApplicationPostResolveRequestCache(object sender, EventArgs e)

026     {

027          HttpContextBase context = new HttpContextWrapper(((HttpApplication)  sender).Context);

028         this.PostResolveRequestCache(context);

029      }

030

031     public virtual void PostMapRequestHandler(HttpContextBase  context)

032     {

033         RequestData data = (RequestData)  context.Items[_requestDataKey];

034         if (data != null)

035          {

036             context.RewritePath(data.OriginalPath);

037              context.Handler = data.HttpHandler;

038         }

039     }

040

041     public virtual void PostResolveRequestCache (HttpContextBase context)

042     {

043         RouteData routeData =  this.RouteCollection.GetRouteData(context);

044         if (routeData !=  null)

045         {

046             IRouteHandler routeHandler  = routeData.RouteHandler;

047             if (routeHandler == null)

048             {

049                 throw new  InvalidOperationException(string.Format(CultureInfo.CurrentUICulture,  RoutingResources.UrlRoutingModule_NoRouteHandler, new object[0]));

050              }

051             if (!(routeHandler is StopRoutingHandler))

052             {

053                 RequestContext  requestContext = new RequestContext(context, routeData);

054                  IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);

055                  if (httpHandler == null)

056                  {

057                     throw new  InvalidOperationException(string.Format(CultureInfo.CurrentUICulture,  RoutingResources.UrlRoutingModule_NoHttpHandler, new object[] { routeHandler.GetType()  }));

058                 }

059                  context.Items[_requestDataKey] = new RequestData { OriginalPath =  context.Request.Path, HttpHandler = httpHandler };

060                  context.RewritePath("~/UrlRouting.axd");

061             }

062          }

063     }

064

065     void IHttpModule.Dispose()

066      {

067         this.Dispose();

068     }

069

070      void IHttpModule.Init(HttpApplication application)

071     {

072          this.Init(application);

073     }

074

075     // Properties

076      public RouteCollection RouteCollection

077     {

078          get

079         {

080             if  (this._routeCollection == null)

081             {

082                  this._routeCollection = RouteTable.Routes;

083              }

084             return this._routeCollection;

085          }

086         set

087         {

088              this._routeCollection = value;

089         }

090     }

091

092      // Nested Types

093     private class RequestData

094      {

095         // Properties

096         public IHttpHandler  HttpHandler { get; set; }

097

098         public string OriginalPath {  get; set; }

099     }

100 }

共2页:

上一页1

2

下一页

您可能还会对下面的文章感兴趣: