1. 程式人生 > >System.Web.Abstractions中的裝飾者模式,及其在Asp.net Mvc中的應用

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類的(例如HttpApplicationStateWraperHttpApplicationStateBase)。

Wrapper類使用建構函式將原來的HttpApplicationState等類的例項傳入。並用

this[]實現了可以讀取。


在初始化時用以下方法將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模式

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

protectedvirtualvoid ProcessRequest(HttpContext httpContext) {
            HttpContextBase iHttpContext 
=new HttpContextWrapper(httpContext);
            ProcessRequest(iHttpContext);
        }

這個方法在HtmlHelperRenderRoute中有使用到過:

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