Почему сгенерированный NinjectMVC3.cs из NuPack не компилируется? (или что случилось с MvcServiceLocator в ASP.NET MVC 3 Beta?) - PullRequest
7 голосов
/ 06 октября 2010

Использование надстройки NuPack и установка пакета NInject MVC 3 приводит к следующей ошибке компиляции в сгенерированном файле NinjectMVC3.cs.

The name 'MvcServiceLocator' does not exist in the current context

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1009

Вот текущий сгенерированный класс:

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));
    }
}

Ответы [ 3 ]

13 голосов
/ 06 октября 2010

В основном, 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());
5 голосов
/ 06 октября 2010

Я исправил пакет и загрузил его в канал.Было бы здорово, если бы у вас была возможность попробовать и убедиться, что это работает сейчас.Я поднял версию Ninject.MVC3 с 0.1 до 0.2 :)

1 голос
/ 10 октября 2010

Я только что установил 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 - это классы, которые я создал в своей папке Models, и я добавил конструкторную зависимость к своему HomeController. Вот код:

    private IProductRepository products;

    public HomeController(IProductRepository productRepository)
    {
        products = productRepository;
    }

Я добавил несколько точек останова и запустил приложение, и оно работает как шарм. Надеюсь, это поможет.

...