Использование ASP.NET MVC 2 с Ninject 2 с нуля - PullRequest
9 голосов
/ 25 марта 2010

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

Я использую только что выпущенный ASP.NET MVC 2 (т.е. без предварительного просмотра или выпуска) кандидат, реальная вещь), и думал, что я получу хорошее начало используя Ninject 2 (также выпущенную версию) с расширениями MVC. я скачал проект расширений MVC, открыл его в VS2008Sp1, собрал это в режиме выпуска, а затем пошел в папку mvc2 \ build \ release и скопировал Ninject.dll и Ninject.Web.Mvc.dll оттуда в Папка «Библиотеки» в моем проекте (чтобы я мог их контроль исходного кода и всегда иметь правильную версию везде). Я не включить соответствующие 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 () прокомментирован в двух местах выше. Я решил, что могу запустить его в трех разных комбинации, все с их причудливыми побочными эффектами;

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

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

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

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

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

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

В результате получается поведение, которое выглядит точно так же, как в пункте 1.

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

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

(также опубликовано в Ninject Google Group)

1 Ответ

10 голосов
/ 28 марта 2010

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

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

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

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

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

...