MVC 3 ninjectバインドレイジー評価パラメーター

asp.net-mvc ninject ninject.web.mvc
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().To().WithConstructorArgument("storageFolderAbsolutePath", c => c.ToString());

問題はラムダ関数にあります。 Server.MapPath( “/”)を返したい…​ しかし、cオブジェクトにはリクエストコンテキストがありません。 どうすれば送信できますか?

  3  1


ベストアンサー

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

プロバイダーを登録するには(デリゲートを使用してサービスを解決するには)、

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

ただし、「HttpContext.Current」はWebリクエストごとに作成されるため、「IFilesRepository」のライフスタイルは「Webリクエストごと」のライフスタイルに変更する必要がある可能性が高いため、保持したくないライフスタイルが長い「IFilesRepository」でその上に。 より長いライフスタイルで `IFilesRepository`を使用できるように、「マッピングパス」機能を抽象化することができます。

1


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

0


タイトルとURLをコピーしました