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?
la source
NinjectHttpApplication
) et en configurant le noyau dans le~/App_Start/NinjectMVC3.cs
fichier (RegisterServices
méthode).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!
la source
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.
la source
Comme l'a dit Alex Ford:
J'avais une version spéciale de ce problème qui pouvait être résolue comme suit:
la source
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.
la source
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.
la source
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
la source