System.Web.Abstractions中的裝飾者模式,及其在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類的(例如HttpApplicationStateWraper與HttpApplicationStateBase)。
Wrapper類使用建構函式將原來的HttpApplicationState等類的例項傳入。並用
在初始化時用以下方法將System.Web程式集中的HttpApplicationState類的物件傳入
public HttpApplicationStateWrapper(HttpApplicationState httpApplicationState){
if (httpApplicationState ==null)
{
thrownew ArgumentNullException("httpApplicationState");
}
this._application = httpApplicationState;
}
然後使用索引器設定其訪問方式
publicoverrideobjectthis[int index]{
get
{
returnthis._application[index];
}
}
及
Code使之可以訪問,再加上實現了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中
protectedvirtualvoid ProcessRequest(HttpContext httpContext) {HttpContextBase iHttpContext =new HttpContextWrapper(httpContext);
ProcessRequest(iHttpContext);
}
這個方法在HtmlHelper的RenderRoute中有使用到過:
publicstaticvoid 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