Ninject + MVC3 = InvalidOperationException:シーケンスに要素が含まれていません


90

新しいMVC3プロジェクトを作成し、F5キーを押して、サンプルページを見ました。

次に、NuGetを使用してNinject.MVC拡張を取得しました。Ninjectのドキュメント「MVC3アプリケーションの設定方法」に従って、global.asaxを変更しました。

public class MvcApplication : NinjectHttpApplication
{
   public static void RegisterGlobalFilters(GlobalFilterCollection filters)
   {
       filters.Add(new HandleErrorAttribute());
   }

   public static void RegisterRoutes(RouteCollection routes)
   {
       routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

       routes.MapRoute(
           "Default", // Route name
           "{controller}/{action}/{id}", // URL with parameters
           new { controller = "Home", action = "Index", 
               id = UrlParameter.Optional });
   }

   protected override IKernel CreateKernel()
   {
       var kernel = new StandardKernel();
       kernel.Load(Assembly.GetExecutingAssembly());
       return kernel;
   }

   protected override void OnApplicationStarted()
   {
       base.OnApplicationStarted();

       AreaRegistration.RegisterAllAreas();
       RegisterGlobalFilters(GlobalFilters.Filters);
       RegisterRoutes(RouteTable.Routes);
   }
}

アプリを実行すると、次の例外を除いて黄色の死の画面が表示されます。

InvalidOperationException-シーケンスに要素が含まれていません。

System.Linq.Enumerable.Single(...)で

Ninject.Web.Mvc.Bootstrapper.Initialize(...)67行目。

そして、確かに、そのファイルの67行目が.Single()を呼び出しているため、例外がスローされます。

何が悪いのですか?

回答:


101

ninject.mvc3NuGet をインストールすると、App_Startプロジェクト内にNinjectMVC3.csファイルを含むサブフォルダーが作成されます。このフォルダを削除して、もう一度お試しください。だから私が従った手順はここにあります:

  1. 既定のテンプレートを使用して新しいASP.NET MVC 3プロジェクトを作成する
  2. [パッケージマネージャーコンソール]ウィンドウを表示します([表示]-> [その他のウィンドウ]-> [パッケージマネージャーコンソール])。
  3. install-package ninject.mvc3コマンドラインでタイプする
  4. のデフォルトのコードをGlobal.asax質問のコードに置き換えます
  5. AppStartパッケージのインストール中に作成されたサブフォルダーを削除します
  6. アプリケーションを実行する
  7. /Home/IndexGoogle Chrome Webブラウザーで開いたデフォルトページの美しさをお楽しみください:-)

3
うまくいきました。理由はわかりません。私はそれを理解せずにバグを修正するのは好きではありません...
ユダガブリエルヒマンゴ2011年

19
バグではありません。NuGetパッケージは、global.asaxを変更する必要がないように、カーネルをセットアップする別の方法のみを使用します。アプリケーションが両方の方法を同時に使用したため、拡張機能が2回起動されたときに無効な状態になりました。
Remo Gloor

役立つ説明をありがとう、レモ。
ユダガブリエルヒマンゴ2011年

4
App_Startフォルダー削除せずにこれを解決する正しい方法は何ですか?
Ryan Lundy、

12
@ Kyralessa、Global.asaxをそのままにして(から派生しないNinjectHttpApplication)、~/App_Start/NinjectMVC3.csファイルでカーネルを構成する(RegisterServicesメソッド)。
Darin Dimitrov

120

他の誰かが問題をより迅速に解決し、私がしたように彼らの頭のすべての髪の毛を引き出すことを望まないことを期待して、これに追加する必要があります。

新しいビジネス用語に一致するように、プロジェクトのすべての名前を変更する必要がありました。あらゆる場所で名前空間を変更し、アセンブリ名(プロジェクトを右クリック>プロパティ>アプリケーションタブ)を変更して、生成されたアセンブリが新しい命名規則に一致するようにしました。アセンブリの名前変更により、Ninjectは非常に怒りました。

生成されたアセンブリの名前を変更することにより、コンパイル時に新しい名前で新しいファイルが作成されていました。ただし、古い名前の古いファイルはまだbinディレクトリにありました!App_Startに追加されたクラスを介してNinjectアクティベーションがある場合、このアクティベーションクラスは両方のアセンブリ(古いものと新しい名前が変更されたもの)で呼び出されます。方法や理由を聞かないでください。そうすると、「初期化済み」のエラーが表示されます。

