先来个图预览一下:

1.首先是System.Web.Routing下的RequestContext类,代码相当简单,把HttpContextBase和RouteData放在一起就OK了。

Code
using System;
using System.Security.Permissions;
using System.Web;

namespace System.Web.Routing


{
[AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal),
AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
public class RequestContext

{
// Methods
public RequestContext(HttpContextBase httpContext, RouteData routeData)

{
if (httpContext == null)
throw new ArgumentNullException("httpContext");
if (routeData == null)
throw new ArgumentNullException("routeData");
this.HttpContext = httpContext;
this.RouteData = routeData;
}

// Properties

public HttpContextBase HttpContext
{ get; internal set; }


public RouteData RouteData
{ get; internal set; }
}
}
关于RouteData,我以后会讲的,现在只需要知道它存储了Route信息,从URL中根据Route规则Map到的参数值都在里面。
2.接着就是ControllerContext类了,这个类很有意思:
using System.Security.Permissions;

namespace System.Web.Mvc


{
using System.Web.Routing;

[AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
public class ControllerContext : RequestContext

{
protected internal ControllerContext(ControllerContext controllerContext)

: this(GetControllerContext(controllerContext), GetControllerContext(controllerContext).Controller)
{}

public ControllerContext(HttpContextBase httpContext, RouteData routeData, ControllerBase controller)
: base(httpContext, routeData)

{
if (controller == null) throw new ArgumentNullException("controller");
Controller = controller;
}

public ControllerContext(RequestContext requestContext, ControllerBase controller)
: this(

GetRequestContext(requestContext).HttpContext, GetRequestContext(requestContext).RouteData, controller)
{}


public ControllerBase Controller
{ get; private set; }

internal static RequestContext GetRequestContext(RequestContext requestContext)

{
if (requestContext == null) throw new ArgumentNullException("requestContext");
return requestContext;
}

internal static ControllerContext GetControllerContext(ControllerContext controllerContext)

{
if (controllerContext == null) throw new ArgumentNullException("controllerContext");
return controllerContext;
}
}
}
其实它也就是在RequestContext的基础上加了个对Controller的引用(当然是对ControllerBase基类的引用)。
它的几个重载的构造函数以及静态方法写得很有意思,值得借鉴。
3.