0

在我的 MVC 2 项目中,我最初使用 Ninject 2 并编写了这个版本的 NinjectControllerFactory:

public class NinjectControllerFactory : DefaultControllerFactory
{
    private IKernel kernel = new StandardKernel(new HandiGamerServices());

    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
    {
        try
        {
            if (controllerType == null)
            {
                return base.GetControllerInstance(requestContext, controllerType);
                // return null;
            }
        }
        catch (HttpException ex)
        {
            if (ex.GetHttpCode() == 404)
            {
                IController errorController = kernel.Get<ErrorController>();
                ((ErrorController)errorController).InvokeHttp404(requestContext.HttpContext);

                return errorController;
            }
            else
            {
                throw ex;
            }
        }

        return (IController)kernel.Get(controllerType);
    }

最重要的是检索我的 ErrorController,它允许我优雅地处理大量 HTTP 错误。

问题是我通过 Nuget 升级到 MVC 2 扩展,所以已经提供了 NinjectControllerFactory。是否可以使用我自己的 GetControllerInstance 覆盖?如果是这样,怎么做?

4

1 回答 1

1

我正是这样做的,并且出于同样的原因。在Global.asax.cs中,我将其添加到我的OnApplicationStarted覆盖中(在 中声明为虚拟NinjectHttpApplication):

ControllerBuilder.Current.SetControllerFactory(
    new MyControllerFactory(ControllerBuilder.Current.GetControllerFactory()));

这意味着您正在创建自己的控制器工厂,但为其提供默认实现以完成繁重的工作。

然后像这样定义你的控制器工厂:

public class MyControllerFactory : IControllerFactory
{
    private IControllerFactory defaultFactory;

    public MyControllerFactory(IControllerFactory defaultFactory)
    {
        this.defaultFactory = defaultFactory;
    }

    public IController CreateController(RequestContext requestContext, string controllerName)
    {
        try
        {
            var controller = defaultFactory.CreateController(requestContext, controllerName);
            return controller;
        }
        catch (HttpException e)
        {
            // Pasted in your exception handling code here:
            if (ex.GetHttpCode() == 404)
            {
                IController errorController = kernel.Get<ErrorController>();
                ((ErrorController)errorController).InvokeHttp404(requestContext.HttpContext);

                return errorController;
            }
            else
            {
                throw ex;
            }
        }
    }

    public SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName)
    {
        return defaultFactory.GetControllerSessionBehavior(requestContext, controllerName);
    }

    public void ReleaseController(IController controller)
    {
        defaultFactory.ReleaseController(controller);
    }
}

如您所见,我们只是在大多数情况下使用默认(Ninject)控制器工厂,除非它找不到页面。要获取错误控制器,您可以像以前一样传入,也可以使用错误控制器名称进行kernel调用。defaultFactory.CreateController

于 2012-05-10T19:13:33.623 回答