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?
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:
install-package ninject.mvc3
sur la ligne de commandeGlobal.asax
avec le code dans votre questionAppStart
créé lors de l'installation du package/Home/Index
page par défaut ouverte dans votre navigateur Google Chrome navigateur Web :-)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!
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.
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.
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.
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.