zoukankan      html  css  js  c++  java
  • 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)
        {
            
    throw new ArgumentNullException("httpApplicationState");
        }
        
    this._application = httpApplicationState;
    }

     然后使用索引器设置其访问方式

    public override object this[int index]
    {
        
    get
        {
            
    return this._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

    protected virtual void ProcessRequest(HttpContext httpContext) {
                HttpContextBase iHttpContext 
    = new HttpContextWrapper(httpContext);
                ProcessRequest(iHttpContext);
            }

    这个方法在HtmlHelperRenderRoute中有使用到过:

    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

  • 相关阅读:
    移动端touch与click区别--移动端开发整理笔记(五)
    移动端适配(rem & viewport)--移动端开发整理笔记(四)
    移动端事件(touchstart、touchmove、touchend)--移动端开发整理笔记(三)
    Flex弹性盒模型(新老版本完整)--移动端开发整理笔记(二)
    meta设置与去除默认样式--移动端开发整理笔记(一)
    react native ios 上架
    react16 路由按需加载、路由权限配置
    mpvue 页面预加载,新增preLoad生命周期
    mpvue 星星打分组件
    mpvue 签字组件
  • 原文地址:https://www.cnblogs.com/chsword/p/System_Web_Abstractions_Decorator_AspnetMvc.html
Copyright © 2011-2022 走看看