2012-01-21 65 views
2

我已经实现了一个自定义路由(从RouteBase继承),以便根据存储在数据库中的数据实现动态路由。处理之后,该路径最终含有 1返回的RouteData)一种EF实体 2)动作 3)控制器每个路由的控制器工厂

所有作品如预期所不同的是,我想用于控制器值是任一的一个完整的类型名控制器(我允许我的用户从管理面板中选择它)或单词“自动”。如果选择“自动”,则使用结构图查找实现通用控制器的控制器,该控制器为<TEntityType>。为此,我使用路由数据返回一个MvcRouteHandler,并将自定义控制器工厂传递给它的构造函数。

经过一点挖掘,我意识到MvcRouteHandler不会将该控制器工厂传递给它创建的MvcHandler,因此我的自定义控制器工厂从不会被调用,并且路由总是失败。 我不确定我有什么替代品,如果有的话。我想我大概可以设置控制器工厂,但我觉得这是错误的,因为只有我的自定义路由处理的请求应该有自定义控制器工厂。

由于提前, 约翰

回答

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));

at Application_Start