控制器工厂每条路线

本文关键字:条路 工厂 控制器 | 更新日期: 2023-09-27 18:20:55

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

除了我希望控制器值是控制器的完整类型名称(我允许我的用户从管理面板中选择它)或单词"自动"之外,所有操作都如预期。如果选择了Auto,则我使用结构映射来定位实现通用控制器<TEntityType>。为了做到这一点,我返回了一个MvcRouteHandler和一个自定义控制器工厂的路由数据,该工厂被传递到它的构造函数中。

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

提前感谢,John

控制器工厂每条路线

最终完成了以下工作。唯一的灰色点是ReleaseController方法,框架没有向该方法传递RequestContext。这是可以的,因为如果该方法实现IDisposible,那么它所做的就是在控制器上调用dispose,所以默认实现是可以的。

   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(类型为(RouteControllerFactory));

在Application_Start