2010-08-02 9 views

Répondre

4

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.

+1

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. –

+0

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. –

1

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.

Questions connexes