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

來源:互聯網
上載者:User
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

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.