我已经实现了一个自定义路由(从RouteBase继承),以根据存储在数据库中的数据获得动态路由。处理完毕后,此路由最终返回包含的RouteData 1)EF实体 2)行动 3)控制器
所有工作都按预期工作,除了我希望控制器值是控制器的完整类型名称(我允许我的用户从管理面板中选择它)或单词“自动”。如果选择了Auto,我使用结构图来定位实现通用Controller< TEntityType>的控制器。为此,我使用路由数据返回一个MvcRouteHandler,并将自定义控制器工厂传递给它的构造函数。
经过一番挖掘后,我意识到MvcRouteHandler没有将该控制器工厂传递给它创建的MvcHandler,因此我的自定义控制器工厂永远不会被调用,路由总是会失败。 我不知道我有什么替代方案。我想我可能会设置一般的控制器工厂,但我觉得这是错误的,因为只有我的自定义路由处理的请求应该有自定义控制器工厂。
提前致谢, 约翰
答案 0 :(得分:1)
最后,以下工作。唯一的灰色点是框架不传递RequestContext的ReleaseController方法。这是可以的,因为所有方法都是在控制器上调用dispose,如果它实现了IDisposible,那么默认实现就可以了。
public class RouteControllerFactory : IControllerFactory
{
private readonly DefaultControllerFactory Default = new DefaultControllerFactory();
public IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName)
{
return (requestContext.RouteData.Values.TryGetValue("controllerfactory") as IControllerFactory ?? Default).CreateController(requestContext, controllerName);
}
public System.Web.SessionState.SessionStateBehavior GetControllerSessionBehavior(System.Web.Routing.RequestContext requestContext, string controllerName)
{
return (requestContext.RouteData.Values.TryGetValue("controllerfactory") as IControllerFactory ?? Default).GetControllerSessionBehavior(requestContext, controllerName);
}
public void ReleaseController(IController controller)
{
Default.ReleaseController(controller);
}
}
要注册控制器工厂,请使用 ControllerBuilder.Current.SetControllerFactory(typeof运算(RouteControllerFactory));
在Application_Start