2010-10-06 21 views
7

L'utilisation de l'add-in NuPack et l'installation du package NInject MVC 3 entraînent l'erreur de compilation suivante dans le fichier NinjectMVC3.cs généré.Pourquoi le fichier NinjectMVC3.cs généré par NuPack ne se compile-t-il pas? (ou ce qui est arrivé à MvcServiceLocator dans ASP.NET MVC 3 Beta?)

The name 'MvcServiceLocator' does not exist in the current context

Le sample video David Ebbo publié le montre working just fine at 09:43.

Voici la classe actuellement générée:

public class NinjectMVC3 { 
    public static void RegisterServices(IKernel kernel) { 
     //kernel.Bind<IThingRepository>().To<SqlThingRepository>(); 
    } 

    public static void SetupDependencyInjection() { 
     // Create Ninject DI Kernel 
     IKernel kernel = new StandardKernel(); 

     // Register services with our Ninject DI Container 
     RegisterServices(kernel); 

     // Tell ASP.NET MVC 3 to use our Ninject DI Container 
     MvcServiceLocator.SetCurrent(new NinjectServiceLocator(kernel)); 
    } 
} 

Répondre

13

Fondamentalement, MvcServiceLocator a disparu. Chaque fois que la vidéo a été faite, il y avait un décalage dans les versions, je suppose. Il existe d'excellentes explications disponibles here et here.

Les deux étapes qui feront fonctionner Ninject sont les suivantes. Remplacer NinjectMVC3 par ce qui suit (j'ai aussi changé le nom qui est pas nécessaire):

public class NinjectResolver : IDependencyResolver 
{ 
    private static IKernel kernel; 

    public NinjectResolver() 
    { 
     kernel = new StandardKernel(); 
     RegisterServices(kernel); 
    } 

    public static void RegisterServices(IKernel kernel) 
    { 
     //kernel.Bind<IThingRepository>().To<SqlThingRepository>(); 
    } 

    public object GetService(Type serviceType) 
    { 
     return kernel.TryGet(serviceType); 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return kernel.GetAll(serviceType); 
    } 
} 

et ajoutez la ligne suivante à App_Start() dans gloabl.asax.cs

DependencyResolver.SetResolver(new NinjectResolver()); 
+0

Yep! Le paquet NuPack était basé sur MVC 3 Preview 1 et doit être mis à jour. Merci! –

+0

Je vais essayer de faire réparer le paquet en direct plus tard aujourd'hui, merci! –

5

Je fixe le paquet et téléchargé à le flux. Ce serait génial si vous aviez une chance de l'essayer et de vérifier que cela fonctionne maintenant. J'ai augmenté la version de Ninject.MVC3 de 0.1 à 0.2 :)

+0

Les deux versions Ninject.MVC (0.1 et 0.2) doivent-elles apparaître dans l'interface graphique de référence Ajouter un package? Le nouveau (0.2) construit définitivement comme prévu. – Jedidja

+0

Non, ça ne devrait pas. L'interface utilisateur est encore très tôt. C'est plus ou moins juste un prototype. –

+2

En fait, il compilé, mais en essayant d'exécuter le code, je ne pouvais pas charger le type 'System.Web.Mvc.IMvcServiceLocator' de l'assembly 'System.Web.Mvc, Version = 3.0.0.0, Culture = neutre, PublicKeyToken = 31bf3856ad364e35 '. – Jedidja

1

Je viens d'installer Ninject.MVC3 0.3. J'utilise ASP.NET MVC 3 Beta.

J'ai ajouté ce code dans mon fichier Global.asax.cs:

public static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind<IProductRepository>().To<SqlProductRepository>(); 
    } 

    public void SetupDependencyInjection() 
    { 
     IKernel kernel = new StandardKernel(); 
     RegisterServices(kernel); 
     DependencyResolver.SetResolver(new Ninject.Mvc3.NinjectServiceLocator(kernel)); 
    } 

et je l'ai ajouté un appel à SetupDependencyInjection() en fonction Application_Start() il ressemble à ceci:

protected void Application_Start() 
    { 
     SetupDependencyInjection(); 

     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 
    } 

Le IProductRepository et SqlProductRepository sont des classes que j'ai créées dans mon dossier Modèles et j'ai ajouté une dépendance de constructeur à mon HomeController. Voici le code:

private IProductRepository products; 

    public HomeController(IProductRepository productRepository) 
    { 
     products = productRepository; 
    } 

J'ai ajouté quelques points d'arrêt et j'ai exécuté l'application, qui fonctionne comme un charme. J'espère que cela t'aides.