web-dev-qa-db-ja.com

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

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

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

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()を呼び出し、例外をスローします。

私は何を間違えていますか?

89

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

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

他の誰かが問題をより迅速に解決し、私がほとんどやったように頭の上のすべての髪の毛を抜きたくないという希望で、これに追加する必要があります。

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

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

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

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

120
Chev

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

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

23
Remo Gloor

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

他の誰かが問題をより迅速に解決し、私がほとんどやったように頭の上のすべての髪の毛を抜きたくないという希望で、これに追加する必要があります。

次のように解決できる特別なバージョンの問題がありました。

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

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

ファイルを削除すると、エラーがなくなります。

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

>ここをクリックして元のブログエントリを表示<

4
Wowe

私の解決策は、名前空間プロバイダーのApp_StartフォルダープロパティをTrueに設定していたことです。

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

2
PhilAI

もう1つの原因を追加したい...

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

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

2
fordareh

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

publish to Azure screenshot

1
viggity