Pourquoi les NinjectMVC3.cs générés à partir NuPack ne compilera pas? (Ou ce qui est arrivé à MvcServiceLocator dans ASP.NET MVC 3 Beta?)
-
28-09-2019 - |
Question
Utilisation du complément NuPack et en installant les résultats du paquet Ninject MVC 3 dans l'erreur de compilation suivante dans le fichier NinjectMVC3.cs
généré.
The name 'MvcServiceLocator' does not exist in the current context
Le vidéo échantillon David Ebbo a affiché le montre fonctionne très bien à 09:43 .
Voici la classe actuellement générée:
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));
}
}
La solution
En fait, MvcServiceLocator
a disparu. Chaque fois que la vidéo a été faite il y avait un décalage dans les versions, je suppose.
Il y a d'excellentes explications disponibles et ici .
Les deux étapes qui feront le travail Ninject sont les suivantes. Remplacer NinjectMVC3
par ce qui suit (j'ai aussi changé le nom qui est pas nécessaire):
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);
}
}
et ajoutez la ligne suivante à App_Start()
dans gloabl.asax.cs
DependencyResolver.SetResolver(new NinjectResolver());
Autres conseils
I ont fixé l'emballage et transféré sur la charge. Ce serait génial si vous avez eu la chance de l'essayer et vérifier que cela fonctionne maintenant. I a augmenté la version de Ninject.MVC3 0,1 à 0,2:)
Je viens installé Ninject.MVC3 0,3. J'utilise ASP.NET MVC 3 Beta.
J'ai ajouté ce code dans mon fichier 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));
}
Et j'ai ajouté un appel à SetupDependencyInjection()
en fonction Application_Start()
il ressemble à ceci:
protected void Application_Start()
{
SetupDependencyInjection();
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
Le IProductRepository
et SqlProductRepository
sont des classes que je faisais dans mon dossier Modèles et j'ai ajouté une dépendance constructeur à mon HomeController
. Voici le code:
private IProductRepository products;
public HomeController(IProductRepository productRepository)
{
products = productRepository;
}
J'ai ajouté quelques points d'arrêt et a couru l'application et il fonctionne comme un charme. Espérons que cela aide.