web-dev-qa-db-ja.com

NInject:カーネルへの参照をどこに保持しますか?

新しいWebアプリケーションでNInjectを使用していますが、不明な点が2つあります。

  1. GCがすべてのインスタンスを収集しないようにするために、カーネルアラウンド(セッション/アプリ変数)への参照を保持する必要はありませんか?たとえば、.Using()を指定してから、Kernelオブジェクトが収集された場合、すべての「シングルトン」も収集されませんか?

  2. カーネルオブジェクトへの参照を保持する必要がある場合、WithArguments()に渡される引数を変更できるようにするにはどうすればよいですか、それは不可能です。

48
JC Grubbs

カーネルを回したくないのは事実です。通常、Webアプリでは、カーネルをHttpApplicationの静的プロパティに格納します。カーネルへの参照が必要な場合は、IKernelタイプの依存関係を(コンストラクター引数またはプロパティを介して)公開するだけで、Ninjectはそのタイプをアクティブ化したカーネルへの参照を提供します。

バインディングでWithArguments()を使用すると、すべてのアクティベーションに使用されます。 IParametersを使用する場合、それらはそのアクティベーションにのみ使用されます。 (ただし、アクティブ化するサービスがシングルトンのように再利用可能な動作をしている場合は、異なるIParametersを渡しても再アクティブ化されません。)

29
Nate Kohari

これは、IoCコンテナの使用を開始する際の一般的な落とし穴です。 この関連する質問 を参照してください。

手短に:

  • コンテナを回すのは悪い習慣です(そこにいて、それをやったら、本当に痛いです)
  • 本当にコンテナを直接呼び出す必要がある場合は、最初に注入されたファクトリへの抽象化を検討し、最後のリソースとしてコンテナへの静的ゲートウェイの使用を検討してください
16