当控制器发生冲突时,Custom ControllerFactory不会替换DefaultControllerFacto

本文关键字:ControllerFactory 替换 DefaultControllerFacto Custom 控制器 冲突 | 更新日期: 2023-09-27 18:30:01

我有一个自定义控制器工厂(与我的问题相关的非常基本的实现):

public class MyControllerFactory : DefaultControllerFactory
{
    public override IController CreateController(RequestContext requestContext, string controllerName)
    {    
        var controller = base.CreateController(requestContext, controllerName);
        return controller;
    }
    protected override System.Web.SessionState.SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, Type controllerType)
    {
        return base.GetControllerSessionBehavior(requestContext, controllerType);
    }
}

global.asax中注册如下:

protected void Application_Start()
{
    ControllerBuilder.Current.SetControllerFactory(typeof(MyControllerFactory));
    // other code here
}

当解决控制器时没有冲突时(例如,在解决过程中只找到一个控制器),该控制器工厂中设置的断点会正确命中。但是,当我有两个具有相同名称的控制器(在我的情况下:一个在区域中,一个不在区域中)而不使用路由中的名称空间约束时,我的控制器没有被命中,DefaultControllerFactory接管并抛出(预期的)异常。


我的问题

我是否正确注册了MyControllerFactory?在我上面概述的情况下,它没有被使用还有其他原因吗?


我想做什么

我正在尝试编写一个ControllerFactory,它自动使用(配置指定的)区域中定义的控制器(即,如果发生冲突,如上所述,请使用区域控制器而不是非区域控制器)。如果该区域不包含匹配的控制器,则回退到不在区域中的控制器。

当控制器发生冲突时,Custom ControllerFactory不会替换DefaultControllerFacto

您可以尝试使用全局命名空间优先级。您可以使用ControllerBuilder.Current.DefaultNamespacesAdd方法来添加应该被赋予更高优先级的命名空间。所有添加的名称空间都具有相同的优先级,添加它们的顺序并不重要,但它们的优先级高于未添加的名称。因此,您可以使用此方法添加您的config指定的命名空间,这应该会导致它首先在那里搜索。你只需将其添加到你的Application_Start中,也许在你的线路之后注册你的控制器工厂:

ControllerBuilder.Current.DefaultNamespaces.Add("MyControllerNamespace");

您还可以在名称空间名称后添加一个".*",使其也可以搜索子名称空间。

如果发生名称冲突时默认实现会妨碍操作,那么您也可以直接实现IControllerFactory接口,而不是扩展DefaultControllerFactory

相关文章:
  • 没有找到相关文章