2010-03-25 8 views
9

Je viens de faire Fichier -> Nouveau Projet hier soir sur un nouveau projet. Ah, le l'odeur des champs verts.Utiliser ASP.NET MVC 2 avec Ninject 2 à partir de zéro

J'utilise le ASP.NET MVC 2 vient de sortir (pas de prévisualisation ou de libérer candidat, la vraie chose), et je pensais que je prendre un bon départ en utilisant Ninject 2 (version également publié) avec les extensions MVC. I téléchargé le projet extensions MVC, l'a ouvert dans VS2008Sp1, construit en mode de libération, puis est allé dans le dossier mvc2 \ build \ release et copié Ninject.dll et Ninject.Web.Mvc.dll de là à la Dossier de bibliothèques sur mon projet (de sorte que je puisse les traîner dans le contrôle de source et toujours avoir la bonne version partout). Je n'ai pas inclure les fichiers .xml correspondants - devrais-je? Est-ce qu'ils fournissent simplement une intelligence intellisense ou une autre fonction? Pas un gros problème, je crois.

Anyhoo, j'ai suivi les conseils les plus à jour que j'ai pu trouver; I référencé les DLL dans mon projet MVC2, puis est allé travailler sur Global.asax.cs. D'abord je l'ai fait hériter de NinjectHttpApplication. I a supprimé la méthode Application_Start() et a remplacé OnApplicationStarted() à la place. Voici cette méthode:

protected override void OnApplicationStarted() 
{ 
    base.OnApplicationStarted(); 
    AreaRegistration.RegisterAllAreas(); 
    RegisterRoutes(RouteTable.Routes); 
    // RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
} 

Et j'ai aussi suivi les conseils de VS et mis en œuvre la méthode CreateKernel :

protected override Ninject.IKernel CreateKernel() 
{ 
    // RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
    return new StandardKernel(); 
} 

C'est tout. Aucune autre modification au projet.

Vous remarquerez que la méthode RegisterAllControllersIn() est commentée dans deux endroits ci-dessus. J'ai pensé que je peux l'exécuter dans trois combinaisons différentes, toutes avec leurs effets secondaires funky;

  • Exécution comme ci-dessus.

Je suis ensuite présenté avec la page standard "Bienvenue à ASP.NET MVC" en tout son 'gloire. Toutefois, après que cette page s'affiche correctement dans le navigateur , VS me montre une exception qui a été levée. Il renvoie NinjectControllerFactory.GetControllerInstance(), qui a été appelé avec une valeur NULL dans le paramètre controllerType. Notez que ce se produit après le rendu de la page/Home - Je ne sais pas pourquoi il est appelé à nouveau, et en utilisant des points d'arrêt, j'ai déjà déterminé que GetControllerInstance() a été appelée avec succès pour le HomeController . Pourquoi ce nouvel appel avec controllerType comme nul? I vraiment aucune idée. En appuyant sur F5 en ce moment me ramène au navigateur , rien à redire.

  • la méthode Enlever les commentaires CreateKernel()

RegisterAllControllersIn() C'est là des choses commence vraiment à obtenir funky. Maintenant, j'obtiens une erreur 404 .Quelques fois j'ai également obtenu une ArgumentNullException sur la ligne RegisterAllControllersIn(), mais c'est assez rare, et j'ai pas été capable de le reproduire.

  • décommenter les méthode RegisterAllControllers() dans OnApplicationStarted()

(Et mettre le commentaire en arrière sur celui CreateKernel())

Résultats dans le comportement qui semble exactement comme ça dans point 1.

Donc, pour ne pas continuer éternellement - existe-t-il un guide pas à pas exact sur la façon de configurer un projet MVC 2 avec Ninject 2 (les deux non-bêta versions de version) pour obtenir les contrôleurs fournis par Ninject? De cours je vais alors commencer à fournir des choses réelles pour l'injection (comme les objets ISession et les dépôts, les enregistreurs, etc), mais je pensais que je travaillerais d'abord ce travail.

Toute aide sera grandement appréciée!

(également affiché au Groupe Ninject Google)

+0

Ceci est en train d'être corrigé par les gars de Ninject. Plus quand j'ai la tête enroulée autour de tout ça! –

+0

Pourquoi n'inscrivez-vous pas de modules comme dans http://github.com/enkari/ninject.web.mvc (readme.markdown)? (J'ai vu le fil à http://groups.google.com/group/ninject/browse_thread/thread/c011f0bd83993a59)? –

+0

Salut, La raison pour laquelle il n'y a pas de modules, c'est qu'il s'agit d'un projet vierge, et les dépôts et autres choses qui seront injectés n'existent pas encore. La première chose que j'ai faite après avoir configuré le projet MVC était essentiellement d'ajouter Ninject 2 au mélange, pour m'assurer que l'injection du contrôleur fonctionnait, et ce n'était pas le cas. Donc c'est ma raison. :) –

Répondre

10

Je me sens sale répondre à ma propre question, mais au profit de tous ceux qui pourraient se promener dans cette ...

Ce n'est pas un problème Ninject, En fait, il semble que ce soit un problème avec Cassini (le serveur web intégré dans VS2k8), qui gère ces requêtes différemment qu'IIS ne les gère. La raison principale est que l'application reçoit une demande pour favicon.ico, que Cassini envoie à MVC, et Ninject ne savait pas comment la gérer.

Ian Davis avait une solution de bogue pour ceci dehors dans une durée impressionnante courte, et a également recommandé d'ajouter un itinéraire ignorer pour éviter ce problème spécifiquement pendant le développement. Ajoutez juste ce qui suit à votre config d'itinéraire:

routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" }); 

Espérons que cela aide quelqu'un!