ASP.NET MVC 4

ASP.NET MVC 4

Адам Фриман

Начинаем

Если вы планируете кодировать SportsStore на своем компьютере, вам нужно будет установить программное обеспечение, описанное в главе 2. Вы также можете взять SportsStore из архива с кодом, который прилагается к этой книге (доступен на apress.com). Мы включали скриншоты проекта после того, как добавляли основные функции, чтобы можно было проследить, как изменялось приложение в процессе нашей работы над ним.

Создавать приложение вместе с нами вам, конечно, не обязательно. Мы постарались сделать скриншоты и листинги с кодом настолько доступными, насколько это возможно, на случай, если вы читаете эту книгу в поезде, кафе или тому подобное.

Создаем решение и проекты Visual Studio

Мы собираемся создать решение Visual Studio, которое включает три проекта. Один проект будет содержать нашу доменную модель, второй будет нашим MVC-приложением, а третий будет содержать модульные тесты. Для начала мы создадим новое решение Visual Studio под названием SportsStore, используя шаблон Blank Solution, который можно найти в разделе Other Project Types диалога New Project, как показано на рисунке 7-1. Для создания решения нажмите ОК.

Рисунок 7-1: Создаем новое решение Visual Studio

Решение Visual Studio является контейнером для одного или нескольких проектов. Для нашего примера нам понадобится три проекта, которые мы описали в таблице 7-1. Чтобы добавить проект, щелкните правой кнопкой по вкладке Solution в Solution Explorer и выберите Add New Project в контекстном меню.

Таблица 7-1: Три проекта SportsStore
Название проекта Шаблон проекта Цель проекта
SportsStore.Domain Class Library Содержит доменные объекты и логику; поддерживает механизм хранения с помощью хранилища, созданного используя Entity Framework.
SportsStore.WebUI ASP.NET MVC 4 Web Application (Выберите Basic, когда будет предложено выбрать шаблон проекта) Содержит контроллеры и представления; выступает в качестве интерфейса приложения.
SportsStore.UnitTests Unit Test Project Содержит модульные тесты для двух других проектов.

Мы используем версию Basic шаблона ASP.NET MVC 4 Web Application, поскольку она содержит несколько полезных дополнений: набор часто используемых библиотек JavaScript и папку Scripts (в том числе JQuery, JQuery UI, Knockout и Modernizr), базовый макет в папке Views и несколько CSS стилей в папке Content (в том числе стили валидации формы, которые мы добавляли вручную в главе 2).

Примечание

Файлы библиотеки JavaScript, которые включены в шаблон Basic, описаны в главе 24. Стив является создателем библиотеки Knockout. Адам описал Knockout в своей книге Pro JavaScript for Web Apps (Apress, 2012), наряду с Modernizr и некоторыми другими важными библиотеками JavaScript и интерфейсами HTML5. Адам также писал о JQuery, JQuery UI и JQuery Mobile в своей книге Pro JQuery (Apress, 2012). Как вы, возможно, догадываетесь, мы оба испытываем глубокий интерес к этой области и считаем, что невозможно создать хорошее серверное приложение, не уделяя должного внимания клиентской стороне.

Вы можете удалить файл Class1.cs в проекте SportsStore.Domain - мы не будем его использовать. Когда вы это сделаете, окно Solution Explorer должно выглядеть так, как показано на рисунке 7-2.

Рисунок 7-2: Проекты отображаются в окне Solution Explorer

Чтобы сделать отладку легче, щелкните правой кнопкой мыши по проекту SportsStore.WebUI и выберите команду Set as Startup Project в контекстном меню (имя выделится полужирным шрифтом). Это означает, что, когда вы выберите Start Debugging или Start without Debugging в меню Debug, будет запущен именно этот проект.

Добавляем ссылки

Нам нужно добавить ссылки на библиотеки инструментов, которые мы собираемся использовать для двух проектов. Самый простой способ добавить библиотеки - это кликнуть правой кнопкой мыши по каждому проекту, выбрать пункт Manage NuGet Packages, который вызывает диалог NuGet, и найти и установить необходимые библиотеки.

Нам также нужно установить зависимости между проектами. Кликните правой кнопкой мыши по каждому проекту в окне Solution Explorer, выберите пункт Add Reference и добавьте ссылки на необходимые библиотеки инструментов или другие проекты из раздела Solution.

Вы можете просмотреть подробную информацию о проектах, пакетах NuGet и зависимостях от других проектов в таблице 7-2.

Внимание

Не жалейте времени на то, чтобы установить эти отношения должным образом. Если вы установите неправильные библиотеки и ссылки на проекты, у вас будут проблемы в дальнейшей работе над проектом.

Таблица 7-2: Необходимые зависимости проекта
Название проекта Зависимости инструментов Зависимости проектов Ссылки Microsoft
SportsStore.Domain None None System.Web.Mvc System.ComponentModel.DataAnnotations
SportsStore.WebUI Ninject, Moq SportsStore.Domain None
SportsStore.UnitTests Ninject, Moq SportsStore.Domain, SportsStore.WebUI System.Web.Mvc, System.Web, Microsoft.CSharp

