Учебный курс по ASP.NET MVC 3, глава 1. Обзор ASP.NET MVC

Паттерн Model-View-Controller разделяет приложение на три логических компонента: модель, представление и контроллер. Фреймворк ASP.NET MVC – альтернатива паттерну ASP.NET Web Forms в задаче создания веб-приложений, являясь при этом легковесным фреймворком с широкими возможностями по тестированию, интегрированным с существующой функциональностью ASP.NET такой, как master pages и membership-based. Аутентификацией. Фреймворк MVC определен в сборке System.Web.MVC.

Паттерн MVC

clip_image00142

MVC – стандартный паттерн, с которым знакомо множество разработчиков. Некоторые веб-приложения выигрывают от использования данного паттерна, другие же могут использовать традиционный подход к разработке ASP.NET приложений, основанный на postbacks и Web Forms. Третьи веб-приложения могут комбинировать оба подхода, при этом ни тот, ни другой не исключают присутствия друг друга.

Фреймворк MVC состоит из следующих компонентов:

  • Модели. Объекты моделей являются частями приложения, реализующими логику домена данных приложения. Зачастую объекты моделей получают и сохраняют состояние модели в базе данных, например, объект Продукт может получать информацию из базы данных, манипулировать её состоянием и затем сохранять обновлённый объект обратно в таблицу Продукт в базу данных. В небольших приложениях модель часто является концептуальным слоем, нежели физическим. Например, если приложение только загружает множество данных и отправляет его на представление, приложение не будет иметь физически реализованного слоя модели и ассоциированных классов. В данном случае, множество данных берёт на себя роль объекта модели.
  • Представления. Представления отображают пользовательский интерфейс. Обычно этот интерфейс создаётся согласно данным из модели. Например, может существовать представление для редактирования записей в таблице Продукты, отображающее выпадающие списки, checkboxes и другие поля, основываясь на текущем состоянии объекта Продукт.
  • Контроллеры. Контроллеры управляют взаимодействием с пользователем, работают с моделью и выбирают, какое из представлений обрабатывать и выдавать пользователю во время взаимодействия с ним. Например, контроллер обрабатывает строки из запроса и пересылает эти значения в модель, которая в дальнейшем может помещать их в базу данных.

Паттерн MVC помогает создавать приложения, отделяющие различные аспекты функциональности приложения друг от друга (логика ввода-вывода, бизнес-логика, UI-логика), при этом предоставляя определённую степень связности между этими аспектами. Паттерн определяет, где будет расположен каждый из слоёв. UI-логика расположена в представлении, логика ввода-вывода в контроллере, бизнес-логика – в модели. Это разделение помогает управляться со сложностями во время разработки приложения, позволяя сфокусироваться на одном из аспектов функциональности в один момент времени. Например, вы можете сконцентрироваться на представлении вне зависимости от степени готовности бизнес-логики. Связность между тремя основными компонентами приложения MVC также предоставляет возможность параллельной разработки – один разработчик занят представлением, второй контроллером, третий моделью.

Поддержка Test-Driven Development

Паттерн MVC облегчает тестирование приложение (по сравнению с Web-forms приложением). Например, в Web-Forms приложении один класс используется одновременно и для вывода контента пользователю и для реакции на его действия. Написание автоматических тестов для подобного приложения может быть сложным, так как для тестирования одной страницы вам придется создать экземпляр класса страницы, всех его контролов и зависимостей. Из-за такого количества экземпляров, которые необходимо создать для тестирования одной страницы, может быть проблематично написание тестов для тестирования отдельных частей приложения. Более того, тесты для Web Forms приложений нуждаются в веб-сервере. Фреймворк MVC же разделяет компоненты и использует интерфейсы, что предоставляет возможность тестировать отдельные компоненты по отдельности.

Когда создавать приложение MVC?

Необходимо чётко понимать, использовать MVC или Web Forms. Одно другое не заменяет, можно использовать оба фреймворка.

Перед тем, как сделать выбор, взвесьте преимущества каждого из подходов.

Преимущества MVC
  • Разделение приложения по слоям снижает сложность разработки.
  • Не используется состояние представления для server-based форм, что делает приложение полностью контролируемым разработчиком.
  • Используется паттерн Front Controller, обрабатывающий запросы через один контроллер, что позволяет проектировать приложение с богатой структурой маршрутов. Подробнее см. Front Controller.
  • Более совершенная поддержка TDD.
  • Подходит для разработки большими командами, которым необходим полный контроль над поведением приложения.
Преимущества Web Forms
  • Поддержка событийной (с множеством событий для обработки серверных контролов) модели, сохраняющей состояние HTTP, что подходит для разработки бизнес веб-приложений.
  • Используется паттерн Page Controller, предоставляющий функциональность отдельных страниц. Подробнее см. Page Controller.
  • Используется состояние для server-based форм, что облегчает процесс манипуляций с данными.
  • Хорошо подходит для маленьких команд, где требуется быстрая разработка большого количества компонентов.

В целом, менее сложный процесс разработки, так как компоненты (класс Page, контролы и др.) плотно интегрированы и требуется меньше кода для их описания, нежели в модели MVC.

Функциональность фреймворка ASP.NET MVC

  • Разделение функциональности приложения и TDD. Все основные действия основаны на интерфейсах и могут тестироваться с использованием объектов-«болванок», которые эмулируют объекты и их поведение. Можно тестировать приложение без запуска контроллеров, что быстро и гибко. Можно использовать любой фреймворк для тестирования, совместимый с .NET Framework.
  • Функциональный фреймворк. Компоненты фреймворка спроектированы с учётом их возможного редактирования или замены. Вы можете подключить собственный движок представлений, политики маршрутизации, сериализации параметров методов и др. Фреймворк также поддерживает Dependency Injection (DI) и Inversion Of Control (IOC). DI позволяет вставлять объекты в класс без участия самого класса. IOC определяет, что, если необходим какой-то объект, первый объект должен получить второй объект из внешних исходников (например, конфигурационного файла). Это облегчает тестирование.
  • Маршрутизация ASP.NET, являющаяся отличным компонентом для маппинга URL, позволяющая создавать приложения с удобными для поиска URL-ами. Для URL нет необходимости включать расширения для файловых имен, и они спроектированы с учетом поддержки паттерном наименования URL, которые работают одинаково хорошо для SEO и REST.
  • Поддержка разметки файлов страниц (.aspx), пользовательских контролов (.ascx) и master page (.master) как шаблонов для представлений. Вы можете использовать существующую функциональность ASP.NET с фреймворком MVC, такую, как вложенные master pages, инлайн выражения (<%= %>), серверо-ориентированные контролы, шаблоны, связывание данных, локализацию и др.
  • Поддержка существующей функциональности ASP.NET: forms-based и windows аутентификация, membership, roles, мониторинг здоровья, архитектуру провайдеров и др..

Благодарности

Благодарим Александра Белоцерковского за неоценимую помощь в подготовке данного курса.