Visual Studioはそれが生成しているバイナリ(新しい名前が変更されたもの)のみを削除するため、クリーニングソリューションでさえ機能しません。それはただそこに座っているだけで古いものを残します。

他のことをする前に、binフォルダーを削除してください!これにより、他の誰かが貴重な労働時間を無駄にしないように願っています。


7
まあ、私はあなたの答えに出くわす前に、40分ほど無駄にした。アレックス、ありがとう!
Maxim V. Pavlov

3
受け入れられた答えは私のためにそれをしませんでしたが、これはそうしました。アレックス、ありがとう。
Pluc、

2
どうもありがとうございます!私はこの問題で1時間燃えました、そしてあなたの応答なしでもっと多くを燃やしたでしょう。これは、適切な質問に対する正しい答えである必要があります。
Doug

2
鮮やかさ!アレックス、ありがとう。私はこれの底に着くために多くの時間を無駄にしました、あなたの解決策は完全に働きました。
Apogee 2014

3
これは素晴らしかった。どうもありがとうございます。私はまさにこれを行い、完全な名前空間の名前を変更しました。アセンブリがまだビンに組み込まれているという事実に私の問題を帰することさえしませんでした。どうもありがとうございました!
David L

23

MVC3アプリケーションをセットアップする両方の方法を示すために、質問にリンクされているドキュメントWikiを更新しました。私は、NuGetパッケージの推奨される方法である2番目のオプションを使用することをお勧めします。

NinjectHttpApplicationから派生する代わりに、パッケージのインストール中に作成されるAppStartフォルダー内のNinjectMVC.csを使用しています。これは、カーネルを作成したり、モジュールをロードしたり、バインディングを定義したりする場所でもあります。


とても役に立ちました、レモ。すでに回答にマークを付けているので、私はあなたの質問に賛成票を投じ、他のいくつかの質問にも賛成票を入れます。Wikiに回答して更新していただき、ありがとうございます。
ユダガブリエルヒマンゴ2011年

4

アレックス・フォードが言ったように:

他の誰かが問題をより迅速に解決し、私がしたように彼らの頭のすべての髪の毛を引き出すことを望まないことを期待して、これに追加する必要があります。

私は次のように解決できるその問題の特別なバージョンを持っていました:

例外の詳細:System.InvalidOperationException:シーケンスに要素が含まれていません

このエラーは、App_Start / NinjectWebCommon.csを含む2つのプロジェクトがあるために発生します。

ファイルを削除すると、エラーが解消されます。

注:クラスライブラリプロジェクトの1つでNinject.Web.Commonアセンブリを参照する必要があるためにNinject.Web.Commonを取得する場合は、「App_Start」フォルダーと「NinjectWebCommon.cs」を安全に削除できます。これは、web / web apiプロジェクト用です。

>元のブログエントリを表示するには、ここをクリックしてください<


プロジェクトの名前空間を変更した後、私は今日同じ問題に再び遭遇しました。ここでのすべてのソリューションは役に立ちませんでした。クリーニングと再構築は助けにはなりませんでした。しかし、助けになったのは、私のプロジェクトのbinおよびobjフォルダーを削除することでした。クリーニングで削除されなかった古い名前空間の一部がまだ残っているようです。
Wowe 2015

こんにちはDa_Wolfです。ありがとうございました。あなたは私の問題を解決しました
VivekDev 2016年

2

私の解決策は、App_StartフォルダープロパティのNamespace ProviderをTrueに設定したことです。

これをFalseに変更して、Resharperがフォルダー構造と一致しない名前空間を強調表示しないようにしました。


これで私は怒ってしまいました。
ラシュリープ2014

2

原因をもう1つ追加したいと思います...

Ninject.MVC3パッケージを複数のプロジェクトにインストールしました。そのうちの1つだけが実際のMVCアプリケーションでした。ただし、App_Startフォルダーを削除するのを忘れていました。

参照先のプロジェクトからApp_Startフォルダーを削除すると、問題が解決しました。


うん!これで終わりです!別のプロジェクトに2つ目のNinjectwebcommon.csファイルを誤って追加しました!これで終わりです(MVC 5を使用)
Jose A

1

@Chevの答えに固執するために...これも私の究極の問題でした。Azure Webサイト(現在の名前はAppSite)にデプロイする場合、パブリッシュでこのボックスをクリックして古いファイルを削除します

azureスクリーンショットに公開


これは私が投稿しようとしていたのとまったく同じ写真です!この答えまでスクロールダウンしたかったのですが、上記の答えは私にこの考えを導きました。 +1
Jess
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.