当控制器发生冲突时,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
,它自动使用(配置指定的)区域中定义的控制器(即,如果发生冲突,如上所述,请使用区域控制器而不是非区域控制器)。如果该区域不包含匹配的控制器,则回退到不在区域中的控制器。
您可以尝试使用全局命名空间优先级。您可以使用ControllerBuilder.Current.DefaultNamespaces
的Add
方法来添加应该被赋予更高优先级的命名空间。所有添加的名称空间都具有相同的优先级,添加它们的顺序并不重要,但它们的优先级高于未添加的名称。因此,您可以使用此方法添加您的config指定的命名空间,这应该会导致它首先在那里搜索。你只需将其添加到你的Application_Start
中,也许在你的线路之后注册你的控制器工厂:
ControllerBuilder.Current.DefaultNamespaces.Add("MyControllerNamespace");
您还可以在名称空间名称后添加一个".*",使其也可以搜索子名称空间。
如果发生名称冲突时默认实现会妨碍操作,那么您也可以直接实现IControllerFactory
接口,而不是扩展DefaultControllerFactory
。