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` 的优势及其在实际部署中的便捷性。
655 10
|
5月前
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
336 0
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
742 3
|
11月前
|
C# Android开发 iOS开发
2025年全面的.NET跨平台应用框架推荐
2025年全面的.NET跨平台应用框架推荐
461 23
|
12月前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
338 5
|
12月前
|
XML 前端开发 安全
Spring MVC:深入理解与应用实践
Spring MVC是Spring框架提供的一个用于构建Web应用程序的Model-View-Controller(MVC)实现。它通过分离业务逻辑、数据、显示来组织代码,使得Web应用程序的开发变得更加简洁和高效。本文将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring MVC,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
601 2
|
12月前
|
开发框架 .NET PHP
ASP.NET Web Pages - 添加 Razor 代码
ASP.NET Web Pages 使用 Razor 标记添加服务器端代码,支持 C# 和 Visual Basic。Razor 语法简洁易学,类似于 ASP 和 PHP。例如,在网页中加入 `@DateTime.Now` 可以实时显示当前时间。
|
开发框架 监控 .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
219 5
|
JSON 算法 安全
JWT Bearer 认证在 .NET Core 中的应用
【10月更文挑战第30天】JWT(JSON Web Token)是一种开放标准,用于在各方之间安全传输信息。它由头部、载荷和签名三部分组成,用于在用户和服务器之间传递声明。JWT Bearer 认证是一种基于令牌的认证方式,客户端在请求头中包含 JWT 令牌,服务器验证令牌的有效性后授权用户访问资源。在 .NET Core 中,通过安装 `Microsoft.AspNetCore.Authentication.JwtBearer` 包并配置认证服务,可以实现 JWT Bearer 认证。具体步骤包括安装 NuGet 包、配置认证服务、启用认证中间件、生成 JWT 令牌以及在控制器中使用认证信息
462 2
|
设计模式 开发框架 前端开发
MVC 模式在 C# 中的应用
MVC(Model-View-Controller)模式是广泛应用于Web应用程序开发的设计模式,将应用分为模型(存储数据及逻辑)、视图(展示数据给用户)和控制器(处理用户输入并控制模型与视图交互)三部分,有助于管理复杂应用并提高代码可读性和维护性。在C#中,ASP.NET MVC框架常用于构建基于MVC模式的Web应用,通过定义模型、控制器和视图,实现结构清晰且易维护的应用程序。
250 2

热门文章

最新文章