2011-10-20 13 views
3

遅延評価されたパラメータを使用してコントローラをバインドする必要があります。MVC 3 ninjectバインド遅延評価パラメータ

protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     try 
     { 
      return controllerType == null 
         ? null 
         : (IController) _ninjectKernel.Get(controllerType); 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 
    } 

は、私は次のバインディングを持っている:

_ninjectKernel.Bind<IFilesRepository>().To<FilesManager>().WithConstructorArgument("storageFolderAbsolutePath", c => c.ToString()); 

問題は、ラムダ関数です。私はServer.MapPath( "/")を返すしたいですが、私はcオブジェクトに要求コンテキストを持っていません。どうすればいいですか?

答えて

1

私はNinjectと過度に慣れていないんだけど、 HttpContextBaseを解決できるように、プロバイダにプロバイダを登録できる必要があります。これにより、IFilesRepositoryは、IFilesRepositoryのインスタンスを作成するときにプロバイダを使用してコンテナによって挿入されるコンストラクタ引数としてHttpContextBaseを取得できるようになりました。

Bind<HttpContextBase>().ToMethod(context => new HttpContextWrapper(HttpContext.Current)); 

IFilesRepositoryのライフスタイルが最も可能性が高い「のWeb要求ごと」のライフスタイルに変更する必要があること、しかし注意してください、(サービスを解決するために、デリゲートを使用して)プロバイダを登録するにはウェブリクエストごとにHttpContext.Currentが作成されるため、より長いライフスタイルを持つIFilesRepositoryのものを保持したくないからです。あなたはより長いライフスタイルを持つIFilesRepositoryを持つことができるように、 "マッピングパス"機能を抽象化したいかもしれません。

0

サーバー変数を使用すると、FilesManagerクラス内にそれを取得する必要があります現在のHttpContextに関連しているので、(あなたがする場合は、その目的のために別のインタフェースを使用して)