Чтобы добавить ссылку на сборку System.Web.Mvc в проект SportsStore.UnitTests, кликните правой кнопкой мыши по имени проекта в Solution Explorer, выберите пункт Add Reference и перейдите в раздел Assemblies - Extensions. Вы найдете несколько ссылок на сборки под названием System.Web.Mvc. Убедитесь, что вы добавляете версию 4.0.0. Если вы выберите более раннюю версию, у вас могут возникнуть проблемы при тестировании функций, которые были изменены в последней версии. Другие ссылки Microsoft добавляются таким же образом, но находятся в разделе Assemblies - Framework.

Устанавливаем контейнер DI

В главе 6 мы разобрали, как с помощью Ninject создать пользовательский DR (dependency resolver), который используется платформой MVC для создания экземпляров объектов в приложении. В этом примере мы собираемся поступить иначе, а именно - создать пользовательскую фабрику контроллеров. Это проиллюстрирует одну из многих точек расширения MVC Framework, где вы можете добавить пользовательский код, чтобы изменить поведение платформы или, как мы делаем здесь, ограничить DI и использовать его только в одной части приложения. Обычно DR используется для работы с DI и пользовательской фабрикой контроллеров, чтобы изменить то, как размещаются классы контроллера (к этой теме мы еще вернемся в главе 15). В этом примере приложения мы собираемся использовать только фабрику контроллеров, так как хотим продемонстрировать вам как можно больше различных аспектов платформы MVC.

Создайте в проекте SportsStore.WebUI новую папку под названием Infrastructure, а затем создайте класс NinjectControllerFactory и отредактируйте файл класса так, чтобы он соответствовал листингу 7-1.

Листинг 7-1: Класс NinjectControllerFactory
using System;
using System.Web.Mvc;
using System.Web.Routing;
using Ninject;

namespace SportsStore.WebUI.Infrastructure
{
	// реализация пользовательской фабрики контроллеров, 
	// наследуясь от фабрики используемой по умолчанию
	public class NinjectControllerFactory : DefaultControllerFactory
	{
		private IKernel ninjectKernel;
		public NinjectControllerFactory()
		{
			// создание контейнера
			ninjectKernel = new StandardKernel();
			AddBindings();
		}

		protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
		{
			// получение объекта контроллера из контейнера 
			// используя его тип
			return controllerType == null
				? null
				: (IController)ninjectKernel.Get(controllerType);
		}
		private void AddBindings()
		{
			// конфигурирование контейнера
		}
	}
}

Мы еще не добавляли привязки Ninject, но когда они нам понадобятся, мы можем сделать это с помощью метода AddBindings. Необходимо сообщить MVC, что для создания объектов контроллера мы хотим использовать класс NinjectController. Для этого мы делаем дополнение в методе Application_Start в файле Global.asax.cs проекта SportsStore.WebUI, которое выделено жирным шрифтом в листинге 7-2.

Листинг 7-2: Регистрируем NinjectControllerFactory в MVC Framework
using SportsStore.WebUI.Infrastructure;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace SportsStore.WebUI
{
	public class MvcApplication : System.Web.HttpApplication
	{
		protected void Application_Start()
		{
			AreaRegistration.RegisterAllAreas();

			WebApiConfig.Register(GlobalConfiguration.Configuration);
			FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
			RouteConfig.RegisterRoutes(RouteTable.Routes);
			BundleConfig.RegisterBundles(BundleTable.Bundles);

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

Запускаем приложение

Если вы выберите команду Start Debugging в меню Debug, то получите страницу с сообщением об ошибке. Это произойдет потому, что вы запросили URL, связанный с контроллером, для которого у Ninject нет привязки, что показано на рисунке 7-3.

Рисунок 7-3: Страница с сообщением об ошибке

Если вы видите это окно, то Visual Studio 2012 и ASP.NET MVC у вас настроены и работают правильно. Вы можете остановить отладку, закрыв окно браузера, если ваш браузер по умолчанию – Internet Explorer. Если нет, то переключитесь в Visual Studio и выберите пункт Stop Debugging в меню Debug.

Упрощеная отладка

Когда вы запускаете проект из меню Debug, Visual Studio откроет новое окно браузера для отображения приложения. Чтобы ускорить процесс, вы можете открыть приложение в отдельном окне. Если вы уже запускали отладчик хотя бы один раз, кликните правой кнопкой мыши ярлык IIS Express в системном трее и выберите URL для вашего приложения в контекстном меню, как показано на следующем скриншоте.

Таким образом, вам не нужно будет запускать новую сессию отладки после каждого изменения, чтобы увидеть эффект. Вы просто компилируете решение в Visual Studio, нажав F6 или выбрав Build - Build Solution, а затем перезагружаете страницу в браузере.

или RSS канал: Что новенького на smarly.net