1

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

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自动使用在(配置指定)区域中定义的控制器(即,如果发生冲突,如上所述,使用区域控制器而不是非区域控制器)。如果该区域不包含匹配的控制器,请退回到不在该区域中的控制器。

4

1 回答 1

1

您可以尝试使用全局命名空间优先级。您使用 的Add方法ControllerBuilder.Current.DefaultNamespaces来添加应该给予更高优先级的命名空间。所有添加的命名空间都具有相同的优先级,无论您添加它们的顺序是什么,但它们的优先级高于未添加的命名空间。因此,您可以使用此方法添加配置指定的命名空间,这应该会导致它首先在那里搜索。您只需将其添加到您的 中Application_Start,也许在您注册控制器工厂的行之后:

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

您还可以在命名空间名称后添加“.*”,以使其也搜索子命名空间。

如果在发生名称冲突时默认实现妨碍了您,您也可以直接实现IControllerFactory接口而不是扩展接口。DefaultControllerFactory

于 2013-09-03T21:29:30.750 回答