0

私のMVC2プロジェクトでは、もともと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 に答える