¿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?)

StackOverflow https://stackoverflow.com/questions/3875457

  •  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));
    }
}
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top