web-dev-qa-db-fra.com

Ninject + MVC3 = InvalidOperationException: la séquence ne contient aucun élément

J'ai créé un nouveau projet MVC3, appuyez sur F5, vu la page d'exemple.

Ensuite, j'ai utilisé NuGet pour obtenir le extension Ninject.MVC . J'ai modifié mon global.asax selon la documentation Ninject, Comment configurer une application MVC :

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);
   }
}

Maintenant, lorsque je lance l'application, j'obtiens l'écran jaune de la mort à l'exception suivante:

InvalidOperationException - La séquence ne contient aucun élément.

à System.Linq.Enumerable.Single (...)

sur Ninject.Web.Mvc.Bootstrapper.Initialize (...) ligne 67.

Et bien sûr, ligne 67 de ce fichier appelle .Single (), levant ainsi l'exception.

Qu'est-ce que je fais mal?

89

Vous remarquerez peut-être qu'après avoir installé le ninject.mvc3 NuGet il y a un App_Start sous-dossier créé dans votre projet contenant un NinjectMVC3.cs fichier. Supprimez ce dossier et réessayez. Voici donc les étapes que j'ai suivies:

  1. Créer un nouveau projet ASP.NET MVC 3 à l'aide du modèle par défaut
  2. Ouvrez la fenêtre de la console du gestionnaire de packages (Affichage -> Autres fenêtres -> Console du gestionnaire de packages)
  3. Tapez install-package ninject.mvc3 sur la ligne de commande
  4. Remplacez le code par défaut dans Global.asax avec le code dans votre question
  5. Supprimez le sous-dossier AppStart créé lors de l'installation du package
  6. Exécutez l'application
  7. Profitez de la beauté du /Home/Index page par défaut ouverte dans votre navigateur Google Chrome navigateur Web :-)
101
Darin Dimitrov

Je dois ajouter à cela dans l'espoir que quelqu'un d'autre résoudra le problème plus rapidement et ne voudra pas lui arracher chaque mèche de cheveux comme je l'ai presque fait.

Je devais tout renommer dans mon projet pour correspondre aux nouvelles conditions commerciales. J'ai changé les espaces de noms partout et j'ai même changé le nom de l'assembly (clic droit sur le projet> propriétés> onglet application) afin que l'assembly généré corresponde à la nouvelle convention de dénomination. Le renommage de l'Assemblée est ce qui a rendu Ninject très en colère!

En renommant l'assembly qui est généré, un nouveau fichier avec le nouveau nom était en cours de création lors de la compilation. Cependant, l'ancien fichier avec l'ancien nom était toujours dans le répertoire bin! Si Ninject est activé via la classe ajoutée dans App_Start, cette classe d'activation sera invoquée dans les DEUX assemblages (ancien ET nouveau renommé). Ne me demandez pas comment ni pourquoi, mais c'est le cas et cela vous donne cette erreur "déjà initialisée".

Même la solution de nettoyage ne fonctionne pas, car Visual Studio supprime uniquement les fichiers binaires qu'il génère, qui seraient les nouveaux renommés. Il laisse les anciens seuls assis là.

Allez supprimer votre dossier bin avant d'essayer de faire autre chose! J'espère que cela évite à quelqu'un d'autre de perdre de précieuses heures de travail!

120
Chev

J'ai mis à jour la documentation Wiki liée dans votre question pour montrer les deux façons de configurer une application MVC3. Je suggère d'utiliser la deuxième option qui est la voie préférée pour leNuGetpackage.

Au lieu de dériver de NinjectHttpApplication, il utilise NinjectMVC.cs dans le dossier AppStart qui est créé lors de l'installation du package. C'est également l'emplacement où vous créez le noyau et où vous chargez vos modules ou où vous définissez les liaisons.

23
Remo Gloor

Comme l'a dit Alex Ford:

Je dois ajouter à cela dans l'espoir que quelqu'un d'autre résoudra le problème plus rapidement et ne voudra pas lui arracher chaque mèche de cheveux comme je l'ai presque fait.

J'avais une version spéciale de ce problème qui pouvait être résolue comme suit:

Détails de l'exception: System.InvalidOperationException: la séquence ne contient aucun élément

Cette erreur est due au fait qu'il existe 2 projets avec App_Start/NinjectWebCommon.cs

La suppression du fichier élimine l'erreur.

Remarque: si vous n'obtenez pas Ninject.Web.Common parce que vous devez référencer l'assembly Ninject.Web.Common pour l'un de vos projets de bibliothèque de classes, vous pouvez supprimer en toute sécurité le dossier "App_Start" et "NinjectWebCommon.cs". Il est destiné aux projets web/web api.

> cliquez ici pour voir l'entrée de blog d'origine <

4
Wowe

Ma solution était que j'avais défini la propriété du dossier App_Start, Namespace Provider sur True.

J'avais changé cela en False pour que Resharper ne surligne pas l'espace de noms ne correspondant pas à la structure du dossier.

2
PhilAI

Je voulais ajouter une autre cause ...

Nous avons installé le package Ninject.MVC3 sur plusieurs projets - dont un seul était une application MVC réelle. Cependant, nous avons oublié de supprimer le dossier App_Start.

La suppression du dossier App_Start du projet référencé a résolu le problème.

2
fordareh

Pour aborder la réponse de @ Chev ... c'était aussi mon problème ultime. Si vous déployez sur un site Web Azure (maintenant nommé AppSite), vous souhaitez cliquer sur cette case dans la publication pour supprimer les anciens fichiers

publish to Azure screenshot

1
viggity