Perché i NinjectMVC3.cs generati da NuPack si compilano? (O quello che è successo a MvcServiceLocator in ASP.NET MVC 3 Beta?)

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

  •  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));
    }
}
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top