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

本文介绍了.NET Framework 3.5 SP1中System.Web.Abstractions程序集中Wrapper模式的实现原理及其在Asp.net Mvc中的应用。通过继承Base类,并利用构造函数传递原始对象,实现了对象的包装,便于后续功能的扩展。
出处: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类的(例如HttpApplicationStateWraper与HttpApplicationStateBase)。

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


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

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> public HttpApplicationStateWrapper(HttpApplicationStatehttpApplicationState)
{
if (httpApplicationState == null )
{
throw new ArgumentNullException( " httpApplicationState " );
}
this ._application = httpApplicationState;
}

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

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> public override object this [ int index]
{
get
{
return this ._application[index];
}
}

ContractedBlock.gif ExpandedBlockStart.gif Code
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicoverrideobjectthis[stringname]
{
get
{
returnthis._application[name];
}
set
{
this._application[name]=value;
}
}

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

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

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

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

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

在Asp.ne tMvc中的应用

如Asp.net Mvc的Controller类中Session的声明方式:

public HttpSessionStateBase Session { get; }

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

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

Mvc创建HttpContext在MvcHandler中

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> protected virtual void ProcessRequest(HttpContexthttpContext){
HttpContextBaseiHttpContext
= new HttpContextWrapper(httpContext);
ProcessRequest(iHttpContext);
}

这个方法在HtmlHelper的RenderRoute中有使用到过:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> public static void RenderRoute( this HtmlHelperhelper,RouteValueDictionaryvalues){
varrouteData
= new RouteData();
foreach (varkvp in values){
routeData.Values.Add(kvp.Key,kvp.Value);
}
varhttpContext
= helper.ViewContext.HttpContext;
varrequestContext
= new RequestContext(httpContext,routeData);
varhandler
= 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、付费专栏及课程。

余额充值