none
ninject и asp.net mvc 4 RRS feed

  • Вопрос

  • Добрый день. Ранее в своих проектах я использовал для DI ninject и подход описанный в книге Стивена Сандерсона, т.е. у меня была фабрика и её регистрация в Global.asax.cs следующего вида:

     ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());

    Сейчас ninject имеет более новую версию и новый подход:

    При установке всего этого добра через nuGet в папке App_Start создался класс NinjectWebCommon. В котором, как я понял, нужно сделать так..

            private static void RegisterServices(IKernel kernel)
            {
                kernel.Bind<IRepository>().To<EFRepository>();
            }  

    И типо, все должно быть замечательно, но я получаю ошибку No parameterless constructor defined for this object. Ninject ничего не передает в конструктор, а хотелосьбы..

    Не понятно, что делаю не так. В интеренете много информации на этот счет, кто то просто переустановил ninject, кто то использует класс

    class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver
    Общей картины как то, не сложилось. Буду признателен, за помощь


     



Ответы

Все ответы

  • Да, подход изменился немного. Посмотрите книгу Pro ASP.NET MVC 4, там на простом примере всё  подробно изложено. Правда на английском, но думаю разобраться особого труда не составит.
    Модератор
  • В последнее время я работаю над четвёртой частью данного цикла статей и в близжайшее время она выйдет. В частности будет описан новый интерфейс  IDependencyResolver в MVC4, через который внедряются зависимости в фабрике контроллеров и сама новая фабрика.
    Модератор
  • Сделал, как и советовали в книге.

        public class NinjectDependencyResolver : IDependencyResolver
        {
            private IKernel kernel;
            public NinjectDependencyResolver()
            {
                kernel = new StandardKernel();
                AddBindings();
            }
            public object GetService(Type serviceType)
            {
                return kernel.TryGet(serviceType);
            }
            public IEnumerable<object> GetServices(Type serviceType)
            {
                return kernel.GetAll(serviceType);
            }
            private void AddBindings()
            {
                kernel.Bind<IRepository>().To<EFRepository>();
            }
    
            public IDependencyScope BeginScope()
            {
                throw new NotImplementedException();
            }
    
            public void Dispose()
            {
                throw new NotImplementedException();
            }
        }

    про 2 последних метода, в книги вообще не упоминается, далее зарегестрировал в Application_Start

        DependencyResolver.SetResolver(new NinjectDependencyResolver());

    Имею ошибку: The type MyProject.Infrastructure.NinjectDependencyResolver does not appear to implement Microsoft.Practices.ServiceLocation.IServiceLocator. Parameter name: commonServiceLocator

    Что то, я не заметил, в коком месте реализация стала проще и удобнее по сравнению с тем, что было, даже если не брать во внимание, что не особо то пока у меня работает
    • Изменено Sumv 17 мая 2013 г. 10:09
  • Если у кого есть работающий пример для mvc 4, поделитесь пожалуйста.
  • То, что привели вы должно работать. Что ещё кроме контроллеров MVC у вас резолвится с помощью Ninject?
    Модератор
  • Ничего, толком, в проекте вообще ничего нет. В проекте установлен ninject 3.0. Ninject.MVC3
  • Уберите все пакеты, оставьте только ninject 3.0.
    Модератор
  • Как решил? Такая же беда.
    7 февраля 2015 г. 15:11