System.Web.Abstractions中的装饰者模式,及其在Asp.net Mvc中的应用

简介: Wrapper模式的实现 作为.net framework 3.5 sp1 新添加的一个程序集,System.Web.Abstractions里所有的类,都是Wrapper/Decorator模式的。

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];
    }
}

 及

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Code
public override object this[string name]
{
    
get
    {
        
return this._application[name];
    }
    
set
    {
        
this._application[name] = value;
    }
}

使之可以访问,再加上实现了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

 

 

目录
相关文章
|
存储 Shell Linux
快速上手基于 BaGet 的脚本自动化构建 .net 应用打包
本文介绍了如何使用脚本自动化构建 `.net` 应用的 `nuget` 包并推送到指定服务仓库。首先概述了 `BaGet`——一个开源、轻量级且高性能的 `NuGet` 服务器,支持多种存储后端及配置选项。接着详细描述了 `BaGet` 的安装、配置及使用方法,并提供了 `PowerShell` 和 `Bash` 脚本实例,用于自动化推送 `.nupkg` 文件。最后总结了 `BaGet` 的优势及其在实际部署中的便捷性。
596 10
|
3月前
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
234 0
|
9月前
|
C# Android开发 iOS开发
2025年全面的.NET跨平台应用框架推荐
2025年全面的.NET跨平台应用框架推荐
363 23
|
10月前
|
XML 前端开发 安全
Spring MVC:深入理解与应用实践
Spring MVC是Spring框架提供的一个用于构建Web应用程序的Model-View-Controller(MVC)实现。它通过分离业务逻辑、数据、显示来组织代码,使得Web应用程序的开发变得更加简洁和高效。本文将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring MVC,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
530 2
|
11月前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
185 5
|
11月前
|
JSON 算法 安全
JWT Bearer 认证在 .NET Core 中的应用
【10月更文挑战第30天】JWT(JSON Web Token)是一种开放标准,用于在各方之间安全传输信息。它由头部、载荷和签名三部分组成,用于在用户和服务器之间传递声明。JWT Bearer 认证是一种基于令牌的认证方式,客户端在请求头中包含 JWT 令牌,服务器验证令牌的有效性后授权用户访问资源。在 .NET Core 中,通过安装 `Microsoft.AspNetCore.Authentication.JwtBearer` 包并配置认证服务,可以实现 JWT Bearer 认证。具体步骤包括安装 NuGet 包、配置认证服务、启用认证中间件、生成 JWT 令牌以及在控制器中使用认证信息
406 2
|
设计模式 开发框架 前端开发
MVC 模式在 C# 中的应用
MVC(Model-View-Controller)模式是广泛应用于Web应用程序开发的设计模式,将应用分为模型(存储数据及逻辑)、视图(展示数据给用户)和控制器(处理用户输入并控制模型与视图交互)三部分,有助于管理复杂应用并提高代码可读性和维护性。在C#中,ASP.NET MVC框架常用于构建基于MVC模式的Web应用,通过定义模型、控制器和视图,实现结构清晰且易维护的应用程序。
197 2
|
数据采集 JSON API
.NET 3.5 中 HttpWebRequest 的核心用法及应用
【9月更文挑战第7天】在.NET 3.5环境下,HttpWebRequest 类是处理HTTP请求的一个核心组件,它封装了HTTP协议的细节,使得开发者可以方便地发送HTTP请求并接收响应。本文将详细介绍HttpWebRequest的核心用法及其实战应用。
490 6
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
211 7
|
前端开发 测试技术 开发者
MVC模式在现代Web开发中有哪些优势和局限性?
MVC模式在现代Web开发中有哪些优势和局限性?