9

Ninject.MVC3 パッケージを 2.2.1.0 から 2.2.2.0 に更新しました。以前は BootStrapper.Kernel プロパティを介して Kernel オブジェクトにアクセスできましたが、新しいバージョンでは Kernel プロパティは古いものとしてマークされています。という警告が表示されます

「Public ReadOnly Property Kernel As Ninject.IKernel」は廃止されました: 「Ninject をサービス ロケータとして使用しないでください」。

新しいバージョンでカーネルにアクセスする別の方法はありますか?

4

4 に答える 4

6

(なんらかの理由で) Ninject カーネルからオブジェクトを取得する必要があるクラスがある場合は、そのカーネルをクラスに注入されたプロパティ/コンストラクター パラメーターの 1 つとして含めることができます。このパターンは、特定のクラスがカーネルを使用していることを明示的に宣言するという意味で優れています。サービス ロケーター パターンのようにカーネルを常に使用できるようにするよりも優れています。

これは、Ninject がカーネルのインスタンス バインディングをそれ自体に自動的に追加することを前提としています。以前はこれを行っていたことは知っていますが、そうでない場合はバインディングを手動で追加できます。

于 2011-05-18T16:09:30.393 に答える
5

これが Obsolete とマークされ、将来内部に変更される理由は、可能であれば Ninject をサービス ロケータとして使用する傾向があるためです。ただし、Service Locator は使用すべきではないアンチパターンです。また、不適切に設計されたソフトウェアの構築を支援する機能を提供したくないため、将来的には削除される予定です。

これがあなたのコードに多くの変更を必要とする場合、これはあなたのコードがこの不快な依存性注入に苦しんでいることを示しており、本当により良い設計に変更する必要があります.

  1. カーネルへのアクセスを最小限に制限します。MVC では、単純なコンストラクター インジェクション以外の何かが必要になる状況はほとんどありません。したがって、私の最初のアドバイスは、可能な場合はコンストラクター インジェクションにリファクタリングすることです。
  2. 他のオブジェクトを作成するためにカーネルにアクセスする必要があるこれらの非常にまれなケースでは、新しいインスタンスを必要とするクラスにファクトリーを注入し、このファクトリーにカーネルを注入する必要があります (コンストラクターにKernelパラメーターがある場合は、インスタンスを受け取ります)注射をします)。

ほとんどの人がそうしないように言ったとしても、本当にサービス ロケータを使い続けたい場合は、自分で静的参照を保持する必要があります。

于 2011-05-18T21:09:56.747 に答える
2

ASP.NET MVC 3 では、DepedencyResolverはサービス ロケーターを取得するクリーンな方法だと思います。

于 2011-07-06T23:34:41.827 に答える
0

Common Service Locatorを、Ninjectへのサービスロケーションフックとして使用できます。Common Service Locatorでは、オブジェクトを取得することしかできませんが、既に持っているオブジェクトを挿入することはできません。もちろん、この制限を回避することもできますが、BootStrapperではなくNinjectカーネルを公開し、それを参照する静的クラスを簡単に作成することもできます。

于 2011-05-18T17:42:54.243 に答える