`
izuoyan
  • 浏览: 8946426 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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类的对象传入

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

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

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicoverrideobjectthis[intindex]
{
get
{
returnthis._application[index];
}
}


<!--<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模式

但有一点要注意: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

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

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

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicstaticvoidRenderRoute(thisHtmlHelperhelper,RouteValueDictionaryvalues){
varrouteData
=newRouteData();
foreach(varkvpinvalues){
routeData.Values.Add(kvp.Key,kvp.Value);
}
varhttpContext
=helper.ViewContext.HttpContext;
varrequestContext
=newRequestContext(httpContext,routeData);
varhandler
=newRenderActionMvcHandler(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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics