all_2013_07_02.ppt
- Количество слайдов: 33
Курс. NET
Хорошая книга • Принципы, паттерны и методики гибкой разработки на языке C# • Мартин Р. , Мартин М.
Хорошая книга • Мифический человекомесяц, или Как создаются программные системы • Фредерик Брукс
Орг. вопросы • Включить камеру • Отметить присутствующих • След. Занятие – 9 июля
Дом. задание • Сделать сайт, в котором есть страница с многострочным полем для ввода. После ввода в него тест и нажатия на кнопку «обработать» введенный текст обрабатывается (как во тестовом задании) и выводится форма, в которой выведены все файлы. • Сделать страницу, в котором есть два поля ввода – в первое вводится строка, во второе – после нажатия на кнопку выводится кодированная строка, в которой HTML теги заменены для вывода в качестве текста
ASP. NET MVC Введение
ASP. NET • Первая попытка сделать программирование под web так же как программирование под Desktop приложение – Windows Forms • Реализовать паттерн MVC можно и на ASP. NET • С тестами в ASP. NET намного хуже, чем в ASP. NET MVC • При желании можно элементы технологии заменить или заточить под свои нужны, но в ASP. NET MVC делается все намного проще
MVC – model view controller View Отображение информации Controller Управление с отображением, взаимодействие с моделью Model Бизнес-логика модели
Что реально? Модель БД Обработка модели Получение из запроса модели расширяет данные БД, нарушает правила избыточности, умеет себя валидировать Контроллер + движок рендеринга Модель – не правила бизнеслогики в терминах ASP. NET MVC HTML страница Генерируется запрос на основании действий пользователя
Суть ASP MVC • Писать программы проще, потому что концепция «вебовская» , а не притянутая десктопная • Их проще писать, если есть четкое разграничение логики • В MVC четко выделены контроллеры • Контроллеры имеют методы, часть из которых имеет View – то, как будут отображаться результаты вычислений. • Сами результаты вычислений передаются в модели
Задача • Реализовать суммирование двух чисел • Что демонстрируем пример – Синтаксис Razor – Использование моделей – Отсутствие валидации модели (будет отдельная лекция) – Вызов метода из формы – Создание View для методов
ASP. NET MVC Razor
Обычная страница @using NMSP @model Sample Операторы разор начинаются с @ @{ View. Bag. Title=“zzz”; } В данном случае – строго типизированное представление
View. Bag • View. Bag – динамический тип. Dynamic • По сути это набор пар (название свойства, его значение).
Синхронизация структуры БД
Проблема • Когда начинается проект (долгий проект) заказчик как правило не знает всего, чего захочет • Во время реализации изменения структуры БД не исключены, особенно во время оптимизаций (которые делать или слишком рано или слишком поздно) • Есть коллектив разработчиков, которые работают независимо над одним проектом. • Есть ORM в проекте
Приближение к решению • При модификации БД каждый разработчик записывает скрипт изменения • Потом скрипты запускаются «ручками» • Проблемы – не забыть запустить скрипт, не пропустить ни один файл и т. д. • Суть – брахло, единственная стоящая вещь – создания скприпта изменения
Приближение к решению • Каждый скрипт добавляется в сборку (как Embedded resource) • Каждый скрипт жестко нумеруется • В БД записывается номер последнего выполненного скрипта • При запуске смотрится, какие скрипты не выполнялись, выполняются и обновляется номер последнего выполненного скрипта в БД
Недостатки • Пусть Вася и Петя параллельно делали скрипт и оба присвоили ему номер 2. • Вася закомитил первым. Петя увидел, что номер уже занят и изменил номер 2 на номер 3 у своего скрипта. • И «понеслась» - у некоторых будут «пропуски» обновлений, потому что номер 2 будет заменен на номер 3 и Васин номер 2 не выполнится.
Решение • Каждое обновление имеет Guid. • Каждое обновление имеет номер (для определения порядка выполнения) • По сути получаются параллельные ветки обновлений структуры БД, которые разрабатывались независимо и поэтому не зависемы. Как следствие «перемешивание» обновлений из разных веток при сохранении относительного порядка – не страшно.
Где расположить и где запускать • Запускать надо при старте сайта – точно • Но что бы запустить сайт, надо его скомпилировать, а там ORM, для перегенерации которой надо обновить структуру БД. А для обновления – надо запустить • Поэтому надо создать тестовую сборку, в которую включить обновления. И эта сборка должна быть независима. • Даже если сайт не компилируется, тесты запустить можно. А после запуска тестов обновится структуру БД и сайт скомпилируется.
Как искать обновления и их запускать? • Заранее не известно, сколько будет обновлений. • Поэтому для поиска обновлений им надо дать какой-то специализированный маркет, т. е. атрибут • Дальше с помощью рефлексии – получаем выполняемую сборку, получаем типы, фильтруем по наличию атрибута, создаем экземпляры классов, сортируем по порядку выполнения • Исключаем те, которые уже выполнялись (их можно найти по Guid) • Выполняем оставшиеся, каждый раз добавляя их Guid в список выполнявшихся. • P. S. Guid легко генерировать с помощью средств VS
TDD Проблемы
Одна из проблем TDD • Подготавливаем данные для теста ( «эталонные данные» ) • Запускаем тест • Видим ошибку или не ошибку • Подготаваливаем данные для теста – что за этим кроется? ? ? ?
Вариант 1 (не прикольный) using (var db = new cvs_db. Entities()) { var new. Record = new testtable {id = 1, name = "3", value = true}; db. testtables. Add. Object(new. Record); var new. Record 2 = new testtable { id = 2, name = "3", value = true }; db. testtables. Add. Object(new. Record 2); var new. Record 3 = new testtable { id = 3, name = "3", value = true }; db. testtables. Add. Object(new. Record 3); var new. Record 4 = new testtable { id = 4, name = "3", value = true }; db. testtables. Add. Object(new. Record 4); db. Save. Changes(); }
Вариант 1 (сказка на ночь) • А если у таблицы 16 полей и надо добавить 10 записей?
Вариант 2 (прикольный) • Взять open office или office
Проблема • Как это сделать?
Решение (часть 1) • Использовать csv формат (когда все разделяется запятыми, а сами запятые в тексте экранируются)
Решение (2) • Сделать следующую структуру файла – Строка с названием таблицы – Строка, в каждой ячейке которой хранится значение поля – Затем 0 или более строк со значениями этих полей – Затем (опционально) – пустая строка – Все тоже самое для другой таблицы
Пример содержимого файла • • testtable, , id, name, value 1, проверка 1, true 2, "прове, 2", false 3, "про "" 3", false , , second. Table, , id, name,
Мелкая проблема • Почему-то в Office 2010 хоть и пишут, что разделитель – запятая, но ставят точку с запятой. А в 2007 офисе – все нормально, ставят запятую
Возникающие проблемы • 1) разбить файл на «части» по БД (мелочь) • 2) Прочитать значения строк из файла (мелочь) • 3) Понять, к какой таблице относится запись и какой класс надо создавать (мелочь) • 4) воссоздать класс из строки + список полей (не совсем мелочь) • 5) Добавить в таблицу новую запись (не совсем мелочь)