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

Я просто Зарегистрировал-> Новый Проект вчера вечером на новом проекте. А-ч, запах зеленых полей.

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

Anyhoo, я последовал самому актуальному совету, который я мог найти; я сослался на DLLs в своем проекте 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 () метод комментируется в двух местах выше. Я полагал, что могу выполнить его в трех различных комбинациях, всех с их броскими побочными эффектами;

  • Выполнение его как вышеупомянутый.

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

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

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

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

(И откладывание комментария о том в CreateKernel ())

Результаты в поведении, которое точно походит на это в точке 1.

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

Любая справка будет высоко цениться!

(Также отправленный на Ninject Google Group)

9
задан Rune Jacobsen 25 March 2010 в 19:20
поделиться

1 ответ

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

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

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

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

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

10
ответ дан 4 December 2019 в 21:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: