ASP.NET, MVC, ASP.NET MVC
Click here to load reader
description
Transcript of ASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVCИстория, паттерны, реализация
Андрей Кулешов
История
▪ В 1991 появляется первый стандарт языка разметки HTML – Hyper Text Markup Language
▪ В следующее десятилетие наблюдается взрывной рост количества веб-серверов (как программного обеспечения, так и машин, обслуживающих запросы), веб-браузеров, веб-стандартов
▪ От серверов, отдающих статическое содержимое (файлы на жестком диске) – к динамическому содержимому (когда возвращаемый результат был результатом работы программы)
▪ Январь 2002 – релиз ASP.NET Web Forms (вместе с .NET как таковым)
Почему перестало хватать Web Forms?
▪ ASP.NET – хорошая программная платформа, созданная десятилетие назад
• Одно из декларированных преимуществ – не нужно учить HTML – мы кидаем на страницу контролы (привет, разработчики Visual Basic) и всё автомагически происходит на сервере
• Потому что в далекие времена ничего хорошего на клиенте происходить не могло
• Высокая сложность клиентского кода – у каждого браузера свой диалект JavaScript (он же LiveScript, он же JScript, и всё это станет стандартом ECMAScript), своя DOM, и нет никаких распространенных фреймворков, позволяющих абстрагироваться от этих различий
• Обмен данными между клиентом и сервером идёт строго по схеме GET – POST (и разработчикам Web Forms даже не надо знать этих слов)
Что случилось?
▪ AJAX
▪ Стандартизация
▪ JavaScript фреймворки (jQuery, Yahoo)
▪ Расширение возможностей браузеров
▪ Распространение unit-тестирования
Люди, желавшие странного...
▪ Лучший контроль над генерируемой HTML-разметкой
▪ Лучшие возможности для создание скриптов на клиенте
▪ Больше возможностей для юнит-тестирования логики
ДемоMVC для ASP.NET своими руками
Единая точка входа запросов
▪ Все запросы перенаправляются на центральный IHttpHandler
▪ Если по запрошенному пути существуют физический файл на диске, то сервер возвращает этот файл
▪ Иначе – запрос обрабатывается согласно правилам роутинга
Сферический MVC в ваакуме
▪ Model-view-controller (MVC, «Модель-представление-поведение», «Модель-представление-контроллер») — архитектура программного обеспечения, в которой модель данных приложения, пользовательский интерфейс и управляющая логика разделены на три отдельных компонента, так, что модификация одного из компонентов оказывает минимальное воздействие на другие компоненты.
• Модель (Model). Модель предоставляет данные (обычно для View), а также реагирует на запросы (обычно от контроллера), изменяя своё состояние.
• Представление (View). Отвечает за отображение информации (пользовательский интерфейс).
• Контроллер(Controller). Интерпретирует данные, введённые пользователем, и информирует модель и представление о необходимости соответствующей реакции.
- модель независима от визуального представления
- для одной и той же модели можно создавать различные представления
Явление ASP.NET MVC народу
▪ Прототип придуман в феврале 2007 года Скоттом Гуфри, на борту самолета, на котором тот летел на конференцию на восточное побережье США
▪ Впервые показан в октябре 2007 года, где вызвал интерес и желание продолжать
▪ ASP.NET MVC CTP – декабрь 2007
▪ Первый релиз в марте 2009
▪ Последний стабильный релиз – MVC 4 – август 2012 г.
ДемоПроект ASP.NET MVC
Separation of ConcernsРазделение ответственности
Предназначено для того, чтобы сделать код более• тестируемым• открытым к модификациям и рефакторингу• повторно используемым• управляемым• масштабируемым
Configuration over Convention
▪ Есть ряд простых правил (именования файлов и классов, размещения их внутри папок), следуя которым, вы просто подключаете ваш код (или разметку) к инфраструктуре MVC, и не выполняете никакого дополнительного конфигурирования
▪ Например – все контроллеры должны реализовывать интерфейс IController (условие, необходимое для работы), находиться в папке Controllers иметь постфикс имение Controller (конвенции, позволяющие обойтись без их явного конфигурирования)
ASP.NET MVC – это тот же ASP.NET
▪ То есть стоит на плечах гигантов...
▪ Единая среда для Web Forms и MVC
▪ Одно и то же программное окружение– Один и тот же набор модулей для аутентификации,
кэширования, хранения сессий– Централизованный HTTP хэндлер, отдающий все ресурсы
• Возможность работы бок о бок– Классические Web Forms и ASP.NET MVC могут работать
внутри одного и того же проекта
Controllers
▪ Задачи контроллера – это принять данные от пользователя и обработать их, или, наоборот, подготовить данные для отправки пользователю
▪ Содержит множество (возможно, пустое )Actions
▪ Как правило – сгруппированных по смыслу
▪ Каждый Action возвращает информацию, содержащую:- модель (model)- данные для выбора представления (View)
Model
▪ Класс. Просто класс. Plain Old Class Object, он же POCO. Других особых требований к нему нет.
▪ С точки зрения Best Practices существует два подхода:- пишем для Action-ов свои классы, описывающие минимально необходимую сущность (public class HumanViewModel)- используем классы из доменной модели нашего приложения, например, сгенерированные Entity Framework и имеющие маппинги на базу данных
▪ (автор является строгим приверженцем первого подхода)
▪ Однако модель может быть декорирована атрибутами, описывающими её и автоматически включающими клиентскую и серверную валидацию
▪ (хотя с тем же успехом к ней может быть создана парная мета-модель... Но это уже совсем отдельная тема)
Views
▪ Отвечают за преобразование данных (модели) в браузерочитаемую разметку
▪ Использование ASPX/ASCX – только потому, что мы уже умеем на них писать
▪ Это не полноценная страница (Page) – это шаблон. У него нет жизненного цикла, у него вообще жизни нет.
▪ Единственная цель остается той же – получить строку с HTML внутри
▪ Возможность подключения кастомизированных View Engine, начиная с первой версии
▪ Поддерживаемый Microsoft ViewEngine Razor начиная с третьей версии ASP.NET MVC
Cтандартный механизм View
▪ Pure HTML
▪ HTML.* helpers
▪ AJAX.* helpers
▪ URL.* helpers
▪ <%= … %> vs <%: … %> vs <% %> vs @... vs @{ … }
▪ Повторное использование кода и разметки – пользовательские контролы
Rich User Interface
▪ Легкость взаимодействия с JavaScript – разметка не меняется после серверной обработки
▪ jQuery в коробке, поддерживается Microsoft
▪ Легкость AJAX-взаимодействия с сервером – можно обращаться напрямую к Action
▪ Встроенные AJAX.* helpers (начиная с версии 3 используют jQuery, а не собственные библиотеки Microsoft)
▪ Обмен данными в форматах plain HTML, JSON, JavaScript
▪ Благодаря этому – повторное использование серверных контролов в клиентском коде без многократных перегрузок страниц
Unobtrusive JavaScript
▪ Разделение обязанностей – HTML отдельно, JavaScript отдельно
▪ HTML-5 style<input type=“text” data-valid=“true” value=“Привет”/>
▪ AJAX.* и валидация данных используют этот подход,начиная с версии 3
▪ Значительно упрощает получение HTML через ajax-запрос
▪ Значительно упрощает кастомизацию
▪ Значительно увеличивает читаемость кода
Валидация данных
▪ Декларативное объявление атрибутов валидности
▪ Атрибуты ассоциированны с самой моделью
▪ Если модель недоступна (например, сгенерирована) – можно создать для неё класс – поставщик метаданных
▪ Единая модель валидации для клиента и сервера
▪ Начиная с MVC 3 – jquery.validation как движок клиентской валидации
▪ Декларативный HTML-5 стиль на клиенте – легкость работы с AJAX
URL mapping
▪ Сопоставляет пришедший запрос с контроллером, методом
▪ Служит одним из источником параметров Action-ов
▪ User-friendly URL
Сильно упрощенная схема генерации ответа
User Requesthttp://getdev.ne
t
IIS handles request
Routing Module
MVCRouteHandler
Controller Factory Controller
Action View Engine – look for view
Как в контроллеры приходят параметры?
Концепция Model Binders
• Заполнение модели сырыми данными из формы, запроса и прочих источников данных, пришедших от пользователя – НЕ работа контроллераЭто нарушило бы принцип Single Responsibility
• Для любой модели можно определить класс, который ей конструирует, глобально или на уровне отдельного метода
Default Model Binder
• ValueProvider: данные из формы, данные из строки запроса
• Сопоставление данных со свойствами модели происходит по имени
• Угадайте механизм .NET, который позволяет это делать
Reflection
Areas
▪ Средство для разбиения одного большого сайта на несколько почти независимых маленьких
▪ Каждая Area имеет свой набор контроллеров, View и (опционально) моделей
▪ Типичный пример – одна Area для обычных пользователей, другая – для администраторов
Action Filters
▪ Фильтр операции (action filter) — это атрибут, который позволяет декларативно подключать к запрошенной операции некое поведение.
▪ IActionFilter - Методы этого интерфейса вызываются до и после выполнения метода контроллера
▪ IAuthorizationFilter - Методы этого интерфейса вызываются до выполнения метода контроллера
▪ IExceptionFilter - Методы этого интерфейса вызываются всякий раз, когда при выполнении метода контроллера генерируется исключение
▪ IResultFilter - Методы этого интерфейса вызываются до и после обработки результата операции
Dependency Injection
▪ В соответствии с первоначальной задумкой, в ASP.NET MVC предусмотрено множество мест, в которых можно перехватывать или заменять фукнционал фреймворка, не используя грязных хаков
▪ Наиболее популярные заменяемые части:- инстанциирование контроллеров- View Engine- Model Binder
▪ Всего же мест для замены стандартных частей фреймворка в ASP.NET MVC 4 порядка полутора десятков
Интересное чтение
▪ Pro ASP.NET MVC 3 Framework by Steven Sanderson & Adam Freeman
▪ Professional ASP.NET MVC 4 by Phil Haack and many, many others
▪ http://www.asp.net/mvc
▪ Фильтры операций в ASP.NET MVC от Дино Эспозито
Интересное видео
▪ http://www.mvcconf.com/ - онлайн-конференция, посвященная ASP.NET MVC
▪ ASP.NET MVC For Web Forms developers by Dino Esposito
Вопросы?Внимательно слушаю!
Андрей Кулешов
akuleshov.tula
Специально для http://GetDev.NET