2

アプリケーションで実際にそのカーネルに到達する方法を示さずに、どこにでも Ninject カーネルがある小さな、部分的な、1 つのファイルの例について、私は本当に混乱しています。

(1) 1 つのカーネルをインスタンス化し、それを「静的」コンテキストに保持する必要がありますか? または、リクエストごとに別のものをインスタンス化する必要があります (*Application_BeginRequest* 内)。

(2)「リクエストごとのカーネル」の場合、NinjectWebCommon.csのInitialize()メソッド(NuGetパッケージのインストール時に取得)がbootstrapper.Initialize(CreateKernel)を呼び出すため、Application_Startで呼び出される理由 - NinjectWebCommon.cs

(3)「1 つのグローバル静的カーネル」の場合、「InRequestScope()」は機能しません。次のコードを実行すると、ApplicationStart() の時点でリクエストがないため、null が返されます。

kernel.Components.GetAll<INinjectHttpApplicationPlugin>()
  .Select(c => c.RequestScope)
  .FirstOrDefault(s => s != null);

(4)繰り返しますが、「kernel per request」の場合、カーネルをどこに保存しますか? HttpContext.Current? とにかく HttpContext.Current を使用する場合、InRequestScope() を使用する意味は何ですか?

4

1 に答える 1

6

(1) 1 つのカーネルをインスタンス化し、それを「静的」コンテキストに保持する必要がありますか? または、リクエストごとに別のものをインスタンス化する必要があります (*Application_BeginRequest* 内)。

1 つの単一カーネル。

(2)「リクエストごとのカーネル」の場合、NinjectWebCommon.cs(NuGetパッケージのインストール時に取得)のInitialize()メソッドがbootstrapper.Initialize(CreateKernel)を呼び出すため、Application_Startで呼び出される理由 - NinjectWebCommon.cs

リクエストごとのカーネルではありません。

(3) 「1 つのグローバル静的カーネル」の場合、「InRequestScope()」は機能しません。次のコードを実行すると、ApplicationStart() の時点でリクエストがないため、null が返されます。

kernel.Components.GetAll() .Select(c => c.RequestScope) .FirstOrDefault(s => s != null);

それは完全に正常です。HTTP リクエストの外部で InRequestScope に明示的に登録したカーネルからインスタンスを取得することは期待できません。

(4) 繰り返しますが、「kernel per request」の場合、カーネルをどこに保存しますか? HttpContext.Current? とにかく HttpContext.Current を使用する場合、InRequestScope() を使用する意味は何ですか?

どこにもない。カーネルを保存しないでください。カーネルを使用して、アプリケーションの起動時に 1 回だけ DI コンテナーを構成すると、すべての依存関係が自動的に挿入されます。依存関係を構成した場所以外のアプリケーションのどこかにカーネルが必要な場合は、依存関係の注入ではなくアンチパターンであるサービスの場所を使用しているため、深刻な設計上の問題があります。

于 2013-07-29T08:40:32.263 に答える