8

最近、Ninject と Ninject.Web.Mvc の両方を既存の ASP.NET MVC 4 Web アプリケーションに追加しました。サイトを閲覧すると、ランダムに見える次の例外が表示されます。

[InvalidOperationException: Ninject コンポーネント ICache の読み込み中にエラーが発生しました カーネルのコンポーネント コンテナーにそのようなコンポーネントが登録されていません。

提案: 1) KernelBase のカスタム サブクラスを作成した場合は、AddComponents() メソッドを適切に実装していることを確認してください。2) RemoveAll() の呼び出しによってコンテナからコンポーネントを削除していないことを確認してください。3) 誤って複数のカーネルを作成していないことを確認してください。] Ninject.Components.ComponentContainer.Get(コンポーネントの型) in c:\Projects\Ninject\ninject\src\Ninject\Components\ComponentContainer.cs:160 Ninject.Components.ComponentContainer.Get() in c:\Projects\Ninject\ ninject\src\Ninject\Components\ComponentContainer.cs:116 Ninject.Web.Common.<>c__DisplayClass2.b__1(IKernel カーネル) in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\ OnePerRequestHttpModule.cs:74 C の Ninject.GlobalKernelRegistration.MapKernels(Action`1 アクション):

上記の例外を受け取ったら、更新するかクリックして戻るだけで、サイトが正常に機能し始めるようです。サイトのどの領域も、別の領域よりもそれを発生させるようには見えません.

この問題は、次の質問とよく似ています: Ninject + "Error loading Ninject component ICache" . ただし、その質問の問題は、拡張機能自体のバグが原因のようで、1 年以上経過しており、解決されているようです。

これは、 NinjectWebCommon.csファイルをまったく変更しなくても発生します。(モジュールはロードされておらず、バインディングも追加されていません。) それを停止させる唯一の方法は、プロジェクトからNinjectWebCommon.csを完全に除外することです。

Nuget パッケージをインストールする以外はほとんど行っていないため、他にどのような情報を含めればよいかわかりません。おそらく注目に値するのは、このプロジェクトには、DI に Ninject を利用する他のアセンブリへの参照が含まれていることです。

私はかなり見回しましたが、なぜこれが起こるのか途方に暮れています。どんな提案でも大歓迎です。

4

1 に答える 1

6

明らかに、アプリケーションには複数のカーネルが関係しています (MVC + ライブラリ)。アプリケーションの実行時にカーネル インスタンスを作成および破棄することは避けるべきです。アプリケーションの起動時に作成されるカーネルが少なくなるように設計を変更することを強くお勧めします。そして、後で作成されるものはありません(すべてのライブラリを含む)。

そうは言っても、最新バージョンの Ninject でこの問題がどのように発生するのか、コードにはまったくわかりません。アプリケーションとすべてのライブラリが最新バージョンの Ninject にあることを確認する価値があるかもしれません。

于 2012-12-07T08:57:29.523 に答える