Почему сгенерированные NinjectMVC3.cs из nupack не компилируют? (или что случилось с MVCSERVICELOCATOR в ASP.NET MVC 3 BETA?)
-
28-09-2019 - |
Вопрос
Использование Addin Nupack и установка пакета Ninject MVC 3 приводит к следующей ошибке компиляции в сгенерированном NinjectMVC3.cs
файл.
The name 'MvcServiceLocator' does not exist in the current context
То Образец видео Давид Эббо опубликовал это работает просто в 09:43.
Вот в настоящее время класс класса:
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));
}
}
Решение
В принципе, MvcServiceLocator
ушел Всякий раз, когда видео было сделано, в версиях было несоответствие, я думаю.
Есть отличные объяснения доступны здесь а также здесь.
Две шаги, которые сделают Ninject работать следующим образом. Заменять NinjectMVC3
Со следующим (я также изменил имя, которое не нужно):
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);
}
}
и добавьте следующую строку в App_Start()
в gloabl.asax.cs
DependencyResolver.SetResolver(new NinjectResolver());
Другие советы
Я исправил пакет и загрузил его в корм. Было бы здорово, если у вас был шанс попробовать его и проверить, что он работает сейчас. Я повернул версию Ninject.mvc3 с 0,1 до 0,2 :)
Я только что установил ninject.mvc3 0.3. Я использую ASP.NET MVC 3 BETA.
Я добавил этот код в мой 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));
}
И я добавил звонок SetupDependencyInjection()
в Application_Start()
Функция, так что это выглядит так:
protected void Application_Start()
{
SetupDependencyInjection();
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
То IProductRepository
а также SqlProductRepository
это классы, которые я сделал в папке моих моделей, и я добавил зависимость конструктора для моего HomeController
. Отказ Вот код:
private IProductRepository products;
public HomeController(IProductRepository productRepository)
{
products = productRepository;
}
Я добавил некоторые точки останова и запустил приложение, и он работает как очарование. Надеюсь это поможет.