我有一个自定义控制器工厂(与我的问题相关的非常基本的实现):
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
,它自动使用在(config-specified)区域中定义的控制器(即如果发生冲突,如上所述,请使用区域控制器而不是非区域控制器)。如果该区域不包含匹配的控制器,则回退到不在区域中的控制器。
答案 0 :(得分:1)
您可以尝试使用全局命名空间优先级。您使用Add
ControllerBuilder.Current.DefaultNamespaces
方法添加应该赋予更高优先级的命名空间。添加的所有命名空间都具有相同的优先级,您添加它们的顺序无关紧要,但它们的优先级高于未添加的命名空间。因此,您可以使用此方法添加配置指定的命名空间,这应该使它首先在那里搜索。您只需将其添加到Application_Start
中,也可以在您的行之后注册您的控制器工厂:
ControllerBuilder.Current.DefaultNamespaces.Add("MyControllerNamespace");
您还可以在命名空间名称后添加“。*”,以便搜索子命名空间。
如果在名称冲突时默认实现受到影响,您也可以直接实现IControllerFactory
接口,而不是扩展DefaultControllerFactory
。