1

NinjectでMVC 3を使用しています。CreateKernel メソッドで、Global.asax.cs (NinjectHttpApplication) 内のすべてのバインディングを定義しています。

すべてのページ要求に対して実行される HTTP モジュールもあります。モジュールは、CreateKernel メソッドが既に実行された後、PreRequestHandlerExecute でそのロジックを実行します。

モジュールが構築を担当する特定のインスタンス変数にクラス型をリンクすることにより、HTTP モジュールに新しいバインディングを定義させたいと考えています。これは可能ですか?

基本的に、HttpModule では、これを実行しようとしています。

IUserContext userContext = userContextManager.GetUserContext();
Kernel.Bind<IUserContext>().ToConstant(userContext).InRequestScope();
4

1 に答える 1

1

リクエストごとに再バインドするべきではありません。一度に 1000 件のリクエストが進行中の場合、Ninject にそれらの登録を管理させることは可能ですが (たとえば.Named、バインディング メタデータ機能を使用したバインディングを介して)、コンテナーを悪用していることになります。すべきことです (まず、HttpModule各リクエストの後に登録を削除するという忙しい仕事をするつもりですか? これは、スレッドがカーネルへのアクセスをめぐって競合するため、競合を引き起こすだけです。

HttpModule代わりに、適切な場所に関連情報を隠しておく必要があります (一般的には適切ですが、より良いアイデアがあるかもしれませHttpContext.Itemsん)。ToMethod()代わりに、特定のリクエストがあなたHttpModuleが隠した情報。

何かのようなもの:

Kernel.Bind<IUserContext>()
    .ToMethod( ctx=>(IUserContext)HttpContext.Items["userContext"] )
    .InRequestScope();
于 2012-08-29T23:16:46.120 に答える