控制器工厂每条路线

时间:2012-01-21 14:14:43

标签: c# asp.net asp.net-mvc-3

我已经实现了一个自定义路由(从RouteBase继承),以根据存储在数据库中的数据获得动态路由。处理完毕后,此路由最终返回包含的RouteData 1)EF实体 2)行动 3)控制器

所有工作都按预期工作,除了我希望控制器值是控制器的完整类型名称(我允许我的用户从管理面板中选择它)或单词“自动”。如果选择了Auto,我使用结构图来定位实现通用Controller< TEntityType>的控制器。为此,我使用路由数据返回一个MvcRouteHandler,并将自定义控制器工厂传递给它的构造函数。

经过一番挖掘后,我意识到MvcRouteHandler没有将该控制器工厂传递给它创建的MvcHandler,因此我的自定义控制器工厂永远不会被调用,路由总是会失败。 我不知道我有什么替代方案。我想我可能会设置一般的控制器工厂,但我觉得这是错误的,因为只有我的自定义路由处理的请求应该有自定义控制器工厂。

提前致谢, 约翰

1 个答案:

答案 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