C# 发生控制器冲突时,自定义ControllerFactory不会替换DefaultControllerFactory

C# 发生控制器冲突时,自定义ControllerFactory不会替换DefaultControllerFactory,c#,asp.net-mvc-4,asp.net-mvc-areas,controller-factory,C#,Asp.net Mvc 4,Asp.net Mvc Areas,Controller Factory,我有一个自定义控制器工厂(与我的问题相关的非常基本的实现): 它在global.asax中注册如下: protected void Application_Start() { ControllerBuilder.Current.SetControllerFactory(typeof(MyControllerFactory)); // other code here } 如果在解决控制器时没有冲突(例如,在解决过程中只找到一个控制器),则会正确命中此控制器工厂中设置的断点。但是

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

它在
global.asax中注册如下:

protected void Application_Start()
{
    ControllerBuilder.Current.SetControllerFactory(typeof(MyControllerFactory));

    // other code here
}
如果在解决控制器时没有冲突(例如,在解决过程中只找到一个控制器),则会正确命中此控制器工厂中设置的断点。但是,如果我有两个同名的控制器(在我的示例中:一个在区域中,一个不在区域中),但没有在路由中使用名称空间约束,则不会命中我的控制器,并且
DefaultControllerFactory
接管并抛出(预期的)异常


我的问题

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


我想做的事


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

您可以尝试使用全局命名空间优先级。您可以使用
ControllerBuilder.Current.defaultnamespace的
Add
方法来添加应具有更高优先级的名称空间。所有添加的名称空间都具有相同的优先级,无论您添加它们的顺序如何,但它们的优先级高于未添加的名称空间。因此,您可以使用此方法添加配置指定的命名空间,这将导致它首先在那里进行搜索。您只需将其添加到您的
应用程序\u Start
,可能在您注册控制器工厂的行之后:

ControllerBuilder.Current.DefaultNamespaces.Add("MyControllerNamespace");
您还可以在名称空间名称后添加“.*”以使其也搜索子名称空间


如果出现名称冲突时默认实现遇到阻碍,您还可以直接实现IControllerFactory
接口,而不是扩展
DefaultControllerFactory

您可以尝试使用全局命名空间优先级。您可以使用
ControllerBuilder.Current.defaultnamespace的
Add
方法来添加应具有更高优先级的名称空间。所有添加的名称空间都具有相同的优先级,无论您添加它们的顺序如何,但它们的优先级高于未添加的名称空间。因此,您可以使用此方法添加配置指定的命名空间,这将导致它首先在那里进行搜索。您只需将其添加到您的
应用程序\u Start
,可能在您注册控制器工厂的行之后:

ControllerBuilder.Current.DefaultNamespaces.Add("MyControllerNamespace");
您还可以在名称空间名称后添加“.*”以使其也搜索子名称空间

如果出现名称冲突时默认实现遇到阻碍,也可以直接实现IControllerFactory
接口,而不是扩展
DefaultControllerFactory