Использование ASP.NET MVC 2 с Ninject 2 с нуля

Вчера вечером я сделал File -> New Project над новым проектом. Ах, запах зеленых полей.

Я использую только что выпущенный ASP.NET MVC 2 (т.е. без предварительного просмотра или кандидата на выпуск, настоящая вещь), и подумал, что неплохо начать с использования Ninject 2 (также выпущенной версии) с расширениями MVC. Я загрузил проект расширений MVC, открыл его в VS2008Sp1, построил в режиме выпуска, а затем зашел в папку mvc2 \ build \ release и скопировал оттуда Ninject.dll и Ninject.Web.Mvc.dll в папку Libraries на моем компьютере. project (чтобы я мог таскать их с собой в системе управления версиями и всегда везде иметь нужную версию). Я не включил соответствующие файлы .xml - следует? Они просто предоставляют intellisense или какую-то другую функцию? Я считаю, что это не имеет большого значения.

Как бы то ни было, я последовал самому актуальному совету, который смог найти; Я сослался на библиотеки DLL в моем проекте MVC2, а затем приступил к работе над Global.asax.cs. Сначала я сделал это унаследованным от NinjectHttpApplication. Я удалил метод Application_Start () и вместо этого переопределил OnApplicationStarted (). Вот этот метод:

protected override void OnApplicationStarted() 
{ 
    base.OnApplicationStarted(); 
    AreaRegistration.RegisterAllAreas(); 
    RegisterRoutes(RouteTable.Routes); 
    // RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
} 

А еще я последовал совету VS и реализовал метод CreateKernel:

protected override Ninject.IKernel CreateKernel() 
{ 
    // RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
    return new StandardKernel(); 
} 

Вот и все. Других доработок проекта нет.

Вы заметите, что метод RegisterAllControllersIn () закомментирован в двух местах выше. Я решил, что могу использовать его в трех различных комбинациях, все со своими забавными побочными эффектами;

  • Запускаем как указано выше.

Затем мне предоставляется стандартная страница «Добро пожаловать в ASP.NET MVC» во всей ее красе. Однако после того, как эта страница правильно отображается в браузере, VS показывает мне возникшее исключение. Он выбрасывает NinjectControllerFactory.GetControllerInstance (), который был вызван со значением NULL в параметре controllerType. Обратите внимание, что это происходит после визуализации страницы / Home - я понятия не имею, почему она вызывается снова, и, используя точки останова, я уже определил, что GetControllerInstance () был успешно вызван для HomeController. Почему этот новый вызов с controllerType как null? Я действительно понятия не имею. Нажатие F5 в это время возвращает меня в браузер, никаких жалоб там нет.

  • Раскомментирование метода RegisterAllControllersIn () в CreateKernel ()

Вот где все действительно начинает напугать. Теперь я получаю ошибку 404. Иногда я также получал исключение ArgumentNullException в строке RegisterAllControllersIn (), но это случается довольно редко, и мне не удавалось воспроизвести его.

  • Раскомментирование метода RegisterAllControllers () в OnApplicationStarted ()

(И возвращаем комментарий к тому, что находится в CreateKernel ())

Приводит к поведению, которое выглядит точно так же, как в пункте 1.

Итак, чтобы не продолжаться вечно - есть ли точное пошаговое руководство о том, как настроить проект MVC 2 с Ninject 2 (обе версии не бета-версии), чтобы получить контроллеры, предоставленные Ninject? Конечно, затем я начну предоставлять некоторые фактические материалы для инъекций (например, объекты и репозитории ISession, регистраторы и т. Д.), Но я думал, что сначала это заработает.

Любая помощь будет принята с благодарностью!

(Также опубликовано в группе Google Ninject)


person Rune Jacobsen    schedule 25.03.2010    source источник
comment
Это находится в процессе исправления ребятами из Ninject. Больше, когда я оборачиваюсь вокруг всего этого!   -  person Rune Jacobsen    schedule 26.03.2010
comment
Почему вы не регистрируете какие-либо модули, как в github.com/enkari/ninject.web.mvc (readme.markdown)? (Я видел ветку на groups.google.com/group/ninject/ browse_thread / thread /)?   -  person Ruben Bartelink    schedule 26.03.2010
comment
Привет! Причина отсутствия модулей в том, что это новый проект, а репозиториев и прочего, что будет внедряться, еще не существует. Первое, что я сделал после настройки проекта MVC, в основном добавил в микс Ninject 2, чтобы убедиться, что внедрение контроллера работает, но этого не произошло. Это моя причина. :)   -  person Rune Jacobsen    schedule 28.03.2010
comment
+1 за Ах, запах зеленых полей. Особенно, когда они начинают цвести. ;)   -  person Robert Koritnik    schedule 23.04.2011


Ответы (1)


Я чувствую себя грязным, отвечая на свой вопрос, но для пользы всех, кто может вмешаться в это ...

Это не проблема Ninject, на самом деле, это проблема с Cassini (веб-сервер, встроенный в VS2k8), который обрабатывает эти запросы иначе, чем IIS будет их обрабатывать. Основная причина в том, что приложение получает запрос на favicon.ico, который Cassini отправляет в MVC, и Ninject не знает, как с ним справиться.

Ян Дэвис исправил эту ошибку за впечатляюще короткий промежуток времени, а также рекомендовал добавить маршрут игнорирования, чтобы избежать этой проблемы, особенно во время разработки. Просто добавьте в конфигурацию вашего маршрута следующее:

routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });

Надеюсь, это кому-то поможет!

person Rune Jacobsen    schedule 28.03.2010