Je donne une rotation à ASP.NET MVC 3 Preview 1 et je veux configurer ninject avec lui. Est-ce la meilleure façon d'utiliser encore ninject.web.mvc extension? L'exemple Scott Gu posts ne s'exécute pas. Il déclenche une exception "Erreur lors de l'activation de IControllerFactory".ASP.NET MVC 3 Prévisualiser configurer pour ninject
Répondre
Je crois que le code de Scott Gu devrait lire ...
public static void RegisterServices(IKernel kernel)
{
kernel.Bind<IProductRepository>().To<SqlProductRepository>();
kernel.Bind<IControllerFactory>().To<NinjectControllerFactory>();
}
Lorsque le NinjectControllerFactory se trouve dans ...
using Ninject.Web.Mvc;
Alors oui, vous avez besoin encore l'extension pour mvc Ninject.
Il existe peut-être un moyen meilleur/plus récent de définir la fabrique de contrôleurs par défaut dans MVC 3, mais c'est ainsi que je l'ai fait.
Il peut également y avoir un comportement étrange provenant de MvcServiceLocator comme indiqué dans this post.
Vous n'avez pas besoin « Ninject.Web.Mvc » pour configurer Ninject dans MVC 3, comme je l'ai blogué dans un billet intitulé "Dependency Injection in ASP.NET MVC 3 using Ninject".
Assurez-vous que lorsque vous appelez en utilisant le noyau ninject de votre IDependencyResolver, que vous appelez
_kernel.TryGet(serviceType)
Le framework MVC va essayer de saisir un autre IControllerFactory si elle est disponible, si vous appelez "TryGet", il retournera null et le framework utilisera le contrôleur par défaut à la place.
Si vous utilisez plutôt unity, assurez-vous d'enrouler la résolution dans un bloc try/catch et de renvoyer null dans le catch. Bien que ce soit un peu lent, parce que vous ne voulez pas vraiment qu'un bloc catch soit traité comme une partie normale du flux d'exécution.
Avec une implémentation Ninject de IMvcServiceLocator, vous n'avez techniquement pas besoin de NinjectControllerFactory. DefaultControllerFactory cède à MvcServiceLocator pour la création du contrôleur. Tant que Ninject a les bindings nécessaires, c'est bon d'y aller. –
Pour ajouter à mon commentaire ci-dessus, actuellement le MvcServiceLocator nécessite une liaison pour IControllerFactory. Si vous n'en avez pas (oui, même pour DefaultControllerFactory), il va lancer cette erreur. –