gpt4 book ai didi

c# - 每条路线的 Controller 工厂

转载 作者:太空宇宙 更新时间:2023-11-03 14:07:24 25 4
gpt4 key购买 nike

我已经实现了一个自定义路由(继承自 RouteBase)以根据存储在数据库中的数据获得动态路由。处理后,该路由最终返回包含的 RouteData1) 一个EF实体2) Action 3) Controller

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

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

提前致谢,约翰

最佳答案

最后是下面的作品。唯一的灰点是框架没有向其传递 RequestContext 的 ReleaseController 方法。不过这没关系,因为如果 Controller 实现了 IDisposible,那么该方法所做的就是在 Controller 上调用 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);
}
}

要注册 Controller 工厂,只需使用 ControllerBuilder.Current.SetControllerFactory(typeof(RouteControllerFactory));

在 Application_Start

关于c# - 每条路线的 Controller 工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8953639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com