

























public class N2MVCRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
N2MVCHandler handler = new N2MVCHandler();
handler.RequestContext = requestContext;
return handler;
}
}
public class N2MVCHandler : MvcHandler
{
protected override void ProcessRequest(IHttpContext httpContext)
{
if (this.RequestContext == null)
throw new InvalidOperationException("No RequestContext");
string controllerName = this.GetRequiredString(this.RequestContext.RouteData, "controller");
IController controller = this.CreateController(controllerName);
ControllerContext controllerContext = new ControllerContext(base.RequestContext, controller);
controller.Execute(controllerContext);
}
private IController CreateController(string controllerName)
{
N2MVCConfigurationHandler config = ConfigurationManager.GetSection("Nsquared2/N2MVCSection") as N2MVCConfigurationHandler;
IN2ControllerFactory controllerFactory = N2ControllerFactoryBuilder.GetControllerFactory(config.ControllerFactory);
IController controller = controllerFactory.CreateController(base.RequestContext, controllerName);
return controller;
}
}
在这个例子中,我必须用我自己的接口来代替IControllerFactory,因为我希望传递Controller的名字而不是类型。封装在MVC Framework中的MvcHandler 里的ProcessRequest 尝试在没有程序集引用(references assemblies)的情况下定位Controller 然后创建这个类型的Controller 并把他传递给IController。CreateController 方法。但是我认为应该把寻找Controller类型的工作上移到ControllerFactory 中。下面是我的IControllerFactory 接口的具体实现。
public interface IN2ControllerFactory
{
IController CreateController(RequestContext context, string controllerName);
}
我觉得在这篇文章中使用Spring.Net和ControllerFactory来创建我的Controller。
public class N2ControllerFactory : IN2ControllerFactory
{
public IController CreateController(RequestContext context, string controllerName)
{
IResource input = new FileSystemResource(context.HttpContext.Request.MapPath("objects.xml"));
IObjectFactory factory = new XmlObjectFactory(input);
IController controller = (IController)factory.GetObject(controllerName, typeof(IController));
if (typeof(Controller).IsAssignableFrom(controller.GetType()))
{
N2MVCConfigurationHandler config = ConfigurationManager.GetSection("Nsquared2/N2MVCSection") as N2MVCConfigurationHandler;
((Controller)controller).ViewFactory = N2ViewFactoryBuilder.GetViewFactory(config.ViewFactory);
}
return controller;
}
}
ControllerFactory的责任是创建Controller 并填充他需要的所有信息,比如本例中的ViewFactory。
IViewFactory的作用是创建一个责任是创建一个View的factory。因为Controller 并不需要实现Controller 基类(Controller base class)所以我将在我的代码中使用一个“代码规则(code policy)”。我将检查创建出来的Controller 是否继承了Controller 类(Controller class)。如果继承了我就创建一个IViewFactory 并把他注入Controller。IController 接口没有ViewFactory 属性,这些信息我们将在Controller基类中得到。
如果我们再回过头来看一遍IHttpHandler (N2MVCHandler)中的CreateContoller 方法,我们来看看他是怎么在web.config中得到ControllerFactory 的。
private IController CreateController(string controllerName)
{
N2MVCConfigurationHandler config = ConfigurationManager.GetSection("Nsquared2/N2MVCSection") as N2MVCConfigurationHandler;
IN2ControllerFactory controllerFactory = N2ControllerFactoryBuilder.GetControllerFactory(config.ControllerFactory);
IController controller = controllerFactory.CreateController(base.RequestContext, controllerName);
return controller;
}
下面这些是我们在web.config中指定conrollerFactory 和viewFactory的地方。这样我们就可以在web.config中轻松指定自己的ControllerFactory 和ViewFactory 。
<Nsquared2>
<N2MVCSection
controllerFactory="MvcApplication.Models.N2ControllerFactory, MvcApplication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
viewFactory="MvcApplication.Models.N2ViewFactory, MvcApplication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</Nsquared2>
RouteTable.Routes.Add(new Route
{
Url = "[controller]/[action]/[id]",
Defaults = new { action = "Index", id = (string)null },
RouteHandler = typeof(N2MVCRouteHandler)
});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。