Вчера вечером я сделал 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)