System.Web.Abstractions中的装饰者模式,及其在Asp.net Mvc中的应用

出处:http://www.cnblogs.com/chsword/archive/2008/08/25/1272117.html

Wrapper模式的实现

作为.net framework 3.5 sp1 新添加的一个程序集,System.Web.Abstractions里所有的类,都是Wrapper/Decorator模式的。(System.Web.Abstractions里的类可以参见后面的附录,System.Web.Abstractions其实也早早出现在了Asp.net Mvc中

 

在这里,所有的Wrapper类都是继承于Base类的(例如HttpApplicationStateWraperHttpApplicationStateBase)。

Wrapper类使用构造函数将原来的HttpApplicationState等类的实例传入。并用this[]实现了可以读取。


在初始化时用以下方法将System.Web程序集中的HttpApplicationState类的对象传入

public  HttpApplicationStateWrapper(HttpApplicationState httpApplicationState)
{
    
if  (httpApplicationState  ==   null )
    {
        
throw   new  ArgumentNullException( " httpApplicationState " );
    }
    
this ._application  =  httpApplicationState;
}

 然后使用索引器设置其访问方式

public   override   object   this [ int  index]
{
    
get
    {
        
return   this ._application[index];
    }
}

 及


public override object this[string name]
{
    
get
    {
        
return this._application[name];
    }
    
set
    {
        
this._application[name] = value;
    }
}

使之可以访问,再加上实现了Base类中的各种方法,这样,就实现了Wrapper/Decorator模式

 

但有一点要注意:HttpApplicationStateHttpApplicationStateBase并非同一个类,这一点与装饰者模式有些冲突。这是因为当初在建立HttpApplicationState并没有想到日后的扩展性,所以没有对它进行抽像类的处理,所以在3.5sp1中又加入了和它的成员几近相同的HttpApplicationStateBase。当然其它类也是这样。所以UML如下图

 

 

 

其实Wrapper要实现的功能是这样的

 

 

当然,其它的Wrapper也是这样。

正是由于有了这么好的扩展所以在其应用中可以比较方便地扩展出新的ApplicationSession存储方式。

Asp.ne tMvc中的应用

Asp.net MvcController类中Session的声明方式:

public HttpSessionStateBase Session { get; }

这里就使用了HttpSessionStateBase类,这样就可以很方便地扩展Wrapper

Asp.net中所有的Context都是由HttpContext来创建的因为ApplicationServer这些对象都是它的属性。

Mvc创建HttpContextMvcHandler

 

 

protected   virtual   void  ProcessRequest(HttpContext httpContext) {
            HttpContextBase iHttpContext 
=   new  HttpContextWrapper(httpContext);
            ProcessRequest(iHttpContext);
        }

 

这个方法在HtmlHelperRenderRoute中有使用到过:

 

public   static   void  RenderRoute( this  HtmlHelper helper, RouteValueDictionary values) {
            var routeData 
=   new  RouteData();
            
foreach  (var kvp  in  values) {
                routeData.Values.Add(kvp.Key, kvp.Value);
            }
            var httpContext 
=  helper.ViewContext.HttpContext;
            var requestContext 
=   new  RequestContext(httpContext, routeData);
            var handler 
=   new  RenderActionMvcHandler(requestContext);
            handler.ProcessRequestInternal(httpContext);
        }

 

其中RenderActionMvcHandler是MvcHandler的一个继承。

 

附录:System.Web.Abstractions中的类及Wrapper

HttpApplicationStateBase

HttpApplicationStateWrapper

 

HttpBrowserCapabilitiesBase

HttpBrowserCapabilitiesWrapper

 

HttpCachePolicyBase

HttpCachePolicyWrapper

 

 HttpContextBase

HttpContextWrapper

 

 HttpFileCollectionBase

 HttpFileCollectionWrapper

 

HttpPostedFileBase

 HttpPostedFileWrapper

 

 HttpRequestBase

 HttpRequestWrapper

 

HttpResponseBase

 HttpResponseWrapper

 

HttpServerUtilityBase

 HttpServerUtilityWrapper

 

HttpSessionStateBase

 HttpSessionStateWrapper

 

 HttpStaticObjectsCollectionBase

 HttpStaticObjectsCollectionWrapper

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值