Perché i NinjectMVC3.cs generati da NuPack si compilano? (O quello che è successo a MvcServiceLocator in ASP.NET MVC 3 Beta?)
-
28-09-2019 - |
Domanda
Utilizzando il componente aggiuntivo NuPack e l'installazione dei Ninject MVC 3 risultati pacchetto il seguente errore di compilazione nel file NinjectMVC3.cs
generato.
The name 'MvcServiceLocator' does not exist in the current context
Il video di esempio David Ebbo pubblicato mostra che lavorando bene a 9:43 .
Questa è 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));
}
}
Soluzione
In sostanza, MvcServiceLocator
è andato via. Ogni volta che il video è stato realizzato c'era una mancata corrispondenza tra le versioni, immagino.
Ci sono eccellenti spiegazioni disponibili qui e qui .
I due passaggi che renderanno il lavoro Ninject 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());
Altri suggerimenti
Ho fissato il pacchetto e lo ha caricato al feed. Sarebbe bello se si ha la possibilità di provare e verificare che funziona ora. Ho aumentato la versione di Ninject.MVC3 0,1-0,2:)
Ho appena installato Ninject.MVC3 0.3. Sto usando ASP.NET MVC 3 Beta.
Ho aggiunto il codice in mio file 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 alla funzione in SetupDependencyInjection()
Application_Start()
in modo che appaia in questo modo:
protected void Application_Start()
{
SetupDependencyInjection();
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
Il IProductRepository
e SqlProductRepository
sono classi che ho fatto nei miei modelli cartella 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 corse l'applicazione e funziona come un fascino. Spero che questo aiuti.