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类的对象传入
{
if (httpApplicationState == null)
{
throw new ArgumentNullException("httpApplicationState");
}
this._application = httpApplicationState;
}
然后使用索引器设置其访问方式
{
get
{
return this._application[index];
}
}
及
使之可以访问,再加上实现了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中
HttpContextBase iHttpContext = new HttpContextWrapper(httpContext);
ProcessRequest(iHttpContext);
}
这个方法在HtmlHelper的RenderRoute中有使用到过:
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