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類的對象傳入
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
public override object this[string name]
{
get
{
return this._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中
protected virtual void ProcessRequest(HttpContext httpContext) {
HttpContextBase iHttpContext = new HttpContextWrapper(httpContext);
ProcessRequest(iHttpContext);
}
這個方法在HtmlHelper的RenderRoute中有使用到過:
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