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

本文介绍了.NET Framework 3.5 SP1中System.Web.Abstractions程序集中Wrapper模式的实现原理及应用,重点讲解了如何通过Wrapper类扩展HttpApplicationState等对象,并展示了在ASP.NET MVC中的具体实践。
 

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];
    }
}

 及

Code

使之可以访问,再加上实现了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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值