0

は、私はもともとNinject 2を使用してNinjectControllerFactoryこのバージョンの書いた:最も重要なのはこの古いNinject 2コードをNinject 3とMVC 2拡張(NinjectControllerFactory)で動作させるにはどうすればよいですか?私のMVC 2プロジェクトで

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); 
    } 

を私は優雅にHTTPエラーの多くを処理することができます私のErrorController、の検索です。

問題は、Nugetを使用してMVC 2拡張にアップグレードしたため、NinjectControllerFactoryが既に提供されていることです。 GetControllerInstanceの独自のオーバーライドを使用することは可能でしょうか?もしそうなら、どうですか?

答えて

1

私はまさにこれを行い、正確に同じ理由です。 Global.asax.csでは、私は(NinjectHttpApplicationに仮想宣言)私のOnApplicationStartedオーバーライドにこれを追加します。

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に電話するかのいずれかを行うことができます。

+0

Ninject文を使用しているにもかかわらず、カーネルを '参照'するための工場を取得できないようです。また、IControllerにGetControllerSessionBehaviorがないことを示すコンパイルエラーが発生します。 MVC 2とMVC 3の違いは? –

+0

はい、 'GetControllerSessionBehavior'はMVC3のみであると思われますので、単純に実装しないでください。あなたがカーネルを「見る」ことができないということが何を意味するのか分かりません。コンパイラエラーが出ていますか?エラーメッセージとは何ですか? –

+0

ああ、申し訳ありません。うん、それはコンパイラエラーだった。今私はActivationExceptionを取得しています。私がGlobal.aspx.csでNinjectHttpApplicationを使用しようとするたびに発生するようです。私はNugetを介してNinject MVC 2をインストールしました.MvcApplicationをSystem.Web.HttpApplicationから派生させておくと動作します。私はバインディングにもNinjectWebCommonのRegsiterServicesを使用することを余儀なくされています。 –

関連する問題