2010-10-06 6 views
7

L'utilizzo dell'addit NuPack e l'installazione del pacchetto NInject MVC 3 determinano il seguente errore di compilazione nel file NinjectMVC3.cs generato.Perché il NinjectMVC3.cs generato da NuPack non viene compilato? (o cosa è successo a MvcServiceLocator in ASP.NET MVC 3 Beta?)

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

Il sample video David Ebbo pubblicato mostra che working just fine at 09:43.

Ecco la classe attualmente generata:

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)); 
    } 
} 

risposta

13

In sostanza, MvcServiceLocator è andato via. Ogni volta che il video è stato realizzato c'era una discrepanza nelle versioni, immagino.

Sono disponibili eccellenti spiegazioni here e here.

I due passaggi che consentono a Ninject di funzionare sono i seguenti. Sostituire NinjectMVC3 con la seguente (ho anche cambiato il nome, che non è necessario):

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); 
    } 
} 

e aggiungere la seguente riga alla App_Start() in gloabl.asax.cs

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

Sì! Il pacchetto NuPack era basato su MVC 3 Preview 1 e deve essere aggiornato. Grazie! –

+0

Proverò a far riparare il pacchetto live più tardi oggi, grazie! –

5

Ho fissato il pacchetto e caricato su il feed. Sarebbe fantastico se tu avessi la possibilità di provarlo e verificare che funzioni ora. Ho aumentato la versione di Ninject.MVC3 da 0.1 a 0.2 :)

+0

Se entrambe le versioni di Ninject.MVC (0.1 e 0.2) sono visualizzate nella GUI Aggiungi pacchetto di riferimento? Il nuovo (0.2) crea sicuramente come previsto. – Jedidja

+0

No, non dovrebbe. L'interfaccia utente è ancora in una forma molto precoce. È più o meno solo un prototipo. –

+2

In realtà, ha compilato, ma cercando di eseguire il codice, ho ricevuto Impossibile caricare il tipo 'System.Web.Mvc.IMvcServiceLocator' dall'assembly 'System.Web.Mvc, Version = 3.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35 '. – Jedidja

1

Ho appena installato Ninject.MVC3 0.3. Sto usando ASP.NET MVC 3 Beta.

ho aggiunto questo codice nel mio file di 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)); 
    } 

e ho aggiunto una chiamata a SetupDependencyInjection() in Application_Start() funzione in modo che assomiglia a questo:

protected void Application_Start() 
    { 
     SetupDependencyInjection(); 

     AreaRegistration.RegisterAllAreas(); 

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

Il IProductRepository e SqlProductRepository sono classi che ho creato nella mia cartella Modelli e ho aggiunto una dipendenza costruttore al mio HomeController. Ecco il codice:

private IProductRepository products; 

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

ho aggiunto alcuni punti di interruzione e fatto funzionare l'applicazione e funziona come un fascino. Spero che questo ti aiuti.