89 votes

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

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

Ensuite, j'ai utilisé NuGet pour obtenir le Ninject.MVC extension. J'ai modifié mon global.asax selon la Ninject de la documentation, de la Configuration D'une MVC3 Application:

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 quand je lance l'application, j'obtiens le jaune de l'écran de la mort avec l'exception suivante:

InvalidOperationException - Séquence contient pas d'éléments.

au Système.Linq.Énumérable.Seul(...)

au Ninject.Web.Mvc.Programme d'amorçage.Initialiser(...) ligne 67.

Et bien sûr, ligne 67 du fichier des appels .Seul(), jetant ainsi l'exception.

Ce que je fais mal?

120voto

Alex Ford Points 15277

Je dois ajouter à cela dans l'espoir que quelqu'un d'autre va résoudre le problème plus rapidement et pas envie de sortir chaque mèche de cheveux sur leur tête comme je l'ai presque fait.

J'avais besoin de renommer tout dans mon projet pour correspondre à de nouvelles conditions. J'ai changé les espaces de noms de partout et j'ai même changé le Nom de l'Assembly (cliquez-droit sur le projet > propriétés > onglet application), de sorte que l'assembly généré correspond à la nouvelle convention de nommage. L'assemblée renommer est ce qui fait de Ninject très en colère!

En renommant l'assemblée, qui est généré un nouveau fichier avec le nouveau nom a été créé lorsque nous avons compilé. Toutefois, l'ancien fichier avec l'ancien nom était encore dans le répertoire bin! Si vous avez Ninject activation par l'ajout de la classe dans App_Start puis cette activation de la classe se invoquée dans les DEUX assemblées (ancien ET nouveau renommé). Ne me demandez pas comment, ni pourquoi, mais il le fait et il vous donne ce "déjà initialisé" erreur.

Pas encore de solution de nettoyage fonctionne parce que Visual Studio ne supprime que les fichiers binaires qu'il génère, ce qui serait la nouvelle renommé. Il laisse les anciennes seul juste assis là.

Allez supprimer votre bin et obj dossiers avant d'essayer de faire autre chose! J'espère que cela sauve quelqu'un d'autre de perdre de précieuses heures de travail!

101voto

Darin Dimitrov Points 528142

Vous remarquerez peut-être qu'après l'installation de l' ninject.mvc3 NuGet il y a un App_Start sous-dossier créé à l'intérieur de votre projet contenant un NinjectMVC3.cs le fichier. Supprimer ce dossier et essayer de nouveau. Donc, voici les étapes que j'ai suivi:

  1. Créer un nouveau ASP.NET MVC 3 projet à l'aide du modèle par défaut
  2. Afficher la fenêtre de Console Package Manager (Affichage -> Autres Windows -> Gestionnaire de paquets de la Console)
  3. Type 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. Supprimer l' AppStart sous-dossier créé lors de l'installation du package
  6. Exécuter l'application
  7. Profitez de la beauté de l' /Home/Index par défaut de la page qui s'ouvre dans votre navigateur web Google Chrome :-)

23voto

Remo Gloor Points 26195

J’ai mis à jour la documentation que wiki lié à votre question de montrer les deux moyens d’application setup un MVC3. Je suggère d’utiliser la deuxième option qui est le moyen préféré pour theNuGetpackage.

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

4voto

Da_Wolf Points 97

Comme Alex Ford a dit:

Je dois ajouter à cela dans l'espoir que quelqu'un d'autre va résoudre le problème plus rapidement et pas envie de sortir chaque mèche de cheveux sur leur tête comme je l'ai presque fait.

J'ai eu une version spéciale de ce problème qui pourrait être résolu comme suit:

Détails De L'Exception: System.InvalidOperationException: Séquence contient pas d'éléments

Cette erreur est causée par le fait qu'il y a 2 projets avec App_Start/NinjectWebCommon.cs

Supprimer le fichier élimine l'erreur.

Remarque: si vous êtes nu-prise en Ninject.Web.Commune car vous avez besoin de référence Ninject.Web.Assemblée commune pour l'un de votre bibliothèque de classe projet, vous pouvez supprimer le "App_Start" du dossier et "NinjectWebCommon.cs". Il est destiné pour le web/web api projets.

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

2voto

PhilAI Points 71

Ma solution a été que j’avais mis la propriété de dossier de App_Start, fournisseur de Namespace sur True.

J’avais changé ce false afin que Resharper ne mettez en surbrillance l’espace de noms ne correspond ne pas à la structure des dossiers.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X