Начинаем
Если вы планируете кодировать 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
, а затем перезагружаете страницу в браузере.