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


90

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

Ensuite, j'ai utilisé NuGet pour obtenir l' extension Ninject.MVC . J'ai modifié mon global.asax conformément à la documentation Ninject, Comment configurer une application 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);
   }
}

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 (...)

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

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

Qu'est-ce que je fais mal?

Réponses:


101

Vous remarquerez peut-être qu'après l'installation de ninject.mvc3NuGet, un App_Startsous-dossier est créé dans votre projet contenant un NinjectMVC3.csfichier. 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 package (Affichage -> Autres fenêtres -> Console du gestionnaire de package)
  3. Tapez install-package ninject.mvc3sur la ligne de commande
  4. Remplacez le code par défaut Global.asaxpar le code de votre question
  5. Supprimer le AppStartsous - dossier créé lors de l'installation du package
  6. Lancez l'application
  7. Profitez de la beauté de la /Home/Indexpage par défaut ouverte dans votre navigateur Web Google Chrome :-)

3
Ça a marché. Je ne sais pas pourquoi. Je n'aime pas corriger les bugs sans le comprendre ... mais merci, cela me débloque.
Judah Gabriel Himango

19
Ce n'est pas un bug. Le package NuGet n'utilise qu'une autre façon de configurer le noyau afin qu'il n'ait pas à modifier le global.asax. Votre application a utilisé les deux méthodes simultanément, ce qui a mis l'extension dans un état non valide lorsqu'elle est démarrée deux fois.
Remo Gloor

Merci pour l'explication utile, Remo.
Judah Gabriel Himango

4
Quelle est la bonne façon de résoudre ce problème sans supprimer le dossier App_Start?
Ryan Lundy

12
@Kyralessa, en laissant Global.asax tel quel (ne dérivant pas de NinjectHttpApplication) et en configurant le noyau dans le ~/App_Start/NinjectMVC3.csfichier ( RegisterServicesméthode).
Darin Dimitrov

120

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

J'avais besoin de tout renommer dans mon projet pour correspondre aux nouveaux termes commerciaux. J'ai changé les espaces de noms partout et j'ai même changé le nom de l'assembly (clic droit projet> propriétés> onglet application) afin que l'assemblage généré corresponde à la nouvelle convention de dénomination. Le changement de nom de l'assemblage 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 a été créé 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 appelée dans les DEUX assemblys (l'ancien ET le nouveau renommé). Ne me demandez pas comment ou 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 ne supprimera que les binaires qu'il génère, qui seraient les nouveaux renommés. Cela laisse les anciens seuls assis là.

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


7
Eh bien, j'ai perdu environ 40 minutes avant de tomber sur votre réponse. Merci Alex!
Maxim V. Pavlov

3
La réponse acceptée ne l'a pas fait pour moi, mais celle-ci l'a fait. Merci Alex.
Pluc

2
Merci beaucoup! J'ai brûlé une heure sur cette question, et j'en aurais brûlé beaucoup plus sans votre réponse. Cela devrait être la bonne réponse à la question appropriée.
Doug

2
Brillant! Merci Alex. J'ai perdu tellement de temps à essayer d'aller au fond des choses, votre solution a parfaitement fonctionné.
Apogee le

3
C'était fantastique. Merci beaucoup. J'ai fait exactement cela, un changement de nom complet de l'espace de noms et je n'ai même pas attribué mes problèmes au fait que l'assembly était toujours construit dans le bac. Merci beaucoup!
David L

23

J'ai mis à jour la documentation Wiki liée à 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 méthode préférée pour theNuGetpackage.

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.


Très utile, Remo. Comme j'ai déjà noté une réponse, je vais simplement voter pour la vôtre et peut-être pour quelques autres. Merci d'aller au-delà des attentes en répondant et en mettant à jour le Wiki.
Judah Gabriel Himango

4

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 arracher chaque mèche de cheveux sur sa tête 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 obtenez Ninject.Web.Common nu 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 / API Web.

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


Après avoir changé l'espace de noms de mes projets, je me suis retrouvé aujourd'hui dans le même problème. Toutes les solutions ici n'ont pas aidé. Le nettoyage et la reconstruction n'ont pas aidé. Mais ce qui a aidé a été de supprimer les dossiers bin et obj de mon projet. On dirait qu'il y a encore des morceaux de l'ancienne partie de l'espace de noms qui n'ont pas été supprimés avec un nettoyage.
Wowe

Salut Da_Wolf, c'est tout. Je vous remercie. Vous avez résolu mon problème
VivekDev

2

Ma solution était que j'avais défini la propriété de dossier App_Start, Fournisseur d'espace de noms sur True.

J'avais changé cela en False afin que Resharper ne surligne pas l'espace de noms ne correspondant PAS à la structure de dossiers.


C'était tout pour moi, me rendant fou.
rashleighp

2

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.


Ouais! C'était ça! J'avais ajouté par erreur un deuxième fichier Ninjectwebcommon.cs sur un autre projet! C'était ça (en utilisant MVC 5)
Jose A

1

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

publier sur une capture d'écran azure


C'est exactement la même photo que j'allais publier! J'aurais aimé faire défiler jusqu'à cette réponse, mais les réponses ci-dessus m'amènent à cette idée. +1
Jess
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.