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类的(例如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

 

 

时间: 2024-09-25 11:02:08

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

如何在 ASP.NET MVC 中集成 AngularJS(2)

在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩.应用程序版本自动刷新和工程构建等内容. 下面介绍如何在 ASP.NET MVC 中集成 AngularJS 的第二部分. ASP.NET 捆绑和压缩 CSS 和 JavaScript 的捆绑与压缩功能是 ASP.NET MVC 最流行和有效的特性之一.捆绑和压缩降低了 HTTP 请求和有效载荷的大小,结果是可以更快和更好的执行 ASP.NET MVC 的网站.有许多可以减少 CS

ASP.NET MVC中图表控件的使用方法_实用技巧

微软发布了一个强大的ASP.NET的图表控件,支持丰富的图表选项设置-包括列,点,泡沫,饼图,圆环图,金字塔,漏斗,盒形图,面积,范围,AJAX的互动,以及更多.Microsoft图表控件示例项目包括ASP.NET页的图表样本超过200个.在这篇文章中,我将展示如何在ASP.NET MVC中使用图表控件. 这里介绍一个非常简单的项目,显示了一个类的结果比较.两个字段 - ID(这是唯一的一个学生)和GPA(平均成绩) - 代表一个特定的学生的结果.各种图表结果显示,学生的结果进行比较.我希望把重

理解和用好System.Web.Abstractions.dll

ASP.NET中,所有的上下文对象(HttpContext,HttpReqeust,HttpResponse-)都没有进行抽象,而 且它们都是自我封闭的对象,我们无法对它进行扩展和修改.虽然它们都提供公有构造器,我们可能也可 以追溯到请求管道的源头,去自己实例化HttpContext,可是它们的大部分方法都是封闭的,不可重写的 ,这样使得我们在做多工作的时候无法称心如意,甚至于四处碰壁. ASP.NET MVC由于要提高可扩展性的可测试性,这就要求这些上下文环境中在测试环境中可以被模拟, 甚至于

未能加载文件或程序集“System.Web.Abstractions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e3

问题描述 我的站点在本地服务器上运行和发布都没有问题.(有安装了VS2008)但是放到远程虚拟服务器上运行时却总是出现一下的错误"未能加载文件或程序集"System.Web.Abstractions,Version=3.5.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35"或它的某一个依赖项.系统找不到指定的文件."同样作为服务器,为什么到远程虚拟服务器上程序就运行不了了呢? 解决方案 解决方案二:该回复于200

包含在ASP.NET MVC中的过滤器

在深入研究如何编写过滤器之前,首先看看包含在ASP.NET MVC中的过滤器. ASP.NET MVC包括了如下3种即开即用的动作过滤器: Authorize:该过滤器用于限制对控制器或控制器动作的访问. HandleError:该过滤器用来指定一个处理异常的动作,这个异常是从动作方法的内部抛出的. OutputCache:该过滤器用来为动作方法提供输出的缓存. 接下来将依次深入讨论这3个过滤器. 1  Authorize AuthorizeAttribute是包含在ASP.NET MVC中默认

如何在 ASP.NET MVC 中集成 AngularJS(3)

今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容. 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后,我意识到,我必须提供两个版本的路由表:一个运行在调试模式的应用程序下和一个运行在发布模式的应用程序下.在调试模式下,JavaScript 文件在未使用压缩功能的情况下会被下载.如果想要调试并在 JavaScript 控制器中设置断点,这是必须的.事实上,路由表的产生版本也出现了一些挑战,由于产生路由代码使用的是 JavaScript

如何在 ASP.NET MVC 中集成 AngularJS(1)

介绍 当涉及到计算机软件的开发时,我想运用所有的最新技术.例如,前端使用最新的 JavaScript 技术,服务器端使用最新的基于 REST 的 Web API 服务.另外,还有最新的数据库技术.最新的设计模式和技术. 当选择最新的软件技术时,有几个因素在起作用,其中包括如何将这些技术整合起来.过去两年中,我最喜欢的一项技术就是设计单页面应用(SPA)的 AngularJS.作为一个微软stack开发者,我也是使用 ASP.NET MVC 平台实现 MVC 设计模式和并进行研究的粉丝,包括它的捆

ASP.NET MVC中实现多个按钮提交的几种方法

有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较麻烦点. 方法一:使用客户端脚本 比如我们在View中这样写: 代码<inputtype="submit"value="审核通过"onclick='this.form.action="<%=Url.Action("Action1"

在 ASP.NET MVC 中使用 HTTPS

某些安全性较高的网页,如网上支付或用户登陆页面,可能会使用到https(SSL/TLS)来提高安全性.本文介绍了如何在ASP.NET MVC中强制某action使用https和如何进行向https页面的跳转. 我们先实现强制一个action使用https.这里写了一个RequireHttpsAttribute,它的作用是将非https连接转换成https连接,这样所有使用了RequireHttps这个filter的controller都会强制使用https连接.   1 using System