¿Por qué la NinjectMVC3.cs generados a partir de NuPack no compilan? (O lo que le pasó a MvcServiceLocator en ASP.NET MVC 3 Beta?)
-
28-09-2019 - |
Pregunta
Uso del complemento NuPack y la instalación de los resultados del paquete de Ninject MVC 3 en el siguiente error de compilación en el archivo NinjectMVC3.cs
generado.
The name 'MvcServiceLocator' does not exist in the current context
El video de muestra David Ebbo publicado muestra que trabajar muy bien a las 09:43 .
Esta es la clase generada actualmente:
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));
}
}
Solución
Básicamente, MvcServiceLocator
ha desaparecido. Cada vez que el video fue hecho hubo una falta de coincidencia en las versiones, supongo.
Hay excelentes explicaciones disponibles aquí y aquí .
Los dos pasos que harán el trabajo Ninject son los siguientes. Reemplazar NinjectMVC3
con la siguiente (También ha cambiado el nombre que no es necesario):
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);
}
}
y agregue la siguiente línea al App_Start()
en gloabl.asax.cs
DependencyResolver.SetResolver(new NinjectResolver());
Otros consejos
he fijado el paquete y lo ha subido a la alimentación. Sería muy bueno si has tenido una oportunidad de probarlo y comprobar que funciona ahora. I subido la versión de Ninject.MVC3 0,1 a 0,2:)
Me acaba de instalar Ninject.MVC3 0,3. Estoy usando ASP.NET MVC 3 Beta.
He añadido este código en mi archivo 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));
}
Y he añadido una llamada a SetupDependencyInjection()
en función Application_Start()
por lo que se ve así:
protected void Application_Start()
{
SetupDependencyInjection();
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
El IProductRepository
y SqlProductRepository
son clases que he tomado en mi Modelos de carpetas y he añadido una dependencia constructor para mi HomeController
. Aquí está el código:
private IProductRepository products;
public HomeController(IProductRepository productRepository)
{
products = productRepository;
}
He añadido algunos puntos de interrupción y corrió la aplicación y funciona como un encanto. Espero que esto ayude.