/
Теги: компьютерные технологии программирование программное обеспечение язык программирования c# операционная система windows
ISBN: 978-5-9775-0378-5
Год: 2009
Текст
Ларе Пауэре
Майк Снелл
Microsoft®
Visual Studio
2008
Санкт-Петербург
«БХВ-Петербург»
2009
УДК 681.3.06
ББК 32.973.26-018.2
П21
Пауэре, Л.
П21 Microsoft Visual Studio 2008 / Л. Пауэре, М. Снелл: Пер. с англ. — СПб.:
БХВ-Петербург, 2009. — 1200 с: ил. — (В подлиннике)
ISBN 978-5-9775-0378-5
Рассмотрены приемы работы в интегрированной среде разработки Visual Studio
2008, а также новые технологии и элементьгереды, предназначенные для создания
эффективных современных приложений. Описана работа с решениями, проектами,
редакторами и визуальными конструкторами. Показаны новые возможности языков
программирования С# и Visual Basic. Рассмотрено создание различных типов приложений,
в том числе с помощью ASP.NET, Web-сервисов и WCF, Windows Forms, WPF, WF.
Описано применение в приложениях современных технологий, таких как AJAX, LINQ
и др. Показана работа с данными и базами данных. Уделено внимание автоматизации
интегрированной среды разработки, созданию макросов, дополнительных модулей и
мастеров. Показано использование Visual Studio Team System для коллективной работы
над проектом, выполнение модульных и Web-тестов приложений и многое другое.
Материал сопровождается практическими примерами и полезными советами.
Для программистов
УДК 681.3.06
ББК 32.973.26-018.2
Группа подготовки издания:
Главный редактор Екатерина Кондукова
Зам. главного редактора Игорь Шишигин
Зав. редакцией Григорий Добин
Перевод с английского Андрея Дашкевича
Редактор Анна Кузьмина
Компьютерная верстка Натальи Смирновой
Корректор Наталия Перишкова
Оформление обложки Елены Беляевой
Зав. производством Николай Тверских
Authorized translation from the English language edition, entitled MICROSOFT® VISUAL STUDIO 2008 UNLEASHED, 1st
Edition, ISBN 978-0-672-32972-2, by POWERS, LARS, and SNELL, MIKE, published by Pearson Education, Inc , publishing as SAMS
Publishing, Copyright © 2008 All rights reserved No part of this book may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without the prior
permission from Pearson Education, Inc RUSSIAN language edition published by BHV St Petersburg, Copyright © 2009
Авторизованный перевод английской редакции, выпущенной Pearson Education, Inc, импринт SAMS Publishing,
Copyright © 2008 Все права защищены Никакая часть настоящей книги не может быть воспроизведена или передана в какой
бы то ни было форме и какими бы то ни было средствами, будь то электронные или механические, включая
фотокопирование, записана на магнитный носитель, размещена в любых базах данных и информационно-поисковых системах без
предварительного письменного разрешения Pearson Education, Inc Перевод на русский язык "БХВ-Петербург" © 2009
Лицензия ИД № 02429 от 24.07.00. Подписано в печать 27.02.09.
Формат 70x100Viв. Печать офсетная. Усл. печ. л. 96,75.
Тираж 2000 экз. Заказ tyg 3716
"БХВ-Петербург", 190005, Санкт-Петербург, Измайловский пр., 29.
Санитарно-эпидемиологическое заключение на продукцию № 77.99.60.953 Д.002108 02 07
от 28.02.2007 г выдано Федеральной службой по надзору
в сфере защиты прав потребителей и благополучия человека.
Отпечатано с готовых диапозитивов
в ГУП "Типография "Наука"
199034, Санкт-Петербург, 9 линия, 12
Оглавление
об авторах 1
Посвящение 2
Благодарности 3
Введение 4
Кто должен прочитать эту книгу? 4
Как организована эта книга? 5
Часть I. Введение в Visual Studio 2008 5
Часть II. Подробности о IDE 5
Часть III. Программирование и работа с кодом 5
Часть IV. Расширенные возможности Visual Studio 6
Часть V. Создание промышленных приложений 6
Часть VI. Система командной работы Visual Studio Team System 6
О типографских соглашениях 6
ЧАСТЬ I. ВВЕДЕНИЕ В VISUAL STUDIO 2008 7
Глава 1. Краткий обзор Visual Studio 2008 9
Некоторые приятные улучшения интегрированной среды разработки 10
Один инструмент для множества задач 10
Более четкий оконный интерфейс 12
Сохранение настроек 16
Совместное использование кода в сообществе разработчиков 18
Расширенная поддержка Class Designer 18
VI Оглавление
Пользовательские приложения 18
Повышаем производительность Web-разработчика 20
Более "умные" клиенты 30
Решения на базе пакета приложений Office 34
Мобильные устройства 38
Ориентированные на сервис решения с постоянным подключением 40
Разработка приложения/бизнес-процесса 41
Создание и использование сервисов 43
Работа с данными 45
Проектирование данных 45
Отображение объектов на реляционные данные 46
Создание периодически подключаемых приложений 48
Линейка программных продуктов Visual Studio 49
Редакции Express Edition 50
Редакция Standard Edition 50
Редакция Professional Edition 51
Team Systems 52
Инструменты Expression Tools 54
Резюме 55
Глава 2. Краткий обзор интегрированной среды разработки 56
Установка Visual Studio 56
Выбор языка 56
Конфигурирование вашей среды разработки 57
Стартовая страница 60
Опции запуска 60
Ваш первый проект 62
Строка меню 62
Множество панелей инструментов 68
Стандартная панель инструментов 68
Настройка панелей инструментов 69
Панель Toolbox 71
Визуальные конструкторы 72
Текстовые редакторы 73
Редакторы кода 73
Настройка редактора 76
Solution Explorer 71
Окно свойств Properties 11
Управление множеством окон в интегрированной среде разработки 7S
Прикалывание Ъ
Стыковка Ъ
Резюме 8^
Оглавление VII
Глава 3. .NET Framework и языковые улучшения в версии 2008 83
Обзор улучшений интегрированной среды разработки Visual Studio 2008
по .NET-языкам 84
Улучшения интегрированной среды разработки для VB 84
Улучшения интегрированной среды разработки для С# 85
Дополнения в .NET-языках версии 2008 86
Выведение типа данных переменной на основе присваивания 87
Создание объекта и настройка его свойств одной строкой кода 89
Добавление методов в существующие классы 90
Добавление бизнес-логики в сгенерированный код 95
Доступ к данным и выполнение запросов при помощи .NET-языков 97
Разбиение сборки на несколько файлов 98
Работа с XML непосредственно в коде 99
Удаление неиспользуемых аргументов из обработчиков событий
(только для VB) 100
Создание автоматически реализуемого свойства (только для С#) 100
Улучшения в .NET Framework 3.5 101
Резюме 104
ЧАСТЬ П. ПОДРОБНОСТИ О IDE 105
Глава 4. Решения и проекты 107
Разбираемся с решениями 107
Создание решения 108
Работа с решениями ИЗ
Осваиваем проекты 119
Создание проекта 119
Работа с файлами определения проектов 122
Работа с проектами : 128
Резюме 133
Глава 5. Браузеры и проводники 135
Solution Explorer 135
Визуальные подсказки и значки 136
Управление решениями 141
Управление проектами 142
VIII Оглавление
Class View 142
Панель инструментов 143
Панель поиска 144
Панель объектов 144
Панель членов 146
Server Explorer 147
Подключения к данным 148
Серверные компоненты 149
Object Browser 153
Изменение области действия 153
Просмотр объектов 154
Document Outline 156
Редактирование элементов 157
Резюме 158
Глава 6. Редакторы и визуальные конструкторы 159
Основы 159
Текстовый редактор 160
Визуальные конструкторы Visual Studio 162
Кодирование в редакторе кода 162
Открытие редактора 163
Написание кода в редакторе кода 164
Анатомия окна редактора кода 165
Панель кода : 166
Поиск в документах 170
Отладка в текстовом редакторе 179
Печать кода 182
Окно определения кода Code Definition Window 183
Создание и редактирование XML-документов и схем 184
Выведение схемы 185
Редактирование таблиц стилей XSLT 186
Каскадные таблицы стилей 187
Добавление правил стилей 187
Определение атрибутов таблицы стилей 187
Разработка клиентских приложений под Windows 187
Создание проекта Windows Forms 188
Создание проекта Windows Presentation Foundation 197
Разработка Web Forms 200
Конструирование приложения Web Form 201
Программирование компонентов и элементов управления 207
Создание нового компонента или элемента управления 207
Дальнейшие замечания по поводу написания кода компонентов 208
Резюме 210
Оглавление
IX
Глава 7. .NET-сообщество: использование и создание
разделяемого кода 211
Функциональные средс+ва Visual Studio для работы с сообществом
разработчиков 211
Стартовая страница Visual Studio 212
Меню Help 217
Нахождение и применение совместно используемого контента 228
Изучение типов совместно используемого контента 229
Поиск нужного контента 229
Инсталляция и хранение совместно используемого контента 230
Участие в сообществе 232
Создание совместно используемых элементов
(шаблонов проектов и элементов) 232
Создание шаблона проекта 232
Создание шаблонов элементов 239
Упаковка вашего произведения 239
Подписывание вашей работы 247
Публикация вашего произведения 248
Резюме 249
ЧАСТЬ III. ПРОГРАММИРОВАНИЕ И РАБОТА С КОДОМ 251
Глава 8. Работа со средствами повышения
производительности Visual Studio -..253
Основные средства помощи в текстовом редакторе 255
Отслеживание изменений 255
Индикаторы проблем кодирования 256
Активные гиперссылки 257
Синтаксическое расцвечивание 257
Структурирование и навигация 258
Структурирование кода 258
Навигация по HTML 260
Смарт-теги и смарт-задачи 262
Визуальный конструктор HTML 262
Визуальный конструктор Windows Forms 263
Редактор кода 263
Технология IntelliSense 264
Complete Word 265
Quick Info 266
X Оглавление
List Members 266
Parameter Info 268
Organize Usings 269
Фрагменты кода и шаблоны кода 269
Парность скобок 278
Настройка технологии IntelliSense 279
Список задач 281
Задачи комментариев 281
Задачи ярлыков 283
Пользовательские задачи 283
Резюме 284
Глава 9. Рефакторинг кода 285
Основы рефакторинга в Visual Studio 286
Запуск инструментов рефакторинга 287
Предварительный просмотр изменений 290
Переименование 292
Доступ к операции Rename 292
Работа с диалоговым окном Rename 294
Извлечение метода 295
Доступ к операции Extract Method 296
Извлечение методов 296
Генерируем заглушку метода 303
Извлечение интерфейса 304
Доступ к операции Extract Interface 304
Извлечение интерфейсов 304
Параметры рефакторинга 306
Удаление параметров 307
Превращение локальной переменной в параметр 308
Перестановка параметров 310
Инкапсуляции поля 311
Доступ к операции Encapsulate Field 311
Диалоговое окно Encapsulate Field 312
Резюме 313
Глава 10. Отладка кода 314
Основы отладки 315
Сценарий 315
Множество фаз отладки 315
Отладка приложения (самопроверка) 316
Выводы по основам отладки 326
Оглавление XI
Отладчик Visual Studio 326
Меню и панель инструментов Debug 326
Опции отладки 331
Вход в код, выход из кода и пропуск кода 332
Указание мест выхода в код 338
Точки отслеживания (опция When Hit) 347
Просмотр данных в отладчике 348
Функция Edit and Continue 353
Сложные сценарии отладки 354
Удаленная отладка 354
Отладка сервисов WCF 356
Отладка многопоточных приложений 356
Отладка скрипта на стороне клиента 359
Резюме 361
ЧАСТЬ IV. РАСШИРЕННЫЕ ВОЗМОЖНОСТИ VISUAL STUDIO 363
Глава 11. Введение в объектную модель расширяемости 365
Обзор объектной модели расширяемости 365
Версии объектной модели 366
Категории расширяемости 368
Корневой объект DTE/DTE2 368
Объекты решений и проектов 370
Управление проектами в решении 372
Доступ к коду внутри проекта 373
Окна 377
Ссылки на окна : 377
Взаимодействие с окнами 378
Текстовые окна и панели окон 381
Типы оконных инструментов 384
Связанные окна 392
Панели команд 394
Документы 398
Текстовые документы 399
Объекты команд 412
Выполнение команды 413
Соответствие привязок клавиш 414
Объекты отладчика 415
События расширяемости 415
Резюме 416
XII Оглавление
Глава 12. Пишем макросы 418
Запись макроса 419
Использование Macro Explorer 420
Создание макроса при помощи интегрированной среды Macro 422
Работа с макропроектами 423
Написание макроса 426
Отладка 429
Обработка событий 430
Запуск макросов 435
Резюме 439
Глава 13. Надстройки и мастера м 440
Создание первого проекта надстройки 441
Настройка параметров надстройки 441
Структура надстройки 451
Жизненный цикл надстройки 451
Реакция на команды 457
Управление надстройками 459
Пример надстройки: цветовая палитра 460
Начинаем 461
Создание User Control 461
Завершение разработки класса Connect 466
Предоставление настроек надстройки 469
Создание мастера для Visual Studio 486
Изучение структуры мастера 486
Создание мастера Add New Item Wizard 490
Резюме 495
ЧАСТЬ V. СОЗДАНИЕ ПРОМЫШЛЕННЫХ ПРИЛОЖЕНИЙ 497
Глава 14. Создание приложений ASP.NET 499
Основы сайта ASP.NET 500
Создание нового проекта Web-приложения 500
Управление свойствами и опциями проекта 512
Создание Web-страниц 518
Конструирование вашего пользовательского интерфейса 527
Определение компоновки страницы и размещение элементов управления 528
Создание общего внешнего вида 533
Оглавление XIII
Работа с элементами управления ASP.NET 562
Обзор элементов управления ASP.NET 563
Стандартные элементы управления ASP.NET 564
Проверяющие элементы управления 567
Элементы управления входом в систему 569
Элементы управления навигацией сайта 573
Элементы управления данными 574
Пользовательские элементы управления 576
Резюме 576
Глава 15. Создание приложений Windows Forms 578
Основы конструирования форм 578
Конечный пользователь 579
Роль стандартов пользовательских интерфейсов 580
Планирование пользовательского интерфейса 580
Создание формы 581
Тип проекта Windows Forms Application 582
События и свойства форм 583
Добавление элементов управления и компонентов 585
Компоновка и позиционирование элементов управления 587
Использование контейнеров 591
Внешний вид элемента управления и его поведение 596
Работа с элементами управления ToolStrip 597
Отображение данных 604
Создание пользовательских элементов управления 608
Сабклассинг существующего элемента управления 608
Конструирование пользовательского элемента управления 609
Создание нестандартного элемента управления 612
Резюме : 613
Глава 16. Создание богатых и интеллектуальных
пользовательских интерфейсов 614
Платформа Windows Presentation Foundation 614
Модель программирования 617
Введение в визуальный конструктор WPF 620
XAML и панели конструирования 621
Программирование в WPF 625
Компоновка 625
Стили и шаблоны 632
Привязка данных 636
Перенаправленные события 638
Оглавление
Создание простого приложения для просмотра изображений 639
Начинаем компоновку 640
Хранение изображений 642
Привязка к изображениям 645
Обработчики событий кнопки и эффекты изображения 646
Выбор пути в обычном диалоговом окне 647
Резюме 653
Глава 17. Создание богатых приложений на основе браузера 654
Создание активных клиентских приложений в стандартных браузерах 654
Элементы управления AJAX в ASP.NET 655
Создание страницы AJAX 657
Библиотека с открытым исходным кодом ASP.NET AJAX Control Toolkit 662
Создание уникальных и богатых сред на платформе Windows
при помощи браузера 669
Выбор между независимым приложением WPF и WPFXBAP 670
Создание WPF-приложения для браузера 671
Соображения безопасности 673
Развертывание WPF-приложения для браузера 677
Кросс-платформенные интерактивные среды 681
Начинаем работать с Silverlight 681
Создание приложения Silverlight 682
Использование Silverlight на Web-странице 691
Резюме 695
Глава 18. Работа с базами данных 696
Создание таблиц и связей 696
Создание новой базы данных SQL Server 697
Определение таблиц 698
Использование визуального конструктора диаграмм баз данных 700
Работа с операторами SQL 705
Написание запроса 705
Создание представлений 709
Разработка хранимых процедур 709
Создание триггеров 713
Создание пользовательских функций 714
Использование проектов баз данных 715
Создание проекта базы данных 715
Автоматическое генерирование скриптов 717
Выполнение скрипта 718
Оглавление XV
Создание в управляемом коде объектов баз данных 718
Начинаем проект SQL Server Project 719
Создание хранимой процедуры на языке С# 719
Привязка элементов управления к данным 722
Введение в привязку данных 722
Автоматическое генерирование привязанных элементов управления
Windows Forms 724
Редактирование типизированных наборов данных 730
Ручная привязка элементов управления Windows Forms 731
Привязка данных к элементам управления Web 735
Объектно-реляционная проекция 739
Обзор LIMQ 740
Проецирование при помощи конструктора O/R Designer 741
K^LINQ 744
Резюме 747
Глава 19. Ориентированные на сервис приложения 748
Фундаментальные основы сервиса 748
Почему именно Web-сервисы ASP.NET и WCF? 750
Приложения Web-cepBHcaASP.NET 751
Шаблон проекта ASP.NET Web Service Project 753
Создание Web-сервиса ASP.NET 755
Использование Web-cepBHcaASP.NET 772
Управление исключительными состояниями Web-сервисов ASP.NET 778
Приложения сервисов WCF 780
Шаблон проекта WCF Project 781
Создание сервиса WCF 783
Настройка сервиса WCF 789
Использование сервиса WCF 795
Хостинг и развертывание сервиса WCF 797
Резюме 798
Глава 20. Встраивание рабочих процессов в ваши приложения 800
Фундаментальные основы Windows Workflow 801
Компоненты рабочего процесса 801
Шаблоны проектов рабочих процессов 802
Визуальный конструктор рабочих процессов 803
Шаблоны элементов рабочего процесса 805
Действия рабочих процессов 808
XVI Оглавление
Создание последовательного рабочего процесса 810
Конструирование рабочего процесса 810
Настройка действия CodeActivity 818
Настройка действий IfElse и использование редактора RuleConditionEditor 818
Настройка действия InvokeWebService 819
Настройка действий HandleExternalEvent 821
Описание хоста и клиента для рабочего процесса 823
Выполнение вашего рабочего процесса 832
Рабочий процесс типа конечного автомата 834
Создание рабочего процесса типа конечного автомата 834
Инициализация и переход из состояния в состояние 836
Описание клиента и хоста 845
Выполнение рабочего процесса типа конечного автомата 849
Резюме 850
Глава 21. Разработка офисных бизнес-приложений 851
Обзор функциональных возможностей расширения Office 852
Функциональные возможности Office 852
Типы проектов Office в Visual Studio 855
Создание надстройки для Office 857
Модификация ленты 857
Модификация панели задач 862
Создание областей форм Outlook 863
Создание расширения документа Office 865
Элементы управления хостинга .#. 866
Создание панели действий 868
Сохранение данных в кэше данных 870
Реализация ваших собственных смарт-тегов 872
Резюме 875
ЧАСТЬ VI. СИСТЕМА КОМАНДНОЙ РАБОТЫ
VISUAL STUDIO TEAM SYSTEM 877
Глава 22. Командная работа и система командной работы
Visual Studio 879
Проекты разработки программного обеспечения 880
MSF Agile 880
Модель командной работы MSF for CMMI 883
Оглавление XVII
Система командной работы Visual Studio 884
Visual Studio Team System Architecture Edition 885
Visual Studio Team System Development Edition 885
Visual Studio Team System Test Edition 888
Visual Studio Team System Database Edition 889
Сервер Team Foundation Server 890
Резюме 892
Глава 23. Управление командными проектами
и работа с ними 894
Анатомия сервера Team Foundation Server 894
Уровень приложения 895
Уровень данных 897
Безопасность 898
Управление командным проектом 900
Создание нового командного проекта 901
Добавление пользователей в команду проекта 904
Управление структурой проекта и итерациями 909
Вклад в проект 911
Подключение к серверу Team Foundation Server 911
Использование Team Explorer 912
Использование портала проекта 913
Использование Microsoft Office 914
Использование проектных извещений 916
Работа с отчетами проекта 917
Резюме 919
Глава 24. Система управления исходными кодами 920
Основы системы управления исходными кодами 921
Основы архитектуры 921
Права и разрешения системы безопасности 922
Система управления исходными кодами 924
Настройка Visual Studio 924
Окно Source Control Explorer 925
Управление рабочими областями 927
Добавление файлов в систему управления исходными кодами 930
Редактирование файлов в системе управления исходными кодами 931
Получение файла из хранилища исходных кодов 931
Возврат ваших изменений 932
Концепция наборов изменений 938
XVIII Оглавление
Откладывание кода 940
Слияние изменений 941
Ветвление и слияние 944
Ветвление 945
Слияние / 946
Резюме 947
Глава 25. Отслеживание элементарных работ 948
Разбираемся с элементарными работами 949
Роль элементарных работ и SDLC 949
Набор элементарных работ для вашего проекта 949
Распознавание общности элементарных работ 955
Использование Team Explorer для управления элементарными работами 964
Создание новой элементарной работы 965
Поиск и фильтрация элементарных работ 967
Перспективы Team Role 970
Концепция проекта 971
Менеджер проекта 972
Бизнес-аналитик 979
Разработчик 981
Тестировщик 984
Модификация элементарных работ 986
Заполнение процесса элементарными работами 986
Модификация существующей элементарной работы 992
Резюме 994
Глава 26. Версия Development Edition 995
Визуальная разработка кода 995
Визуальный конструктор классов Class Designer 996
Добавление элементов в схему 998
Описание отношений между классами 999
Описание методов, свойств, полей и событий 1003
Модульное тестирование разработчиком 1004
Пример модульного теста 1005
Создание эффективных модульных тестов 1006
Классы и методы модульных тестов 1007
Создание модульных тестов 1008
Выполнение модульных тестов 1010
Анализ покрытия кода 1013
Оглавление XIX
Профилирование производительности 1016
Создание сеанса анализа производительности 1016
Настройка сеанса 1018
Цели сеанса 1023
Отчеты 1023
Отчеты по производительности 1024
Анализ кода 1033
Настройка правил для исполнения 1033
Обработка нарушений правил как ошибок кодирования 1034
Подавление правил» 1036
Выполнение анализа 1037
Просмотр результатов 1038
Указания по исправлению 1038
Метрики кода 1040
Измерения 1040
Вычисление метрик кода 1041
Работа с результатами 1041
Резюме 1043
Глава 27. Редакция Architecture Edition 1044
Элементы Team Architect 1045
Шаблоны проектов 1045
Шаблоны элементов 1046
Проектирование вашего приложения 1047
Работа с диаграммой приложения 1048
Определение системы 1056
Системная диаграмма 1056
Описание инфраструктуры 1059
Диаграмма логического центра данных 1060
Развертывание приложения 1068
Диаграмма развертывания 1069
Проверка развертывания 1070
Отчет по развертыванию 1072
Реализация приложения 1072
Настройка свойств реализации 1072
Генерирование проектов 1072
Резюме 1074
Глава 28. Редакция Test Edition 1075
Создание, настройка и управление тестами 1076
Проекты тестов 1076
XX Оглавление
Элементы тестов 1078
Управление тестами 1079
Настройка тестирования 1082
Web-тестирование 1082
Запись Web-теста 1083
Управление запросами Web-теста 1084
Выполнение Web-теста и просмотр результатов 1085
Заполнение Web-теста данными 1086
Извлечение значений из Web-тестов 1093
Правила проверки 1094
Тестовая нагрузка 1096
Создание теста нагрузки 1096
Просмотр и редактирование нагрузочного теста 1103
Выполнение нагрузочных тестов и просмотр результатов 1104
Ручные тесты 1105
Создание ручного теста 11,06
Выполнение ручного теста 1106
Обычные тесты 1107
Упорядоченные тесты 1107
Создание упорядоченного теста 1109
Резюме 1109
Глава 29. Редакция Database Edition 1110
Система Database Project System 1111
Создание проекта базы данных 1112
Представление схемы 1118
Сравнение схем 1120
Просмотр описаний объектов 1122
Скрипт обновления схемы 1123
Опции сравнения 1124
Сравнение данных 1125
Просмотр подробностей на уровне записей 1127
Просмотр и выполнение скрипта обновления 1127
Рефакторинг переименованием 1129
Опции Rename 1130
Предварительный просмотр изменений схемы 1130
Модульные тесты 1131
Создание модульных тестов 1131
Визуальный конструктор модульных тестов для баз данных 1134
Создание данных 1136
Создание плана создания данных 1137
Оглавление XXI
Предварительный просмотр сгенерированных данных 1139
Создание данных 1143
Построение и развертывание 1144
Резюме 1145
Глава 30. Team Foundation Build 1146
Обзор Team Foundation Build 1146
Архитектура Team Foundation Build 1147
Создание нового построения 1150
Название построения 1151
Выбор файлов для построения 1151
Определение файла проекта построения 1152
Описание политики сохранения построений 1155
Описание конфигурации агента построения 1155
Планирование построения или настройка триггеров построения 1157
Редактирование определения построения 1158
Файл проекта TFSBuild.proj 1159
РольМ8ВшШ 1159
Запуск построения 1159
Отслеживание и анализ построений 1161
Team Build Explorer 1161
Отчет по построению 1162
Резюме 1165
Предметный указатель 1166
Об авторах
Ларе Пауэре занимает должность ISV Technical Advisor в команде Developer and Platform
Evangelism фирмы Microsoft. Он работает с крупнейшими глобальными lSV-партнерами
(независимыми поставщиками программного обеспечения) фирмы Microsoft и помогает им
создавать решения на базе технологий нового поколения фирмы Microsoft. До того как
перейти в фирму Microsoft, JTapc был независимым консультантом, занимавшимся
подготовкой и преподаванием по платформе .NET.
Майк Снелл возглавляет подразделение Solutions фирмы СЕ1 (www.ceiamerica.com). Майк и
его команда консультируют и преподают клиентам, которые хотят создавать хорошее
коммерческое программное обеспечение. Майк является также региональным директором
фирмы Microsoft (www.theregion.com).
Посвящение
Шэрил, Келси и Карсону: спасибо вам за то, что вы всегда были под рукой, когда я в вас
нуждался.
Ларе Пауэре
Керри, Элли и Бену. Спасибо за ваше понимание моей занятости в те многие выходные,
которые я провел в своем офисе, и за то, что для завершения этой книги пришлось
пожертвовать нашей рок-группой. Теперь мы можем опять возродить "ХЬох".
Mail к Снелл
Благодарности
Мы хотим поблагодарить замечательную команду издательства "Sams Publishing" за их
ценный вклад и помощь в создании этой книги. Это литературный редактор Шэри Кларк (Cheri
Clark), технический редактор Тодд Мэйстер (Todd Meister), редактор-консультант Марк
Ренфроу (Mark Renfrow), редакторы Кристи Харт (Kristy Hart) и Энн Гоэбел (Anne Goebel)
и, наконец, редакторы Брук Фарлинг (Brook Fading) и Нэйл Роув (Neil Rowe).
Я хотел бы также поблагодарить архитекторов моей команды за их идеи и за то, что они
выслушивали мои соображения по многим темам этой книги. Кроме того, я хотел бы
поблагодарить моего хорошего друга и соавтора Ларса Пауэрса. Это была еще одна отличная
совместная работа.
Майк Снелл
Я хотел бы поблагодарить многих членов команды Developer and Platform Evangelism
фирмы Microsoft, работающих по всему миру. Могу честно сказать, что это самая высоко
мотивированная группа умных людей, с которой мне приходилось когда-либо работать, и я с
удовольствием называю эту команду своим профессиональным домом. Я хотел бы также
поблагодарить моего соавтора Майка за то, что он сначала убедил меня присоединиться к
этому проекту, а затем был надежным компаньоном при написании и редактировании книги.
И наконец, со всеми возможными извинениями я обращаюсь к Джэйсону Ольсэну (Jason
Olsen): за разработчиков!
Ларе Пауэре
Мы хотели бы также поблагодарить все команды фирмы Microsoft, которые отвечают за
претворение в жизнь концепций Visual Studio и Visual Studio Team System.
Введение
Выход Visual Studio 2005 и Visual Studio Team Systems ознаменовал серьезный пересмотр
способов разработки для .NET. Они принесли нам фрагменты кода, нестандартные шаблоны
проектов, рефакторинг, мастера привязки данных, смарт-теги, инструменты моделирования,
автоматизированные инструменты тестирования, управление проектами и задачами — и это
далеко не все.
Visual Studio 2008 основана на этих продуктах и обеспечивает дополнения для
интегрированной среды разработки Visual Studio. Имеется много новых улучшений в языках, среда
Framework получила много дополнений, а инструменты были значительно
усовершенствованы. Например, Visual Studio 2008 включает такие элементы, как Windows Presentation
Foundation (WPF) для создания богатых клиентских решений, Windows Communication
Foundation (WCF) для создания более динамичных ориентированных на сервис решений,
Windows Workflow Foundation (WF) для структурного программирования бизнес-процессов.
Кроме того, есть и такие усовершенствования языка, как Language Integrated Query (L1NQ), a
также улучшения системы командной работы (такие как метрики кода, профилирование
производительности, пересмотренная система построения командных проектов). Все эти
инструменты предназначены для увеличения производительности вашей работы и
повышения ее успешности. Эта книга должна помочь вам использовать множество встроенных в
Visual Studio инструментов, чтобы вы смогли оценить их пользу.
Кто должен прочитать эту книгу?
Эту книгу захотят прочитать те разработчики, которые используют Visual Studio в своей
работе. Она подробно описывает многие функциональные возможности, имеющиеся в
последней версии интегрированной среды разработки. В книге описаны следующие ключевые
темы:
□ понимание основ решений, проектов, редакторов и визуальных конструкторов;
□ создание макросов, надстроек и мастеров;
□ отладка при помощи интегрированной среды разработки;
□ рефакторинг кода;
□ совместное использование кода членами команды и сообществом;
□ создание приложений ASP.NET;
□ создание и использование Web-сервисов и применение технологии Windows Presentation
Foundation (WPF);
□ работа с данными и базами данных;
□ создание и хостинг приложений на базе рабочих процессов при помощи технологии
Windows Workflow Foundation (WF);
Введение
5
□ использование командного сотрудничества и продукты Visual Studio Team System;
□ моделирование приложений;
□ тестирование приложений на системном уровне и уровне модульных тестов;
□ управление изменениями исходных кодов и построениями.
Эта книга не о языках, а об инструментах. Если вы хотите освоить язык Visual Basic или
язык С#, то вам понадобится дополнительная книга, которая сосредоточена именно на них.
Если вы умеете писать код на языке С# или Visual Basic, то эта книга поможет вам
оптимизировать производительность вашей работы в Visual Studio. Еще раз повторимся, эта книга
не является руководством по .NET-языкам. Однако мы описываем здесь новые языковые
возможности (такие как LINQ) языков С# и Visual Basic. Мы также стараемся дать простые
примеры, которые будут доступны программистам, использующим как тот, так и другой
язык. Однако основная цель этой книги состоит в объяснении тонкостей интегрированной
среды разработки Visual Studio 2008 (для повышения производительности труда
разработчиков).
Как организована эта книга?
Вы можете прочитать эту книгу от начала и до конца, либо можете выбрать те главы,
которые максимально соответствуют вашим текущим потребностям. Иногда мы ссылаемся на
содержимое других глав, но в основном каждая глава самостоятельна. Такая организация
позволяет вам перескакивать между главами и читать по мере наличия свободного времени
(и интереса). Книга состоит из шести частей, все они описаны далее.
Часть I. Введение в Visual Studio 2008
Главы этой части дают обзор того, что следует ожидать от Visual Studio 2008. Те читатели,
которые знакомы с предыдущими версиями Visual Studio, могут просто просмотреть эти
главы. Кроме того, здесь описаны новые языковые улучшения для языков VB и С# версии
2008 года.
Часть II. Подробности о IDE
Эта часть описывает основные способы разработки в Visual Studio. Она дает разработчикам
базовое понимание богатых функциональных возможностей их основного инструмента.
В этих главах описываются многие меню и окна, которые определяют каждый инструмент.
Мы описываем основные концепции проектов и решений, а также подробно исследуем
проводники, редакторы и визуальные конструкторы.
Часть III. Программирование и работа с кодом
Эта часть построена на темах, обсуждавшихся в части II. В ней происходит углубление в
функциональные возможности повышения производительности Visual Studio 2008. Здесь
исследуются средства повышения производительности, которые имеются в интегрирован-
6
Введение
ной среде разработки, и обсуждается то, как наилучшим образом использовать Visual Studio
для рефакторинга и отладки вашего кода.
Часть IV. Расширенные возможности Visual Studio
Главы этой части предназначены для тех разработчиков, которые заинтересованы в
модификации, автоматизации или расширении интегрированной среды разработки (IDE). Мы
объясняем модель расширяемости, а затем описываем использование интерфейса
прикладного программирования (API) для автоматизации Visual Studio при помощи макросов. Мы
описываем также, как вы можете расширить возможности интегрированной среды
разработки при помощи написания ваших собственных надстроек.
Часть V. Создание промышленных приложений
В этой части описывается, как необходимо работать с инструментами интегрированной
среды для написания ваших приложений. В каждой главе дан подробный обзор использования
Visual Studio для конструирования и разработки приложений. Мы описываем создание
приложений при помощи ASP.NET, Web-сервисов и WCF, Windows Forms, WPF, WF, а также
работу с данными и базами данных.
Часть VI. Система командной работы
Visual Studio Team System
И наконец, в последней части обсуждается особый набор редакций Visual Studio, который
носит коллективное название Visual Studio Team System (VSTS). Мы посвящаем отдельную
главу каждой редакции VSTS: Development Edition, Architecture Edition, Test Edition и
Database Edition. Мы также подробно исследуем ключевые концепции командного
сотрудничества, отслеживания рабочих элементов, а также управление версиями при помощи
клиентских редакций VSTS и сервера Team Foundation Server. В заключение мы обсуждаем
концепцию автоматизированных построений в контексте Visual Studio Team System.
О типографских соглашениях
В этой книге используются следующие типографические обозначения:
Строки кода, команды, операторы, переменные и любой текст, который вы увидите на
экране, набраны моноширинным шрифтом.
Указатели места заполнения в синтаксических описаниях набраны курсивным
моноширинным шрифтом. Указатель места заполнения вы заменяете фактическим именем файла,
параметром либо другим элементом.
Курсивом выделяются технические термины при их описании.
В этой книге есть примечания, советы и предупреждения, которые помогут вам не
пропустить важную и полезную информацию.
ЧАСТЬ I
Введение
в Visual Studio 2008
Глава 1
Краткий обзор Visual Studio 2008
Windows Vista ознаменовала выпуск .NET Framework 3.0. В эту версию были включены
многие новые функциональные возможности, предназначенные для разработчика программного
обеспечения под Windows. Среди них была первоначальная версия Windows Presentation
Foundation (WPF), а также Windows Communication Foundation (WCF) и Windows Workflow
Foundation (WWF). Однако сама Visual Studio осталась неизменной. Вы могли использовать эти
новые функциональные возможности, но они не были "встроены" в интегрированную среду
разработки. Для того чтобы создавать приложения на основе этих элементов .NET Framework
и Visual Studio 2005, вам приходилось использовать ее расширения.
Visual Studio 2008 восстанавливает утраченную "синхронизацию" между инструментами
разработки и .NET Framework. .NET Framework из версии 3.0 (выпущенной вместе с Vista)
становится версией 3.5 (поставляемой вместе с Visual Studio 2008). Теперь интегрированная
среда разработки имеет собственную встроенную поддержку WPF, WCF и WWF. Кроме
того, имеется множество других новых функциональностей, в том числе: непосредственная
поддержка приложений Office, CardSpace, LINQ, значительно переделаны ASP.NET и CLR.
Примечание
Несмотря на то, что Visual Studio 2008 представляет собой важную ключевую версию,
она не является последней для Visual Studio. Непосредственно за версией 2008
последует значительный пересмотр инструмента совместной разработки Visual Studio
Team Systems и сервера Team Foundation Server (от Microsoft).
Если вы уже давно занимаетесь этими вопросами, то вы, наверное, ожидаете, что новая
версия (такая как Visual Studio 2008) принесет с собой новые модели программирования,
незнакомые термины, новые диалоговые окна и новые способы просмотра кода; найти
надежную опору на незнакомой местности бывает непросто. Данная глава покажет вам, чего
можно ожидать от первого знакомства с Visual Studio 2008. Сначала мы дадим обзор
продукта (для того чтобы помочь вам найти точку опоры). Затем мы поможем вам разобраться
в линейке программных продуктов Visual Studio. Пусть эта глава служит вам картой
сокровищ версии 2008; она будет направлять вас по верному пути.
Примечание
Часть I содержит три главы. Данная глава описывает нововведения в продукте и
саму линейку программных продуктов. Глава 2 является вводным руководством по
10
Часть I. Введение в Visual Studio 2008
инсталляции продукта, его запуску и созданию первого проекта. Она также познакомит
вас с основами работы в интегрированной среде разработки. В главе 3 мы опишем
расширения языка и .NET Framework, являющиеся частью версии 2008.
Некоторые приятные улучшения интегрированной
среды разработки
Visual Studio 2008 и .NET Framework 3.5 добавляют сотни новых функциональных
возможностей в уже полнофункциональный программный продукт. Эта новейшая версия
увеличивает производительность труда разработчиков при создании приложений, предназначенных
для новой версии .NET Framework. Для этого увеличено количество типов проектов,
снижено количество рутинных задач и учтены новые аспекты совместной разработки
программного обеспечения. И данный раздел, и следующие за ним подчеркивают эти улучшения,
которые могут облегчить вашу рабочую жизнь. Конечно, все эти пункты мы впоследствии
рассмотрим в книге гораздо подробнее; считайте содержимое данной главы "обзором для
руководителя", который предназначен для вечно занятого разработчика.
Один инструмент для множества задач
Многие из нас работают в таких условиях, где различные приложения созданы под разные
версии .NET Framework. По мере увеличения числа версий такое встречается все чаще.
Например, в эксплуатации у вас может иметься приложение под версию .NET 2.O. А новое
приложение вы пишете под версию .NET 3.5. Однако даже в том случае, когда ваше
производственное приложение требует периодического обслуживания, вы вряд ли захотите иметь
на своем компьютере две версии Visual Studio.
Visual Studio 2008 поддерживает возможность выполнять разработку приложения под
конкретную версию .NET Framework. Это означает, что вы можете использовать единый
инструмент для разработки приложений под множество разновидностей .NET Framework.
Указание версии .NET Framework для приложения приведет к соответствующей выбранной
версии настройке панели инструментов, типов проектов, доступных ссылок и даже
технологии IntelliSense внутри интегрированной среды разработки. На рис. 1.1 показано создание
нового приложения в Visual Studio 2008 и выбор версии .NET Framework (в правом верхнем
углу).
На рис. 1.2 обратите внимание на диалоговое окно Add Reference. В нем показано
добавление ссылки на приложение Windows, которое создается под .NET Framework 2.0. В
данном случае все компоненты, которые являются частью версии 3.0 или 3.5, недоступны
(затенены).
Вы можете также принять решение перенести свое приложение под другую (хотелось бы
надеяться — более новую) версию .NET Framework. Вы можете сделать это в свойствах
проекта (щелкните правой кнопкой мыши по файлу проекта и выберите команду
Properties). На рис. 1.3 показан пример. Обратите внимание на раскрывающийся список-
Target Framework. Вы можете сделать здесь изменение, и интегрированная среда
разработки (IDE) перенастрЬит технологию IntelliSense, ссылки, вашу панель инструментов (и
прочее) под выбранную новую версию Framework.
Глава 1 Краткий обзор Visual Studio 2008
11
ЩЩШ^и^т>№ [»&<4«gjg3raj
Ne* Project
Project types.
Visual C*
*Vmdov*s
Л'еЬ
Smsrt Device
Office
Database
Reporting
Tert
.VCF
Workflow
Other Languages
Qtha Project Types
Test Projects
Templates.
Vi nal SturJi
5^J
Windows
Forms Ap
1
Console
Application
n nstdtltJ ttrr iildtes
3
Class Librarv
Excel 2007
Workbook
My Template
'3
SmartClient
Template
3
Search
Online Те .
Ш
ASP NET
Web Appl
Outlook 2007
Add in
3
ASP NET
Web Servi
'T4
WCF Service
Application
i
1
[.NOfwrrvewcrkJ^ т]ТП|
.NET Framework 2 0 >
NFT Framework 3 0
i(PX .WPF-B/.r-trnfJ1- —-.
Application Application
frf 3
Word 2007 Winders
Document Forms
A project fcr creating гп application wrth a Windows Forms user interface (NET Framework 3 5)
Name- »VindowsFoimsAppl(cet»cn3
Location С \l>ers\m;nell\Documentz:\Visual Studic 2003\Projerts
Solution Name. WmdowsFormsApplicatian3 _£| Create directory Icr solution
. ] Add to Source Control
Рис. 1.1. Создание приложения
под конкретную версию NET Framework
<•» Add Reference
I V УйЫ
>NET J COM [ Projects [ Browse j Recent |
Component Name
4 <■■'' m '' i^ toi ' mi,», .-
System.DirectoryServices.Prctoc
System Drawing
System Drawmg.Design
System EnterpriseServices
'" 4jum k tr/' d-J
: nt.n Jctf» ' (dsi.i rct-i
' лс*т ['> L<-
System, Management
l .'2I>| Vil Uj.rMO I [ ".t Ъ 0'„
System. Messaging
Version
2000
2.0 0 0
2.0 Л О
голо
2*0 и
2.0 00
. 5 0 п
2.0.0 О
v2 0 50727
v2 0 50727
vlO.50727
v2J0 50727
< J П =4O27
v2 0.50727
ok
CAWin
C\Wm
C:\Wm
OXWin
CAWin
C*ncel
Рис. 1.2. Добавление ссылки на приложение
под версию NET Framework 2.0
Конечно, вы можете использовать Visual Studio 2008 и для того, чтобы открыть уже
существующее приложение, созданное под предыдущую версию .NET Framework. При этом вы
можете обновить версию или оставить ее без изменения. Эти возможности помогут вам
обновляться (для того чтобы использовать преимущества версии 2008) или продолжать
работать с приложениями, созданными под более старые версии .NET Framework.
2 3ак 3716
12
Часть I. Введение в Visual Studio 2008
v/* WindowsfarrrnAppiicafconJ - M«a
шшшШт-
File Edit View Project Build Debug Data Tools Test Window Help
Jb J-
:«4£
•£J-
)► Debug
- AnyCPlf
- L9
^
Wtndow?FormsAppbcatk>n3
! Applicstjon
Build
Build Event?
Debug
Resource*
Services
Settings
Reference Path*
Signing
Security
Ш
Assembly name:
WindowsFcimsAppficaticrG
Target Framework:
Default namespacr
WjndowsForrosApplkcattQn3
Output type.
j Windows Application
Resources
Specify how application resources will be managed4
Assembly info» ma
9 Icon and manifest
A manifest determines specific settings for an application To embed a custom manifest, first add
your project and then select it from the ffst below.
[I] Outp.il j£ Fird Svnbol Peulu -*|jS"wr L*t[
Read/
Щ
&
Рис. 1.З. Изменение версии платформы для приложения Windows
Примечание
Настройка версии Framework выполняется на уровне проекта. Поэтому вы можете
создать единое решение, состоящее из множества проектов, каждый из которых
может быть выполнен под различные версии .NET Framework.
Более четкий оконный интерфейс
Выполнены некоторые улучшения управления и доступа для многих окон внутри
интегрированной среды разработки. Многие элементы пользовательского интерфейса приобрели
новый вид и новые функциональные возможности.
Навигатор интегрированной среды разработки
Теперь разработчик может перемещаться между открытыми окнами интегрированной среды
разработки без помощи мыши. Это позволяет не снимать пальцы с клавиатуры и может
увеличить производительность. Visual Studio 2008 предоставляет здесь несколько вариантов.
Первый— это обычная комбинация клавиш операционной системы Windows.
Предположим, что у вас есть в интегрированной среде несколько открытых окон с кодом. Для
перемещения по ним вперед (слева направо) вы можете использовать комбинацию клавиш
<Ctrl>+<-> (знак "минус"). Так происходит при стандартных настройках интегрированной
среды разработки; ваши настройки могут отличаться. Для перехода в обратном направлении
(справа налево) вы можете использовать комбинацию клавиш <Ctrl>+<Shift>+<->. При этом
вы будете быстрее переключаться между окнами (без необходимости выполнять прокрутку
мышью или искать нужное окно вашего решения).
Глава 1. Краткий обзор Visual Studio 2008
13
Аналогичных результатов вы можете добиться путем использования нового визуального
средства, которое называется навигатором (Navigator). Этот инструмент похож на нажатие
комбинации клавиш <Alt>+<Tab> операционной системы Windows, которая позволяет
делать быстрый переход между приложениями. Для доступа к нему нужно использовать
комбинацию клавиш <Ctrl>+<Tab> (и <Ctrl>+<Shift>+<Tab>). Она служит для того, чтобы
открыть диалоговое окно и перемещаться по открытым окнам с кодом и инструментами
разработки. На рис. 1.4 показан результат. Обратите внимание, что в центре окна
перечислены активные файлы.
Active 1оЫ Window* Active File*
$% Toe oc< '-*£ Cla:sJ cr
>/J) Solution E/pfrter - Ncli^inn *^ CUkI cs
"~| Oar. Vie* *^ (.'lav.' :s
^f Properties
£?, F.'ul Syr bol Rfs>;te.
J% EtrcLisl
^ Str\«» E<pbter
3 Output
С \UsersWmnell\Cocurrenti;\V4u3l Static 2008\Fk> ects*C ii5L»bfery2\CSaisLJl'<jry2<iaisl tj :
Рис. 1.4. Навигатор интегрированной среды разработки в действии
Совет
Для изменения клавиатурных комбинаций для навигатора выберите в меню Tools |
Options. В узле Environment выберите Keyboard. Здесь вы можете настроить
клавиатурные комбинации быстрого вызова. Для этого вам нужно изменить значения
Window.NextDocumentWindowNav и Window.PreviousDocumentWindowNav
Вы можете получить доступ к навигатору и напрямую при помощи нажатия комбинации
клавиш <Alt>+<F7>. При этом появится окно навигатора с выбранным списком окон активных
инструментов. Вы можете перемещаться между списками при помощи клавиш <—» и «—>.
Улучшенная стыковка
В предыдущих версиях часто было затруднительно правильно пристыковывать окно кода
или инструмента внутри интегрированной среды разработки. В версии 2008 стыковка окон
значительно улучшена. Появились новые значки и элементы визуализации, которые
значительно упрощают этот процесс. На рис. 1.5 показан пример стыковки окна Server Explorer
поверх панели Toolbox. Вы видите, что имеются варианты размещения этого окна слева от
панели инструментов, ниже нее и т. д. Выбор каждого из вариантов приводит к визуальному
отображению результата еще до того, как вы отпустите кнопку мыши.
Стандартные диалоги
Еще одно приятное изменение в интегрированной среде разработки — это использование
стандартных диалоговых окон Windows для выполнения таких задач, как открывание фай-
14
Часть I. Введение в Visual Studio 2008
лов, сохранение чего-либо или распечатывание кода. В предыдущей версии Visual Studio
интегрированная среда имела собственные версии (окон) для этих обычных задач. Однако
это приводило лишь к путанице, поскольку большая часть пользователей Windows привыкла
работать со стандартными инструментами.
В качестве примера рассмотрим рис. 1.6 и 1.7. На рис. 1.6 показано диалоговое окно Open
File из Visual Studio 2005. Это окно было специфичным для Visual Studio.
^ь с 85iLib3ry2 - Microsoft WsjsI Stu3>o
File Edft View, Project Build Debug Data Tools Test Window Help
< J - _J - Jr d & ' \ a •'-,-• * Debug » Any CPU
'- - -~ - Z ^ D , • ^ *L» :
~ * X a«s3.C' Class2a ClasjUs
- »5
befco
.J
There ar« no ussbie centred ш Ihisgrottp,
Dreq «o t*ro cdto tto ttsttB в«кШс ths
tecft»e<
„I
& % Serve»
"%en
= ;N
list the guide diamond to choose a docking locatmn. To present docking, bold down CTRL*
Рис. 1.5. Улучшенная стыковка окон
Open File .. ..
J Look in
I IflP
Desktop
I ?
11 My Projects
Л
| M/ Computer
li
; Projects
Name Date modif Type
i ДИгз project!
В ran с hi
ClasiLibraryl
GWR
NorthwmdsDemo
NorthWmdSmokeTest
M*SmokeTest
SQurceCcntrclSmol eTest
ScufceDemcBranch
TFS Projects
VSfvUcrcsSQ
WebSitel
:: WindowsApplicetJonl
File name:
Files of type. All Files (' ♦)
p* Ф - Jl
Sue Tat
.J Щ ж Tools ▼
5
Jl
71 i
№\т£Ш\
\i
l|
Cancel j 1
Рис. 1.6. Диалоговое окно Open File в Visual Studio 2005
Глава 1. Краткий обзор Visual Studio 2008
15
На рис. 1.7 показано это же диалоговое окно в Visual Studio 2008. Обратите внимание, что
это то же самое диалоговое окно, которое вы получаете и в любом другом приложении под
Windows.
My Exported Templates -
Projects
ClassLibrarvl
ClassLibrar*?2
f DataAccessLayer
j DataFrarnewcrk
Fabrifcam
Name Date mod if ted
ClassLibrarvl
, CtaisLibrar/2
Contoso
DataAoressLayer
i DataFramewoik.
Fabrikam
SmartCiienl Template
Solutionl
ThreadDebugging
■: VSMacrosSO
♦VebSitel
> WebS.te2
WindcwsFormsApplicationl
, > WmdowsFormsApp!ication2
Rename
-* ЛНмИ
Open
Cancel ]
Рис. 1.7. Диалоговое окно Open File в Visual Studio 2008
Выберите шрифт
В узле Environment (Fonts and Cblors) диалогового окна Options (вызываемого из меню
Tools) имеется новая настройка Environment Font. Она позволяет настроить шрифт для
всей интегрированной среды разработки. На рис. 1.8 показан выбор этой настройки из списка.
options ч .^1!!23
>| Environment »
j General '
| Add in/Macros Security ! ,
AutcRecover \
Documents < j
1 Fonts and Colors
I Help
§ Import and Export Settings
| International Settings
1 Keyboard
i Startup
?!
1 Task List l '
1 Web Broker
1 Projects and Solutions
1 Text Editor
I Database Tools
1 Debuaoino
Show settings for*
[Т«вШ»г -. ■ -.. r "\
Tot Editor
Pnnter
Statement Completion
EditcrToollip
1АИ Text Tool Windows]
Command Window
Disassembly
Find Results Window
Immediate Window
Memory Window
Output Window
Registers
[Watch, Locals, and Autos Tool Windows]
Autos Window
CallStack Window
DataTips
Locals Window \
Threads Window *^*
Watch Windows
1 DataSet Designer
I Table and Database Designers
аататаяшшяюташшиишш ■тшшмими1 Query and View Desiqners
; u^i
| Use Defaults | !
Size
-» * - L
Custom... J I
1 Custom... 1
xYyZz i 1
j Cancel j I
Рис. 1.8. Настройка шрифта Environment Font
16
Часть /. Введение в Visual Studio 2008
Изменение этого шрифта приведет к изменению вашей интегрированной среды.
Предположим, что вы задали Environment Font значение Courier New, 8pt. Это приведет к изменению
диалоговых окон, меню и прочего. На рис. 1.9 показан результат такого изменения.
Viaw
Fi_la Edit Vi*w Rer4cto: Prefect Build. Dabu? Da^a [ lOQXl \ Teat Kindow Halp
$ - Л " «J «I *? ' £ ~ii & **» • '- ■ £N >* ► Debugs [^ Attach tc Vrec... ..
• -Jei 9^ '^ * >& Device Security Menegex.
, ^ Connect to Device...
ify Device Zaxjlataz Miaagar.
SexV-ttx Explorer -r- 9-
13 i 4*
Jjt Data Connection*
♦ Щ Servers
ИЯ1Г7 Syst? *b Сояя*« le Ba«ba». -
USir.g Syat? 1^ Connect to Server .
using SyaM «„,
ua.fig Syati -3 - Cod* SnlW>«» Manager
Cbooae Toolboo» Item»
1ereapace С -
IJbblic Add-in Непждвг.. .
J Macros
:1+K, CtrI-"-B
* }
Paccaaz Product! Catalog
Create OTID
Z\>l fit*civv4 C^w^s-^vi S'^itAoa
£•£ WCF Service Configuration EdituT
External Tools ..
Xsapoct and Export Setting»..
Cuatoisisa
Option*...
3k Server Explorer ^» Taelb&a j * {'"
Rudy
Рис. 1.9. Интегрированная среда с новым шрифтом
Сохранение настроек
Многие из вас настраивали интегрированную среду под свои потребности. Воссоздать эти
настройки может быть непросто. К счастью, Visual Studio 2008 поддерживает миграцию
настроек. Если, например, у вас имеется инсталлированная система Visual Studio 2005, то
Visual Studio 2008 позволит вам при первом запуске выполнить миграцию этих настроек.
Если же вы пересаживаетесь за новый компьютер либо хотите поделиться с кем-либо
своими настройками Visual Studio 2008, то вы можете сделать это при помощи инструмента
Import and Export Settings. Такой пункт имеется в меню Tools как в Visual Studio 2005, так и в
Visual Studio 2008. Это мастер, который позволяет вам импортировать настройки,
экспортировать их в файл или восстанавливать настройки в один из вариантов по умолчанию,
предлагаемых интегрированной средой. На рис. 1.Ю показан пример экспорта настроек.
Когда вы экспортируете или импортируете настройки, то можете указать, какие из них
следует применить. На рис. 1.11 показана вторая стадия процесса экспорта. Обратите
внимание, что вы можете выбрать те настройки, которые хотите экспортировать.
Последняя стадия экспорта — сохранение файла с расширением vssettings. Этот файл можно
затем передать другим пользователям. Его можно использовать также для миграции
настроек с одного компьютера на другой и с одной версии интегрированной среды на другую. Вы
Глава 1. Краткий обзор Visual Studio 2008
17
можете запустить мастер Import and Export Settings Wizard и выбрать импорт настроек из
этого файла.
II *•
£j£fe Welcome to the Import and Export S ettings Wbard
wss
You can use this wizard to import or export specific categories ol settings, or to reset the environment to
one of the default collections of settings.
What do you want to do?
О Export selected environment settings
Settngs wilt be saved out to a file so they сап later be imported at any time on any machine
Import selected environment settings
Import settings from a file to apply them to the environment
Reset afl settings
Reset all environment settings to one of the default collections of settings.
Cancel i
Рис. 1.10. Экспорт ваших настроек
Choose Settings to Export
I Settings with warning коп* might expose intellectual property er other sensitive informatrtjn By
default, these settings are not selected For more information, press Fl.
Which settings do you want to export?
-, \ш\ Д^дН
-l fvj General Settings J
0
0
0
0
И
0
0
0
0
0
I3l
Call Browser ]
Class View Options
Code Snippet Locations
Command Window Aliases
Errcr List Display Settings !~~»
External Tools List
RJe Extension Mapping
Find Options
Find Symbol Options
Menu and Command Bar Customizatio
New Project Pib(go. Preferred Lanauaae "
Description
All settings that are available for import
and export. Expand the category to see
more details
< Previous [ Next >
Рис. 1.11. Выбор настроек для экспорта
18
Часть I. Введение в Visual Studio 2008
Совместное использование кода в сообществе разработчиков
Написание кода часто является коллективным занятием. Сообщество разработчиков велико
и по большей части они поддерживают друг друга. Если у вас появилась проблема, то,
скорее всего, кто-то другой с ней уже сталкивался. В Интернете можно часто найти решения,
компоненты, образцы кодов, статьи и все прочее, что поможет решению вашей проблемы.
Между разработчиками существует своеобразное родство по духу, которое заставляет их
публиковать образцы кодов, отвечать в группах новостей и давать советы. Возможно, это
происходит потому, что каждый понимает, что в свое время ему может тоже понадобиться
ответ на важный для него вопрос, а может быть, это просто желание покрасоваться друг
перед другом. Как бы то ни было, Visual Studio 2008 продолжает традиции поддержки
сообщества разработчиков, которые были встроены в версию 2005 года.
Вы по-прежнему можете создавать компоненты, предназначенные для сообщества
разработчиков. Однако в версии 2008 вы можете указать, предназначены ли ваши компоненты
для версии 2005, версии 2008, либо для той и другой одновременно.
Другое изменение в функциональных возможностях поддержки сообщества
разработчиков— это упрощение пунктов меню сообщества разработчиков до двух пунктов в меню
Help. Первый пункт меню является прямой ссылкой на форумы MSDN Forums и заменяет
собой бывшие Ask a Question и Check Question Status. Это позволяет вам попасть на
форумы и работать непосредственно там. Второй пункт — это Report a Bug, который заменяет
собой Send Feedback.
Более подробную информацию по функциональным возможностям Visual Studio 2008 (и
MSDN Forums) в области поддержки сообщества разработчиков см. в главе 7.
Расширенная поддержка Class Designer
Class Designer появился в Visual Studio 2005. Он представляет собой графический
инструмент для написания и модификации классов. Вы можете использовать его для определения
новых классов и их связей, добавления в эти классы свойств и методов, а также для
модификации элементов свойств или методов; он даже позволяет выполнять рефакторинг кода.
Например, изменение названия некоторого метода в Class Designer приведет к изменению
имени данного метода во всех его вызовах.
Visual Studio 2008 теперь предоставляет поддержку Class Designer для приложений на
языке C++. Вы можете использовать его для визуализации классов и их связей. Вы сможете
увидеть родные структуры наследования C++, перечисления, классы шаблонов и т. д.
Имеются, однако, и некоторые ограничения. Если вы являетесь разработчиком на языке C++, то
вам следует ознакомиться с ними в документации продукта.
Class Designer является составной частью редакции Visual Studio Professional Edition и
более высоких. Однако мы подробно опишем его в той части данной книги, которая
посвящена Visual Studio Team System (см. главу 26).
Пользовательские приложения
.NET очень быстро распространилась в мире программных продуктов под Windows. Это
заняло всего несколько лет, но теперь совершенно честно можно сказать, что сейчас
Глава 1. Краткий обзор Visual Studio 2008
19
.NET— везде; программирование под Windows и программирование под .NET теперь
являются синонимами. Многие пользовательские приложения, с которыми мы имеем дело,
созданы на базе .NET частично или полностью. Сюда входят Web-приложения, клиентские
приложения под Windows, мобильные приложения, решения на базе Office, "умные
клиенты" (работающие через Интернет) и т. д. Теперь разработчики под .NET требуются везде, и
вы можете использовать свои навыки для самой широкой аудитории потребителей.
На рис. 1.12 представлено диалоговое окно New Project в Visual Studio 2008; оно
показывает огромное количество пользовательских решений, реализация которых возможна при
помощи .NET.
New Piojcct
Project typei.
л VtsualC*
Windows
Web
Smart Device
Office
Database
Reporting
Test
V.CF
Workflow
Other Languages
Other Project Types
Test Projects
Template*.
«'tiiial Studio installed templates
3
W.ndtww
Formi Ap
Ш
i Console
Application
m
Class Library
.**
bcel 2007
Workbook
fv\- Templates
•1
SmartClient
Template
J
Search
OnlmeTe
ASP NET
Web Appt
'1
£
ASP NET
WebSer.i
Ш.
Outlook 2907 WCF Service
Add-in
Application
[ NET Framework 3-S
Й
WPF
Application
Ш
Word 2007
Document
|V
WPF BrcNvser
Application
.tf5
V/mdcA's
Form;
_iR~
A project!or creating an application *4rth a Windows Forms user interface (NET Framework 35)
Name
Location.
Solution
Solution Name:
vVindowsFormiApplkalion3
C\Users\msnelf\Dccuments\V'isual Studio 2008\ Projects
[Oerte new Sgiulton ▼ ] у] С reate directory for solution
WindovssFcrmsApplicatiorG f~ Add tc Source Control
Рис. 1.12. Многоликие приложения Visual Studio 2008
Несмотря на то, что на рис. 1.12 показано множество шаблонов проектов, это окно не
является неким "планом действий" в отношении пользовательских приложений. Разработчик под
.NET имеет множество вариантов создания пользовательских приложений при помощи как
Visual Studio, так и новой Expressions Studio (будет обсуждаться далее в этой главе).
Следующий список дает обзор технологий презентации, доступных разработчику под .NET:
□ ASP.NET позволяет вам создавать Web-решения (а также решения на базе браузеров) с
использованием HTML, Ajax и обработки на стороне сервера;
□ NetCF— .NET Compact Framework 3.5 работает на небольших устройствах и позволяет
вам создавать приложения для этих мобильных устройств;
□ Silverlight — это новое решение фирмы Microsoft предназначено для разработки высоко
интерактивных решений, которые сочетают видео и анимацию (предоставляемые через
Интернет для компьютеров под управлением как Windows, так и Мае);
□ VSTO — Visual Studio Tools for Office позволяет вам создавать решения на базе
инструментов пакета Office (в том числе Outlook и SharePoint);
20
Часть /. Введение в Visual Studio 2008
П WinForms — эти формы используются для разработки бизнес-приложений и различных
инструментов для платформы Windows. Приложения WinForms могут быть как
независимыми, так и управляться данными. Кроме того, приложения WinForms могут
подключаться к Web-сервисам, использовать ресурсы клиента и т. д.;
П WPF— Windows Presentation Foundation использует WinForms, XAML, Smart Clients,
трехмерную графику и прочее для того, чтобы вы могли создавать функционально
богатые клиентские решения под Windows. Приложения WPF могут разрабатываться
аналогично приложениям WinForms. Кроме того, они могут существовать в виде решения на
основе браузера (которое работает в "песочнице безопасности");
□ XNA — эта технология позволяет вам создавать игры для ХЬох при помощи Visual
Studio (но это тема для другой книги).
Все эти технологии поддерживаются в Visual Studio 2008. С их помощью вы можете
создавать самые различные пользовательские приложения. В данном разделе описаны некоторые
улучшения разработки, имеющиеся в Visual Studio 2008.
Примечание
В Visual Studio 2008 имеется множество новых клиентских опций. Мы упомянем здесь
все. Однако все они также описаны более подробно в остальной части данной книги
В главе 14 описывается ASP.NET; в главе 15— стандартные формы Windows; в
главе 16 внимание сосредоточено непосредственно на WPF; в главе 17 обсуждаются
приложения Ajax и ХВАР; в главе 21 описывается создание решений на базе пакета
приложений Microsoft Office.
Повышаем производительность Web-разработчика
Большинство приложений, создаваемых в настоящее время, имеет сходство с Web-
компонентами — будь это полноценное Web-приложение на базе браузера, "умный клиент"
(работающий через Интернет), Web-сервис и т. д. Граница между традиционным
клиентским приложением и Web-приложением фактически размывается. К этому привели такие
технологии, как Ajax (Asynchronous JavaScript and XML), Web Services, Smart Clients и
XAML (Extensible Application Markup Language). Теперь вы можете создавать богатую среду
для пользователей в соответствии с вашими нуждами. И, конечно же, фирма Microsoft
соответствующим образом расширяет возможности Visual Studio в отношении Web-разработки.
Web-разработчикам нужны инструменты, которые помогают им в обычных задачах,
возникающих при создании их приложений. Давайте честно признаем — стандарты HTML, CSS и
XML нелегко запомнить и по ним непросто писать. Поэтому мы хотим получить
инструменты, которые будут нас направлять. И, конечно же, как только дело доходит до работы с
кодом, то мы хотим иметь доступ ко всем исходникам и манипулировать ими по своему
усмотрению. Visual Studio 2008 основана на недавней версии 2005 года. Она является шагом
вперед в плане увеличения производительности Web-разработки. Мы упомянем многие из
этих улучшений в последующих разделах.
Примечание
Многие из последующих пунктов мы более подробно опишем в главе 14.
Глава 1. Краткий обзор Visual Studio 2008
21
Создание более богатого Web-интерфейса
Ajax предоставляет возможность использовать повсеместную поддержку JavaScript
(имеющуюся в Web-браузерах) для создания более интерактивной среды для пользователей.
Клиентские приложения, созданные с использованием Ajax, по-прежнему придерживаются
парадигмы "клиент-сервер". Однако при помощи Ajax клиент может обновлять части
некоторой страницы как будто бы йез обратного обмена с сервером (конечно, обычно обмен
имеется). Кроме того, большинство Ajax-приложений переносит в клиентскую часть
обработку таких вещей, как переключение частей страниц, работа с табуляцией, автозавершение
ввода данных, отображение диалогов и т. д. В результате достигается более высокая степень
интерактивности для пользователя.
Ajax не является специфической технологией фирмы Microsoft. Он, скорее, является
моделью программирования. Однако фирма Microsoft выпустила расширения Ajax Extensions for
Visual Studio, предназначенные для версий 2003 и 2005 годов. Данные элементы управления
облегчали разработчикам приобретение опыта работы с Ajax. Эти элементы были
улучшены, и теперь они включены в Visual Studio 2008 и .NET Framework 3.5. На рис. I.13
показаны элементы управления в панели инструментов Visual Studio.
Toolbox й Л^мт^ ,
+i Standard
it; Data
W VaJkSattoo
:.+; Nmrigatioo
I >t! Logb
iti W«feP»rts
II H AJAX Extensions
I! Ь Pointer
11 ИЗ ScriptManager
I О ScrrptManagerProxy
II 0 Timer
II Я UpdatePanel
|| 9 UpdateProgress
Ф Reporting
f? HTML
I H GeoeraJ
P
ш\
*l
~ 1
_lji
Рис. 1.13. Расширения Ajax в Visual Studio 2008
Эти элементы управления позволяют вам создать страницу, которая может получать
частичные асинхронные обновления (при помощи UpdatePanel) и отображать ход процесса
обновления (при помощи UpdateProgress). Они также позволяют вам создать собственные
элементы управления и функциональные возможности, которые реализуют Ajax (без
необходимости писать код Java-скриптов на стороне клиента).
В дополнение к этим элементам управления Visual Studio 2008 поддерживает IntelliSense,
документирование комментариями в коде и отладку Java-скриптов на стороне клиента. Она
также содержит библиотеку Microsoft Ajax Library, являющуюся обычной библиотекой
JavaScript, которая поддерживает объектно-ориентированную разработку для JavaScript.
Подробный обзор этих позиций, Ajax и прочего представлен в главе 17.
22
Часть I. Введение в Visual Studio 2008
Microsoft Silverlight
Microsoft Silverlight— это еще одна замечательная клиентская технология для Web.
Silverlight позволяет улучшить пользовательскую среду, создаваемую браузером. Он
используется для создания высоко интерактивных мультимедийных сред. Для Silver-
light необходим дополнительный модуль для браузера. Он работает под Windows,
Mac и Linux с самыми разными браузерами. Silverlight с Visual Studio 2008 не
поставляется; однако для Visual Studio имеются расширения Silverlight в виде встраиваемого
модуля.
Работа с расширенной панелью инструментов
Visual Studio 2008 предоставляет Web-разработчику богатый набор инструментов и
элементов управления. Она по-прежнему поддерживает стандартные элементы управления для
ASP.NET и HTML, такие как метки, текстовые поля, кнопки и т. п. Кроме того, по-
прежнему присутствуют и элементы управления для проверок, данных, процедуры
регистрации и WebParts. Конечно, многие из них улучшены. Однако здесь мы сосредоточимся на
представлении новых элементов управления для разработчика ASP.NET.
Для Web-разработчика необходимо отметить следующие три элемента управления
пользовательского интерфейса: ListView, DataPager и LinqDataSource Первый из них
(ListView)— это элемент управления, который упрощает отображение повторяющихся
данных. Элемент управления ListView управляется шаблонами пользователя. Таким
образом, вы можете легко настроить поведение вашего интерфейса пользователя при таких
операциях, как просмотр, редактирование, добавление и удаление. Кроме того, ListView
поддерживает сортировку, разбиение на страницы и, конечно же, привязку данных. На рис. 1.14
показан экран настройки ListView. Здесь вы можете задать вид отображения во время
работы, визуальный стиль и т. д.
ID FirstName LastName Title Address City
Databound Databound Databound Databound Databoi
Databound Databound Databound Databound Databoi
Databound Databound Databound Databound Databoi
Databound Databound Databound Databound Databoi
Databound Databound Databound Databound Databoi
Databound Databound Databound Databound Databoi
Databound Databound Databound Databound Databoi
Databound Databound Databound Databound Databoi
Databound Databound Databound Databound Databoi
' Databound Databound Databound Databound Databoi
\l 2345 ... Last|
J] Enable Pagtrvg
[Nwnenc Pager »] * Г ""l "L~ *
} OK | '' Cancel
Рис. 1.14. Настройка элемента управления ListView
Select s Layout.
Tiled
Budeted List
Flow
Single Rcw
Select з Style:
I (No Formatongj
I Colorful
Optic
Глава 1. Краткий обзор Visual Studio 2008
23
Элемент управления ListView управляется шаблоном. Конечно же, вы имеете полный
доступ к компоновке и управлению этими шаблонами. Кроме того, сам элемент управления
может помочь в настройке соответствующего шаблона. На рис. 1.15 показаны задачи Tasks
для ListView. Обратите внимание, что вы можете изменить представление Current View
(показанное в визуальном конструкторе WebForm) на другой шаблон представления.
'vkWrn ЧсгжНУмя1<Ш,я 1«=» ®, Ж !
! File Edit View Website Build Debug Format Table Took Test Window Help
jb^Oud^*^ <&*>-'-£!-- ► Debug ^ .NET - l§ ^j
Style Application Manual • Target Rute (New Inline 5tyle) »k/ *1 <£) j j :S :? | | XHTML 1 0 Tranirtion, ~ ^t J
i (None) * (Default Font) - (DefauH - ' В / Ц A / E • Ь p . ^ .
>i
T
D«fiu4t»pat* - X 1 .J
i
i !
I asp list. e**Lisfc/iev.l
Employ eelD FlrstName LastName Title HomePhone
10 abc abc abc abc
Ц abc abc abc abc
[2 abc abc abc abc
>3 abc ъЬс abc abc
J4 abc « ©be abc abc
Ь abc abc abc abc /
Щ abc abc abc abc
,7 abc abc abc abc
{8 abc abc abc abc
9 abc abc abc abc
First] Prevwms J frfext] Last I
Л 1 1
3™lfatV№*»T»«k5 j
Choose Data Source NorthwindDataSource [^ j
Co» injure D;rt4 S<
Refresh Sc hema
CunfigLre ListVio
) Current View
<V 1
AlternaUngheniTemplate
EdrUtemTemplste jj
EmptyDataTemplate 1
ImertltrnVTemplate 1
Item Template 1
SelectedltEmTemplate |
1 Л 1
SqIDataSource - NorthwindDataSource
1 _ I
Л Design ; 3 Split H Source |<]f<html>| <bodv> |<fcrm*farml> ;<div>j <eip-ListVi£\s*JslViftvi> j»-
i j J] Output £r fifn* Syf"b«t Fei Jlti J$ t гэ» L*t]
i Dreg margin handles to resree margins, Ргем SHIFT orCTRI j
Рис. 1.15. Задачи Tasks для ListView
На рис. 1.16 показано представление по шаблону EditltemTemplate. Исходная компоновка
шаблона доступна для вашей настройки. В этом примере мы фактически выводим метки и
элементы управления формы в виде таблицы (для большей ясности). Обратите также
внимание, что в этих шаблонах возможно перемещение между записями. Это позволяет вашим
пользователям прокручивать блоки данных и производить необходимые обновления.
Еще один новый элемент управления в версии 2008 (который нам хотелось бы
выделить) — это DataPager. Этот элемент управления позволяет вам управлять разбиением
данных на страницы, а также пользовательским интерфейсом такого разбиения. Вы
можете использовать этот элемент управления как сам по себе, так и встраивать его в качестве
части другого создаваемого вами элемента управления. Упомянутый уже ранее элемент
управления ListView фактически использует элемент управления DataPager. Вы можете
связать с DataPager и другие привязанные к данным элементы управления при помощи
свойства PagedControlID (такой элемент управления должен реализовывать интерфейс
I Pageable ItemCont a iner).
Вы можете полностью управлять настройкой, компоновкой и поведением элемента
DataPager. На рис. 1.17 показан редактор полей DataPager (доступ к нему можно получить
через окно Tasks элемента управления). Обратите внимание, что вы можете настроить вид и
поведение всех элементов, связанных с данной компоновкой DataPager.
24
Часть I. Введение в Visual Studio 2008
t^> 972702 Miaetoft Visual $&du?
File Edit View Website Build Debug
Format Table Toots Test
» £1 ' ; ; ►, Debug
Wrndo*
» WET
Heip
• A
iablS
Й
Style Applrcatioiv Manual » Target Rule; (New Inline Style) »Lfc' *_' ^
(None) - (Default Font) - (Defaull - В I П A t/ » - •= ]= j
^- XHTML 1 0 Transition. •
Defauttaspx"
es^.Lisr\*ie>v#|j5tyW|_
p.i UttVfewT**k*
Choose Data Source. pJorthwindDataSource [»j
Corfigce Data Source
Refresh Schww
( t»rvfiyi"«r Lkttf«rw,
Current View Edrtitem Template \*\
SqlDataSowce - NorthwindDataSourte
jU Design ja Split «''J Source i\ <forn>*'oFml*.[«.drv> J'asp'tistViewaUstView^ <AKematingItemTerrplate> j«;td>|j
.J} Output l|f. Find Symbol Remits! ]$ irot un\
Drag margin handles to resize margins Press SHIFT orCTRl
LnlSl Col 24
Рис. 1.16. Компоновка визуального конструктора формы EditltemTemplate
Available fields
мт Next/Previous Pager Field
• Numeric Pager Field
Ji] Template Pager Field
•-1ВШШ
Next/Previous Page/ Field
ЕЗЯ1
В ApfKwwH:*'
SuttonCsxClBSS
ButtcnType
FirstPagelmageUrl
FirslPageTert
LastPigelmageUrt
LastPageText
NextPagelmageUrf
NextPageTert
PrevioLuPagelmagelirl
PreviouiPageText
В ОДаШ*
properties
Button
First
Last
Next
Pre\ious
RenderDtsabtedButton:; False
ButtonCssQass
The CSS class applied to the next and previous buttons
Рис. 1.17. Редактор полей DataPager
Последний новый элемент управления (который мы здесь отметим) — это LinqDataSour-
ceControl. LINQ (Language Integrated Query, встроенный язык запросов) — это новая модель
программирования, введенная в Visual Studio 2008. Она сочетает запросы к базе данных с
языком программирования .NET. Таким образом, вы можете писать строго типизированный
код (а не простые строчки) для запросов к вашим данным. Написание запросов полностью
поддерживается технологией IntelliSense, работа которой зависит от ваших данных. Кроме
Глава 1. Краткий обзор Visual Studio 2008
25
того, LINQ может работать с данными из различных источников данных (в том числе SQL
Server, XML и многих других). Более подробный обзор этой новой технологии см. в главе 18.
Элемент управления LinqDataSourceControl дает вам возможность привязывать
элементы управления при помощи технологии LINQ подобно тому, как это делается с другими
источниками данных ASP.NET. Вы можете использовать LinqDataSourceControl для
получения доступа к базам данных, коллекциям данных в памяти, классам источников
данных и т. д. Когда вы подключаетесь к этим источникам данных, элемент управления
LinqDataSourceControl позволяет вам писать код взаимодействия с данными, используя
всю мощь L1NQ. Весь код ваших запросов к базе данных для выборки, группирования,
упорядочивания, фильтрации, обновления, вставки и удаления будет строго типизирован
и основан на LINQ. Этот код для вас фактически пишет LinqDataSourceControl. На
рис. 1.18 показан пример настройки элемента управления LinqDataSourceControl для
подключения и работы с классом данных LINQ.
Select:
_J CustomerlD
" j CompanyName
j CcntactName
J ContartTrtle
H Address
J City
!^_J Region
The data source ran a utormtfcalty insert, update, and delete data,
G Enable the UnqDitaSource to perform automatic deletes
f | Enable the LinqDataSource to perform automatic inserts
!_] Enable the UnqDetaSouice to perform automatic updates
1 ™
s
Cancel
Frrwh
1
Wh«e~
torderBy...
IJRovi
«need ,
Рис. 1.18. Мастер настройки источника данных LinqDataSourceControl
Одновременные разработка и конструирование
При создании Web-формы разработчик много раз переключается между представлениями
Source и Design для Web-формы. Представление Source дает вам полный доступ к
редактированию кода XHTML данной страницы. Представление Design позволяет увидеть страницу
в ее развитии и дает доступ ко многим командам быстрого вызова, связанным с элементами
управления в визуальном конструкторе. Visual Studio 2008 значительно облегчает такое
переключение. Она предоставляет представление Split. В нем вы можете видеть как код
XHTML, так и Designer. На рис. 1.19 показан пример.
Представление Split старается поддерживать синхронизированное состояние исходного
кода и визуального конструктора. Когда вы перетаскиваете элементы из панели инструментов
26
Часть /. Введение в Visual Studio 2008
на панель Source или Design, то все это работает. Однако представление Design может
утратить синхронизацию в том случае, когда вы делаете много изменений в вашем исходном
коде. В этих случаях представление Design показывает, что оно не синхронизировано (см.
середину рис. 1.19). Нужно щелкнуть мышью по панели Designer, и синхронизация будет
восстановлена. Это новое представление может сделать вашу разработку Web-форм более
интуитивно понятной и более производительной.
V< 972101 - Microsoft УТ^ы'£^^ДШ^^Д^^^^^^Д^^^^^^^Д^^^^Д
File Edit View Website Build Debug Format Toots Test Window Help
Ob-J-.J J*
[ТзсЬсч <r Д X
<: Standard
A label
J «ы ТЫВси
1 {*b} Button
I QJT) LirtkButtcrt
Я {Ж} ImageButtcn
I _V HyperLink
I [ - * DropDownList
a *£ LiftBox
1 0 CheckBm
I " ChectBoxLirt
1 0 RadioButton
1 - Radio6uttcr»Li4t
I j£ linage
1 Ш ImageMsp
1 _3 Table
1 :Z BulletedList
1 HiddenFieJd
1 P'i Literal
1 ""? Calendar
*
1
^
I y*. Toolbox ^Sfrver L
([UCtJtpt.J^^odS
1 Reedy
vnt;
Л. -& -3» *i - * £J * ~ > Debug - NET
SpKtaspx*
<Л.Г>
<CO<:so Lasel "^"LabeZ.4" iurj 5С="эегч зг" T'x'«
«'*>< v ^"^"с^Лэг T'-'Drc^Do^iLtatl" ' ., Л~ =
</ l Г>
I <cr>
■ctdX8*p.Lii.«l ^-"Leb-elS" r.ra\-"aerver" "Ч,с-
1 <tc,>-Cd*i -Tey-?OK "«""етсВех*" ' „,;■' - "server 'x
j <.'tr>
1
*J
!
Design view 15 out of iync with Source view Click here tc synchf onrie
First Name ]
Last Namr j
Ctfv Name |
^г^Лй™1"^
И i
*" <
Л Design П Split ] -ii Source |4J[<df*;-'[<table>j <;i;>j[<to>
IResute|j$Erfe<4 Uj
Ln30 Col 83
Label
serve
iews
iWilflrfPOffia и -
- 13
">State-i.'c:so L.fce^
:'ХЛ^.\тЧ»т
r'Xta'xx/cd>
<«spL»bel*Label5>J
Ch83
_1й!Ш^ш!1
-I
' X vJ
' I
l3t £ j
•'•*fc !|
1
1
;i|
1
1
1
'► 1
1
Рис. 1.19. Представление Split визуального конструктора Web Form
Создание внешнего вида и управление им
Стили и таблицы стилей являются составной частью Web-разработки уже много лет. Они
помогают обеспечить единообразный внешний вид, которым можно централизованно
управлять. Спецификация CSS (Cascading Style Sheet) также продолжает развиваться; она
предлагает нам все больше возможностей для изменения визуального представления наших
приложений. Конечно, при этом добавляются дополнительные элементы, атрибуты и
увеличивается сложность. К счастью, Visual Studio 2008 предоставляет инструменты для создания
и управления как встроенными стилями (определенными непосредственно в вашем
исходном коде XHTML), так и таблицами стилей (ess-файлами).
Один из таких инструментов — это панель Manage Styles, имеющаяся у разработчика Web-
форм. На рис. 1.20 показана эта панель в действии. Здесь вы можете прикрепить таблицу
стилей к Web-форме, создать новый стиль, просмотреть стили и т. д. Обратите внимание на
кнопку Options и соответствующее меню. Эти опции помогают вам управлять стилями.
В версии 2008 переработано также диалоговое окно New Style/Modify Style. Здесь вы
можете создать или модифицировать стиль, созданный на базе спецификации CSS (до версии 2.1
включительно).
Глава 1 Краткий обзор Visual Studio 2008
27
* 572701 - Microsoft VfruajI $t"dfo
File Edit View Website Build
•jl'J'Jildl <
Spfetaspx
lasp'Ldbf^Labell]
First Nams
Debug Format Table Took Test Window
' ~ '-- - ~„ ~ S\ p Debug - .NET
Help
Last Name j
City Name j
State | Unbound _»j
Postal Code I
§& Attach Style S vx
CSS styles:
|;ч Styk&heefcc»
>^bod>
^ formLabd
1* *brroCantrol
Selected style preview
L»
*• * x j
p [ Categorwe By Order
Categorize By Element
Categorize By Type
Ы 5ho" Atl 5ly<es
Show Styles Used In Current Page
Show Styles Used On Selection
Separate Grouped Selectors
[*J Display Selected Style Preview
AaBbYyGgLU]
i Design 3 SpUt H Source |<ljj<asp Label*Laj^ A^Af>% Stales ^Manage Styles [
j_3 Obtp Jt & Ftrd Symtol Poults J& cacr iiit|
Reedy In 15 Col 94 Ch94
Рис. 1.20. Управление стилями в вашем приложении
"~ 1Шш&Ш
Has Style
Selector; fbrmLabel "^] . ] Appi> new style to document st
| Define in; Ex song style sheet ^] URL: StyfeSheet.css P~ |Эго*яе ,„
E
text-decoration:
[ .undertne
"overtne
kne through
Ыпк
none
Sock
Background
Border
Box
Poatton
Layout
Lst
Table
font family
font-srae
font watft.
font-style.
font v* «it
text-transfbrm-
Verdana
smal
bold
normal
norma!
h
E
E
E
E
color «дешй рг|
AaBbYyGgLUj
Fsmfy V<
I; color:
Verdana; font-size smal; font weight bold, font style normal, font-variant
«ВДОС000
ok j caned j | Aprty
Рис. 1.21. Создание или модификация стиля
Этот диалог был переделан для того, чтобы дать вам доступ к новым функциональным
возможностям и сделать все несколько более интуитивно понятным. Вы можете получить
доступ к этому диалоговому окну либо при помощи кнопки Build Style на панели
инструментов Style Sheet, либо из таблицы стилей, либо из панели Manage Styles (при помощи опции
28
Часть I. Введение в Visual Studio 2008
New Style). На рис. 1.21 показан пример доступа к диалоговому окну New Style из панели
Manage Styles.
Edit View Website Build Debug Format Table Tools Test
File
J - J - ^ А Ш . • i «0 - n- • ; -:
Style Application: Manuel * Target Rule (New Inline Style)
SpSLaspx*
First Name [_
Last Name [
City Name [
(asp Labd«1.abe5|
jjUnbound ▼[
Poaai Code
Window Help
fr Debug • NET
„ X №*£*** '
* jj Л^ New 5tr!e .
|! Aj, Ai+a.i Style 5Ь«*
i Select CSS styte to appty.
m
* a x
f Option» ▼ .
Clear Styles
) SfcyteShecti**
(± .form La be!
=b.
($1 formControl
.lormlabef
[
font-family Verdana,
font-size, small,
font-weight bold, '
font-style, normal-
font-variant normal
color «000000,
J Design ] a Split H Source |«.jl<td>Jj<asp Label#Label5 > j [>| j | д| (<$ foopctt** a,Apply Stylet fy Manny % r
[J] Output j£. fird Symbol Retells ^ error utl|
Drag margin bandies to resae margirts Press SHIFT or CTRL for more options.
Рис. 1.22. Применение стилей
V* 972701 - Microsoft Visual Stjuo
• File Edit View Website Build Debug Format Took Test Window Help
! Л » J" Jr «1 £ < 4 *> • t* - >>- > Debug - NET
I Style Application; Manual - TargrtRuIr < Inline Style > 'La/lsi,;. \- bwff.'r > £
Щ
->
i »'
! 2
•^
s
SpfiUspx* - X £5S Properties
Client Objects & Events ▼ ('No Events) ▼
';< Г "id " « ,»tlTVeT">
<-tiLi=>Dcti.tled Разе<'с1-:.е> | >
1 <"!.'>*• fr"'-''5!:yle5>ieei;.caa" '- '-"styvear^et" т:у-я-|
i- тем» L|
.1 <2сгк < d-' f гпь_" ;i -t-"flervcr'>
Y 'div- •> ~>-"centsr"> [ f
n <table sc,Af=MJ-4: 5СЭ, zvxi. ft.is-'. left" fc-
1 i
i
1
i
i
i
<tdXesc'Label ..b-^Lafcell" г \ iT.-"aezv<
< cdX аэр. "еГСБох Т Г- " Тгх сРйх F t гз tNisF* "
<тг>
<rdXd3F.L^be: 'r-"Lafcel2" *л v'-Kaervi
<tdxa3p:Tsxt.3cx j.j-"IexLBQxl~ rj_-_^="
</tr>
•ctdxasp-Labe- r£-"Label3" г.тг.^'аеп''
<tdxaip.T'*xtB';x ТГ>-"ТгхтВоч2" ' ^аг-" т
* | ш ,
| _ fi Oesign a Split j £ Source I |<|j<div>| <t*ble> [►]
E«0
Applied Rub
body
< nine style >
1
CSS Properties
font-variant
font-weight
text-deccrabon
text transform
J Stock
I text-abgn
! letter-spaong
kne-he<ght
teit-ndent
vertcal-algn
white-space
i «tord-spaang
"-} Saeteefottml
i +' background
:laj CSS Properties л£.Дррч
1 JZ3 <>tttp Jt £T h**'1 V^hal R«*»i»s 3 Еггэг Ьл\
j Drag margin handles to resize margins Press SHIFT or CTRL for more options
* m
, i
cbody>
<table>
eft
jj* center
iPjusbfy
&Щ
^H^
l^Hierflf
li-i («J ?
-
- s
^r Л X<
[Summary
*
E
[5
X
3-
1
«
*
-"
41
>Ji-
»
r*'SVyiw ^ManageStyes
Рис. 1.23. Редактирование свойств стиля
Глава 1. Краткий обзор Visual Studio 2008
29
Вы можете быстро применять стили к элементам вашей страницы (при помощи панели
Apply Styles). Здесь вы видите все стили, определенные на вашей форме или в приложенной
таблице стилей. Каждый стиль имеет визуальное представление для облегчения быстрого
выбора. Для применения стиля вы просто выделяете элемент формы и щелкаете по стилю.
На рис. 1.22 показан пример использования этой функциональной возможности. Обратите
также внимание, что текст подсказки ToolTip для стиля показывает его CSS-определение.
Последнее средство управления стилями (которое мы здесь рассмотрим) — это панель
свойств CSS. Здесь вы можете быстро увидеть свойства стиля и управлять ими так же, как
вы управляете свойствами элемента управления. На рис. 1.23 показано использование этой
панели. Обратите внимание, что вы можете работать с теми стилями, которые определены в
вашей Web-форме. Все стили сгруппированы и доступны также в алфавитном порядке. Это
может несколько облегчить жизнь для тех, кто не любит рыться в IntelliSense при
определении стилей.
Централизованное управление навигацией и конструированием
В Visual Studio 2005 была введена возможность создавать главные страницы. Эти страницы
были центральным местом управления элементами дизайна и навигации сайта. Кроме того,
главные страницы имеют поддержку визуального конструктора (что исключает
необходимость во включаемых файлах, которые были видны только в браузере). При работе в
режиме конструирования разработчик может видеть страницу в контексте общего дизайна сайта.
Был также и один недостаток — вы могли иметь только один уровень главных страниц. Вы
не могли вкладывать главные страницы друг в друга и просматривать результат в
визуальном конструкторе. Например, обычной практикой является определение ведущей главной
страницы, в которой содержатся рамка вашего сайта, средства навигации, информация
нижнего колонтитула и т. д. Затем вы можете создать отдельные "неведущие" главные страницы
для контента разного типа. Эти страницы будут иметь собственные элементы общего
дизайна в дополнение к определенным на ведущей главной странице. Еще раз повторим, что в
версии 2005 этого сделать нельзя.
iAdtf New tern - с^«я\ввД 0«^^ "" ШшЁД]
Template* Ы) -3 |
j Visual Studio installed templates * I
Jj tj П *-i Л \Л У ^ 'У
I Web Form Mart** Page Web User AJAX Client AJAX Client AJAA Client AJAX Master 1
i Я Contrcl Behavior Control Library Page Ц
L4L.R.A А. Ф „.# ..Я ._ -II
I A Master Psge for Web Applications 1
1 Name ContentMaster master I
I Language: jVHualG* »] /Piece code in separate file I
II jpSeJert maiter page 1
I [ Add ' [ Cancel ' 1
Рис. 1.24. Выбор ведущей страницы
для новой "неглавной" ведущей страницы
30
Часть I. Введение в Visual Studio 2008
К счастью. Visual Studio 2008 такую возможность поддерживает. С ее помощью при
создании новой главной страницы вы можете выбрать существующую главную страницу. На
рис. 1.24 показано именно это. Раньше при создании главной страницы эта опция была не
доступна.
При помощи новой вложенной главной страницы вы можете определить главный контент
внутри указателя места нахождения контента, определенного ведущей главной страницей.
Затем вы добавляете новый указатель места нахождения контента внутри вашей вложенной
страницы. Страницы, созданные на основе этой вложенной главной страницы, будут
размещать свой контент внутри этой области. Конечно, вы можете создать много уровней
вложенных главных страниц. При разработке визуальный конструктор покажет вам ваши
главные страницы. На рис. 1.25 представлен простой пример aspx-страницы, созданной из
вложенной главной страницы.
File Edit View Webiite Build Debug Format Table Tools Tert
$ * -J ' ~J «d £ * и <» ' >ч ' £J ' >" * Debug
Style Application* Manual 'Target Rule (New Inline Style) *p/!>i, ;
Defaufcaspx* NJprtg»ti<>pMartef.rf»»4tf»4 f Copt*rHM«t*»W«t*r i
Client Objects & Events ▼ (No Events]
Windcw
- NET
<%(? Разе ~£- i-£-?="C#** 4s»v
Cont^llMd!, fl.T4lbta
Navigation Master Page
j
2 Design n Split H Source
j ЛЗ Ottf jt gl Fir>d Symbol Results J& caor t*$l|
Reedy
iii'M^fflH и иштшщшшшшшж
- £3
Solution kpwe* - С <> \ ^ & X
33 So I is\ ion '972701 A project)
- J C\_\97Z701\
H _j App_Code
-I App_Data
+ ^ ContentMarter master
Gy J DataPegrr.aspx
I*) lJ Default asp*
lJ LinqDataScurceaspx
О I ListVtew.aspx
I) Z3 NavigationMastermaste
+) ^ J Split aspx
A| StyleSheeLcti
1 vv«d A'ebtnf о
_j* web config
INS
Рис. 1.25. Страница, созданная из вложенной ведущей страницы
Более "умные" клиенты
Богатые клиенты дождались в версии 2008 некоторого возрождения. Благодаря многим
технологическим достижениям в области интерфейсов пользователя граница между Web-
приложением и Windows-приложением продолжает размываться. Мы уже обсуждали Ajax.
Здесь мы рассмотрим, как версия 2008 позволяет создавать более богатые и "умные"
клиенты при помощи нового интерфейса программирования Windows Presentation Foundation
(WPF) фирмы Microsoft.
WPF является как дополнением к .NET Framework, так и набором инструментов, при
помощи которых разработчики могут создавать богатые решения для Интернета. Сам код осно-
Глава 1. Краткий обзор Visual Studio 2008
31
ван на XAML (Extensible Application Markup Language). Код XAML для пользовательского
интерфейса создается при помощи визуального конструктора WPF в Visual Studio (либо
аналогичного инструмента под названием Expression Blend). Затем XAML выполняется при
помощи .NET CLR. Поскольку он обрабатывается на клиенте и не связан ограничениями
HTML, то выполняется как основанная на векторах среда с аппаратным ускорением. В
результате получается исключительно богатая интерактивная среда, которая поддерживает как
двумерную, так и трехмерную графику.
Visual Studio для создания решений WPF предоставляет уже знакомую среду. Сначала вы
определяете проект WPF и добавляете в него формы WPF. При создании своего решения вы
выбираете тип проекта (в зависимости от того, будет ли приложение выполняться как
дополнительный модуль браузера или как инсталлируемый настольный клиент). На рис. 1.26
показаны шаблоны проектов WPF. При выборе WPF Application будет создано обычное
приложение WPF, которое проталкивается на клиентский компьютер или инсталлируется на
нем. Оно может иметь доступ к локальным ресурсам клиента.
Add New Projetf
Project types:
Vwual C*
Windows
Web
Smart Device
Office
Database
Reporting
Test
WCF
Worlcfiow
Other Languages
Other Project Types
Test Projects
Templates:
Visual Studio iruiatlerfterupiatci
й!!
Windows
Forms Ap„,
3|
Empty
Project
Ш
Class Library
3
Windows
Service
jft Г*
WPF WPF Broker
Application Application
,-ctf ^
WPF Custom WPF User
Ccntrcl Lib Control
.NET Framework 3.5 -rj^ifl
Щ
Console
Application
Windows
Forms
Mv Templates
Search
Online Те
г 1ы4кЛ<..£ч
Рис. 1.26. Создание нового проекта WPF в Visual Studio 2008
Приложение WPF Browser Application предназначено для развертывания при помощи URL
и выполнения в качестве расширения браузера. Приложение (называемое ХВАР (XAML
browser application)) работает в песочнице безопасности. Оно не имеет прав на клиентском
компьютере и удаляется в качестве части кэша браузера. Ему не нужно ничего скачивать
(при условии, что у пользователя на компьютере есть .NET Framework 3.5). Оно может
работать с cookies-файлами браузера и поддерживается как IE, так и Firefox.
Неправильный выбор типа приложения не станет большой проблемой. Вы можете
переносить формы WPF между приложениями разных типов. Обратите внимание, что на рис. 1.26
выделены еще два типа приложений — это WPF User Controls и WPF Custom Control
Library. Оба они предназначены для создания многократно используемых элементов
управления для приложений WPF.
32
Часть I. Введение в Visual Studio 2008
Для следующего шага создания формы WPF нужно просто открыть ее и начать
перетаскивать на панель конструирования элементы управления пользовательского интерфейса. Для
разработчиков под Windows теперь имеется существенное отличие— вы можете управлять
кодом компоновки формы (кодом XAML). Это более характерно для разработки Web-форм
при помощи Visual Studio. На рис. 1.27 показан визуальный конструктор XAML в действии.
Обратите внимание, что элементы управления XAML перечислены в панели инструментов
слева. Хотя они и похожи на элементы управления Windows и Web, они представляют собой
новый набор элементов управления именно для WPF. Обратите также внимание на то, что
визуальный конструктор показывает как поверхность конструирования, так и код XAML.
При разработке вашего кода поддерживается их синхронизация. Окно свойств при
редактировании свойств элемента управления XAML предоставляет такие же возможности.
File Edit View Project Build Debug Deta Tools
bo bc« т i X Wtndowlwmr V^owujtarofco;
t. Common * " '""" ~ ~-
' ^ Pointer^ j j
Ь Border
(jjj) Button
E] CheckBcx
£f ComboBcx
f Л Grid
M Image
A Label
** LiitBcw
0 RadicButton
П Rectangle
□ StackPanel
TabCcntfol
t-bi TextBox
fc Control
lfc Pornter
ID Border
|*ь) Button
3J Canves
El CbeckBox
£$ ComboBox
Test Window
? Debug
Help
Miked Platform:
Ргйренбы * $ X
System Windows.CoMrou
Name'1 ojtiofl \
Search Clear >
\aTcoI
Ready
~3$«v
^Design H~
;-т
SXAML :- _ ШЩШ
<C-rcp!:nadowBit3i5pEJf«ct /> —Ц
</""e'ic3CK.3J.CKdyEf*''ct>
</T*xr.3cx>
<3fcS.W* hr <. , -'WV ^ jj;'j-"f3,*a,f-|,v »
<£!u~tcn Bi-mspfiieco
<STcSaf lowBitXTECfcrr. >>
.1 *
Button fbuttonl) VVindowyGrm/Sutron
S Appea*aiw:e-
Boroe'Thickreii 1 '
Opaat>
V.s b >t>' Visible
Мете Pfqpeitiei ®
Сс'ог Б зек
D ?e<fco4 315
Noise 0
Opacity
ShaaowDepth 5
Sot>nesi 05
3itmapEf*ectIn.
С spTo Bounds
S^apjToDev>ce „
В Brushes
Background Systerr V
Eorce'Brush SFF7070
Рис. 1.27. Конструирование формы WPF
Визуальный конструктор более подробно описывается в главе 16. Здесь мы сосредоточимся
на движке форм, элементах управления, программировании событий, поддержке отладки,
развертывании, технологии IntelliSense, конфигурировании и прочих внутренностях WPF.
Дизайнеры и разработчики
При обсуждений WPF важно отметить ту работу, которая была проведена для поддержки
процесса взаимодействия разработчика и дизайнера. Понятно, что разработчик может лишь
попытаться создать дизайн пользовательского интерфейса. Само собой разумеется, что
разработчики не являются хорошими дизайнерами интерфейсов пользователя.
Однако даже в тех случаях, когда в проектах принимали участие дизайнеры — часто либо
дизайн приложения оказывался не слишком хорош, либо его реализация была очень труд-
Глава 1 Краткий обзор Visual Studio 2008
33
ной. У дизайнеров имелись свои инструменты, которые не взаимодействовали с
инструментами разработчиков. Дизайн часто предоставлялся команде разработчиков в виде картинок
либо в виде простого HTML. Разработчикам часто приходилось реализовывать тонкости
дизайна параллельно с написанием кода своего решения. В итоге все были недовольны.
Дизайн никогда не становился таким, каким он был задуман, и разработчики тратили слишком
много времени на достижение нужного внешнего вида.
WPF старается изменить такое положение вещей. Код разметки (XAML) пользовательского
интерфейса полностью отделен от кода реализации (на языке С# или VB). Кроме того,
фирма Microsoft предоставляет инструменты конструирования, позволяющие дизайнерам
создавать реальные интерфейсы пользователя, которые могут быть использованы командой
разработчиков. Нет больше никаких "трудностей перевода". Дизайнер может создать или
открыть элемент пользовательского интерфейса WPF, отредактировать его при помощи
Expression Blend (ему не нужно изучать Visual Studio) и сохранить его в составе решения
(или послать его разработчику). Разработчик может затем открыть этот элемент внутри
Visual Studio и начать наполнять события пользовательского интерфейса своим кодом.
Такой обмен между ними может продолжаться в течение всей разработки пользовательского
интерфейса. Никто не ругает чужой код; все используют свои сильные стороны.
Рис. 1.28. Конструирование формы WPF в Expression Blend
На рис. 1.28 показан пример из инструмента Expression Blend. Обратите внимание, что здесь
открыт тот же xaml-файл (форма WPF). Дизайнеры могут пользоваться знакомым им
инструментом для компоновки интерфейса пользователя и применения таких визуальных
техник, как трехмерная графика и анимация. Обратите также внимание на то, что для
поддержания связности между решениями используется файл проекта С#. После того как
дизайнеры завершат свою работу, сохраненные ими результаты поступают в команду разра-
34
Часть I. Введение в Visual Studio 2008
ботчиков. Они могут даже протестировать пользовательский интерфейс в контексте
приложения (при помощи сборки и запуска проекта).
Expression Blend
Инструмент Expression Blend фирмы Microsoft— это близкий родственник Visual
Studio 2008. Он дает дизайнеру возможность создавать богатые формы WPF (на
XAML), анимации и т. д. — и это без всякого кодирования. Вы можете также
использовать его для создания приложений Silverlight.
Expression Blend полностью построен на WPF. Он является отличным примером того,
чего можно достичь при помощи этой технологии.
Несмотря на то, что семейство программных продуктов Expression выходит за
пределы данной книги, вам следует знать о них. Мы дадим обзор этих продуктов в
разд. "Линейка программных продуктов Visual Studio" далее в этой главе.
Делаем выбор
Такое множество возможных вариантов разработки под Windows богатой среды для
пользователя неизбежно приводит к возникновению вопроса: "Какую технологию создания
интерфейса пользователя выбрать для моего следующего приложения под Windows?" Конечно,
ответ зависит от конкретной ситуации. Когда вы делаете выбор, то должны учитывать
назначение каждой технологии.
WPF — это технология Windows, для которой необходимо наличие .NET Framework на
клиенте. Она может работать как в песочнице безопасности браузера, так и в качестве
полноценного приложения Windows. WPF следует использовать тогда, когда вам необходимо
создать для пользователя богатую высокоэстетичную среду, когда вы хотите иметь низкие
издержки инсталляции и обновлений и когда вам требуется распределенная система.
Технологии Silverlight требуется только встраиваемый модуль для браузера. Этот
встраиваемый модуль работает на клиенте как мини-CLR. Таким образом, вы по-прежнему можете
писать свой код на языке С# или VB и иметь доступ к некоторым элементам .NET
Framework. Silverlight— это очень легкая кроссплатформенная версия WPF. Ее основные
сильные стороны — это видео, анимация и звук (мультимедийные возможности). Считайте
Silverlight альтернативой программного продукта Adobe Flash.
И наконец, Windows Forms также занимают определенное место в создании
инсталлируемых бизнес-приложений, которые взаимодействуют с операционной системой, используют
ресурсы клиента, подключаются к базам данных и т. д. Они предлагают стандартную
рабочую среду пользователя для ввода данных, манипуляций с файлами, конфигурирования, а
также соответствующие задачам решения. Их легко разрабатывать и обычно они не требуют
большой дизайнерской работы.
Решения на базе пакета приложений Office
Разработчики уже давно имеют возможность настройки пакета приложений Office;
некоторые из нас еще помнят создание макросов для Excel в операционной системе Windows 3.1
или автоматизацию редактора Word при помощи языка WordBasic. Visual Studio 2008 делает
еще один шаг в направлении разработки с использованием Office. Инструменты для разра-
Глава 1 Краткий обзор Visual Studio 2008
35
ботки теперь встроены в интегрированную среду С их помощью вы можете создавать на
базе Office проекты и решения, в которых используются Word, Excel, Project, Visio,
PowerPoint, Outlook, SharePoint и Info Path.
Для всех прод>ктов Office имеются шаблоны проектов. Вы можете создавать решения как
для Office 2003, так и для Office 2007. На рис. 1.29 показано диалоговое окно New Project
для решении с использованием Office. Это шаблоны для Visual Basic, но существуют такие
же шаблоны и для С#.
i Other Language!
л Visual Basic
Winder
Web
Smart Device
QtiiLe
Database
Reporting
Ttil
wcr
Wcrlrflrw/
Other Project Types
Г erf Projects
Templates
' з «-J ten plate.,
E»cel2007 Excel ГС,07 Excel 2007 InfcPath
Add-in Template Wcrkbock 2007 Add in
PcAfrPomt Project 2СЮ7 SharePoint SharePoint
AV'7Addin «dd n УЮ7 Seq 2»"Ю7 Stat
\й %$ & £±
Word 2007 Woid20G7 Excel 20CP Etc el 2003
Document Template Add in Template
JX
PcAerPaint Proje:t20D3 Vtsic 2003
200JAdd.n iid-in Add in
,'.ord200b
Add m
A project for aejtinj a managed cede add inter Excel 2007 < NET Fra тел ork 3.5)
Name ExcelAddlnl
Location С User^msneJbDocument: VisujI Studic 2008* Projects
Solution I Create new ^olLrtmn » >• Create director
Solution Name. bcelAddlnl Add to Source'
NET Frame-Aort 325
Iff* 3
InfoPflth
2007 For
r:
Vis.c 20 17
«dd in
ОиМисЛ 2СЮ?
Add in
Ш
VjrtJ< D7
Add in
Outlook ЗУР
AriJ in
'3 3
Vrfcrd2003
Dccument
for solutio
iontfot
WcrdA33
Template
Рис. 1.29. Множество шаблонов проектов внутри VSTO
Примечание
Пакет инструментальных средств Visual Studio Tools for Office (VSTO) в состав Visual
Studio Professional Edition не входит Он больше не является отдельным программным
продуктом Visual Studio 2008 поставляется с новой версией VSTO 3 0 Это должно
увеличить информированность сообщества разработчиков об этих инструментах и
расширить их применение
Существует несколько ситуаций, когда вам может потребоваться создать приложение на
базе Office. Самая часто встречающаяся из них — это когда вам нужно, чтобы ваше бизнес-
приложение предоставляло свои функциональные возможности внутри привычных рабочих
приложений Office. Бизнес-приложение обычно имеет массу разнообразных данных и
реализует некоторые рабочие процессы.
Например, возможно, вы работаете с финансовым или производственным приложением,
либо с расчетом заработной платы. Каждое из них выполняет свою задач> Однако
пользователям могут понадобиться данные, находящиеся в бизнес-приложениях. При этом они
будут принимать решения, которые необходимо ввести в эти приложения. Это часто делает-
36
Часть I. Введение в Visual Studio 2008
ся посредством обычного копирования и вставки и часто никак не регистрируется данными
приложениями. Пользователи теряют время на переключения между инструментами Office
и бизнес-приложениями. В такой ситуации следует рассмотреть возможность создания
приложения Office Business Application (OBA).
Разработка документов, шаблонов и дополнительных модулей
Обратите внимание на множество шаблонов на рис. 1.29. Например, там есть три шаблона
для Excel 2007. Каждый из них служит определенной цели. Шаблоны офисных приложений
позволяют вам создавать решения на основе единственного документа, шаблона документа
или в виде дополнительного модуля к приложению Office. Следующий список содержит
краткий обзор этих трех подтипов проектов.
□ Document— такие проекты позволяют вам создавать решение на базе конкретного
документа. Сам документ обычно существует в ограниченном количестве экземпляров.
Для примера предположим, что у вас есть документ Excel, который должен читать и
записывать информацию по расходованию средств проекта из/в систему ERP. Этот
документ будет обновляться еженедельно по результатам совещания по бюджету. Данные
должны быть актуальными, и изменения должны поступать в систему выставления
счетов. В этом случае вам следует создать решение на базе этого единственного документа.
□ Template— этот проект основан на файле .шаблона Office (например, xltx-файл для
Excel). Создание решения на базе файла шаблона Office дает вам возможность помочь
пользователю при создании нового экземпляра данного шаблона. Вы можете
распространить среди своих пользователей шаблоны часто используемых документов. Когда
пользователь создает новый экземпляр, шаблон может извлечь данные, находящиеся в
других компьютерных системах (для заполнения документа). Затем вы можете
зафиксировать результаты в базе данных (после маршрутизации шаблона средствами рабочих
процессов SharePoint).
□ Add-in — этот проект позволяет вам расширить функциональные возможности
приложения Office. Вы создаете дополнительные модули для повышения производительности
и создания дополнительных решений внутри данного приложения. Например, вы могли
бы написать дополнительный модуль для Outlook, который облегчил бы пользователям
хранение и классификацию их электронной почты.
Какой бы шаблон вы ни выбрали, Visual Studio 2008 предоставляет богатую среду для
создания вашего решения на базе Office. В качестве примера на рис. 1.30 показана Visual Studio
2008 при создании решения по шаблону Word 2007 Template. В этом примере пользователь
создает предложение по профессиональному обучению. Поля документа заполняются из
базы данных бизнес-приложения (в которой имеются данные по клиентам, по ресурсам, а
также стандартные расценки).
VSTO 3.0 предоставляет также поддержку работы с лентой Office 2007. Таким образом,
ваше приложение сможет вести себя как остальные приложения Office. Вы можете поместить
ваши разработки на вашу собственную вкладку ленты Office. На рис. 1.31 показан простой
пример. Представленные здесь функциональные возможности применяются к упомянутому
ранее шаблону документа. В этом примере разработчик предоставляет специфические
функциональные возможности шаблона документа (доступ к которым пользователь может
получить с ленты приложения Word).
Глава 1. Краткий обзор Visual Studio 2008
37
File Edit View Project Build Debug Date Tools Test Window Help
y] » _J - Li У УМ i ^t ' ' • £l • - ' ► Debug - Mined Platforms
'Fli , j f С -I П » -!
TbC'tbCNC
tiC ЛВ Window» Fofms
t Common Controls
ъ d*u
T Components
О Dialogs
г Word Controls
lit Powter
Stbbcaba [Dei^nt
Contosodobc*!
Aa RrrhTeittContentCont/al
Aa PlainTextContentControl
'Z[ PictureContentControl
' J ComboBcxCorrtentControl
Jj DropDownLrstCcntentCont
"•»' DetePickerContentControl
$ BuildingBlackGalleryConte.-
/Ф Bookmark
~ (jtaieraJ
Home Insert Page layout
Calibrl (Body) • li
В / U * ** *, ж' if*
Ft
J
Paste
Befeientes Mailings Review View
£ 4= • V * * A a
л- vr л . , _ SM« Editing
;<2l
С onto so
я
Quote to Deliver Training Services
This quote represents the details of a proposed contract between Contosa and'
quote is valid for a period i' enter days days.
—
Customer Details
Thisquote Is provided spedficalry to the customer listed below. The quote is basecj|
choose a company and is not transferable
Company Name
■ on*» an i
h m„„
Ready
Рис. 1.30. Создание проекта типа Word 2007 Template в Visual Studio 2008
rf» Ш70Х - Microsoftybw£$^2
File Edit View Project Build
. j ц : :i -r <v _i ~
ff Office WAoo Controls
Jt_Pwn»er^
;J BO»
j Button
'l ButtonGroup
0 ChetkBox
*f ComboBox
' DropDown
*bjj EditBox
p Gatleiy
^. Group
A Label
£|Z Menu
Separator
"У SplitButton
' Tab
v£* ToggleButton
£ «Windows Forms
£ Data
~ Component*
Ft Printing
i I
Debug Data Format
RJbbonLcs (Design)
Tools Test
'/ Debug
Window Help
• Mixed Platforms
'$>
SLfc^tj
Manage Que»» (Built In)
( Cuatomer | j Find С js ten»
Manage Quo»
Cttetomer Lookup
Property
"" % *a x
spf tButtonl Microsoft.OfficcToals Rib *
»rUL*Uai'
0 (A p plication Settings *
(Name)
ButtonEnabled
ButtonType
Checked
Centre IS tze
Description
Enabled
GenerateMember
J
S Image
ImageName
ItemSrze
KeyT.p
Label
Locked
Modifiers
(Name)
split Buttonl !
True '
Button
False
RftbonControiS
True
True
*M£itbYi '
teffi*| Conto&oTra
RibbonCcntmlSt
Submit Quote
False
Internal
Indicates the name used in code to
Identify the object.
rrem(s) Saved
Ь 4,4
iff 42» 76
Рис. 1.31. Настройка ленты Microsoft Office
38
Часть I. Введение в Visual Studio 2008
Создание решений на основе SharePoint
SharePoint стал почти таким же вездесущим, как и Office. Организации используют его для
управления знаниями, совместной деятельности и автоматизации бизнес-процессов.
Конечно, это неизбежно приводит к его доработкам и расширению со стороны разработчиков.
Если вы производили доработки SharePoint при помощи существовавших инструментов для
Visual Studio версий ранее 2008 года, то знаете, что это было серьезной задачей. Поддержки
стадии конструирования не было, конфигурация была сложной, а отладка — очень трудной.
Visual Studio 2008 предоставляет для разработчиков SharePoint гораздо более богатый набор
инструментов. С его помощью вы можете создавать рабочие процессы SharePoint (см.
шаблоны проектов на рис. 1.29) и строить WebParts на базе ASP.NET. Кроме того, отладка в
интегрированной среде сокращена с 15 шагов до 5. Разработка под SharePoint теперь
является первостепенным приоритетом интегрированной среды. Это должно привести к
упрощению процесса расширения SharePoint и помочь удовлетворить те потребности бизнеса,
которые породил этот программный продукт для совместной деятельности.
В этом разделе были отмечены многие новые функциональные возможности VSTO 3.0 для
Visual Studio 2008. Однако имеется еще масса других улучшений. В их число входят: доступ
к открытым форматам XML, способность добавлять функциональные возможности в
существующие формы Outlook, нестандартные панели задач в Word и Excel, привязка данных, а
также улучшенные развертывание и безопасность. Мы опишем все это (и не только это) в
главе 21.
Мобильные устройства
Visual Studio 2008 продолжает совершенствоваться в плане написания приложений под
мобильные устройства. Эта новейшая версия позволяет вам создавать приложения для
различных технологий и устройств. Вы можете создавать решения под Windows Mobile 2003,
Windows CE 5.0 и 6.0, а также Windows Mobile 5.0 и 6.0 как для смартфонов, так и для КПК.
Кроме того, вы можете создавать приложения и для того множества устройств, которые
используют эти операционные системы и соответствующие версии .NET Compact Framework.
Для создания мобильных приложений интегрированная среда разработки предоставляет
визуальные конструкторы форм, редакторы кода, а также поддержку отладки. Начните с
проекта Smart Device. Затем можете выбрать вашу целевую платформу Target Platform,
целевую версию .NET Compact Framework (NetCF) и тип шаблона проекта (приложение в виде
форм, библиотека классов, элемент управления и т. д.). На рис. 1.32 показан пример. Здесь
приложение предназначено для Windows Mobile 5.0 и самой последней версии NetCF.
Проектирование приложения Windows Mobile— процесс аналогичный. В панели
инструментов имеется набор элементов управления. Вы выбираете элемент управления и
перетаскиваете его на форму. Форма выглядит и действует как устройство, для которого вы ведете
разработку. На рис. 1.33 показан пример среды конструирования. Этот пример— простая
пользовательская форма поиска. Обратите внимание на меню в нижней части экрана. Вы
используете эти меню для того, чтобы дать пользователю возможность работать с формой
при помощи основных кнопок смартфона (поскольку смартфон не имеет стилуса (пера) или
мыши).
При разработке вашего приложения вы можете развернуть его и оттестировать на эмуляторах
устройств. Это позволяет отладить ваше приложение и увидеть, как оно ведет себя на имити-
Глава 1. Краткий обзор Visual Studio 2008
39
руемом устройстве. Visual Studio 2008 поставляется с основными эмуляторами смартфонов и
КПК. Однако существует более 20 эмуляторов устройств (которые можно скачать). На
рис. 1.34 показано приложение, которое развернуто и работает на простом эмуляторе
смартфона. Здесь вы можете взаимодействовать с приложением и отлаживать свой код.
Add New Smart Device Pr4*^^rr«^evwePr^^
Target platfornv
Window Mobdc 5-0 Smartphooe SDK
NET Compact Framework version: ^ш Compact Framework Version 3 b
Templates:
>3 "Щ Щ «55
Ф Ф T<
Device Clars Library Console Control Empty
Application Application Library Project
Dtfw/nlosd addrtona' emulator irncjes ard imsrt device SCKs
, Descnption*
A project for creating a NET
j Compact Framework 35 forms
I application for Windows Mobile
5 0 SmartphoneSOK Platform
OK Caned
Рис. 1.32. Выбор шаблона проекта типа Smart Device
**> 9?2701 - V crcscn V.ju»! Studio
TTisj
file Edit View Project Build Debug Data Format Tools Test Window Heip
J3 - _J - -J А Ш
USA Windows Mobde5.0 Smartph
Гяойш "" " ^ H X
i* ЛЯОеукеОвпгиЛ
г Common Device Controb
It Pointer '
3 CheckBox |
V$ ComboBox
J? DateTimePrcker '
A Label
,\ LinkLabel |
,]* Lirttfew j
_^| PictureBox '
l_l ProgressBar I
«h't TertBox Г
V TreeV'iew t
r^ WebBrowser J
'< Device Contrinem j
4 Device Menus tt Toolbars !
I- Device D«t« j
i ^ Pointer '
"V BindingSource !
,J DataGnd
-i| DataSel |
f* Pevke Components
Ready
» Debug
■ Mixed Platforms
Z - L : J.
Form l.cs [Design)"'
£ # et
ШШШНЖШ!
ч3? mainMenul
Рис. 1.33. Конструирование формы для смартфона
40
Часть I. Введение в Visual Studio 2008
Рис. 1.34. Выполнение мобильного приложения на эмуляторе устройства
Значительным дополнением в версии 2008 является возможность писать модульные тесты
для приложений под мобильные устройства. Теперь вы можете создавать эти тесты при
помощи стандартной инфраструктуры для написания тестов, встроенной в Visual Studio
(начиная с версии 2005). Эти модульные тесты ведут себя точно так же. Кроме того, они могут
интегрироваться с программными продуктами семейства Team System (такими как Team
Test) и публиковать тестовые данные на сервере Team Foundation Server.
Compact Framework 3.5 также предоставляет некоторые приятные улучшения. В их число
входят: поддержка привязки данных LINQ, технология Windows Communication Foundation,
улучшенное сжатие, улучшения звука, усовершенствованное управление безопасностью и т. д.
Ориентированные на сервис решения
с постоянным подключением
Многие бизнес-приложения содержат специфические процессы (рабочие процессы),
связанные с документами, записями и соответствующими данными. Эти бизнес-процессы обычно
включают в себя постадийный просмотр и утверждение (документов) соответствующими
должностными лицами; для них может также потребоваться обмен данными между
различными компьютерными системами. Бизнес-процесс обычно бывает также достаточно
длительным — а это означает, что процесс является не одномоментным действием, а
многошаговым процессом, который должен ждать перехода на следующий шаг.
Встраивание таких процессов в бизнес-приложение обычно превращалось в крупную
нестандартную разработку (почти без возможности получить какую-либо консультацию), либо
приводило к привязыванию вашего приложения к программным продуктам сторонних
производителей. В такой ситуации помогали Web-сервисы, но разработчикам не хватало про-
Глава 1 Краткий обзор Visual Studio 2008
41
стых средств встраивания в них поддержки множества протоколов, различных транспортов,
сильных средств безопасности и поддержки транзакций.
Visual Studio 2008 (и .NET Framework) теперь предоставляет готовую поддержку создания
бизнес-процессов в виде рабочих процессов и надежной интеграции их с другими
приложениями, системами и партнерами. В этом разделе рассматривается технология Windows
Workflow (WF), которая определяет бизнес-процессы многократного использования, а также
технология Windows Communication Foundation (WCF), которая используется в этих бизнес-
процессах для обмена между системами.
Примечание
В главе 3 мы рассмотрим улучшения для поддержки обмена и рабочих процессов,
введенные в NET Framework и языках программирования (а не в самой
интегрированной среде разработки).
Разработка приложения/бизнес-процесса
Рабочий процесс представляет собой набор операций (называемых действиями), которые
выполняются в зависимости друг от друга, бизнес-правил, различных \словий и действий
пользователя. Рабочие процессы обычно моделируют бизнес-процессы и часто включают в
себя взаимодействие с пользователем. Windows Workflow предоставляет инфраструктуру,
инструменты и движок для использования рабочих процессов в вашем приложении. С ее
помощью вы можете создать рабочий процесс и быть уверенными в том, что он б\дет
работать везде, где инсталлирована .NET Framework.
Вы взаимодействуете с рабочими процессами из вашего приложения. Тго может быть
приложение любого типа (Windows, ASP.NET, консольное, сервис и т д.) Обычно вы
предоставляете рабочему процессу данные и, возможно, получаете от него ответ, либо вы можете
использовать рабочий процесс для запуска определенных задач или действий в вашем Гни-
нес-процессе. Рабочий процесс может также сохранять себя во время длительных
транзакций, а затем при необходимости возобновляться.
В Visual Studio 2008 встроены два типа рабочих процессов: последовательные и типа
конечных автоматов. Последовательный рабочий процесс выполняет шаги сверху вниз (в порядке
конструирования). Каждый шаг зависит от предыдущего (и, возможно, от некоторою
набора условий). Рабочий процесс типа конечного автомата реагир\ет на различные состояния
(статус), передаваемые в него. Состояния обеспечивают переходы между другими
состояниями и могут также запускать определенные события.
Тип вашего рабочего процесса вы выбираете на стадии конструирования Имеются
шаблоны как для последовательных, так и для конечных автоматов На рис. 1.35 показан пример
шаблонов рабочих процессов, встроенных в Visual Studio 2008. Обратите также внимание на
шаблоны рабочих процессов SharePoint. Они предоставляют такие же рабочие процессы,
только в них имеются дополнительные методы для разработчиков SharePoint.
Создание рабочего процесса— очень визуальное действие. Основная идея здесь состоит в
том, что сами рабочие процессы традиционно представляются в виде набора шагов
(прямоугольников) и связей (стрелок). У вас по-прежнему есть доступ к коду, но виз\альный
конструктор предоставляет хороший визуальный инструмент для создания как
последовательных процессов, так и процессов типа конечного автомата. С его помощью вы можете
42
Часть I. Введение в Visual Studio 2008
указать точки начала и конца, добавить в диаграмму действия и настроить каждое действие
в соответствии с его задачей.
Project typ«s
Visual С*
Window*
Web
Smart Device
Office
Database ,
Reporting
Test
V.CF
Workflow
Other Languages
Other Project Тур
Test Projects
Templates-
Visual Studio nsta edttrrplatt.
Empty
WcrWIo..
State
Machin™
73
Search
Online Те
Sequential
Workflow
Workflow
Artrvrty...
Sequentwl
Woricflcw
Library
SharePoint
2007 Seq
SharePoint
2007 Stat
State
Machine
A project for creating a sequential workflow, library ( NET Framework 3,5)
Name. SalesQuoteWorkftow
Location C.\Ustn\minell\Documents\Vt5ual Studio 2003\Projecft\972701
•» Browse.
* OK J ' Cancel 1
Рис. 1.35. Создание приложения с последовательным рабочим процессом
♦•» 972701 - Microsoft Vnual ^^gl^^^BS
File Edit View Project Build Debug
Workflow Data
k Я 0~k m - ' * 2 к1 л *r z
Taaibox ~ a X Workflowl.cs (Design]»
- Window? Workflow v3.0 * Г
1 1^ Pointer г ~~
\\ Ca(IE*ternalMeth.od
J: ' Code ]
i ^ Compensate
1 j^ Compensate bleSequence
1 y) CcndrbonedActivityGroup
1 (y Delay '
1 -|j EventDnven
i JO EventHandlingScope
1 p FaultHandler
1 .}j HandleExtexnalLvent
1 {*olfEI«
1 .*£ InvokeWebService
1 [£} Imt^e Workflow
i i'j Listen
1 i j> Parallel -
1 Policy
1 >4^ Replicator j
1 Л Sequence | -
1 Щ Suspend
1 Ц] SynchronizauonScape ,
1 0 Terminate
1 *< T^"»~
рШ4ШШр|у^ДДДШ#^^:^:^ ЫШЦ
Took Test Window Help
$«>««>| *»UMrMm
^
1
j > ^*>«, j
1
*»-*- .- -
1 ■■♦
1
-T M-f='-»^S, *
Г
**-
1
' «r/«^ V
1
L
1 Read/
^гшш.тппптптггитгп^
t
Ф. 1
, * >.. . ,
^ !fl|L~' |>-—
,. | l(..^ ..
t
• i- "
! .. . . .;
1 «*"**&» !
- X
л
1
j
1
i
г
If
■?
"». L
"*i
»л
7 i
^-1
I
I S
i |
I
—' 1
л I
л 1
. 1
J
Рис. 1.36. Конструирование последовательного рабочего процесса
На рис. 1.36 показан последовательный рабочий процесс в Visual Studio. С левой стороны -
фигуры действий рабочего процесса. Вы используете их для визуального представлени
Глава 1. Краткий обзор Visual Studio 2008
43
вашего рабочего процесса. Каждая фигура имеет набор свойств, которые требуют настройки
разработчиком. Этот простой пример рабочего процесса позволяет реализовать
утверждение предложения на покупку. Здесь имеется условие if /then для определения, нужно ли
утверждение для данного предложения на покупку. Если оно необходимо, то предложение
ждет утверждения. Затем предложение либо утверждается, либо отвергается пользователем.
Если пользователь не ответил в срок, то посылается сообщение об истечении срока. Вы
можете изучить этот рабочий процесс по визуальному представлению в виде диаграммы.
Набор инструментов для рабочих процессов содержит также простой редактор правил и
условий. Этот редактор позволяет вам настраивать правила рабочих процессов и управлять
этими правилами. Затем эти правила выводятся в виде XML для того, чтобы при
необходимости они могли подстраиваться на стадии выполнения. На рис. 1.37 показан пример
редактора правил. В этом диалоге настраивается условие по стоимости предложения на покупку
из предыдущего примера. Затем это условие прикрепляется к действию if /then на
диаграмме.
Примечание
Более подробное обсуждение инструментов Windows Workflow см. в главе 20.
Select « rule cpndrttcn to Ь« assigned to the activity's condition You can ako add, edit, delete or
rename «istmg conditions.
и ^New- 'j/Edit„ iJj Rename . ;< Delete
III Condition Preview
I!! thts.QuoteVolue >« 10000
OK | | Cancel
Рис. 1.37. Определение правил и условий рабочего процесса
Создание и использование сервисов
Большинство организаций имеет много компьютерных систем, причем каждая
предназначена для своей конкретной цели. Это могут быть: финансовая система, кадровая система,
система управления заказами, система управления запасами, система обслуживания клиентов
и т. д. Эти приложения обслуживают конкретные бизнес-процессы. Однако большинству
организаций необходимо отвязать эти бизнес-процессы от их приложений и использовать их
как часть комплексного решения. Именно здесь помогают ориентированные на сервис ре-
л
ЗЗак 3716
44
Часть I. Введение в Visual Studio 2008
шения. После предоставления бизнес-процесса в виде сервиса им могут воспользоваться
многие клиенты.
Концепция многократного использования кода существует уже давно. Однако многократное
использование ориентированного на сервис кода стало очень популярным только с
появлением Web-сервисов. Вездесущий характер HTTP и порта 80 в сочетании с интерфейсами на
базе XML позволяет получить новый уровень обмена между приложениями. Разработчики
начали оформлять основные бизнес-функции в виде сервисов и вызывать их из разных
клиентов.
Visual Studio 2008 и .NET Framework 3.5 представляют собой следующую стадию этой
ориентированной на сервис парадигмы. При помощи этих инструментов вы можете создавать
сервисы на базе Windows Communication Foundation. WCF является инфраструктурой,
которая признает тот факт, что разработчикам нужно много уровней обмена (а не один только
протокол SOAP поверх транспортного HTTP), им требуется сильная система безопасности,
им часто нужна также поддержка транзакций, и они не хотят писать для этого весь код
низкого уровня.
Вы создаете сервис WCF как библиотеку кода, как рабочий процесс или как приложение
Web-сервиса. На рис. 1.38 показаны шаблоны новых проектов, перечисленные в типах
проектов WCF. Здесь вы можете указать, что ваш Web-сервис содержит рабочий процесс
(бизнес-процесс), или просто создать библиотеку сервиса, из которой будет вызываться ваш код.
| Add New Prpjett ^^^^^^^Я^^ЯИ^^^^^^^^ЯЯВ^^^^^^^^^^^^^^}
Project type* Templates: >NET Framework 3.5 yRR
Visual C*
Windows
Web
Smart Device
Office
Database
Reporting
ТеЛ
WCF
Workflow
Other languages
Other Project Types
Test Projects
Visual Studio installed templates
Щ Щ Щ Щ
Sequential Stite Syndication WCF Service
Workflow Machin.. Service Li... Library
Service
iibhlfy t«
3
Search
%
A sequential workflow exposed as a WCF service (.NET Framework 3.5)
Name* WFServiceLibraryl
Location: GUJsers4rnsnell\DocurnentsMsual Studio 200S\Projecls\Prcjectl т ; Brewse^.
| QK ] r Cancel |
Рис. 1.38. Выбор типа проекта WCF
Вы можете также (как и прежде) создать Web-сервис в asmx-файле (при помощи шаблонов
Web-проектов). Эта же самая область шаблонов дает также доступ к новому шаблону WCF
Service Application. С его помощью вы можете создать сервис WCF, который настраивается
аналогично Web-сервису.
WCF полностью настраиваемая. Она освобождает вас от необходимости написания
внутреннего кода сервиса. Вместо этого вы можете сосредоточиться на функциональности ва-
Глава 1. Краткий обзор Visual Studio 2008
45
шего сервиса. Например, вы можете добавить в ваш сервис оконечные точки (в зависимости
от того, какой стек протоколов вы собираетесь поддерживать— HTTP, TCP/IP, MSMQ,
именованные каналы и т. д.). На рис. 1.39 показан редактор конфигурирования WCF.
Обратите внимание, что поддержка привязки для оконечной точки — это задача
конфигурирования (а не программирования).
Примечание
Более подробное обсуждение инструментов для Windows Communication Foundation и
Web-сервисов см. в главе 19.
Щ a\u3«r3W3nelftdc*unwtsWl$!L^stad»2^^ ~ Microsoft Se'vic* M s.Tr-L.ffi.,'.,
File Help
Ж I
-; U Swvtcet
У *£> WdSerflceUbraryl Servfcel
H JEndporti
1 (Empty Name)
"^ (Empty Name)
♦ CjOert
LJBhungi
♦ LJCtagno*ca
.t CJ Advanced
Delete Efldpcnrct
Create a New Service
Create a Mew Client
SeivlccEndMint
General jdentt* ! H*adan
:B IConfijM^on)
Name
В EndpoiatPr
BehavuyConfisurauon
bndngCorfigurattor
BmdingMame
B»r»A njN smetpacc
Carl» act
UstertUn
UatenUriMode
1 wirftlpnixAng
Imexl-ttpiundnjj
UexN*rnedPjpeBr<*ng
mexTcpftndng
nwnqtuegretion Bndng
4netMenqftndng
Ind Named Rpe&ndng
netPeerTcnflraing
neiTcpBnding
netTcpCortexlureing
LebHttpundlng
ws2QC7FederatlonHtpBindng
Li2007rttc Ending
weDualJHtlp&ndng
k
r-
1
s
-
'Bindng
Thia setting lets ycu choose the type of the Ьггеапд you *am to use for thu endparl
Yot. can uae one of the eyatorrKJefined WCF brxSng types cr register you* cwn in th
Рис. 1.39. Конфигурирование сервиса WCF
Работа с данными
Данные— это сфера непосредственных интересов бизнес-разработчика. Поэтому
неудивительно, что самый лучший инструмент и инфраструктура в области бизнес-разработки
продолжают предлагать все новые улучшенные способы доступа к данным и их представления.
Доступ к данным в Visual Studio и .NET Framework— везде. Здесь мы выделим несколько
новых аспектов, с которыми вы столкнетесь в версии 2008.
Примечание
Доступ к данным описан более подробно в главе 18.
Проектирование данных
Типизированный набор данных позволяет вам создать класс .NET, который основан на
семантике таблиц вашей базы данных, но "за кулисами" работает как набор данных. Типизи-
46
Часть I. Введение в Visual Studio 2008
рованные наборы данных уже давно являются составной частью Visual Studio. Вы можете
автоматически генерировать их на базе схем таблиц и редактировать код, используемый для
запроса, обновления, вставки и удаления данных.
Для типизированных наборов данных Visual Studio 2008 предоставляет дополнительную
поддержку на стадии конструирования. Вы можете создать файл типизированного
источника данных (xsd) и использовать панель Toolbox и Server Explorer для создания набора
данных. На рис. 1.40 показан такой пример. Для создания набора данных таблицы из Server
Explorer были добавлены на поверхность конструирования.
Кроме того, теперь в версии 2008 типизированный набор данных поддерживает
иерархические обновления. Эта функциональная возможность позволяет вам сохранять данные во
множестве связанных таблиц типизированного набора данных. На рис. 1.40 это позволило
бы редактировать как информацию о служащих, так и соответствующие территории —
и выполнить обновление как единый процесс.
<^ Э?2701 - M>erasc*t VlamJ Strict
File Edit View Project Build
JJ ' _J ' J? *4 0 i
JTcobc» * й j
| L D*taSet
1^ Pointer
*vj TableAdapter
I ♦ Query
>j DataTable
ij Relation
| !£ General __
j Server Exp orer ■*■ u )
\Л ' 4%
;-» lJ Tables
ц> ГЗ Categories
IT JD CustomrrCustcmcrDer
♦, '.23 CustomerDemogrBphic,
it, J] Customers
'*• 213 Employees
Ы П EmployeeTerrttories
iu J3 Order Details
Ш 13 Oiders
i* 3 Products
\ Л1 Region
f+j J3 Shippers
r+< 13 Suppliers
b JD Territories
'*' J^-Views
Ready-
Debug Data Tools
< j Emptoyeesotsd*
Test Window
> Debug
Help
» Mixed Platforms
! i
Щ
EmployeelD
Last№rne
FirrtName
TrtJe
TrtJeOf С curtesy
BirthDate
HireDate
Address
City
Pegicn
PostafCcJe
Country
ВДиШШШ)ШШГШ:^ПмШШ::Ш
Фк FiH.GetDataQ
fel RII,GetData0
Рис. 1.40. Создание типизированного набора данных
при помощи визуального конструктора наборов данных
Отображение объектов на реляционные данные
Большая часть бизнес-приложений зависит от данных, хранящихся в реляционных базах
данных. Базы данных состоят из таблиц, столбцов и связей. Такая структура позволяет
удачно реализовать механизм хранения и отчетности. Однако технология базы данных часто
не соответствует потребностям объектно-ориентированного разработчика под .NET.
Разработчик объекта мыслит категориями объектов, свойств, методов, связей, инкапсуляции
и т. п. Огромное количество времени затрачивается на преобразование данных из базы дан-
Глава 1. Краткий обзор Visual Studio 2008
47
ных в объектно-ориентированную структуру и обратно. Кроме того, разработчиков просят
писать код на Structured Query Language (SQL) и .NET.
Add New Item - DataPeffife ^|Д|Д
1 Categoric? Templates:
VrsuafC* Kerns
Code
Date
J Web
I Windows Fermi;
1 WPF
I Reporting
§ Workflow
'
Visual Studio installed ttmplatei
DataSet UNQ to SQL
Owes
s &
4ML Schema XSLTFile
My Templates
-J
Search
Online Те
| UNQ to SQL classes mapped to relational objects.
I Name Customers dbml
ШШ1ШШИГ|Ж|||М1№||||Ш||Ж|ТЙ11
J
Local
Database
• -ж
Local
Databa
jjjj|jjjj^^^^^^!Pft|;tt'Wa''"V"V^V"'
Service-Ьэ. XML File
Database
[ Add |
ign i
Cancel | 1
Рис. 1.41. Создание нового класса LINQ to SQL
File Edh View Project
Too be» «r 4 X
■: Object RefetientfDesig.. ;
l^ Pointer
"II Class
<-u Association
4- Inheritance
jit General
Server Ёхркжг
J2 CustomerDen *
13 Customers
I] Employee
И EmployeeTerr
13 Order Details
Л Orders
ЛЗ Products „
J3 Region
13 Shippers
13 Suppliers
;♦ H Territories
i i Views
lJ Stored Procedure
!+? _D CustOrde/Hty
Li5 13 CustOrdersDe
№
Build Debug Data
^ '< ** - " '
Customer/Sun**
Test Window
!► Debug
Д X
Help
» Mixed Platforms
Customer
~ Properties
TJ3* Custoi-e/lD
!?3* CompanyNa-vie
'J3* ContactNarre
23* Contact*
Z3* Address
4* City
^f Region
^ PcctalCcde
Z3* Country
'Л* °hcne
^
~ Properties 5
J ^J* Ord*rlD
23* CustorrerlD
23* EroployeelD
23* OrderDate
*3* Required rate
23* ShiopedDa^e
23* ShipV»
23* Freight
23* ShipNerr*
!3* ShrpAdoness
23* ShipCity
2? ShipRegion
23* ShipPcstalCoa
23* ShicCcunay
• i»
V CustOrdersDetail iSystemJntt
•* CuitOrdtrsOrders (System Stni
Рис. 1.42. Установление соответствия между связями базы данных и объектами
LINQ (см. главу 3) является технологией, которая помогает сгладить это противоречие. Она
предоставляет средства для работы с записями базы данных как с объектами. Она также
позволяет вам писать ваши запросы при помощи .NET (языков С# и VB). Над LINQ нахо-
48
Часть I. Введение в Visual Studio 2008
дится объектно-реляционный конструктор (O/R Designer) для SQL Server, который
называется LINQ to SQL. С его помощью вы можете конструировать и создавать классы .NET,
основанные на схемах баз данных. Таким образом, вы можете быстро преобразовать
концепции баз данных в объектно-ориентированные концепции.
Для создания класса LINQ to SQL нужно использовать шаблон Visual Studio. Вы можете
добавить такой класс в проект любого типа (Web, Windows, библиотеку классов и т. д.). На
рис. 1.41 показано диалоговое окно Add New Item с выбранным в нем шаблоном LINQ to
SQL Classes.
Затем для построения вашего класса LINQ вы можете использовать O/R Designer. Сначала
вы используете Server Explorer для того, чтобы открыть подключение к базе данных (с
которой вы будете работать). Затем вы можете перетаскивать таблицы из базы данных на
поверхность конструирования. Визуальный конструктор понимает (и обеспечивает) связи
между таблицами. Он устанавливает соответствие таблиц классам и столбцов — свойствам.
На рис. 1.42 показан пример работы конструктора. Здесь имеются класс клиентов и линия
связи с заказами клиентов. Обратите также внимание на методы, перечисленные справа на
диаграмме. Они были созданы путем перетаскивания хранимых процедур из Server
Explorer на поверхность конструктора. Теперь разработчик может работать с этими
классами и методами так же, как и с другими объектами .NET.
Создание периодически подключаемых приложений
Многим современным приложениям доступ к данным требуется как в автономном, так и в
неавтономном режиме работы. Например, данные отчетов или записи системы
обслуживания клиентов могут понадобиться вам в дороге (либо в офисе клиента). Вы не можете всегда
надеяться на то, что сможете к ним подключиться. Разработчики справляются с этой
проблемой разными способами. Для обеспечения простого решения этой сложной проблемы
последняя версия Visual Studio предоставляет сервисы синхронизации данных.
Синхронизация данных позволяет вам синхронизировать и кэшировать данные центральной
базы данных и клиентской системы пользователя. Этот кэш — версия SQL Server Compact
Edition (CE). Фирма Microsoft уже использует эти сервисы в Vista, Office и даже в
программном обеспечении своего устройства Zune. Вы также можете использовать эти сервисы
в ваших приложениях.
Возвратясь к рис. 1.41, вы можете заметить шаблон Local Databa.... На самом деле этот
шаблон называется Local Database Cache. С его помощью вы создаете sync-файл для
настройки синхронизации между локальным хранилищем данных и сервером. При открытии
файла кэша локальной базы данных в Visual Studio открывается диалоговое окно Configure
Data Synchronization. Здесь вы можете настроить таблицы, которые необходимо
кэшировать на клиенте, настроить базу данных сервера и сконфигурировать информацию о базе
! данных клиента. На рис. 1.43 показан пример этого диалога.
Область Cached Tables диалогового окна Configure Data Synchronization позволяет
определить, какие таблицы будут синхронизироваться. На рис. 1.44 показан пример добавления
таблиц в этот список. Здесь вы для каждой таблицы настраиваете, каким образом
происходит синхронизация. Сервисы синхронизации более подробно обсуждаются в главе 18.
Глава 1. Краткий обзор Visual Studio 2008
49
Configure Oat» Syw^niwftgnJ
,—- --- i, n тшшшшяшшит
IliMPPpgy
Select or create a Server connection to the remote database a nd then add the tables to cache locally. The Client с onnection represents the local
database where the cached tables are stcred after synchronization. Open the code example link to view hour to invoke synchronization
Cached Tables.
3§3 Application
Database Connections
Server connection,
northwwdConnefbonStnng (Setting*}
Client connection:
i N©rthwindv»df (n«*}
jftj Advanced
/, Synchronize tables in a single transaction
Create synchrontiauon components: Client ftnd Serve r
Server project location;
Client project location:
DctaOemo
DiteDtmo
f Cancer-
Рис. 1.43. Конфигурируем синхронизацию данных
Select the tables to be available offffne indicating the columns used to identify inserted and updated records, and the table
to temporarily store deleted records
Tables on dbo'.
n$ J Categones
I j$J[ CirstomerCustemerOemo
1-Й CustomeiDemographks
JViftj Customers
i bU&J EmployeeTemtones
'QfcJ Order Details
11 fci Orders
L Ж\ Products
L&] Region
[ 5*j Shippers
Lj&i Suppliers
Data to download
| No* and incremental changes «far first synchronotttort
Compare updates using;
UstEa'ttOjtefnew) ~ " "ill
Compare inserts using.
i CreationDate (new)
Move deleted items to?
[ ^mpteyees^Tombstone (new)
j Show all database items
Script Generation
П7] AutomaticaJJy generate server-SKle scripts
>/j Execute scripts when this dialog is closed
Рис. 1.44. Добавление и настройка синхронизации таблиц
Линейка программных продуктов Visual Studio
Подобно версии 2005, Visual Studio 2008 имеет много разновидностей— каждая на свой
вкус. Есть варианты и для любителей, и для системных архитекторов уровня предприятия;
50
Часть I. Введение в Visual Studio 2008
для бета-тестировщиков и для рядовых сотрудников — и, конечно же, есть кое-что
"вкусненькое" и для разработчиков! Разобраться во всех продуктах и редакциях Visual Studio
непросто. Мы надеемся, что следующая информация поможет вам выбрать вашу версию
Visual Studio.
Редакции Express Edition
Фирма Microsoft предлагает редакции Visual Studio Express Editions для каждого языка (VB,
С#, C++, Web, SQL). Эти редакции бесплатны, их можно скачать. Они представляют собой
простые начальные версии, предназначенные для новичков, любителей, студентов и вообще
для любого человека, который хочет написать какую-либо программу и не пробить дыру в
своем бюджете. Существует даже редакция для разработчиков видеоигр. Кроме самих
редакций имеются также пособия, видеоролики, сайты, развлекательные проекты и т. д.
Редакции Express Edition следует рассматривать как ответ фирмы Microsoft на
существующие сегодня бесплатные инструменты для разработчиков. В конце концов, если вы студент
колледжа, которому нужно поднять Web-сайт для своего приятеля, то вы, безусловно,
будете искать самое дешевое решение. И конечно, фирма Microsoft хочет быть уверена, что
через пять лет, когда вы будете принимать решения для всей вашей организации, вы уже
будете знакомы с ее программными продуктами. Редакция Express Edition прекрасно заполняет
эту нишу.
Эти редакции преднамеренно лишены некоторых возможностей своих профессиональных
старших товарищей (конструктора классов, модульного тестирования, шаблонов
предприятия, поддержки XSLT, управления исходными кодами, поддержки 64-битных вычислений
и т. д.). Однако они имеют полную поддержку языков (например, LINQ) и доступ к
элементам .NET Framework (таким как WPF).
Редакции Express Edition имеют также упрощенную среду пользователя, лишенную
сложности (и возможностей) профессиональных редакций. Однако при помощи этих инструментов
разработчики смогут создавать приложения "клиент-сервер" (на базе форм), Web-сайты и
даже Web-сервисы.
Примечание
Найти дополнительную информацию по редакциям Visual Studio Express Editions
(а также скачать одну из них) вы можете на сайте фирмы Microsoft по следующему
адресу: http://www.microsoft.com/express/default.aspx.
Редакция Standard Edition
Редакция Standard — основная версия начального уровня для профессиональных
разработчиков. Эта редакция по своему характеру аналогична редакциям Express Edition. Однако она
содержит все .NET-языки в одном пакете. Кроме того, она дает разработчикам больше
функциональных возможностей, чем версии Express. Среди этих дополнительных
возможностей имеются следующие:
□ поддержка многопроектных решений;
□ поддержка выбора версий .NET 2.0, 3.0 и 3.5;
Глава 1. Краткий обзор Visual Studio 2008
51
□ поддержка конструирования при создании пользовательских сред для Web, Windows,
WPF и Ajax;
□ инструменты конструирования баз данных (для работы с базами данных помимо SQL
Express Edition);
□ поддержка Windows Communication Foundation (WCF) и Windows Workflow (WF);
□ визуальное моделирование при. помощи визуального конструктора классов Class
Designer;
□ поддержка редактирования XML (и в том числе и XSLT);
□ инструмент развертывания "одним щелчком" (ClickOnce);
□ возможность писать, записывать и выполнять макросы;
□ поддержка создания и использования дополнительных модулей Visual Studio;
□ мастер преобразования Conversion Wizard для преобразования устаревших проектов в
формат версии 2008;
□ в состав редакции входит SQL Server 2005 Express;
□ совместимость с Visual Source Safe (VSS).
Редакция Professional Edition
Большая часть корпоративных разработчиков и консультантов остановится на одной из
профессиональных редакций Visual Studio. Возможно, у вас уже есть какая-то версия Visual
Studio (в зависимости от того, какую лицензию вы приобрели и когда). Редакция Visual
Studio Professional дает вам: всю языковую поддержку (включая VB, С#, C++); все, что есть
в редакции Standard Edition; и, конечно же, все новые улучшения, которые мы уже обсудили
в этой главе.
Основные различия между стандартной и профессиональной редакциями (кроме пакета
MSDN) — это набор функциональных возможностей, которых нет в стандартной редакции.
Следующие функциональные возможности поставляются только с профессиональной
редакцией (и более старшими):
□ Visual Studio Tools for Office (VSTO);
□ SQL Server 2005 Developer Edition;
□ возможность создавать программное обеспечение для мобильных устройств;
□ конструктор классов Class Designer и Object Test Bench;
□ Crystal Reports;
□ модульное тестирование (теперь не только в версии Team Edition);
□ Server Explorer.
Professional Edition поставляется также как часть подписки MSDN. Visual Studio Professional
поставляется с разными видами подписки MSDN. Это началось с версии 2005 года. Теперь
52
Часть I. Введение в Visual Studio 2008
вы можете купить Visual Studio Professional в следующих вариантах (перечислены от
меньшего количества функциональных возможностей/приложений к большему количеству):
□ только Visual Studio Professional (без MSDN)— содержит только Visual Studio
Professional (как мы уже обсуждали);
□ Visual Studio Professional с MSDN Professional — содержит Visual Studio (как мы уже
обсуждали). Кроме того, вы получаете доступ к более старым версиям Visual Studio. Вы
также получаете Visual Source Safe. Подписка MSDN предоставляет лицензии
разработчика для Windows и Window Server, Virtual PC, наборы SDK, наборы для разработки
драйверов и т. д. Вы также получаете возможность два раза обратиться за технической
поддержкой и доступ к модерируемым группам новостей;
□ Visual Studio Professional с MSDN Premium — включает все, что имеется в предыдущем
варианте со следующими дополнениями: содержит Expression Web и Expression Blend;
добавлены лицензии разработчика для SQL Server и других платформ (BizTalk,
Commerce Server и многие другие); предоставляет лицензии для работы с Microsoft Dynamics
(GP, CRM, POS и т. д.); включает лицензии на Microsoft Office Systems 2007 (включая
Visio, Groove, Word, Excel и многие другие).
Примечание
Дополнительную информацию по профессиональным редакциям Visual Studio вы можете
получить на сайте фирмы Microsoft по следующему адресу: http://msdn2.microsoft.com/
en-us/subscriptions/aa718657.aspx.
Team Systems
Team Systems — это набор интегрированных инструментов для полного жизненного цикла
разработки программного обеспечения. Фирма Microsoft выпустила первые версии Team
Systems в 2005 году. В них вошли версии Visual Studio, предназначенные для различных
стадий жизненного цикла разработки программного обеспечения. Ядром системы является
сервер централизованного управления и отчетности Team Foundation' Server. По общему
мнению, эти продукты имели большой успех. Фирма Microsoft развивает этот успех
выпуском Visual Studio Team Systems 2008.
Клиентские инструменты
Редакции Visual Studio Team Systems предназначены для различных ролей жизненного
цикла процесса разработки программного обеспечения. Это следующие роли: разработчик,
архитектор, тестировщик и разработчик баз данных. Кроме того, имеются и клиентские
лицензии доступа для менеджеров проекта и других заинтересованных лиц. Вышеупомянутые
роли представляют версии Team Systems, которые имеются в продаже.
Важно отметить, что каждая ролевая версия Team Systems содержит Visual Studio 2008
Professional. Вместе с ней поставляется также и MSDN Premium (описанная ранее). Клиентские
инструменты Team Systems дают вам также доступ к центральному серверу Team Foundation
Server (приобретается отдельно). Уникальными эти продукты делает наличие (или
отсутствие) в них дополнительных "приятностей". Цель — создать набор инструментов для разных
Глава 1. Краткий обзор Visual Studio 2008
53
ролей в проекте. В следующем списке выделены те функциональные возможности, которые
предназначены для целевых групп пользователей.
□ Visual Studio Team System Development Edition— предназначена для большинства
разработчиков, в эту версию входят: статический анализ кода, профилирование кода,
динамический анализ кода, метрики кода, политики анализа кода, модульное тестирование
и анализ покрытия кода. Эти инструменты помогают разработчикам при верификации,
тестировании и проверке кода на наличие стандартных проблем.
□ Visual Studio Team System Database Edition— предназначена для разработчиков,
которые плотно работают с разработкой баз данных; эта редакция позволяет вам создавать
проекты баз данных, генерировать образцовые данные, сравнивать схемы, сравнивать
данные, выполнять модульное тестирование на уровне базы данных и т. д.
□ Visual Studio Team System Architect Edition— предназначена для архитекторов
программного обеспечения; этот продукт улучшает проектирование и проверку
правильности проектирования распределенных систем. Функциональные возможности включают
следующие визуальные конструкторы: System Designer, Application Designer, Logical Da-
tacenter Designer, Deployment Designer и редактор Settings and Constraints Editor.
□ Visual Studio Team System Test Edition — предназначена для тестировщика
программного обеспечения; эта редакция включает возможность создавать модульные тесты и
видеть анализ покрытия кода. Однако для тестировщиков ее сильной стороной является
возможность создавать и управлять тестами: нагрузки, ручными, общими,
упорядоченными и Web-тестами. Кроме того, имеется также агент Team System 2008 Test Load
Agent. Это отдельный программный продукт, который работает в сочетании с Team Test
для генерирования тяжелых нагрузок (в различных вариантах нагрузочных тестов).
□ Visual Studio Team Suite — для тех, кому нужно иметь все сразу (и у кого нет
бюджетных ограничений) этот продукт содержит в себе абсолютно все (кроме кухонной
раковины!). Он включает в себя все функциональные возможности редакций Team Architect,
Developer, Database Developer и Test (в одном пакете). Фирма Microsoft понимает, что в
наших рядах есть те, кто не может удержаться от того, чтобы получить все и сразу. Для
них Microsoft и создала Team Suite — полнофункциональную интегрированную среду
разработки, которая охватывает все роли команды.
Примечание
Мы описываем функциональные возможности Team Systems более подробно в части VI.
Сервер
Центром Team Systems является сервер Team Foundation Server (TFS). В то время как
клиентские инструменты обеспечивают замечательные функциональные возможности, сервер
позволяет вам назначать задания, делать отчеты по статистике и отслеживать общее
самочувствие вашего проекта. Информация о проекте синхронизируется между архитекторами,
разработчиками, тестировщиками, менеджерами проекта и рядовыми исполнителями.
Функциональные возможности сервера Team Foundation Server — это управление проектом
и управление версиями исходных кодов. Управление проектом и его отслеживание
выполняются при помощи "рабочих элементов". Рабочий элемент может быть задачей проекта,
проблемой или ошибкой в программе, требованием к программному обеспечению, функ-
54
Часть I. Введение в Visual Studio 2008
циональной возможностью или тестовым сценарием. В общем смысле, рабочий элемент
представляет собой обобщенную единицу работы над проектом. Конечно, рабочие элементы
могут настраиваться и иметь состояния, новые поля и связанные с ними бизнес-правила.
Рабочие элементы могут также порождаться методологией. Наконец, рабочие элементы
играют главную роль в обеспечении взаимодействия команды проекта, а также отчетности.
Функциональные возможности управления версиями исходных кодов сервера Team Foundation
Server включают такие возможности уровня предприятия: массивы изменений, отложенные
изменения, правила автоматической сборки, возможность связывания рабочих элементов с
изменениями исходных кодов, параллельная разработка, движок политик управления
версиями исходных кодов, ветвление, контрольные точки и т. д.
Эти функциональные возможности управления проектом и управления версиями исходных
кодов работают в среде движка управления сборкой, инфраструктуры отчетности и портала
проекта. Инструменты сборки позволяют выполнять как автоматические сборки (по
расписанию), так и сборки "по требованию". Сборки регистрируются, документируются,
автоматически тестируются и анализируются на покрытие кода и — например — на изменения
кода. Движок отчетности и портал проекта повышают у членов команды степень
информированности о проекте. Построенный на базе Windows SharePoint Services (WSS), он
поставляет новейшие отчеты по тестам и сборкам, документацию, анализ качества и объявления.
Примечание
Сервер TFS можно приобрести так же, как и любой другой продукт семейства
Microsoft Server (такой как Microsoft SQL Server или Microsoft BizTalk Server).
Дополнительную информацию по лицензированию TFS вы можете получить по адресу
http://msdn2.microsoft.com/en-us/vsts2008/products/bb933758.aspx.
Инструменты Expression Tools
Близким родственником Visual Studio является новая линейка программных продуктов
фирмы Microsoft под названием Expression. Они без сомнения привлекут много внимания.
Эти инструменты предназначены для создания дизайнерами приложений для платформы
Microsoft. Они предлагают богатую среду для создания дизайна приложений Web,
Windows и Silverlight. Они также обеспечивают взаимодействие между дизайнерами и
разработчиками.
Важно, чтобы вы имели представление об этих инструментах — для того, чтобы вы знали,
где их можно использовать — и потому, что они работают с файлами проектов и проектами
Visual Studio и предлагают аналогичные возможности (но несколько по-другому). Далее
приводим краткий обзор этих инструментов:
□ Expression Blend — используется для создания интерфейсов WPF на базе XAML. Вы
можете также использовать его для создания приложений Silverlight;
□ Expression Design — позволяет дизайнеру создавать иллюстрации на базе векторной
графики (которые включают рисунки, текст и т. д.);
□ Expression Web — инструмент дизайна для создания Web-форм ASP.NET и Web-сайтов;
□ Expression Encoder — инструмент для кодирования видео и аудио и для их публикации в
приложениях Silverlight;
Глава 1. Краткий обзор Visual Studio 2008
55
П Expression Media— инструмент для управления дизайнерскими ресурсами (файлами) и
организации их в систему каталогов;
□ Expression Studio — содержит полный набор инструментов семейства Expression. Для
тех дизайнеров, которым нужно все сразу.
Примечание
Дополнительную информацию по продуктам семейства Expression (больше они в этой
книге описываться не будут) вы можете получить по адресу:
http://www.microsoft.com/expression/default.aspx.
Резюме
Новая версия Visual Studio имеет большое значение для всех разработчиков. Visual Studio
интересует тех разработчиков, которые пишут код на языках C++, С#, Visual Basic и многих
других языках. Буквально миллионы разработчиков загружают компьютеры и запускают
свой любимый инструмент каждый день. Они проводят подавляющее большинство своего
рабочего времени за созданием решений при помощи этого инструмента. Данная глава
сориентировала вас по некоторым новым возможностям, имеющимся в этой новейшей версии.
Глава 2
Краткий обзор
интегрированной среды разработки
Когда вы путешествуете по незнакомой местности, часто бывает нелишним заглянуть в
путеводитель. Перед тем как отправиться навстречу новым приключениям, нужно по крайней
мере заглянуть в карту. То же самое относится и к знакомству с новым инструментом
разработки такого масштаба, как Visual Studio 2008. Будет разумно сначала немного
познакомиться с этим инструментом.
Данная глава должна стать вашим кратким путеводителем. Она служит для ориентации
перед тем, как отправиться в дорогу. Мы опишем основы инсталляции, загрузку
интегрированной среды разработки, а также компоновку инструмента (проекты, редакторы и
визуальные конструкторы). Давайте приступим.
Установка Visual Studio
Инсталляция Visual Studio 2008 осталась похожей на инсталляцию предыдущих версий.
Приложение обеспечивает работу многих инструментов. В зависимости от купленной вами
редакции при инсталляции будет доступно определенное подмножество этих инструментов
(см. главу 1). Если вам посчастливилось стать владельцем Team Suite Edition, то вы получите
полный набор опций. На рис. 2.1 показано диалоговое окно выбора опций инсталляции для
Visual Studio Professional.
Выбор языка
Настройка вашего компьютера (используемого для разработки) будет относительно
несложной. Мы предлагаем для обычного разработчика выбрать один основной язык и
(возможно) один резервный. Вы можете использовать вторичный язык для просмотра кода
примеров с сайта MSDN или ему подобных. Обычно это означает, что если ваш основной
язык — Visual Basic, то в качестве вторичного вы инсталлируете язык С# (или наоборот).
Это решает такую проблему: иногда находится отличный код, который вы захотите
включить в свой проект, и вдруг обнаруживаете, что на выбранном вами языке этого кода нет.
Кроме того, Visual Studio 2008 позволяет вам настроить ваш первичный язык (см. следую-
Глава 2. Краткий обзор интегрированной среды разработки
57
щий раздел). Выбор при инсталляции множества языков (большую часть которых вы
использовать не собираетесь) не только занимает пространство жесткого диска, но также
загромождает вашу рабочую среду слишком большим количеством вариантов выбора. Однако
мы рекомендуем полностью установить систему помощи MSDN. Всегда есть вероятность
найти решение имеющейся у вас проблемы в теме, посвященной другому языку.
Visual Studio 2008 sen
Select features to total:
.- B& Mcrosoft Vtausi Sludo 2001 PlufossN
3> И& Lanpuage Tools
<f Q{fa\tauslCe
$ B& Visual Bast
BJj Usual Wsb 0evtkip«r
D X OoNuscalarCoRMwity Edition
i) B«b Tools for Rodrstribuhng Anpkcsttaf
D X Ciystal Sports Baste lor Usual Shulf
i Visual Studio now includes functionality to create unit tests
and ordered tests, and to run tests from the IDE and from
the cemtnand line
Feature retal path
С * Ргоолт FileivMcrcnft VWuel Stud» 3 С
Disk Sue Avaiabte floqured flamarmg
6««GB 125GB 31GB 95GB
5 7GB 7C1MB Obytei 701 MB
<Pwvtoo» j hstal
Рис. 2.1. Страница выбора вариантов
процедуры установки Visual Studio 2008
Конфигурирование вашей среды разработки
Первая загрузка интегрированной среды разработки приведет к появлению диалогового
окна, которое попросит вас выбрать ваши настройки среды. Поскольку Visual Studio
становится центральным инструментом для такого большого количества разработчиков, тестиров-
щиков, архитекторов и даже менеджеров проектов, то все труднее удовлетворить их
единственным инструментом. Для того чтобы помочь в этом вопросе, фирма Microsoft
создала целый набор настроек среды, которые сконфигурированы под обычные типы
разработчиков. Например, если вы настроите свою среду на работу с С#, то в диалоговом окне New
Project будут автоматически выделяться проекты на С#. На рис. 2.2 показаны имеющиеся
варианты.
Диалоговое окно установок по умолчанию появится только при первом запуске Visual
Studio. При последующих запусках вы напрямую попадете в интегрированную среду.
Однако вы можете пожелать изменить ваши настройки среды (в том случае, если вы часто
переключаетесь с одного языка на другой или если изменилась ваша роль). Например,
разработчики на языке С# ббльшую часть времени используют настройки для разработки под С#.
Они могут изменить их на набор настроек Tester or Project Management Settings в том
случае, если они собираются выполнить большой объем работы по тестированию проекта.
58
Часть I. Введение в Visual Studio 2008
Вы управляете своими настройками среды из пункта Import and Export Settings в меню
Tools. На рис. 2.3 показана первая страница этого мастера. Эта страница позволяет вам
выбрать экспорт или импорт настроек.
Before уси begin using Visual Studio for thefirittime, you need to specif/the type of development
activity you engage in the most such »s Visual Baste or Visual C*. Visual Studio uses this information
to apply s predefined collection of settings to the development environment that is designed for your
development aebvity
Vou can choose to use a different collection of settings at any time From the Tools menu, choose
Import and Export Settings and then choose Reset all settings
p~ AJIcw Visual Studio to download and display online RSS content
I/. Migrate my eligible settings from a previous version and apply them in addition to the default
settings selected ЬеЫ»
Choose your default environment settings:
f General Development Settings Description
miMmj-fiffimS Customize! the environment to maximize code editor
|£Щ1и1;Ма$ВШ£Ж^ screen space and improve the visibility of commands
Web Deselopment Settings specrfictoC* Increases productivity with keyboard
shortcuts that ate designed to be easy to learn and
use.
| Start Visual Studio * Exit Visual Studio
Рис. 2.2. Диалоговое окно выбора вариантов настроек среды
Vou can use this wizard tc import or export specific categories of settings, or to reset the environment to
one of the default collections of settings
What do you want to do? »
Export selected environment setting»
Settings will be saved cut to a file so they can later be imported at any time on any machine*
e Import selected environment settings
Import settings from a file to apply them to the environment
Reset *9 settings
Reset all environment settings to one cf the default collections of settings.
[ Next> ; I C«ntd
Рис. 2.З. Мастер импорта и экспорта настроек
Глава 2. Краткий обзор интегрированной среды разработки
59
Совет
Если вы не отличаетесь от других разработчиков, то вы, вероятно, весьма тщательны
в настройке вашей среды. Нет ничего хуже, чем работать на компьютере с другой
настройкой интегрированной среды разработки. Вы должны быть благодарны за то, что
вы можете использовать мастер импорта и экспорта настроек для того, чтобы брать
ваши застройки интегрированной среды с собой.
При импорте вы можете выбирать из нескольких коллекций настроек. Имеется несколько
коллекций по умолчанию (и в том числе те, которые основаны на языке и роли). Кроме того,
вы можете указать файл со своими настройками. На рис. 2.4 показаны варианты коллекций
настроек при их импорте.
Which collection Df setting! do you want to import?
., „> Default Settings
c,y> General Development Settings
i^ Visual Basic Development Settings"
ij,f Visual C* DeveJcpment Settings
i^< Visual C++- Development Settings
-ганаши
„ t_7 My Settings
j> CurrentSeltings vssrtting*
4>> Old CurrentSettings vssettings
Description,
Optimizes the environment to prcMdethe
most convenient access to commands and
options for web development activrties,
regardless cf programming tenguage used
Options for other types of development
activities are deemphasaed
Рис. 2.4. Выбор коллекции настроек для импорта
Другим ключевым экраном мастера импорта и экспорта настроек является экран выбора
настроек. На этом экране вы решаете, какие опции важны при импорте. Это позволяет вам
выбирать настройки, которые вы планируете импортировать. Например, вам может
нравиться то, как ваш друг настроил свой редактор кода (шрифты и контрастные цвета), но вам
не нужны все остальные его настройки (такие как клавиатурные комбинации). На рис. 2.5
показан самый низкий уровень детализации, на котором вы можете управлять своими
настройками среды.
Совет
Замечательная функциональная возможность инструмента импорта и экспорта
настроек состоит в его способности переносить избранные закладки системы помощи
Эти избранные закладки отделены от ваших избранных закладок в браузере Кроме
того, они могут путешествовать с вами с компьютера на компьютер, так что вам не
придется тратить драгоценное время на копание в файле помощи в поисках особенно
важной темы.
60
Часть I. Введение в Visual Studio 2008
Setting* wrth warning ice as might contain value* that couJd compromise your с
these settings are not selected Fcr тгяе information, press Fl
mputer By default.
Whkh settings do you want to import?
- [Щ ЩЩ
fc Щ General Settings
p] Call Browser
0 Class View Options
[•] Code Snippet Locations
|_] \.( Command Wtndow Abases
*"
'
~
}
0 Error List Display Settrngs ' *
[__| » External Tools Lrt
0 File Extension Mapping
0 Find Options
0 Fmd Symbol Options
pj Menu and Command Bar Custorruzetio
,~ R1 _.NewfrojjHtPial90.Pj?ferTelJranouaoe w
* _w^_™^ ■■■■"?■ ■■ _~,_j »
Description:
All settings that are available for import
and export Expand this category to see
more details
Рис. 2.5. Выбор настроек для импорта
Стартовая страница
Когда вы впервые попадаете в интегрированную среду разработки Visual Studio 2008, то
видите стартовую страницу этого инструмента. Эта функция выглядела многообещающе в
предыдущих версиях, но в Visual Studio 2008 она действительно полезна. На рис. 2.6
показан пример новой стартовой страницы.
Стартовая страница содержит несколько Web-частей. Начнем с левого верхнего угла. Здесь
имеется область недавних проектов Recent Projects. Отсюда вы можете запустить проект,
над которым недавно работали, либо создать новый. Ниже находится область Getting
Started (Для начинающих). Эта Web-часть полезна в том случае, если вы ищете
возможности обучения. Здесь можно начать с изучения вопросов для начинающего, новых
возможностей, либо раздела "How Do I...?" ("Как мне сделать, чтобы...?"). Еще ниже находится
область последних новостей Visual Studio. Здесь вам сообщают о новейших редакциях, и вы
можете сами связаться с фирмой Microsoft. Наконец, в центре страницы находятся
последние новости и предложения от MSDN. Эту область очень полезно просмотреть при старте
проекта — особенно если вам кажется, что вы слишком много времени тратите на проект и
начинаете терять связь с тем, что происходит в мире разработчиков.
Опции запуска
Если вам просто не нравится стартовая страница или вы предпочитаете напрямую попадать
в проект, в работе над которым вам предстоит провести следующие несколько месяцев
вашей жизни, то вы можете настроить то, что происходит при загрузке интегрированной
среды разработки. В диалоговом окне Options (Tools | Options) выберите узел Environment, a
затем Startup. На рис. 2.7 показаны некоторые из опций, имеющихся для запуска среды.
Глава 2. Краткий обзор интегрированной среды разработки
61
Не Edit View Tooli Teat Window
Ijij Start Гаде
-1 ^ -2 * Ы n •
#< Visual Studio;
3JWtl>Srtel
3WrndowtfoirmApplicauon2
USolutionl
^WindowsF or msAp plica tionl
Open
CtMtr
What's new in VwialC*'
jjwn с.-ч1 й„;,г> «nal (i
Download tlir Fm»i Kr ем е«(
Siverbrjl.» t0>
m
Tue, Л Aug200717fc<9 GMT • The authoritative С* 3.0 5petrfica*ion wai written by th* рмр e who treated ai
implemented the C* language. The 500 plus page document e now available for download
Nm Haiah i>» Ut«. «uf Sample», Аи*1»Ы«- foi Vi«,*t Stixik> i <№l 6*to ;
Thu. CS Aug 2007 IBJl-42 GMT - Use these inources lo get familial «vith the latest vi
compiler In Visuil Studio 2CM Beti 2
sion of ycur favorite C»
Download Vaual Studio 2008 Beti 2
Thu. 09 Aug 2007 18 48Л2 GMT - Sec all of ihe improvements thai are com ng in Visual Studio 2005 vwth
neat generation Web development, integrated development for the MkiomiII Office system, jnd industry Icding
designers for Window? Vista.
<he tvofulnri 01IMQ Atxl lit imp*. I On Tli'« DetKfiiOf C«
Thu, 24 M*y 200717 3» 56 GMT - C* PM Anson Norton explains the lelaticnihip between LTNQ and the new (eat л»
in CSharp ЗД such at extension methods and lambda expresMiom
<iet the N(T f ramewark i 5 Цегл 2
Thu, OS Aug 200718 50:42 GMT - The Microsoft NET Framework 3.3 Beta 2 is the latest preview release of the Г JET
Framework In support of eirttmg users, the .NET Framework 3.5 has a minimal number of breaking changes.
Download it »odey
Custom Iterate*s
Wed. 17 Jan 2007 03.46.51 GMT • Lejm from top seftng author Bill Wagter how to a
program using custom iterators and the yield statement
Ser- the Searr It W Navigation Improwrmenuon Мк0Ы
te buridmg bloclrs for /our
Рис. 2.6. Стартовая страница Visual Studio 2008
i Environment
General
Adrf-in/Macros Security
Auto Recover
Documents
Find and Replace
Fonts and Colon
- Help
Import and Export Settings
International Settings
Keyboard
Startup
Task List
Web Browser
Projects and Solutions
- Source Control
Text Editor
- Database Tools
Plugging
At startup;
I Show Start Page
Start Page news channel:
httpV/go.mkrosoftxom/fwlmk/7linkid=45192Etdcid=409
Sj Download content every:
60 * minutes
Рис. 2.7. Опции запуска
Здесь вы можете настроить — откуда брать новости для вашей стартовой страницы. Вы
можете также дать указание среде загрузить последнее решение, показать диалоговое окно
нового проекта или окно открытия проекта, открыть домашнюю страницу вашего браузера,
либо не делать вообще ничего (показать пустую среду). Вы можете также настроить — как
часто будет ваш контент автоматически обновляться с сервера.
62
Часть /. Введение в Visual Studio 2008
Ваш первый проект
Следующий естественный шаг— создать ваш первый проект. Это быстро познакомит вас с
некоторыми основными функциональными возможностями управления проектами и файлами
интегрированной среды. Из меню File вы можете создать новый проект или Web-сайт.
Проекты — это просто шаблоны, которые группируют файлы для выполняемых приложений под
Windows, Office или мобильные устройства (см. главу 4). Вы можете также создать Web-
проекты, которые можете смешивать с другими скомпилированными проектами. Web-сайт
создает набор Web-файлов, которые управляются как файлы (а не скомпилированный код).
На рис. 2.8 показан пример Web-сайта внутри интегрированной среды разработки. Мы
выбрали язык С# в качестве целевого языка этого Web-сайта. Обратите внимание, что
компоновка интегрированной среды почти не имеет специфики. Для ваших первых приложений
она будет похожей (пока вы все не настроите). В следующих разделах мы проанализируем
многие элементы этого экрана; будет очень полезно при обсуждении каждого конкретного
элемента обращаться к этому рисунку для уяснения общего контекста.
яштштттт
File Edit View Weh'rte
J ' J' JJfif A
Style Aupltmion Manuil »
l.Non«) . (Default Font;
Tc<wbc* ^ 4 X
к'МКК ♦ :
,- Stent*** |
^ Pcintw '
A libel .
•Ы TextBox '
® Button ' j
© LmkButten |
Q ImigtButton
i Hyperlink j
Tf QropDownUit ] j
*t bit Bex |
0 ChectrBox j
ChecrBaxbrt 1
(> RadtoButtofi
rUdtoButtonliit
lJ Image
t* ImigcMap ]
Э Table !
Z Bulletedlut
Hirfdenbeld I
fl^i liters!
"" Calendar
_J AdRotato» |
\) RtUpload
V Wizard
& <ml
О MuttiView i
•^» Toolbox f^^'^r-sNl j
;>"i«ariu
Read/
Build Debug («mat Т«Ы« Icobt Те* Window Hrlp
"Л Л *J ' * p » ► C*bu9 » NTT . i»
Ti^rt Rule ;New Inline Style) ' №Ь*к s ^ ~+ ~'ж - '- XHTML iX) Transition
- 'Defauh . В / И Д/ |- ;=£ <$» -
DeFaultMpK* ■» X
CMefrt Objects Ik fvenrs * CNofventiJ
i
-}
\
!
ч-чр 7»ye">o/' I "■—"TextSarVvrje" ~M «•"ser.'er" v'l'i f'«7Cirx''X'/*S|
' f. </ ■.'!> ^ j
' _ „! LJ
[«= Ube *Ubete-id
Add ess Lme 1 Г
AAiessLme'2 ' - -
Cifc. j
Strte .' Province |PA ▼]
Postal Code |
*
1
~i Design [L Split eel Source <||<'"»bte> "tt >)[<td»][>^ttp Ur*l*UbelNamr> \j_ *
Ш17
• -*? т -«/ si и •
• ъ.
^ ^И j: "£*
^3 Soiu* on Contoso й P'ojectJ
J» СЛЛСсЫовЛ
j ^ App Code
$ Cider c
„; App w»u
**J Defsuh upx «
_J weLicnfig
А}Л5 *V* *.*„,, .-^Solu. j^
Labeffame Sv i*en Aeb Ul WebContfoK label
EnabeTHerrmv; True
Encb'eV.twS ate Tiue
FcreColoi
Heigh.
Srm!E
Tablnuet D
Text Name
Text
The t«>t 'c be 'hown fee the I abet,
Cc»S7 Ch8?
]
*
Рис. 2.8. Простой Web-сайт внутри интегрированной среды разработки
Строка меню
Если вам приходилось работать с предыдущими версиями, то строка меню Visual Studio
2008 должна показаться вам вполне стандартной. Она очень интуитивна; все находится там,
где вы и ожидали; новые меню появляются в зависимости от вашего местонахождения
внутри интегрированной среды, инсталлированных вами инструментов и вашего языка по
умолчанию. Например, меню Refactor появляется тогда, когда вы находитесь в редакторе
кодов С#; меню Project — тогда, когда у вас открыт проект; меню File настраивается по-
Глава 2. Краткий обзор интегрированной среды разработки
63
разному в зависимости от Visual Basic или С#. В табл. 2.1 приведены (в порядке слева
направо внутри интегрированной среды) некоторые самые обычные меню.
Примечание
Обратите внимание, что каждый моментальный снимок меню в табл 2 1 был сделан
при настройках по умолчанию на меню языка С#. Для каждого случая имеется
эквивалентное (но слегка отличающееся) меню для Visual Basic. Кроме того, сокращенные
комбинации клавиатурных вызовов в меню также показаны для языка С#
Разработчики на языке Visual Basic узнают многие из них (которые совпадают) Все они могут
быть настроены под индивидуальные предпочтения разработчика
Таблица 2.1. Меню Visual Studio 2008
Меню
File
Edit
Рисунок
Ne« ►
Add ►
Close
Close Solution
У Save App_Code/Classl vb Ctrt+S
Save App_Code. Classl vb As _
Advanced Save Options..
g0 Save All Ct/l-Shtft-S
Export Templite
Soune Control ►
|_J Page Setup
^ Print Ctrt+P
Recent Files ►
Recent Projects ►
Exit
J] J Project. CtrkSh.lt* W
^ 1 Web Site Shi1t*Alt*N
J Hie CtrkN
Project From Fjosting Code.
[w.t
"'e-<c .-• \.<
*0 Global Undo "Symbolic Rename
ji Cut Ctrl*-X
Ji Copy Ctrl-с
'Л- >. ИГн И*Ч<К*\
X Delete Del
Select All Ctrl-A
Find and Replace ►
Go To.. Ctrl-G
Insert File As Tent
Advanced > J Format Document Ctil-E, D
Bookmarks > j Format Selection CtrUE F
Outlining. ► Tabify Selected Lines
IntelliSernt ► Untabtfy Selected Lines
Make Uppercase Ctrl* Shift* U
Make Lowercase CtrUU
Delete Horcontal White Space Ctrl» E, \
al> Vie* White Space СЫ*Е, S
J3 »VordWr*p CtrkE,W
Incremental Search СЫ+1
~Z Comment Selection Ctrl- E, С
"Z Uncomment Selection Ctrl*E,U t
jjjE Increase Line Indent
ijE Decrease Line Indent
Описание
Меню File используется для
создания новых проектов и Web-
сайтов Меню File позволяет вам
сохранять работу, работать с
проектами под контролем
системы управления исходными
кодами, а также распечатывать ваш
код
Меню Edit используется для
управления элементами в
буфере обмена и исправления ошибок
при помощи Undo и Redo Кроме
того, меню Edit предоставляет
доступ к таким важным
инструментам, как Find and Replace и
IntelliSense Выпадающее меню
на рисунке показывает некоторые
расширенные опции, имеющиеся
в меню Edit, такие как Format
Document, которая полезна для
применения ваших настроек
форматирования к коду, с
которым вы работаете
64
Часть I. Введение в Visual Studio 2008
Таблица 2.1 (продолжение)
Меню
View
Refactor
Website
Рисунок
l>«"]
% Server Explorer CtrkW, L
$$ Solution Explorer Ctrl*W, S
^l Class View CtrkW.C
f Code Definition Wmdow Ctrl+W, D
j3 Object Browser Ctri*W,J
£ Error List Ctrl+W,E
~] Output Orl*W, 0
^ Properties Window Ctrb-W, P
£ Task List Qrl*W,T
^ Toolbox CtrkW, X
Find Results ►
Other Windows *
Toolbars ►
OJ FullScreen Shrft«-Art+ Enter
}* . Нл«.дй»е Ra»-k.vA»d "r i+
^? U^g<»«e Format a '.w-ShiH*-
Hr<* la-k-
F»?v r • T«s*
fli Pf-ytr, r-^es ЧтИ + П
Z3 Refresh
[ Refectcr |
ajfc/ Rename,..
у Extract Method».
.•i/l Encapsulate Field.,.
Д> Extract Interface...
у Promote Local Variable to Parameter
* % Remove Parameters...
i.6 Reorder Parameters.,.
| WebsiteJ
dJ
'¥ LJ
*L*
a
Ш
i*
Add New Hem... Ctrl* Shift-A
Add Existing Item-. Shift+Art+A
New Folder
Add ASP.NET Folder ►
Copy Web She...
Nest Related Files
Unload Project
Add Reference.
Add Web Reference...
Add Service Reference...
Set as Startup Project
Project Dependencies...
Project Build Order...
R*»r>*">h Ihc <?<t ""г>Ыгк> lr*rm
Start Options...
ASP NET Configuration
!
1
Л
3 Bookmark Window CtrkW, В
О Command Window Ctrl* W, A
,J Document Outline Ctrh-W,U !
3 Object Test Bench i
3 Property Manager
ifj Resource Vtew CtrkW, R i
<4* Macro Explorer Alt*Fo i
Щ Start Page j
4 j[] WebBrowser CtrkW,W .
F2 "!
Ctrl*R, M
Ctrt*R, E
CrrkR\I
CtrhR, P
CtrkR,V
CtrkR.0
Описание
Меню View предоставляет доступ
к множеству окон, имеющихся в
Visual Studio Если вы
потеряетесь сами или потеряете окно в
интегрированной среде, то меню
View — это лучшее место для
того, чтобы сориентироваться
Отсюда вы можете получить
доступ к Server Explorer,
Solution Explorer, Task List и
другим ключевым окнам
интегрированной среды разработки.
Выпадающее меню показывает
опцию Other Windows — и там
много, много окон среды Visual
Studio 2008
Меню Refactor (только для языка
С#) предоставляет доступ к таким
опциям, как переименование
элементов кода, извлечение кода
из метода в новый метод,
продвижение локальных переменных
в параметры Более подробную
информацию по рефакторингу
см в главе 9
Меню Website доступно только
тогда, когда вы работаете с Web-
приложениями. Оно
предоставляет доступ к добавлению новых
элементов, добавлению ссылок
на ваше Web-приложение,
копированию вашего Web-сайта в
место его размещения и к работе
с зависимостями проекта Вы
можете также настроить
стартовую страницу приложения и
получить доступ к опциям
конфигурирования ASP NET для данного
Web-сайта
Глава 2. Краткий обзор интегрированной среды разработки
65
Таблица 2.1 (продолжение)
Меню
Project
Build
Debug
Рисунок
[1**1„
'£] Add Windows Form..
Л Add User Control.
o|} Add Component...
; **| Add Class... Shift* Att*C !
_J AddNewftem». Ctri-Shrft+A !
JJ) Add Existing Hem... Shcft+Aft+A
^j New Folder
^ Show All Files ,
Unload Project
Add Reference.. j
Add Service Reference.. ;
Set as Startup Project j
Project Dependences.,, j
. Project Build Order». j
*? f<>J't>h P.ojtЛ la.Ibv»- Attr-i
В Services Properties. i
ВШ1
ИЗ
*ft
Bulid Solution F6 j
Rebuild Solution
Clean Solution
Build Services Shift*F6
Rebuild Services
Clean Services ,
Jut к* *ie eu ;cr ;
Bitch Build...
Configuration Manager .
SSSJ
Windows >
►
V
«I
ч>-
Start Debugging FS
Start Without Debugging Ctrl*F5
ujj ! Breakpoints CtrkD, В
D Output
£3j Immediate Ctrl+DJ
Attach to Process '■
Exceptions.. CtrkD, E
Step Into Fll
Step Over F10
Toggle Breakpoint F9
New Breakpoint ►
D:«eA 2-ea:«cirA" Clu-Shrf*-^
Описание
Меню Project аналогично меню
системы Windows, но недоступно
для Web-проектов Здесь вы
можете добавлять новые элементы
и ссылки на ваши проекты,
настраивать стартовый проект и
изменять порядок сборки
проектов в вашем решении. Кроме
того, вы можете получить доступ
к свойствам данного проекта. Это
позволит вам настроить такие
вещи, как: версия NET
Framework, под которую вы
ведете разработку; пространство
имен по умолчанию и многое
другое
Меню Build позволяет вам
запускать для вашего решения
определенный компилятор
(компиляторы). Здесь вы можете
принудительно выполнить сборку
или повторную сборку всего
решения или индивидуального
проекта в решении. Из меню Build
вы можете также получить доступ
к менеджеру конфигураций
Configuration Manager Это
диалоговое окно позволяет вам
управлять сборкой (отладочная или
готовая редакция, использование
процессора и т. д )
Меню Debug предоставляет
разработчикам доступ к
командам отладки Visual Studio Эти
команды включают опции для
запуска вашего проекта внутри
отладочной сессии и
прикрепления новой отладочной сессии к
существующему
выполняющемуся процессу. Кроме того, из
этого меню вы можете
управлять отладочными точками
прерывания Выпадающее меню
показывает некоторые другие
отладочные окна, доступные из
данного меню. Более подробную
информацию см. в главе 10
66
Часть I. Введение в Visual Studio 2008
Таблица 2.1 (продолжение)
Меню
Data
Format
Tools
Table
Рисунок
>;p Show Data Sources Shift-Alt* D
t i Add New Data Source
^д Preview Deta .
Add Query.
I.fowratt]
Align ►
Make Sam* Sure ►
Horizontal Spacing ► ' э$«
Vertical Spacing ► \ iQ<
Center in Form ► ' «£
Order ► ' R
Make Equal
Increase
Dec/ease
Remove
la Lock Controls
^ Attach to Process Ctrl-AJt*P
-^ Device Secunty Manager
$j Connect to Device '
fcjjf Device Emulator Manager
■f ^ Connect to Database»
"^ Connect to Server-
^ Code Snippets Manager.. Ctrl**, Ctn>B i
Chocse Toolbo« Items .
Add in Manager
Macros ► ^ Run TemporaryMacro CliUShrft-P
Partner Products Catalog ^ Record TemporaryMacro ClrUShift-R
Create QUID Save Temporary Macro
Error Lookup v. »- f lee. i- r j s
H '"^ 'л'<Ь> ^ Macro Explorer Ah-F3
$РУ+- *•> Macros IDE AIWF11
i^ WCF SvcConfigEditor Load Macro Project „
External Tools , i сгс ' <<4 '& 5». *>::
Import and Export Settings., ' TJew Macro Project
Customize
Options .
pTabiT
Insert Table
ln$ert * j Rows or Columns
De,ete > | Column to the Left CtrkArf Left Arrow
Select > Column to the Right Ш* Aft* Fight Arrovy
Modrfy * j Row Above Ctrl* Alt-Up Arrow
i Row Below, CtrkArt* Down Arrow
i
t Cell to the Left
• Cell to the Right
1 Caption
Описание
Меню Data позволяет вам
управлять вашими источниками
данных для приложения Из этого
меню вы можете запустить
мастеров для новых источников
данных Дополнительную
информацию по работе с данными см в
главе 18
Меню Format позволяет вам
манипулировать компоновкой
элементов управления в окне или
Web-форме Например, вы
можете выбрать несколько элементов
управления на вашей форме и
настроить расстояние между
ними по горизонтали и по
вертикали Вы можете также
использовать это меню для
блокировки/разблокировки
положения элементов управления
(чтобы они случайно не
переместились)
Меню Tools предоставляет
доступ ко многим инструментам,
которые поставляются вместе с
Visual Studio Сюда входит и
управление дополнительными
модулями и макросами, которые
расширяют вашу среду (см
выпадающее меню) Вы можете
также получить доступ к
инструментам для подключения к
другим серверам и приложениям и
для управления настройками
интегрированной среды
Элементы этого меню инструментов
подробно описываются в данной
книге
Меню Table (доступное в режиме
конструирования Web-формы)
используется исключительно для
добавления и манипулирования
таблицами на Web-форме Здесь
вы можете создать новую
таблицу, вставить строки в
существующую таблицу и изменить
элементы таблицы
Глава 2. Краткий обзор интегрированной среды разработки
67
Таблица 2.1 (окончание)
Меню
Test
Window
Help
Рисунок
|T*J
^J NewTest~
*j Load Metadata File.
^5 Create New Test Lwt...
Run
Debug
Select Active Test Run Configuration
Edit Test Run Configurations
endows
"£t lest View
>Q Test list Editor
Tj Test Results
1*3 Test Runs '
Э Split
= oa* ;',
bUec C»c«. n<-t
-,L\C Kit
d*
jw| New Horizontal Та Ь Group
TJ New Vertical Tab Croup
ill CId&c All Documents
Reset Window Layout
' v [ 1 App_Code/Clas.sl vb
2 СД. WbubI Studio 2008\Web$rtes\Conto5c*Default.espiel*
3 G\.APrcje<te\CQnto*o\AdminMForrriLcs [Design]:!*
4 СЛ Wisue! Studio 2008\Projects\Contosc^ervices\Classl»cs-l
5 App.Code/Order.ci
6 Start Page
Windows^
| H«lp
& How Do I Ctrl+Fl, H
^ Search CtrkFl, S
<$$ Contents CtfkFl, С
£ Index Ctir*Fl,I
'^\ Help Favorites Ctrf+Fl.F
j2 Dynamic Help Ctri+F1,D
£ Index Results Ctrl*Fl,T
"$, MSDN Forums !
^ Report a Bug '
Samples
Customer Feedback Options
Register Product
Check for Updates
Z» Technical Support
About Microsoft Visual Studio
Описание
Меню Test позволяет вам
управлять тестами в Visual Studio
Например, вы можете
использовать опции этого меню
для создания нового теста,
управления существующими
тестами и для измерения
эффективности тестов Вы можете
также запустить отсюда
тестовые прогоны Более подробную
информацию по тестированию в
Visual Studio см. в главе 28
Меню Window позволяет вам
управлять открытыми в
интегрированной среде окнами Вы
можете скрывать окна, закрыть все
открытые окна и превратить
существующее окно (такое как
Solution Explorer) из
пристыкованного окна в документ с
вкладками
Меню Help предоставляет
непосредственный доступ ко всем
опциям справочной системы,
имеющимся в Visual Studio
Например, вы можете включить в
этом меню динамическую
помощь, при этом интегрированная
среда будет отслеживать ваш
контекст и предоставлять помощь
по мере надобности Меню Help
также выведет вас на форумы
MSDN, даст вам возможность
сообщить об ошибке,
просмотреть образцы кода и т д.
Наконец, отсюда вы можете
проверить наличие обновлений и,
конечно, получить доступ к
библиотеке системы помощи
68
Часть I. Введение в Visual Studio 2008
Множество панелей инструментов
Visual Studio 2008 содержит более 30 панелей инструментов. Если вы часто используете
некий набор команд, то наверняка найдется подходящая панель инструментов, в которой
сгруппированы эти команды. В результате большая часть панелей инструментов очень
специализирована. Например, если вы работаете с конструктором классов Class Designer, то вы
конечно же будете использовать панель инструментов конструктора классов для управления
группами классов или изменения масштабирования экрана. Или если вы создаете запрос
SQL Query, то будете использовать панель инструментов конструктора запросов Query
Designer. Мы не будем описывать здесь каждую панель инструментов (поскольку они очень
специализированы). Вместо этого мы сделаем краткий обзор и опишем здесь некоторые
общие принципы, а второстепенные подробности оставим для последующих глав.
Стандартная панель инструментов
Стандартная панель инструментов Standard всегда присутствует в ваших сессиях работы с
интегрированной средой (если конечно вы ее не отключили). Она предоставляет быстрый
Доступ ко всем командам, которые вы будете использовать снова и снова. Стандартные
команды находятся наверху слева: Create New Project, Add New Item, Open и Save. За
ними следуют: Cut, Copy, Paste и Undo. На рис. 2.9 показана стандартная панель,
отстыкованная от интегрированной среды.
Совет
Мы предлагаем вам изучить клавиатурные эквиваленты для таких стандартных
команд, как Cut, Copy, Past, Undo и т. п. После этого вы сможете удалить эти значки
из панели инструментов с тем, чтобы использовать это место для других команд,
которые в любом случае требуют применения мыши (и имеют трудно запоминаемые
клавиатурные комбинации).
Ljp'Ui'W^^P А ЛЛ 1 «"•^•*«- ^ > Debug * 4 Ми«4 Platforms *|
Рис. 2.9. Стандартная панель инструментов в Visual Studio 2008
Стоить упомянуть также две навигационных команды панели инструментов. Там есть
значки, которые выглядят как документ (или кодовый файл) с синей стрелочкой. На одном
значке стрелочка указывает налево, а на другом — направо. Эти навигационные кнопки
позволяют вам перемещаться вперед и назад по вашему коду и решению. Они отслеживают
специальные строки в вашем коде или окна, в которых вы побывали, и предоставляют
переход по этой последовательности {вперед и назад) одним щелчком.
Кнопка справа от навигационных команд (зеленая стрелка) часто называется Run
(Выполнить) или Play (Воспроизвести). Эта кнопка запускает сборку вашего проекта и переводит
вас в режим отладки. Ниже на рисунке вы видите опции поиска внутри вашего кода. Эта
возможность может быть удобна для быстрого нахождения того места, где вы остановились,
или того места, которое вы ищете. Правее находятся значки для быстрого доступа к
отображению одного из многих окон Visual Studio. Точно так же, как и меню View, эти значки да-
Глава 2. Краткий обзор интегрированной среды разработки
69
ют вам быстрый доступ к окнам свойств, Solution Explorer, Object Browser, панели
инструментов и т. д. Есть даже значок для "прочих окон" (Other Windows), который дает доступ
к дополнительным окнам.
Настройка панелей инструментов
В том случае, когда стандартные панели инструментов, поставляемые с Visual Studio, не
соответствуют вашим потребностям, вы можете создать нестандартные панели, которые
будут им соответствовать. Для этого надо выбрать в меню Tools пункт Customize или
щелкнуть правой кнопкой мыши по панели инструментов и выбрать пункт Customize. При этом
откроется одноименное диалоговое окно (рис. 2.10). Здесь можно выбрать панели
инструментов, которые будут отображаться, указать размер значков для панелей, включить (и
отключить) советы и сокращенные клавиатурные комбинации, и т. д.
Mtcrcsoh Office E*cel 2007
Microsoft Office Word 2003
Microsoft Office Word 2007
__ Query Designer
Recorder
Report Borders
Report Formatting
, Source Control
J Standard
Style Application
Style Sheet
Table Designer
Test Tools
Tut Editor
Vie* Designer
Use large icens
J Sho* ScreenTips on toolbars
>/ Show shortcut fceyi in ScreenTips
I React
keyboard...
Clos*
Рис. 2.10. Диалоговое окно Customize в Visual Studio 2008
Для настройки панели инструментов сначала убедитесь в том, что диалоговое окно
Customize открыто. Затем просто зацепите элементы панели инструментов (значки) и
перетаскивайте их либо удаляйте. Вы можете также использовать вкладку Commands (рис. 2.11) для
добавления на панель инструментов определенных команд. Если получилось неудачно, то
вы можете использовать кнопку Reset со вкладки Toolbars для отката в состояние по
умолчанию.
Кнопка New позволяет создавать новые панели инструментов для группировки
существующих команд. Это дает вам большое разнообразие вариантов настройки. После нажатия этой
кнопки вы даете название вашей новой панели и используете вкладку Commands для
добавления элементов. Вы можете также перетаскивать команды с других панелей инструментов
и помещать их на вашу новую панель.
В диалоговом окне Customize вы можете также настроить свои сокращенные клавиатурные
комбинации. Для запуска диалогового окна Options используйте кнопку Keyboard. На
70
Часть I. Введение в Visual Studio 2008
рис. 2.12 показан пример. Сначала вы находите команду в списке, а затем нажимаете
клавиатурную комбинацию. Обратите внимание, что если данной опции уже присвоена
клавиатурная комбинация, то Visual Studio предупреждает вас об этом перед выполнением нового
присваивания.
Мы рекомендуем вам самостоятельно исследовать многочисленные панели инструментов
(и варианты их настройки) в Visual Studio. Очень часто их польза становится очевидной
только в нужный момент. Например, если вы редактируете форму Windows, то наличие
панели инструментов Layout, использующейся для подстраивания расположения элементов
управления друг относительно друга, может значительно сэкономить время. Если вы будете
знать о наличии этих панелей инструментов, то это существенно увеличит вероятность того,
что вы сможете ими воспользоваться.
Toolbars Command*
То addi
toolbar cr menu
Commands:
Щ- Add Activity».
j£ Add Aggregate
Add Assembly
. ^ Add Class
| g] Add Component
i -jjj Add Connexion Point
^ Add Content Page
' / Add Event
. _ij Add Exiting Item
Add File
i n* Add Function...
Rearrange Commands,.
id, drag the command from the Commands list and drop the command on the target
Рис. 2.11. Вкладка Commands диалогового окна Customize
Optiow
Environment
General
Add in/Macros Security
AutoRecover
Documents
Find and Replace
Fonts and Colors
HeJp
Import and Export Setting:
International Settings
Keyboard
Startup
Task List
Web Вгоклег
Project: and Solutions
Souice Control
Te*t Edrtor
Database Tools
Debugging
Apply the following additional keyboard mapping scheme
|у|$уа1С*2005
Show commands containing-
Build RebuildOnlyProjert
Build PebuildSelecticn
1ШШ&Ш&**Шт
I Build PefreshDependencies
Use new shortcut in:
I Global
Press shortcut keys
Shortcut currently used by
"Tj F6
Assign
| Buird.BuildSolution (F6 (Global)}
Рис. 2.12. Диалоговое окно настроек клавиатурных комбинаций
Глава 2. Краткий обзор интегрированной среды разработки
71
Панель Toolbox
Панель Toolbox Visual Studio 2008 предоставляет доступ ко множеству элементов
управления при создании Web- и Windows-форм. Она дает также доступ почти ко всему, что можно
перетащить на визуальный конструктор, используемый для создания форм, XML, схем,
классов и т. д. Для примера: если вы создаете Web-форму, to Toolbox предоставляет массу
элементов управления (сгруппированных для облегчения доступа), которые вы можете
добавлять на форму. Новыми в версии 2008 являются элементы управления Ajax. Они
используются для создания богатых приложений на основе браузера (см. главу 17). Более того,
если вы работаете с текстовым редактором, то панель Toolbox позволяет вам сохранять
фрагменты текста для последующего быстрого доступа к ним.
НЕ^^^^^^^ИРВВ^
|'да"лмх
« Standard
j ', Data
Ih 1^ Pointer
i\ yJ GndView
Jj Data List
!jf-J DeteHsView
jJ ForrnVlew
J Lsrj ListView
|| \ Repeater
| «i» DataPager
| ' j SqlDataSource
\\ ijn Acce«Data Source
If № LinqDataSource
1 [jg ObjectDataSource
{ i]l, XmlDataSource
1 ifa SiteMapDataSaurce
(}) Validation
i-t Navigation
| ■; Pointer
|l <><> SiteMapPath
|| fa Menu
|l V" TreeVww
&> Login
:t WebPart*
J AJAXbrtensom
1 ^ Pointer
II J$ ScnptManager
|| £]• ScnptManagerProxy
II. £5 Timer
[ £j UpdatePanel
|| >E) UpdateProgress
'+! Repotting
!| ГА IJT»M
I y* Toolbox |^|<pPv'M Fsplorpf |
-1
i
1
i I
!
1
1
<
|
7j j
'
I
1
j II
1
; Hi
1II
il
.11
Рис. 2.13. Панель Toolbox в Visual Studio,
настроенная для Web-формы
На рис. 2.13 показана панель Toolbox в ее стандартной конфигурации (отстыкована от
интегрированной среды) при создании Web-формы. Обратите внимание, что стандартная
(Standard) группа элементов управления закрыта (для того чтобы были видны некоторые
дополнительные группы элементов управления). Обратите также внимание, что данные
элементы управления закрыты во всей этой книге. Впервые они будут описаны в главе 6.
Однако основная их часть описана в главах 14 и 15.
12
Часть /. введение в Visual Studio 2008
[ . 'Illllffll
|j^ AiAX
II *t A А
& 4 ~
-} t-f l-
2 Standard
|j 4 A ^
I Zl iE -
< DM»
U я £
I =i Vattdatkn
* * ^
I 3 Navigation
1 '♦' Ugio
4 * Ф
jf <*
< 3
-i 4»
'c%
S
Й3
® © (D
Bj Tj
_a
fl P 4
^ jfc,
JH U
Я AiAXExt«f*fei»
* G10OE
| ii Reporting
I; HTML
*4 AJAXTooedt
|j i, General
/v
Ш
s
ll 2^ Toolbox ^Server brplercr
pa*
ф>
3
Л
*J
2
l-J
-
o»
' 1
л
я
♦ ♦
«1»
Ы
Й
.^
*1
«a
В
:j
& » L*
"-si s **
0 -- ©
О П Kl
:> F %
^ Af wfl l3
~
,
Li
«4?
*-
a
&
*S
-
^m
13 я
3! Li
J liS
й «
%
'^ II
-— I
Рис. 2.14. Панель Toolbox в Visual Studio,
настроенная для экономии экранного пространства
Совет
Вы можете настроить панель Toolbox по своему вкусу. Например, вы можете
добавить собственные группы (называемые вкладками). Вы можете также настроить
панель Toolbox таким образом, чтобы она показывала больше значков. По мере
ознакомления с различными стандартными элементами управления вы сможете
отключить отображение их текстовых меток и показывать только их значки. Для этого
щелкните правой кнопкой мыши группу (вкладку) элементов управления и снимите
флажок List View. На рис. 2.14 показано дополнительное место, которое вы при этом
можете освободить на экране.
Визуальные конструкторы
Визуальный конструктор— это холст, на котором вы при помощи мыши создаете такие
элементы, как формы (посредством перетаскивания, изменения размеров и т. д.). Visual
Studio 2008 поставляется с множеством таких визуальных конструкторов. Они позволяют
вам создавать элементы, которые составляют ваше приложение. Эти элементы включают:
формы Windows, Web-формы, диаграммы классов, схемы XML и т. д.
Все визуальные конструкторы работают практически одинаково. Во-первых, они занимают
центральное место внутри интегрированной среды и имеют вид окон с вкладками,
окруженных различными меню, панелями инструментов и прочими панелями. Во-вторых, вы
используете панель Toolbox как палитру элементов, которые вы помещаете на поверхность
Глава 2. Краткий обзор интегрированной среды разработки
73
конструктора. Затем вы настраиваете множество свойств каждого элемента (при помощи
окна свойств).
На рис. 2.15 показан конструктор Windows Forms в действии. Обратите внимание, что панель
Toolbox находится слева, а окно свойств Properties — внизу справа. Многие конструкторы
имеют собственные панели инструментов. Обратите внимание, что панель управления Layout
отображается при работе с формами. Это позволяет вам легко позиционировать элементы
управления относительно друг друга. В будущих главах мы подробно опишем большинство
визуальных конструкторов. Вы можете также получить более подробный обзор в главе 6.
В! Corneas * ШайЩУ^^^^^^^^^^^^^^^^И
| Fire Edit View Project Build Debug Out» Took
•M £ I ~ > _ <::
1 Го«&вк * * X
|| ^ Common Contrail {
J А д >3 IV .. r;
1 -sj 13 til с 0 *j
* <l .. a
I Г Осянйип
U Г \ D Ш -
1 -
1 ~
1 L< Мспш&ТоеЬмх
1 It Pointer
1 Щ CcntesdMenuStrip
1 J?, MenuStrip
1 i StituiStnp
1 Шг. ToclStrip
1 <Q TootSrripCcnUiner
If Date
1 ff ОщцкиюЛь
1 Ь Г.ЬЧкч
1 У Dialog*
1 '( Yttf}nt*mp*nb**t
\{+ tappet!»*
1 U \ЛтМвмкРригетРк1ц
Ik AMXTaaM
Mr GwaJ
1*^ Toolbox {8Sj Iserver bplo'er |
l| ^£»c»l«t|
[ Rwd>
i*K >-* *'ft ?•
FofmltsIDeefol'^
^ Fto8>tr
Nunt a
Addreu
bthdate
2
9
16
30
Test Window. Help
г Л> «• S fc s: '!
fMMt 1НЖ t ■ -f.«дпШе»«маья; i
September, 2007 ►
Man Tue Wed Tbu Fit Sit
3 4 5 6 7 8
10 11 12 13 14 15
17 IS 19 20 21 ( ^> ]
24 25 26 27 28 29
ZZ!Tod»y 9/22/2007
OK
*' '
^^^^^в
- 9
*x щ1тщт-щд£лЯ^^ГГЖЩ
,,
(ШУЖШ.
u
с»ы 1
i^iil^^ 1
^J Solution Contoso' A project») j j
. '=' £3 Adminlfl ;
'is ~A Prcpertie» \
•i s4 Refeiences 1:
-i ~\\$$$Ш №
**) for ml Designer u H
^ tornil rem Ц
^ Program cs Ц
U J> CV-\Cento«i\ I
>♦, 3 Service! ||
.resolution txplorei L"j Г ^' V ev> 1
Ptopent'c* *» XJ
Forml.cs File Properties * |
Г % 1
Build Action Compiie в
Copy tD Output D Do net copy §
Custom Tool И
Custom Tool Nan R
File Nime Forml a 1}
f, И-. П '<^l « c*,l " ||
BuOd Action |
He* the file rrUtestc the build and ]
d*plo/meni processes ||
Рис. 2.15. Визуальный конструктор Windows Forms
Текстовые редакторы
Visual Studio 2008 имеет несколько текстовых редакторов (текстовых (кодовых)
процессоров). Все текстовые редакторы основаны на общем ядре, которое предоставляет основной
набор функциональных возможностей для каждого редактора (такие как поле выбора,
способность сворачивать вложенные элементы и расцвечивание). Каждый редактор происходит
от этого ядра и имеет настройку для кода (С#, VB и т. д.), для XML, для HTML (или aspx)
или для редактора таблиц стилей.
Редакторы кода
Именно в редакторах кода происходят чудеса. Именно здесь вы занимаетесь делом —
используете свой любимый язык программирования для определения объектов и их функцио-
74
Часть I. Введение в Visual Studio 2008
нальности. Конечно, вы можете писать код и вне редактора Visual Studio, но зачем вам это
делать? Вы можете также написать повесть при помощи Notepad (Блокнот) или составить
налоговый отчет вручную. Хороший редактор кода— это более высокая
производительность — и это ясно и просто. A Visual Studio имеет одни из лучших редакторов кода.
При работе с кодом редактор кода самое главное. Он обрабатывает отступы и пробельные
символы для того, чтобы ваш код был понятным и читабельным. Он обеспечивает
технологию IntelliSense и дописывание операторов (для того чтобы освободить вас от
необходимости поиска (или запоминания) каждой библиотеки объектных модулей или ключевого
слова). Он группирует код в блоки, обеспечивает расцветку ключевых слов и комментариев,
выделяет ошибки, выделяет новый код относительно ранее компилировавшегося. Вообще,
редактор кода Visual Studio делает очень много для того, чтобы ваш труд был
производительным.
Редактор кода С#
На рис. 2.16 показан редактор кода С#. Необходимо отметить некоторые элементы.
П Код группируется в логические области (с левой стороны). Вы можете использовать
знак минуса для того, чтобы закрыть целый класс, метод, свойство или другую
подобную группу. Эта возможность позволяет вам скрывать тот код, с которым вы в данный
момент не работаете. Вы можете также создать ваши собственные (именованные)
области кода для этой же цели.
File Edit i/iew Refartcr Project Build Debug Data Tools Test Window Help
л м, ^ ^ iw m z i < - *j ,_* -
ProfHe.c$* Fpfml.ci (Pwignl* CWauiwjp* Fomrt PwaptrrC*'.*
:* Service? Prcfile - "? f л <
: j »з:^з Syarem.Collecricrs.Gereric;
j '.!'nq S\-3Zco. li".q;
vising iyateir Text,
|- гиа-з.т-р S-r.-vces <
friv-jte ati.rg _иатге,
I1 put^r irMig Haire {
I J$ Ere L.st
Ready
- stackalloc
~$ StackOve/flo^Exceptio
\* STAThreadAttribute
-- ctatic
1$. String
StringBuilder
I 'J Strmg Comparer
f" StringCompansor
*° SlnngSplttOpruon!
7j -ju ,* ъ в й
| ^*3 Solution 'Contoso C projects)
™| - 3 Adminlil
1 ♦ J GV-\Contoso\
3 .j9 Services
i+i Л Properties
*; „j| References
; %J Prohle.es
^Solution bplcrer
Propcttfs
:: *i
class System String
Represents te*t as a stim of Unicode character |
Рис. 2.16. Редактор кода С#
□ Новый код внутри областей помечается цветной линией. Желтый цвет используется для
нового кода, который еще не сохранен. Линия становится зеленой после сохранения и
Глава 2 Краткий обзор интегрированной среды разработки
75
исчезает после того, как вы закроете и вновь откроете файл. Эта функциональная
возможность позволяет вам (и редактору) отслеживать места выполненных во время
текущей сессии изменений в коде.
□ Имя открытого кодового файла показано на заголовке окна кода. Звездочка указывает,
что с момента последнего сохранения код изменился.
П При наборе кода запускается IntelliSense. Для быстрого нахождения в списке нужного
элемента вы можете использовать клавиши со стрелками. При наведении указателя
мыши на элемент вам будут показаны подробности данного элемента (текст подсказки
будет справа). Вы можете нажать клавишу <ТаЬ> для дописывания элемента внутри
IntelliSense.
□ Код выделяется различными цветами. По умолчанию ключевые слова имеют синий
цвет, комментарии— зеленые, текст— черный, создаваемые вами типы— голубые,
строковые значения — красные, и т. д.
□ Два выпадающих списка в верхней части редактора кода позволяют вам перемещаться
между классами в файле (левый выпадающий список) и методами, полями и свойствами
данного класса (правый выпадающий список).
Редактор кода Visual Basic
Редактор кода Visual Basic работает в основном аналогично редактору кода С#. На рис. 2.17
показан тот же самый код, что и на рис. 2.16, но написан он в редакторе кода Visual Basic.
V Contoio - Microsoft VUuat St^io ^
File Edrt View Project Build Debug Data Tools Test Window Help
Л «i, *. ** i i* У ^ 1 , CD * < ~> *} j> , ~
|5~] PrpfSevb" Profile***! Formic*{Deign)*! DefAufcasjw* FomU4teig*,«,c*4;
^Profile ~ Ll(DetbratJom)
jFjMic: Class Froflle
Щ
Fnvitte п.атге Аз String
Piifclic Prcpercy Name () Аз String;
Get
Return _nanie
E^d Set
Sec(SyVal value As S-riig)
_caite - value
Erd Set
End Frapert/
i
[ Private _addreaa As ati
i
I
' *rd С1атз
Щ
|v5t Strings
\*P StnngSplitOptions
ij StrongT>pingE»ception
Common
All
1^ШЫЗжГ
7 X SslJtJon&^icrer- Solutior .. -» 9- X
jj !^3 Solution 'Contcic' D projects)
ft ij& Admmlfl
ft $ GV-\Contoso\
И kj3 Services
К ^ ServicesVB
..Ш My Project
y^] Profilevb
J?3 Solution brplcrer ^,*}f l,«i Viiv»< I
Properties ~~ Z IT
String г
(Represents text as * series of Unicode characters |
5Z!—~
COM Class False
COM Visible True
Senalizable False
сома™
Expose Class to COM.
Ready
Рис. 2.17. Редактор кода Visual Basic
4 3ак 3716
76
Часть I. Введение в Visual Studio 2008
Вот некоторые различия между редакторами:
□ для разделения методов и свойств в редакторе используются горизонтальные линии;
□ выпадающий список IntelliSense разделен на часто используемое подмножество и все
возможные значения;
□ выпадающие списки перемещения по коду в верхней части кодового редактора
позволяют вам перемещаться по всей иерархии активных объектов (включая события).
Выпадающий список слева показывает пространства имен, объекты и события. Выпадающий
список справа показывает все методы для данного типа, включая и те, которые еще не
были перекрыты. Реализованные вами элементы выделены в списке жирным шрифтом.
Настройка редактора
Практически любой аспект текстового и кодового редактора может быть настроен под
любые ваши капризы. Мы знаем по собственному опыту, что не существует даже двух
разработчиков с одинаковым восприятием кода. Вы можете использовать диалоговое окно
Options (Tools | Options) для изменения фонового цвета редактора или цвета и шрифта
различного текста внутри редактора. Вы можете также включить нумерацию строк и
управлять отступами (табуляцией) и пробельными символами. Полный список настроек
текстового редактора велик. Вы можете настроить язык и специфические для редактора опции.
На рис. 2.18 показано диалоговое окно Options для шрифтов и цветов. Здесь вы можете
настроить множество отображаемых элементов редактора (их цвет, шрифт и размер шрифта).
Если вы углубитесь в диалоговое окно Options, то в дереве опций вы наткнетесь на узел
Text Editor. Здесь вы можете манипулировать еще большим количеством настроек для
текстового редактора. Например, вы можете убрать горизонтальные разделители
процедур в редакторе Visual Basic или отключить автоматическое переформатирование кода
редактором.
[ (Ж ]' C*ncd
Рис. 2.18. Диалоговое окно Options с настройками шрифтов и цветов
Глава 2. Краткий обзор интегрированной среды разработки
77
Что еще лучше — вы можете управлять тем, как редактор автоматически форматирует ваш
код внутри редактора кода С#. Если вы хотите, чтобы все ваши фигурные скобки стояли на
отдельных строках, либо предпочитаете, чтобы они находились в начале строки, с которой
начинается блок кода, то можете настроить это здесь. На рис. 2.19 показаны некоторые
опции форматирования кода С# в редакторе.
Option* .ааШ!1^|тД|дЯ|^^^Щ
! [ TextEdrtor
File Extensron .
All Languages
Basic '•
I 1 General ~
1 ТвЬ1; '
I VB Specrfic
1 General
1 Tabi
1 Advanced
I Fcrmattng
11 General
II Indentation
II New Lines
|| Spacing
If Wrapping
II. _ totelltfwise.
pipp 1Д1ДДПИД11|[1Д8Д
J" Indent block contents к
1 Indent open and close braces p
j/j indent case contents
У Indent case labels
-} ^ Labei Indentation
ч Place goto labels in leftmost column |
0 ШШШШШШДДВ1 J
< Indent labels normally i
claaa MyClaaa ' I
( 1
public void Method^) 1
i |
дсса MyLabel; I
MyLabel: If
re cum; 1
} 1
} I
[ OK ' ' Cancel ] 1
1
Рис. 2.19. Управление форматированием кода в диалоговом окне Options
Solution Explorer
Solution Explorer позволяет вам группировать и управлять множеством файлов, которые
составляют ваше приложение. Решение обычно содержит несколько проектов
(приложений). Проект группирует относящиеся к нему файлы. Например, вы можете создать Web-
сайт, приложение Windows Forms, библиотеку классов, консольное приложение и т. д.
Файлы внутри контейнера проекта конкретизируют ваш код формами, файлами классов, XML и
прочими элементами.
Solution Explorer представляет собой то место, где вы обычно начинаете добавлять новый
элемент (класс, изображение, форму) в ваше приложение. Он используется также и для
доступа к этим элементам. Двойной щелчок по элементу в Solution Explorer открывает
визуальный конструктор или редактор, связанный с файлом данного типа. Например, открытие
файла с расширением cs приведет к запуску редактора кода С#. Наконец, Solution Explorer
используется и для управления исходными кодами (для того чтобы добавить или удалить
элемент в/из базы исходных кодов).
На рис. 2.20 показан Solution Explorer, отстыкованный от интегрированной среды.
Обратите внимание, что открыто одно решение (и это предел), а решение содержит несколько
приложений (называемых проектами). Один из них — приложение Windows Forms (с
названием AdminUI); другое— Web-сайт (Contoso); проект в самом низу— библиотека классов
(Services). Solution Explorer подробно рассматривается в главе 4.
78
Часть I. Введение в Visual Studio 2008
Solution Expbrer - СЛДС<?п*сяо\
ft > alia д.. a »
Г 31 Solution 'Contoso' D projects)
£ i^AdmlnUl
i\ -A Properties
h <A References
J . , z2 Forml.cs
l[l **] Form!.Designer cs
.rent
jjj Ргодгдт.с;
III 3 LjjApp_Ct>de
*3 Oassl.vb
lJ3 Order.cs
I .«.J App_Data
pi 3 JJ Defauftaspx
| 4J Defaurt.aspx.es
II J# web.cc-nfig
l| ! i 31 Services
I £ dd Properties
|| tj x^ References
^ Profile es
I^Solution Explore/ L^Oa» View
Рис. 2.20. Solution Explorer в Visual Studio 2008
Окно свойств Properties
С каждой новой редакцией и каждым новым инструментом программирование все меньше
похоже на написание кода и все больше похоже на перетаскивание и конфигурирование.
Properties 5>> ^д1§|§^^. % •. j
button? System.Windows
UliLiziK
Ш (ApplicatianSettings)
ЕВ (DataBindingsJ
Forms.Button
jfpSl^^pIPP^ button?
AccessibleDescnptiDn
|| AccessibleName
AccessibleRole
|| AllowDrop
|| Anchor
I AutoElfipsis
AutoSne
AutoStzeMode
BackColor
|| B-ackgroundlmage
Default
False
Top, Left
False
False
GrowOnly
Control
1 1 (none)
|| BaclcgtoundlmageLayau Tile
CausesValidation
|| ContextMenuStrip
Cursor
DtalcgResult
Dock
1 Enabled
В FlatAppearanee
FlatStyle
(Nime)
True
(ncne)
Default
None
None
True
Standard
I Indicates the name used in code to identify the objec
Щ
*1
•••• h
M
1
t £
Рис.
2.21. Окно свойств в Visual Studio
2008
Глава 2. Краткий обзор интегрированной среды разработки
79
Множество инструментов, элементов управления и мощные визуальные конструкторы,
которые освобождают нас от необходимости писать часто повторяющийся код, теперь тоже
требуют нашего внимания — в виде их обслуживания. Эта работа обычно выполняется
путем манипуляции буквально сотнями свойств, которые при определении нашего
приложения работают во взаимодействии друг с другом. Именно здесь появляется окно свойств
(Properties). Оно позволяет нам управлять размером, внешним видом и поведением наших
элементов управления. Более того, окно свойств группирует схожие свойства в наборы (для
облегчения доступа). Наконец, окно свойств позволяет нам привязать события элемента
управления к коду внутри нашего приложения.
На рис. 2.21 показано окно свойств (отстыкованное от интегрированной среды) для
элемента управления "кнопка". Обратите внимание, что по умолчанию окно группирует схожие
свойства в разделы при помощи категорий вроде Appearance. Вы можете отключить эту
возможность и получать список свойств в алфавитном порядке (путем нажатия значка AZ на
панели инструментов). Следует отметить также, что на панели инструментов есть также
значок с молнией. Он дает вам доступ к событиям данного элемента управления.
Управление множеством окон
в интегрированной среде разработки
Для того чтобы завершить наш стремительный обзор, мы решили снабдить вас указаниями
по настройке и управлению тем изобилием окон, которые имеются в интегрированной среде
разработки (чтобы они не оставили вам окно для написания кода размером с почтовую
марку). Для управления этими окнами вы должны уметь делать только две вещи: прикалывать и
стыковать.
Прикалывание
При прикалывании мы обеспечиваем открытое состояние окна. Название данного действия
происходит от визуального элемента, используемого для прикалывания — это канцелярская
кнопка (см. заголовок Toolbox на рис. 2.22). Прикалывание императивно, поскольку иногда
для написания кода или конструирования формы вам нужно рабочее пространство во весь
экран. В этом случае вам необходимо открепить (скрыть) все излишние окна вашей
интегрированной среды. Обратите внимание, что когда окно открепляется, то оно представлено
на экране вертикальной вкладкой (окно Solution Explorer на рис. 2.22 справа). Если вы
приблизите курсор мыши к этой вкладке, то окно откроется. После завершения его
использования оно опять вернется в скрытое состояние.
Возможно, вы хотели бы перетаскивать на эту форму элементы управления. Для этого вы
могли бы приколоть (в открытом виде) панель Toolbox (см. рис. 2.22). При этом будет
открыто только то окно, с которым вы работаете, и закроется все остальное.
Стыковка
Стыковка— это присоединение окон к разным "липким" местам внутри интегрированной
среды. Обычно это означает стыковку к левой, верхней, правой или нижней стороне
интегрированной среды. Например, панель Toolbox по умолчанию пристыкована к левой стороне
80
Часть I. Введение в Visual Studio 2008
интегрированной среды. Вы можете пожелать разместить ее в нижней части экрана, ниже
активного визуального конструктора (рис. 2.23).
*j/> Сото» - Mtcfowl*
File Edit View Project Bu*W Debug Data Format Tools Test Window HeJp
, -sj^_ l J n -> _, j.. ; f 3^±i* # R.JR i Ь ft: О? у1.В1.Ш ■»,»-■*;.$ *
?**** -Ж*~ P^fr-lfmfflfrVfa"'1-" P«wt tMiiifimf мднишмг^
r* AawndovnfofiTu JdCLJ " * ' ~* "" """
[<: Common Controfc ^Atrto Hide]
* ® в a ^ n
а д *з -r •-: n
за ira J -j e *u
D Ш l:.
P
*-, Мема&ТооЯмг»
It Pointer
Ф ContextMenuStnp
>& MenuStrip
L_ StatusStrip
>> TootStrfp
i2 ToolSt/ipContawer
ft Oat»
U. *
ft \
j^K 7 oof box ^Scrvgf&ptoiw'l
^ду» p» ^wpm
Name
Mdraaa
BYthdate ~ " ~
< September, 2007 »
i Sun Mon Ttie Wed Thu Fri Sat
26 27 2Й 2S JG 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 IB 19 20 71 22
НЛ 24 23 26 27 2S 29
30 1 2 i 4 5 6
CD Today: 9/23/200?
d
frt.n Tiflfr....iTf..l
rl* p j
OK t?! C*** ] 1
- "-и —- L J
«i-.шт. йёг ййкЛййг..'^
^ Eire r Lilt
Ready
Рис. 2.22. Приколотое и открепленное окно в интегрированной среде
;*^ Canto» - М«
File Edit View Project Build Debug Data Tools Test Window Help
- - ь ...LA..? lAr<♦'J £ *'^ ^^ ^I'< & *;«K^-l^ "*^>
ЩрШ' W№: W°" ^ ЩШ |ЩД fjflMg* FocmuA
btitton2 System Windo»vi.Forms,Birt *
ttaiyn д.
Locked False
El Margin 3, 3, 3, 3
jffl MawmumSrce 0,0
EB MinimumSae 0,0
Modifiers
JS Padding
PaghtToLeft
IE Siie
Private
0. 0.0. 0
No
75.23
1
True
Tablndex
TabStop
Tag
TertAlign MiddleCenter
TextimageReJatt Overlay
UseCompaublel False
UseMnemonic True
0,
i
ШШШз&ш'' Fomu» IQqiyri^fttftfciek^fcJa^liii^^
euhdata
< September, 2007 ►
Sun Mon Tue Wed Thu Fri Sat
16 2? 18 29 20 31 1
2 3 4 5 6 7 S
9 10 11 12 13 14 15
16 17 18 19 20 21 22
ПЛ 24 25 26 27 28 29
30 1 2 3 4 5 &
C~] Today; 9/23/2007
q Q& \
tt tJ"-""-^
?( Caned ;
j
UXJ
X
«
\E Al Windows Foaas
Д-
^, * 4s5 «- ^ а и 12 a *i *. jj j ^ за 9 из о
• Г; 21 23 fl (ED «в ^ А д И 1Г •'-: » i* IE? si "M
i п и juiiaayfQSaT/aiiTi *
^Propert. ^§о'У>о ЩС\»'лУ„j j^Toolbo* |$|sWrbpfcrgr
Text
The text associated with the control.
|j^6r»»»Utf
Heaay
Рис. 2.23. Некоторые опции стыковки в интегрированной среде
Глава 2. Краткий обзор интегрированной среды разработки
81
Вы можете также пристыковывать окна друг к другу. Например, вы можете пристыковать
окно Properties под окном Solution Explorer. Либо разместить окно Properties как вкладку
в том же самом окне, в котором пристыкован Solution Explorer (рис. 2.23).
Для помощи при стыковке в Visual Studio 2008 были переработаны визуальные подсказки,
которые впервые появились в версии 2005 года. Вы начинаете с приколотого окна
(открепленное окно пристыковать нельзя). Вы щелкаете и удерживаете заголовок окна мышью.
Затем вы перетаскиваете окно туда, где хотите его пристыковать. Visual Studio покажет вам
некоторые значки стыковки.
По краям интегрированной среды расположены четыре значка (по одному слева, сверху,
справа и снизу). Эти значки служат для пристыковки окна к данному краю интегрированной
среды. Использование этих значков приведет к пристыковке окна по всей длине (или
ширине) интегрированной среды. На рис. 2.24 показано окно, в котором находится Solution
Explorer и соответствующие вкладки, которые пристыковываются ко всей правой стороне
интегрированной среды.
В середине интегрированной среды также имеется значок. Он используется для стыковки
выбранного окна относительно других окон интегрированной среды. Например, вы можете
пожелать пристыковать Solution Explorer к правой стороне интегрированной среды, но
выше чем Toolbox. Вы будете делать это при помощи самого правого значка центральной
группы. Наконец, центральный значок центральной группы служит для пристыковки окна к
другому окну в виде вкладки (как панель Class View в нижней части рис. 2.20).
Конечно, вы можете также отстыковывать элементы. Для этого надо просто захватить
пристыкованное окно за заголовок и перетащить его к краю интегрированной среды (просто ни
к чему не пристыковывать).
iwsia й
*jfr Cantos*» - Wian&K yiuigl studio
File Edit View Project Build Debug Dtte Tools Test Window Help
■?' Formlxs lDewjnj*[.
Tooifw» rlx
<+ AS Windows F_ *
Ь Common Con—
* © 0 12
Я "* А Д
•a tv •- 1
Sl W U э E
© *A & fc,
X~ %3
^ - .-i П
ш i' :«j
fc Menus* Toot-
It Pointer
1 Kp ContextMen
I ^-fCieniiStrip
L: StetusStrip
j li*i ToolStrip
7Д TootSlnpCon.,. у
«# PfOfii*
Name
~\ ■
< September, 2007
Sun Mon Tur Wed Thu Fi
26 27 23 29 30 v
2 3 + 567
9 10 11 12 13 14
16 17 18 19 20 21
ПЛ 24 25 26 27 28
30 I i 1 1 S
[ , Today- 9/23/2007
(„Ь Error Ust
Use the guide diamond to choose a docking location To prevent docking, held down CTRL
$Crk&$ft Kj*M*« ^ЗДкй; &.«*№?;,
^Solution 'tontaui' D project*)
^ i^Admrnlft
X Л Ptcptaii«5
J %£ Fc«Tli>C5
^ £om>l 0t»*jn<!r»cs
5 *& fwnUesx
**J Ptcgwmxs
> Jit GWwtts
„4 App.Date
^Propert. [^gSotutio g$ Class V
Рис. 2.24. Стыкуемое окно
82
Часть /. Введение в Visual Studio 2008
И наконец, при работе с плавающими окнами вы можете щелкнуть правой кнопкой мыши
по заголовку и указать Visual Studio, как это окно должно себя вести. На рис. 2.25 показаны
возможные опции. Пристыкованное окно предоставляет выпадающее меню для доступа к
этим же опциям. Опция Floating указывает, что окно будет плавать поверх интегрированной
среды (куда бы вы его ни поместили). Это может быть полезным тогда, когда вы постоянно
перемещаете окна, но не хотите все время переключать опции стыковки. Эту опцию можно
отключить, отметив опцию Dockable (состояние по умолчанию). Вы можете также добавить
окно в центр вашей интегрированной среды (для того чтобы оно вело себя как визуальный
конструктор или редактор кода). Это опция Tabbed Document.
ScHufcon Exploref ♦
^5 Solution 'Cot
Floating
Dockable,
Tabbed
- ЛоНк*'
Hide
3 AdminUI
iS Ld Pfope
4?| Forml.Designer.e5
*•£] Forml.resx
Q Program.es
g \£ GVAContaso\
) .kJ App_Code
t2] Chsd.vb
<*J 0rder.es
v-»j App_Data
•^PfDpett./i^JSDlutiD... ^Clats
VL
Рис. 2.25. Опции окон интегрированной среды
Резюме
Наш стремительный обзор закончен. Мы описали основы инсталляции, ваш первый проект
и стандартные элементы, с которыми вы столкнетесь при самостоятельном путешествии.
Мы надеемся, что вы обрели опору и можете продвигаться вперед.
Глава 3
.NET Framework и языковые улучшения
в версии 2008
Большая часть этой книги посвящена изучению потенциальных возможностей повышения
производительности интегрированной среды Visual Studio. Однако важно также описать
некоторые недавние достижения .NET-языков и Framework. Все эти элементы
(интегрированная среда, языки и Framework) обычно поставляются фирмой Microsoft вместе. То
есть когда выпускается новая версия интегрированной среды (такая как Visual Studio
2008), то вы можете ожидать изменений в основных языках программирования и новую
версию .NET Framework. Поэтому любое обсуждение новой версии интегрированной
среды было бы неполным без хотя бы краткого описания тех элементов, которые поставл!-
ются вместе с ней.
Примечание
Недавно фирма Microsoft расширила .NET Framework без выпуска новой
интегрированной среды. Новая версия C.0) была выпущена вместе с Windows Vista.
Разработчики, которые хотели разрабатывать под эту версию .NET Framework, могли делать
это при помощи различных пакетов расширений для Visual Studio 2005. Однако
версия интегрированной среды 2008 года позволяет разработчикам выбирать версию
.NET Framework для своего приложения. Эта функциональная возможность
называется многоцелевой разработкой и может привести к появлению новых независимых
редакций .NET Framework и интегрированной среды разработки.
В этой главе описываются улучшения как в Visual Basic .NET, так и в С#. Кроме того, здесь
отмечены некоторые основные улучшения, сделанные в последней версии .NET Framework.
Мы предполагаем, что большая часть читателей уже имеет базовые знания либо VB, либо
какого-нибудь языка на основе С, предшествовавших версии 2008 года. Кроме того, вы
должны иметь общее представление о .NET Framework. Поэтому данная глава предполагает,
что у вас есть некоторые практические знания языков в версиях 2003/2005 годов и .NET
Framework. Таким образом, мы сможем сфокусировать эту главу на улучшениях версии
2008 (VB 9, С# 3 и .NET Framework 3.5). Такой подход должен дать вам представление об
улучшениях, на которых вам необходимо сосредоточиться в версии 2008.
84
Часть I. введение в Visual Studio 2008
Обзор улучшений интегрированной среды разработки
Visual Studio 2008 по .NET-языкам
Огромная часть современных .NET-разработчиков знает, что программирование— это
нечто гораздо большее, чем просто язык. Поэтому при выходе новой редакции всегда
ожидают появления языковых улучшений, дополнений к Framework и изменений в том, как
пишется код. Visual Studio 2008 в этом смысле не отличается. Она вышла вместе с .NET
Framework 3.5, VB 9 и С# 3. В последующих разделах описаны многие дополнения языков
VB и С# для версии 2008. В данном же разделе выделены некоторые ключевые улучшения
интегрированной среды, специфичные для выбранного вами .NET-языка.
Улучшения интегрированной среды разработки для VB
Как и в прошлых версиях Visual Basic, сам язык — это только часть дела. Visual Basic — это
и язык, и инструментальные средства. Необходимо отметить некоторые "неязыковые", но
специфичные для VB улучшения, которые поставляются с версией 2008.
□ Улучшенная технология IntelliSense. Новейшая версия VB имеет поддержку IntelliSense
везде и всегда, когда вы набираете текст. Просто введите букву в окне кода, и
технология угадает (почти всегда правильно), что именно вы хотите написать.
Производительность по сравнению с предыдущими редакциями также значительно улучшилась. Кроме
того, VB имеет гораздо более мощную систему подсказок ToolTips для помощи при
кодировании.
□ Элементы управления VB Power Pack. Команда разработчиков VB работает над
возвращением RAD в язык (для того чтобы уменьшить потрясение от перехода с VB 5/6 на
версию .NET). Поэтому они создали промежуточные редакции (между 2005 и 2008)
элементов управления, которые предоставляют дополнительные возможности
повышения эффективности работы — такие как распечатывание, линии и фигуры, а также
DataRepeater. Кроме того, они продолжают выпускать элементы управления Power Pack.
Дополнительную информацию ищите на MSDN по теме "Visual Basic Power Packs".
□ Refactorl. Как правило, мы не описываем в этой книге инструменты сторонних
организаций для Visual Studio. Однако этот стоит упомянуть, поскольку фирма Microsoft
сделала его ключевой частью VB (путем заключения соглашения с фирмой DevExpress о
бесплатном предоставлении продукта Refactor! всем лицензированным разработчикам,
использующим язык VB.NET). Рефакторинг в Visual Studio описан в главе 9. Однако мы
описываем только встроенный в интегрированную среду рефакторинг. Этот
рефакторинг предназначен в основном для разработчиков на языке С#. При помощи этого
соглашения разработчики на языке VB получают массу существующих и много новых
(версии 2008) инструментов для рефакторинга.
□ Инструментальный набор Inter op Forms. Фирма Microsoft продолжает оказывать
помощь тем разработчикам, которые по-прежнему работают с кодом VB 6.
Инструментальный набор Interop Forms — это новый набор инструментов, которые позволяют вам
сохранять ваш существующий код на VB 6 и писать новый код для этого же
приложения при помощи .NET. Этот инструментальный набор обеспечивает поддержку
взаимодействия между двумя средами — чтобы вы могли начать использовать .NET без
переписывания всего вашего приложения.
Глава 3. .NET Framework и языковые улучшения в версии 2008
85
Совет
Если вы переходите на Visual Studio 2008 (VB 9) с VB 6, то вам нужно знать еще кое-
что. Фирма Microsoft собрала для вас всю эту информацию в одном месте. Поищите в
библиотеке MSDN Library тему "What's New for Visual Basic 6.0 Users".
Улучшения интегрированной среды разработки для С#
Язык С# в редакции 2008 сделал еще один шаг вперед; скоро мы это обсудим. Однако
написание кода и процесс редактирования были также улучшены в этой последней редакции.
Подобно VB, язык С# имеет некоторые специфические для него функциональные
возможности в интегрированной среде разработки, которые помогают писать и редактировать код.
□ Улучшенная технология IntelliSense. Новейшая версия С# имеет улучшенное ядро
IntelliSense. Эта новая версия использует IntelliSense практически везде, где вы
набираете текст. Она выполняет дописывание операторов, предоставляет более информативные
подсказки Quick Info Tooltips и имеет более высокую производительность. Кроме того,
IntelliSense работает со всеми замечательными новыми функциональными
возможностями языка С#, которые мы скоро обсудим. Это неявно типизированные переменные,
методы расширения, выражения запросов, лямбда-выражения, частичные методы и т. д.
File Edit View Rffactor Project Buitd
Debug Drta Tools Test
[ * ^ - ^ ; ► Debug
Window Help
» Any CPU
Й
Employee***'
j§ ! ^*.CiLr>»i!f \ctrr tnlsXrvleyee
▼ jfi yafa»v
:о using System;
uaicg 3yatea.Collections.Generic;
uj^tg SyireB.llnq;
using 5увсев.Тежъ;
using Syatea.Date;
uaing 3yateB.D*ta.SqlClk*nfj:
uauig System.Collection
using System.CodeDob;
uaing Systea.Coifiguxe.TJ
using Зувхеи.Ю; S&
X < П namespace СаЕпЬласетмпс
partial class Ln^d
-*9
partial cieas inp'C
partial raid S*
double new?
/fio soretfc
I
}
~ш
Lttbtw ЕМ]
Ready
Ref*ctor
Orgsnae Using?
Create Unit Testw
Insert Snippet...
Surround With—
Go To Definition
find AJI References
BretJipoirtt
RunToCufior
Cut
Copy
Piste
Outlining
-i,i
C?
1
"b Remove Unused Using?
^>j Sort Using*
Remove end Sort
b*
Рис. З.1. Упорядочиваем декларации using
□ Refactoring. Visual Studio 2005 ввела рефакторинг в набор инструментов для
разработчика на языке С#. В версии 2008 инструменты рефакторинга были расширены для
поддержки многих новых функциональных возможностей языка, в том числе выражений
запросов, методов расширения и лямбда-выражений. Переименование, извлечение ме-
86
Часть I. Введение в Visual Studio 2008
тодов и прочие инструменты рефакторинга работают с этими возможностями так же
хорошо, как и с предыдущим синтаксисом языка С#. Кроме того, инструменты
рефакторинга теперь предоставляют дополнительные опции и предупреждения, чтобы вы
могли быть уверенными в том, что вы не получите нежелательных последствий после
изменений, внесенных в работающий код. Дополнительную информацию по рефакто-
рингу см. в главе 9.
□ Форматирование кода. Редактор кода С# продолжает улучшать форматирование
вашего кода и управляет применением этого форматирования. Например, ядро
форматирования понимает такие вещи, как выражения запросов. Когда вы пишете такое
выражение, он автоматически выровняет ключевые слова (такие как From и where), поставив
их друг под другом. Это делается для повышения читабельности вашего кода.
□ Упорядочивание вашего использования деклараций. По мере "старения" вашего кода вы
можете заметить, что декларации using становятся громоздкими. Редактор С# имеет
новую функциональную возможность для того, чтобы помочь вам в управлении этими
декларациями. Теперь есть пункт меню Organize Usings (как в меню Edit, так и в
контекстном меню, которое вы можете получить при щелчке правой кнопкой мыши по
декларации using). Вы можете использовать этот пункт меню для сортировки ваших
деклараций using по пространствам имен и для очистки вашего кода от неиспользуемых
деклараций using. На рис. 3.1 показаны опции этого меню.
Дополнения в .NET-языках версии 2008
.NET-языки получили некоторые улучшения в результате обновлений, сделанных в Common
Language Runtime (CLR). Несмотря на то, что имеется несколько специфических улучшений
как для Visual Basic, так и для С#, большинство улучшений версии 2008 применимы к обоим
языкам. Поэтому мы описываем языковые улучшения одной группой и даем примеры на
обоих языках. Если данное дополнение специфично для конкретного языка, то это будет
отмечено. Языковые улучшения .NET-языков включают следующее:
П локальный вывод типа (называемое также неявным типизированием);
□ инициализаторы объектов;
□ методы расширения;
О анонимные типы;
□ лямбда-выражения;
□ частичные методы;
□ встроенный язык запросов (LINQ);
□ дружественные сборки;
□ поддержка языка XML (только для VB);
□ неиспользуемые аргументы событий (только для VB);
□ автоматически реализованные свойства (только для С#).
Многие из этих новых языковых функций служат для поддержки новой важной
функциональной возможности— встроенного языка запросов (LINQ), который мы также описыва-
Глава 3. .NET Framework и языковые улучшения в версии 2008
87
ем здесь (и вообще по всей этой книге). Однако каждая функциональная возможность языка
полезна и сама по себе, и ее следует четко понимать. Поэтому каждая возможность
подробно описана в следующих разделах. Примеры приводятся как на С#, так и на VB.
Выведение типа данных переменной на основе присваивания
В последних версиях Visual Basic и С# вы можете определять переменные без явного
указания их типа данных. При этом вы по-прежнему можете иметь преимущества строго
типизированных переменных (проверка компилятора, выделение памяти и т. д.). Компиляторы
были улучшены для того, чтобы выводить тип данных на основе вашего кода. Этот процесс
называется выведением локального типа (local type inference) или неявным типизированием
(implicit typing).
В качестве примера рассмотрим следующие строки кода. Здесь вы создаете переменную
типа string и присваиваете значение.
□ С#:
string companyName = "Contoso";
□ VB:
Dim companyName As String = "Contoso"
Теперь давайте рассмотрим эту же строку при помощи выведения типа. Вы можете заметить,
что вам не нужна описательная часть декларации. Вместо нее компилятор может сам
определить, что вам нужна строка, и строго типизировать для вас эту переменную. В языке С# это
происходит при помощи нового ключевого слова var. Его не следует путать с оператором var
в таких языках, как JavaScript. Переменные, определенные как var, будут строго
типизированы. В VB по-прежнему просто используете оператор Dim, но опускаете тип данных.
"П С#:
var companyName = "Contoso";
□ VB:
Dim companyName = "Contoso"
Эти две строки кода эквивалентны во всех отношениях. Несмотря на то, что во втором
примере тип данных не объявлялся, он объявляется компилятором. Это не является возвратом к
универсальному типу данных (такому как Variant или Object). He является это также и
поздним связыванием переменной. Это просто более умный компилятор, который строго
типизирует переменную, выбирая тип данных в зависимости от кода. Вы получаете все
преимущества переменных с ранним связыванием (и экономите количество нажатий клавиш).
Например, посмотрим на рис. 3.2. Это компилятор VB в действии (компилятор С# делает то
же самое). Вы можете видеть, что даже на стадии разработки компилятор определил, что эта
переменная имеет тип System, string.
Есть несколько вещей, которые необходимо знать при использовании выведения типа.
Первое — это то, что вашей локальной переменной для типизации компилятором должно быть
присвоено значение. Это не должно быть большой проблемой, поскольку если значение
вашей переменной не присваивается, то она и не используется.
88
Часть I. Введение в Visual Studio 2008
file Edit View Project Build Debug Dati Tools Test Window Help
& * jd~ Q kk & < & -b & 4 - ^ - £J . i V Debug * AnyCPU
^3
1$
Qpticr Strict On
-Г: Public Ctsas Claaal
^w Public Sub ScnssMsthalO
Dii. cli^anyfiaee - "Centos::'
[Dim companyNamc As String!
- У (Declarations)
_J|
Ready
Рис. З.2. Вывод типа в действии *
Второе — выведение типа работает только с локальными типами. Оно не работает с
переменными уровня класса (называемыми также полями) или статическими переменными.
В этих случаях использование выведения локального типа приведет к ошибке
компилятора языка С#. В VB вы получите такую же ошибку, если опция Option strict
установлена в On. Если вы не используете эту опцию в вашем коде на VB, то переменная не будет
строго типизирована. Вместо этого переменной будет присвоен универсальный тип
данных Object.
Выведение локального типа может быть полезным и в других вариантах деклараций, в том
числе: определение массивов, создание переменных во время циклов, определение
переменной внутри оператора Using, а также определение переменной, которая содержит результат
вызова функции. В каждом из этих случаев компилятор может вывести тип ваших данных
из контекста кода. Еще один пример— следующий код создает оператор Using и выводит
тип переменной спп.
□ С#:
using (var enn = new System.Data.SqlClient.SqlConnection()) {
// Код для работы с подключением
□ VB:
Using enn = New System.Data.SqlClient.SqlConnection
1 Код для работы с подключением
End Using
Глава 3. .NET Framework и языковые улучшения в версии 2008
89
В Visual Basic вы можете включить или отключить выведение локального типа для данного
файла. По умолчанию в новом файле кода VB выведение типа разрешается. Однако если вы
хотите выключить его на уровне файла, то вы можете сделать это путем указания Option
infer Of f в начале файла.
Создание объекта и настройка его свойств одной строкой кода
Теперь существует короткий способ для объявления экземпляра класса и настройки
начальных значений для всех (или некоторых) его членов. Одной строкой кода вы можете создать
экземпляр объекта и настроить свойства этого объекта. На стадии выполнения объект будет
сначала создан, а затем будут настроены его свойства (в том порядке, в котором они
появляются в списке инициализации). Эта новая функциональная возможность называется
инициализаторами объекта (object initializers).
Рассмотрим пример. Предположим, что у вас есть класс Employee, который имеет
несколько свойств вроде FirstName, LastName, FullName, Title и т. д. При помощи
инициализации объектов вы можете создать экземпляр этого класса и настроить начальные значения
некоторых (или всех) свойств экземпляра Employee. Для этого вы сначала конструируете
объект. В языке Visual Basic сразу за конструированием следует ключевое слово with
(в языке С# ничего такого не нужно). Затем вы помещаете каждую инициализацию свойства
в фигурные скобки. Вот примеры:
□ С#:
Employee emp = new Employee { FirstName = "Joe",
LastName = "Smith", Title = "Sr. Developer" };
□ VB:
Dim emp As New Employee With {.FirstName = "Joe", _
.LastName = "Smith", .Title = "Sr. Developer"}
Эти строки кода являются эквивалентом строки создания класса Employee и нескольких
строк кода для каждого из перечисленных свойств. Обратите внимание, что в VB вам нужно
перед инициализацией поставить ключевое слово with, а для доступа к каждому свойству
используется точка. В языке С# вам не нужны ни точка, ни ключевое слово.
Конечно, вы можете использовать инициализацию объектов и с параметризированными
конструкторами. Вы просто передаете параметры в конструктор (как обычно). Затем следом
за конструктором вы делаете инициализацию. Предположим, что класс Employee имел
конструктор, который принимал имя и фамилию. Вы можете создать объект с параметрами и
использовать инициализацию объекта для Title, как показано здесь:
□ С#:
Employee emp = new Employee("Joe", "Smith")
{ Title = "Sr. Developer" };
□ VB:
Dim emp As New Employee("Joe", "Smith") With _
{.Title = "Sr. Developer"}
90
Часть I. Введение в Visual Studio 2008
Инициализация объектов позволяет вам также писать код внутри инициализации. Кроме
того, в VB вы можете использовать свойства объекта (который вы инициализируете) для
того, чтобы помочь инициализировать другие свойства. В языке С# это недопустимо.
Компилятор С# не позволяет вам получить доступ к переменной до завершения присваивания.
Для примера следующий код инициализирует объект Employee и настраивает свойство
Employee. FullName при помощи конкатенации имени и фамилии. Обратите внимание, что
в коде VB используется сам объект.
□ С#:
Employee emp = new Employee { FirstName = "Joe",
LastName = "Smith", FullName = "Joe" + " Smith"};
□ VB:
Dim emp As New Employee() With {.FirstName = "Joe", _
.LastName = "Smith", _
.FullName = .FirstName & " " & .LastName}
Вы можете также делать вложенную инициализацию объекта. То есть если данное свойство
представляет другой объект, то вы можете создать этот другой объект как часть
инициализации. Вы можете также вложить инициализацию второго объекта в инициализацию
первого объекта. Простой пример все прояснит. Предположим, что класс Employee имеет
свойство Location. Это свойство может указывать на объект Location, который содержит
свойства City и State. Теперь вы можете создать объект Employee (вместе с вложенным
объектом Location) так, как показано здесь:
□ С#:
Employee emp = new Employee { FirstName = "Joe",
LastName = "Smith", Location = new Location
{ City = "Redmond", State = "WA" } };
□ VB:
Dim emp As New Employee!) With {.FirstName = "Joe", _
.LastName = "Smith", _
.Location = New Location With _
{.City = "Redmond", .State = "Washington"}}
Добавление методов в существующие классы
Теперь вы можете добавить к существующему типу индивидуальные особенности (как
будто он всегда их имел). Таким образом, вам не придется перекомпилировать данный объект,
не придется вам также создавать второй (производный) объект для добавления этих
особенностей. Более того, вы можете добавить в существующий объект метод (при помощи
использования новой функциональной возможности компилятора под названием методы
расширения (extension methods).
В языках VB и С# это делается несколько по-разному. В VB вы сначала импортируете в ваш
кодовый файл пространство имен System.Runtime.CompilerServices. Затем помечаете
нужную процедуру Sub или функцию Function директивой <Extension () >. И наконец,
Глава 3. .NET Framework и языковые улучшения в версии 2008
91
пишете новую Sub или Function, где первый параметр нового метода — это тот тип,
который вы хотите расширить. Далее показан пример. В этом примере мы расширяем тип
Integer новым методом с названием DoublelnSize:
Imports System.Runtime.CompilerServices
Public Module IntegerExtensions
<Extension()> _
Public Function DoublelnSize(ByVal i As Integer) As Integer
Return i + i
End Function
End Module
Компилятору С# подобный импорт или атрибут метода не нужны. Вместо этого вы сначала
создаете статический класс. Затем создаете статический метод, который вы собираетесь
использовать в качестве расширения. Первый параметр вашего метода расширения должен
быть тем типом, который вы хотите расширить. Кроме того, вы применяете модификатор
this к этому типу. Обратите внимание на следующий пример. В нем мы расширяем тип
данных int новым методом DoublelnSize.
namespace IntegerExtensions {
public static class IntegerExtensions!
public static int DoublelnSize(this int i) {
return i+i;
}
}
}
Для использования метода расширения вы должны сначала импортировать в проект (при
помощи using в языке С#) новые методы расширения. Затем вы можете вызывать любой
новый метод так, как будто он всегда существовал в данном типе. Далее приводится пример
на VB и С#. В этом случае функция DoublelnSize (которая была добавлена в предыдущем
примере) вызывается из класса integer (int).
□ VB:
Imports IntegerExtensions
Module Module1
Sub Main()
Dim i'As Integer = 10
Console.WriteLine(i.DoublelnSize.ToString())
End Sub
End Module
□ C#:
using IntegerExtensions;
namespace СsEnhancements { ,
class Program {
92 Часть I. Введение в Visual Studio 2008
static void Main(string[] args) {
int i = 10;
Console.WriteLine(i.DoublelnSize().ToString());
}
}
}
Создание экземпляра несуществующего класса
Теперь вы можете создать объект, который не имеет представления в виде класса на этапе
проектирования. При этом компилятор создает для вас класс без названия (анонимный). Эта
функциональная возможность называется анонимными типами (anonymous types).
Анонимные типы обеспечивают важнейшую поддержку запросов LINQ. С их помощью столбцы
данных, возвращенные по запросу, могут быть представлены как объекты (подробнее об
этом далее). Анонимные типы компилируются в объекты классов со свойствами "только для
чтения".
Рассмотрим пример того, как следует создавать анонимный тип. Предположим, что вы
хотите создать объект, который имеет свойства Name и PhoneNumber. Однако у вас нет такого
определения класса в вашем коде. Для этого вы можете объявить анонимный тип.
□ VB:
Dim emp = New With {.Name = "Joe Smith", _
.PhoneNumber = 23-123-1234"}
□ C#:
var emp = new { Name = "Joe Smith",
PhoneNumber = 23=123=1234" };
Обратите внимание, что объявление анонимного типа использует инициализаторы объектов
(см. предыдущее обсуждение) для определения объекта. Большое отличие состоит в том,
что после объявления переменной (или после ключевого слова New) отсутствует строгая
типизация. Компилятор создаст для вас анонимный тип со свойствами Name и
PhoneNumber.
В Visual Basic имеется также ключевое слово Key. Оно служит для указания, что данное
свойство анонимного типа должно использоваться компилятором для дальнейшего
определения того, как необходимо обрабатывать объект. Свойства, определенные как Key,
используются для определения равенства двух экземпляров анонимного типа. В языке С# эта
концепция отсутствует. Вместо этого в С# все свойства интерпретируются как свойства,
помеченные Key в языке VB. В VB вы указываете свойство Key следующим образом:
Dim emp = New With {Key .Name = "Joe Smith", _
.PhoneNumber = 23-123-1234"}
Вы можете также создавать анонимные типы при помощи переменных (вместо синтаксиса
присваивания свойств). В этих случаях компилятор использует имя переменной в качестве
названия свойства, а ее значение — в качестве значения свойства анонимного типа.
Глава 3. .NET Framework и языковые улучшения в версии 2008
93
Например, в следующем коде переменная Name используется как свойство для анонимного
типа.
□ VB:
Dim name As String = "Joe Smith"
Dim emp = New With {name, .PhoneNumber = 23-123-1234"}
□ C#:
string name = "Joe Smith";
var emp = new {name, PhoneNumber = 23=123=1234"};
Программирование в своем коде простых неименованных функций
В последней версии .NET-языков вы можете писать простые функции, которые могут иметь
или не иметь названий, выполняться вложенным образом и возвращать единственное
значение. Эти функции существуют внутри ваших методов (а не как отдельные функции). Эти
функции называются лямбда-выражениями. Полезно понимать лямбда-выражения,
поскольку они используются "за кулисами" в запросах LINQ. Однако они допустимы также и
вне LINQ.
»
Рассмотрим пример. Предположим, что вы хотите создать простую функцию, которая
преобразует температуру из градусов Фаренгейта в градусы Цельсия. Вы можете сделать это в
коде на Visual Basic, начав с использования ключевого слова Function. Затем вы можете
указать параметры этой функции (в данном случае это значение в градусах Фаренгейта).
Наконец, вы пишете выражение, вычисляющее значение, которое можно возвратить из
лямбда-выражения. Синтаксис таков:
Dim fahToCel = Function(fahValue As Integer) ((fahValue - 32) /1.8)
Синтаксис С# несколько отличается. В языке С# вы должны явно объявить делегат для
использования компилятором при преобразовании вашего лямбда-выражения. Конечно, вы
объявляете делегат на уровне действия класса. После этого вы можете писать в вашем коде
выражение. Для этого вы используете оператор =>. Этот оператор читается как "идет к".
Слева от оператора вы указываете тип делегата, название выражения, а затем знак =, за
которым следуют любые параметры выражения. Справа от оператора => вы ставите
фактическое выражение. Далее показан пример и делегата, и выражения:
// Объявление делегата на уровне класса
delegate float del(float f);
// Лямбда-выражение внутри тела метода
del fahToCel = (float fahValue) => (float)((fahValue - 32) / 1.8);
Обратите внимание, что в обоих примерах мы присваивали выражение переменной
fahToCel. Таким образом, мы создали делегат (с явным приведением типа к нему в языке
С#). Теперь мы можем вызывать переменную как делегат и получать результаты (как
показано здесь).
□ VB:
Dim celcius As Single = fahToCelG0)
94
Часть /. Введение в Visual Studio 2008
□ С#:
float celcius = fahToCel (-10);
В Visual Basic мы могли бы написать эту функцию встроенной (без присваивания ее
переменной). Мы могли бы написать так:
Console.WriteLine((Function(fahValue As Integer) ((fahValue - 32) / 1.8)) G0))
Обратите внимание в этом последнем примере, что функция объявляется, а затем
немедленно вызывается передачей внутрь значения 70 в конце функции.
Язык С# также имеет свои особенности. Здесь вы можете написать внутри вашего лямбда-
выражения несколько операторов. Для этого вы помещаете их в фигурные скобки и
отделяете точкой с запятой. Следующий пример имеет внутри лямбда-выражения два оператора.
Первый создает новое значение; второй выводит его на консоль. Обратите также внимание,
что делегат в данном случае должен иметь тип void и что вы по-прежнему должны для
выполнения лямбда-выражения его вызвать.
// Объявление делегата на уровне класса
delegate void del(float f);
del fahToCel = (float fahValue) => { float f =
(float)((fahValue - 32) / 1.8); Console.WriteLine(f.ToString()); };
fahToCelG0);
Лямбда-выражения используются в запросах LINQ для таких операторов, как where,
Select и Order by. Например, используя LINQ, вы можете написать следующий оператор:
□ VB:
Dim emps = From emp In db.employees
Where(emp.Location = "Redmond")
Select emp
□ C#:
var emps = from emp in db.employees
where emp.Location == "Redmond"
select emp;
Этот код LINQ преобразуется в лямбда-выражения вроде этих:
□ VB:
Dim emps = From emp In db.employees
.Where(Function(emp) emp.Location = "Redmond")
.Select(Function(emp) emp)
□ C#:
var emps = from emp in db.employees
where (emp => emp.Location == "Redmond"
select (emp => emp);
Глава 3. .NET Framework и языковые улучшения в версии 2008
95
Добавление бизнес-логики в сгенерированный код
Частичный метод (подобно частичному классу) представляет собой код, который вы пишете
для добавления в качестве специфического метода в данный класс при компиляции. Это
позволяет автору частичного класса определить заглушку метода, а затем вызывать этот
метод из других мест класса. Если вы предоставляете код реализации для заглушки
частичного метода, то ваш код вызывается при вызове заглушки (фактически компилятор
объединяет ваш код и частичный класс в единый класс). Если вы не предоставляете определения
частичного метода, то компилятор делает еще один шаг ,и удаляет метод из класса (вместе
со всеми его вызовами).
Частичный метод (и частичный класс) был создан для того, чтобы помогать в
генерировании кода, и его использования в общем случае следует избегать (если только вы не пишете
генераторы кода или не работаете с ним), поскольку частичные методы могут вызвать в
вашем коде путаницу.
Конечно, в Visual Studio появляется все больше и больше встроенных генераторов кода.
Поэтому рано или поздно вы столкнетесь с частичными методами. В большинстве случаев
генератор кода или визуальный конструктор (такой как LINQ to SQL) генерирует частичный
класс и (возможно) один или несколько частичных методов. Модификатор Partial
определяет как частичные классы, так и частичные методы. Если вы работаете со
сгенерированным кодом, то часто будете получать частичный класс, который позволит создать вашу
собственную часть класса (для объединения со сгенерированной частью во время компиляции).
Таким образом, вы можете добавить собственную бизнес-логику в любой частичный метод,
определенный и вызываемый в сгенерированном коде.
Рассмотрим пример. Далее представлен экземпляр частичного класса Employee. Здесь
имеется единственное свойство Salary. Кроме того, есть метод (помеченный Partial)
SalaryChanged. Этот метод вызывается тогда, когда изменяется величина свойства Salary.
□ VB:
Partial Class Employee
Private _salary As Double
Property Salary() As Double
Get
Return _salary
End Get
Set(ByVal value As Double)
_salary = value
SalaryChanged()
End Set
End Property
Partial Private Sub SalaryChanged()
End Sub
End Class
96 Часть I. Введение в Visual Studio 2008
□ С#:
partial class Employee {
double _salary;
public double Salary {
get {
return _salary;
}
set "{
_salary = value;
SalaryChanged();
}
}
partial void SalaryChanged();
}
Предыдущий код мог бы быть кодом, созданным генератором кода. Следующая задача в
реализации частичного метода— это создание другого частичного класса Employee и
предоставление реализации метода SalaryChanged. Это делает следующий код:
□ VB:
Partial Class Employee
Private Sub SalaryChanged()
Dim newSalary As Double = Me.Salary
1 Делаем что-нибудь с информацией о заработной плате...
End Sub
End Class
□ C#:
partial class Employee {
partial void SalaryChanged() {
double newSalary = this.Salary;
// Делаем что-нибудь с информацией о заработной плате ...
}
}
Компилятор заменяет метод SalaryChanged новым частичным методом. Таким образом,
исходный частичный класс (возможно, сгенерированный) рассчитывал на метод, который
мог быть где-то написан, причем не зная ничего об этом методе. Если вы примете решение
написать его, тогда он будет вызван в надлежащее время. Однако это необязательно. Если
вы не предоставите реализацию частичного метода SalaryChanged, то компилятор
ликвидирует и сам метод, и его вызовы — как будто они никогда и не существовали.
Глава 3. .NET Framework и языковые улучшения в версии 2008 97
Доступ к данным и выполнение запросов
при помощи .NET-языков
Ббльшая часть особенностей Visual Studio 2008 с точки зрения языков относится к новой
функциональной возможности LINQ (Language-Integrated Query, встроенный язык
запросов). LINQ— это новая модель программирования, которая использует многие уже
обсуждавшиеся функции. Она предоставляет расширения языков, которые должны изменить
способ, используемый вами для доступа к данным и работы с ними. С ее помощью вы можете
работать с вашими данными с использованием объектного синтаксиса и делать запросы к
коллекциям объектов при помощи VB и С#.
Вы можете использовать LINQ для установления соответствия между таблицами и
объектами (см. главу 18). Таким образом, вы получаете более простой и производительный способ
работы с вашими данными. Сюда входит также полная поддержка технологии IntelliSense
(по названиям таблиц и столбцов), а также поддержка управления вставками, обновлениями,
удалениями и чтением.
Последнее — чтение данных — составляет важную часть LINQ в том смысле, что оно имеет
встроенную поддержку запросов к коллекциям данных. При помощи функциональных
возможностей LINQ вы можете делать запросы не только к вашим данным, но и к любой
коллекции в .NET. Безусловно, имеются для этого и новые ключевые слова, и синтаксис. В
составе Visual Basic имеются операторы Select, From, Where, Join, Order By, Group By,
Skip, Take, Aggregate, Let и Distinct. Язык С# имеет похожий набор ключевых слов.
И если этого недостаточно, то вы можете расширить встроенные операторы запросов,
заменить их или написать собственные.
Вы используете эти операторы запросов для выполнения запросов к любым данным .NET,
реализующим интерфейс IEnumerable или IQueryable. Это может быть DataTable,
объекты SQL Server, коллекции .NET (в том числе Generics, DataSets и данные XML).
Рассмотрим пример. Предположим, что у вас была коллекция объектов служащих
employees, и вы хотели получить доступ ко всем служащим в определенном месте. Для
этого вы можете написать следующую функцию:
□ С#:
public static List<Employee> FilterEmployeesByLocation(
List<Employee> employees, string location) {
// Запрос LINQ для получения коллекции служащих, отфильтрованной по месту
var emps = from Employee in employees
where Employee.Location.City == location
select Employee;
return emps.ToList();
}
□ VB:
Public Function FilterEmployeesByLocation( _
ByVal employees As List(Of Employee), _
ByVal location As String) As List(Of Employee)
98
Часть I. Введение в Visual Studio 2008
1 Запрос LINQ для получения коллекции служащих,
' отфильтрованной по месту
Dim emps = From Employee In employees _
Where Employee.Location.City = location
Return emps.ToList()
End Function
Взгляните на то, что происходит в предыдущем фрагменте кода. Функция принимает список
объектов служащих, фильтрует его по переданному в нее региону, а затем возвращает
результирующий список. Обратите внимание, что для фильтрации списка мы создаем в
оперативной памяти LINQ-запрос emps. Этот запрос можно читать так: рассматривая всех
служащих коллекции employees, необходимо отыскать тех, чей город совпадает с городом,
переданным в функцию. Наконец, вызов метода emps. ToList () в операторе возврата
преобразует результаты запроса в памяти в новую коллекцию.
Это только краткий обзор LINQ. В нем есть еще много всего, в том числе и проверка во
время компиляции, и проверка правильности схемы, не говоря уже о новом синтаксисе
LINQ. Вы, несомненно, захотите посвятить LINQ побольше времени в самом ближайшем
будущем.
Разбиение сборки на несколько файлов
Версия 2005 языка С# ввела концепцию дружественных сборок. Эта функциональная
особенность позволяет вам комбинировать сборки в смысле внутреннего доступа. То есть вы
можете определять внутренние члены, но иметь к ним доступ из внешних сборок. Эта
возможность полезна тогда, когда вы собираетесь разбить сборку на несколько физических
файлов, но хотите, чтобы эти сборки были по-прежнему доступны друг для друга.
Разработчики на Visual Basic теперь имеют эту функциональную возможность в версии 2008.
Примечание
Дружественные сборки не дают доступа к закрытым (private) членам.
Для того чтобы пометить сборку как предоставляющую свои внутренние члены другой
сборке, используется атрибут InternalsVisibleToAttribute. Этот атрибут применяется
на уровне сборки. Вы передаете в атрибут название и маркер открытого ключа внешней
сборки. После этого компилятор свяжет эти две сборки как дружественные. Сборка, в кото-
'рой содержится InternalsVisibleToAttribute, будет предоставлять свои внутренние
члены другой сборке (но не наоборот). Вы можете также сделать это и при помощи опций
компилятора командной строки.
Дружественные сборки (как и все на этом свете) — удовольствие не бесплатное. Если вы
определяете сборку как дружественную для другой сборки, то эти две сборки становятся
парой и должны существовать вместе (для того чтобы их можно было использовать). Это
может вызвать путаницу и осложнить управление вашими сборками. Обычно проще
воздерживаться от использования этой возможности (если только у вас нет совершенно
определенной потребности в ней).
Глава 3. .NET Framework и языковые улучшения в версии 2008
99
Работа с XML непосредственно в коде
Теперь вы можете внедрять XML непосредственно в ваш код на Visual Basic. Это может
значительно облегчить создание в VB сообщений XML и выполнение запросов по XML.
Для поддержки этой функциональной возможности VB позволяет вам писать
непосредственно на XML при использовании типов данных System.Xml. Linq.XElement и
System.Xml.Linq.XDocument. Первый позволяет вам создать переменную и присвоить
ей элемент XML. Второй используется для присваивания переменной документа XML
(целиком).
Примечание
Мы описываем здесь то, как VB позволяет вам писать код XML. Эти два объекта
(XElement и XDocument) являются важными дополнениями и для разработчиков на
языке С#. Однако разработчики на языке С# будут работать со свойствами и
методами этих объектов напрямую (и не будут писать XML и производить его синтаксический
разбор непосредственно в редакторе кода).
Написание XML внутри вашего кода — это структурированный процесс, а не просто строки
для движка синтаксического разбора. Фактически "за кулисами" компилятор использует
LINQ to XML для того, чтобы все это работало. Рассмотрим простой пример. Следующий
код создает переменную emp типа XElement. Затем он присваивает этой переменной
фрагмент XML:
Dim emp As XElement = <employee>
<firstName>Joe Smith</firstName>
<title>Sr. Developer</title>
<company>Contoso</company>
<location state="WA">Redmond</location>
</employee>
Вы можете создать похожий фрагмент как XDocument. Вы просто добавите определение
документа XML — это (<?xml version="l. 0"?>) —в заголовок XML. В любом случае в
итоге у вас получится XML, которым можно манипулировать, передавать как сообщение,
делать к нему запросы и т. д.
Однако в большинстве случаев вы не захотите жестко кодировать ваши XML-сообщения в
вашем коде. Вы можете определить в коде структуру XML, но данные поступят из других
источников (переменные, базы данных и т. д.). К счастью, Visual Basic поддерживает также
создание XML при помощи выражений. Для этого надо использовать синтаксис в стиле
ASP, как в <%= expression%>. В этом случае вы указываете компилятору, что хотите
вычислить выражение и присвоить его XML. Для сообщений XML с повторяющимися
данными вы можете даже определить цикл в вашем выражении. Для примера рассмотрим
создание предыдущего XML при помощи этого синтаксиса. Предположим, что у вас есть объект
е, который представляет собой служащего. В этом случае вы можете написать присваивание
XElement так, как показано здесь:
Dim e As Employee = New Employee ()
Dim emp As XElement = <employee>
<firstName><%= e.FirstName %></firstName>
<lastName><%= e.LastName %></lastName>
100
Часть I. Введение в Visual Studio 2008
<title><%= e.Title %></title>
<company><%= e.Company %></company>
<location state=<%= e.Location.State %»
<%= e.Location.City %>
</location>
</employee>
Удаление неиспользуемых аргументов
из обработчиков событий (только для VB)
Visual Basic теперь позволяет вам опускать неиспользуемые и нежелательные аргументы
ваших обработчиков ошибок. Идея состоит в том, что это позволит получить более
читабельный код. Кроме того, это позволяет вам присваивать методы непосредственно
обработчикам ошибок (не пытаясь определить для события надлежащую сигнатуру).
Для примера предположим, что у вас есть следующий код для обработки события нажатия
кнопки:
Private Sub Buttonl_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Buttonl.Click
1 Здесь будет ваш код
End Sub
Вы можете удалить из этого кода обработчики ошибок (или никогда не вводить их сюда).
Ваш новый код будет работать точно так же, а выглядеть он будет так:
Private Sub Buttonl_Click() Handles Buttonl.Click
1 Здесь будет ваш код
End Sub
*
Создание автоматически реализуемого свойства
(только для С#)
Новейшая версия С# допускает упрощенное объявление свойств, называемое
автоматически реализованными свойствами (auto-implemented properties). При помощи этой
функциональной возможности вы можете просто объявить свойство (без необходимости объявлять
локальное закрытое поле для поддержки свойства). Компилятор сам сделает это за вас. Это
может быть полезным тогда, когда вам не нужна программная логика внутри тех элементов,
которые получают доступ к свойству.
Для примера предположим, что вам нужно свойство Name класса Employee. Вы можете
объявить это свойство без настройки переменной закрытого поля:
public string Name { get; set; }
Обратите внимание, что программной логики в операторах get и set нет. Компилятор
создаст за вас анонимное поле для поддержки свойства. Кроме того, технология IntelliSense
редактора кода языка С# еще больше ускоряет это объявление свойства. Просто введите
Глава 3. .NET Framework и языковые улучшения в версии 2008
101
prop для того, чтобы получить кодовую заглушку в виде фрагмента кода (с соблюдением
синтаксиса автоматически реализованных свойств).
Улучшения в .NET Framework 3.5
В .NET Framework 3.5 имеется много новых классов и функциональных возможностей. Эта
новейшая версия основана на предыдущей версии. .NET Framework 2.0 (а также пакет
обновлений SP1) добавила много новых базовых классов, интерфейсов, обобщений и т.д.
Промежуточная редакция (.NET Framework 3.0), которая поставляется с Windows Vista,
заложила поддержку Windows Presentation Foundation (WPF), Windows Communication
Foundation (WCF) и Windows Workflow Foundation,(WF). Данная новейшая редакция продолжает
расширять версию 3.0. Версия .NET Framework 3.5 включает LINQ, переработанную
ASP.NET, Add-In Framework, SQL Synch Services и т. д.
Конечно, мы не можем подробно описать все эти функциональные возможности в таком
ограниченном объеме. Поэтому мы просто выделим некоторые ключевые дополнения и
улучшения этой версии .NET Framework. Многие из них описываются в этой книге более
подробно.
Примечание
Если вы инсталлировали версию 2.0, SP1 для 2.0 или SP1 для 3.0, то вам будет
приятно узнать, что версию 3.5 можно инсталлировать вместе с предыдущими версиями
Framework.
□ ASP.NET. .NET Framework 3.5 включает много новых улучшений для разработчиков
ASP.NET. Пространство имен System.Web, которое поддерживает ASP.NET, включает
много новых классов и элементов управления. Например, теперь Framework напрямую
поддерживает AJAX-программирование при помощи элементов управления
ScriptManager и UpdatePanel. Имеется также новый элемент управления для
отображения данных под названием ListView, объект источника данных под названием
LinqDataSource для работы с данными LINQ и объект DataPager для управления
разбиением на страницы записей данных в вашем приложении. Более подробно об
улучшениях ASP.NET читайте в главах 1 и 14.
О LINQ. Мы уже упоминали LINQ несколько раз. Следует однако заметить, что LINQ
встроен в .NET Framework. Сюда входит и пространство имен System.Linq, которое
определяет стандартные операторы запросов LINQ и типы. Пространство имен
System.Data.Linq является промежуточным звеном между базами данных и
подсистемой LINQ. Есть и другие пространства имен, имеющие отношение к LINQ, в том
числе: System.Data.Linq.Mapping для обработки объектных/реляционных соответствий
между LINQ и SQL (см. главу 18) и System.Xml. Linq для работы между XML и
подсистемой LINQ. Конечно, многие элементы управления были также обновлены для
работы с LINQ.
□ Add-In Framework. Пространство имен System.Addln является новым для .NET
Framework 3.5. Оно предоставляет классы и методы для разработчиков, желающих
создавать такие приложения, которые могут расширяться на основе общей структуры
дополнительных модулей. Например, класс AddlnStore позволяет обнаруживать и
управлять дополнительными модулями. Framework обеспечивает также контроль версий,
102
Часть I. Введение в Visual Studio 2008
изоляцию, активацию и песочницу безопасности. Если вы создаете новое приложение и
хотите, чтобы оно позволяло использовать дополнительные модули, то вам следует
поподробнее изучить это пространство имен.
□ Улучшения ClickOnce. Развертывание приложений в один щелчок в этой новейшей
версии .NET также продолжает улучшаться. Появилась возможность развертывания
приложения из нескольких местоположений, а также возможность использования
фирменного оформления ваших диалоговых окон развертывания.
П Windows Communication Foundation (WCF). Новое пространство имен
System. ServiceModel инкапсулирует то, что известно как WCF. С его помощью вы
можете без труда создавать ориентированные на сервис приложения, которые работают
через многие протоколы, транспорты и типы сообщений. WCF является важнейшим
компонентом .NET 3.5 и описывается более подробно в главе 20. Вот некоторые
возможности, включенные в WCF: предоставление и использование новостных лент RSS и
АТОМ с помощью пространства имен System. ServiceModel. Syndication;
взаимодействие с операциями Ajax с помощью формата данных JavaScript Object Notation
(JSON), встроенного в пространство имен System.Runtime. Serialization. Json;
использование модели Web-программирования WCF для создания сервисов REST
(representational state transfer) для взаимодействия непосредственно по HTTP (без SOAP).
Кроме того, WCF содержит новую систему управления идентификацией CardSpace.
□ Windows Presentation Foundation (WPF). Предоставляет новую технологию презентации
для приложений Windows. Эта технология распределена по всему пространству имен
System, windows и включает в себя поддержку создания приложений Windows на базе
XAML, ХВАР, векторной графики, а также двумерной и трехмерной графики. Более
подробную информацию см. в главах 16 и 17.
□ Windows Workflow Foundation (WF) Пространство имен System.Workflow, которое
было впервые введено в .NET 3.0, теперь расширено (и интегрировано в Visual Studio) в
редакции 3.5. WF позволяет вам создавать для ваших приложений как
последовательные рабочие процессы, так и рабочие процессы типа конечных автоматов, обеспечивать
их работу, сохранять их и т. д. Теперь WF также интегрирована и с WCF. Поэтому вы
можете без труда предоставить и вызвать рабочий процесс как сервис WCF. Подробнее
о WF читайте в главе 20.
О Трассировка и диагностика. Пространство имен System. Diagnostics содержит
новый класс EventSchemaTraceListener, который позволяет выполнять журналирова-
ние и трассировку от точки до точки между доменами, потоками и компьютерами.
□ Pipe Streams. Новое пространство имен System. 10. Pipes предоставляет поддержку
обмена как по именованным, так и по анонимным каналам. С его помощью вы можете
писать код, который ведет обмен на уровне каналов между процессами и
компьютерами. Например, класс NamedPipeServerStream можно использовать для чтения и
записи по именованному каналу. Пространство NamedPipeCli,entStream предоставляет
поддержку для клиента, ведущего обмен с серверами каналов.
□ Улучшения многопоточности. В пространстве имен System.Threading имеется новый
класс ReaderWriterLockSlim, который обеспечивает повышенную
производительность и уменьшает вероятность блокировок.
□ Добавления Time Zone. Имеются два новых типа, помогающих вам работать с
приложениями, которым нужно использовать множество временных зон. Это классы
Глава 3. .NET Framework и языковые улучшения в версии 2008
103
System. DateTimeOff set и TimeZonelnfo. Структура DateTimeOf fset представляет
собой точный момент времени. Это смещение по времени указывает, на сколько время
отличается от времени UTC (Universal Coordinated Time). Используйте этот новый класс
тогда, когда вам нужна точность и арифметика вычисления даты/времени.
Класс TimeZonelnfo— это приятное улучшение, которое представляет собой дату и
время в заданной временной зоне. Вы можете использовать этот класс для надежного
представления одной и той же даты и времени в разных временных зонах. Кроме того,
при необходимости вы можете использовать этот класс для создания собственных
временных зон.
О Поддержка одноранговых сетей. Наконец-то в .NET Framework появилась собственная
поддержка одноранговых сетей. Она содержится в пространстве имен
System.Net .PeerToPeer. С ее помощью вы можете создать приложение, которое
работает без сервера и просто ведет обмен одного клиента (узла) с другим (аналогично
приложению Groove фирмы Microsoft). Приложения, поддерживаемые этим новым
пространством имен, могут: отслеживать состояние клиентов (находятся ли они в
автономном режиме или подключены) и что они делают; взаимодействовать (вести обмен
сообщениями) между узлами; находить новые узлы и т. д.
□ Сервисы синхронизации для ADO.NET. Вместе с Visual Studio 2008 поставляются
сервисы синхронизации Sync Services. С их помощью вы можете создать приложение,
которое работает как в подключенном состоянии, так и в автономном режиме. Эти типы
приложений называются периодически подключенными приложениями (occasionally
connected applications (OCA)). Используйте сервисы синхронизации (и их инструменты)
для того, чтобы указать, какие именно данные должны быть доступны тогда, когда
пользователь находится в автономном режиме. При появлении подключения сервисы
синхронизации выполняют синхронизацию пользовательских изменений и изменений
базы данных.
Сервисы синхронизации для ADO.NET являются частью пространства имен
Microsoft . Synchronization. Data. Обратите внимание, что оно не является частью
System и поэтому является не главной частью .NET Framework, а дополнительной
библиотекой фирмы Microsoft. Сервисы ADO.NET — это фактически часть того, что
называется Microsoft Sync Framework. Эта инфраструктура обеспечивает сервисы
синхронизации для данных (ADO.NET), файлов и каталогов (File System) и лент новостей
RSS/ATOM (FeedSync).
□ Поддержка Windows Vista. Ядро Windows Forms было переработано для того, чтобы
обеспечить вашим приложениям поддержку операционной системы Vista. Это означает,
что после обновления ваши приложения получат внешний вид Vista. Кроме того, теперь
у вас есть доступ к общим диалогам Vista (System. Windows . Forms . FileDialog).
Например, OpenFileDialog и SaveFileDialog поддерживают тот самый интерфейс,
который вы видите в Windows Vista при открывании и сохранении файлов.
□ .NET Compact Framework. С версией .NET Framework 3.5 поставляется также и новая
версия .NET Compact Framework. Эта инфраструктура используется на широко
распространенных мобильных устройствах, таких как смартфоны и устройства под
управлением Windows Mobile/CE. Эта более быстрая версия предоставляет поддержку WCF,
LINQ, а также улучшенную отладку и диагностику.
104
Часть I. Введение в Visual Studio 2008
Резюме
В этой главе были представлены основные улучшения .NET-языков, которые поставляются
с Visual Studio 2008. Эти дополнения должны помочь вам писать больше хорошего кода.
Мы описали выведение типа ваших данных компилятором, инициализацию объектов при их
конструировании, добавление кода реализации методов в сгенерированный частичный
метод и многое другое. Эти улучшения языков С# и VB дают дальнейшее развитие
инструментальным средствам .NET и помогают увеличить продуктивность вашего труда и ваши
возможности.
И наконец, в этой главе были кратко описаны некоторые новые элементы .NET Framework
3.5. Конечно, в ней есть еще много нового. Framework становится такой большой, что
разработчикам (и книгам) часто приходится специализироваться в какой-либо одной области.
Мы предлагаем вам взглянуть на наш список улучшений, а затем перейти для дальнейшего
изучения к той области, в которой вы специализируетесь.
ЧАСТЬ II
Подробности о IDE
Глава 4
Решения и проекты
Решения и проекты — это контейнеры, которые Visual Studio использует для размещения и
группировки кода, который вы пишете в интегрированной среде. Решения — это
виртуальные контейнеры; они группируют и применяют свойства к одному (или нескольким)
проектам. Проекты имеют и виртуальный, и физический характер. Помимо функционирования в
качестве организационных единиц для вашего кода они также однозначно соответствуют
результатам, получаемым на выходе компилятора. Иначе говоря, Visual Studio превращает
проекты в откомпилированный код. Каждый проект приводит к созданию .NET-компонента
(такого как файл с расширением dll или ехе).
В этой главе мы опишем роль решений и проектов в процессе разработки программного
обеспечения. Мы увидим, как создавать решения и проекты, изучим их физические
характеристики и обсудим способы наилучшего использования их функциональных возможностей.
Разбираемся с решениями
С точки зрения программирования — все, что вы делаете внутри Visual Studio, происходит в
контексте решения. Как мы уже упоминали, сами по себе решения не делают ничего, кроме
того, что служат контейнерами высокого уровня для прочих элементов. Проекты — это
самые очевидные элементы, которые можно поместить внутрь решений, но решения также
могут содержать разнообразные файлы, которые необходимы для самого решения (такие
как документы Readme и диаграммы проекта). Фактически в решение может быть добавлен
файл любого типа. Однако решения не могут содержать другие решения. Кроме того, Visual
Studio может открыть только одно решение единовременно. Если вам нужно работать над
несколькими решениями одновременно, то вам придется запустить еще один экземпляр
Visual Studio.
Итак, что же решения приносят в процесс разработки? Решения полезны, поскольку они
позволяют вам обращаться с разными проектами как с единым элементом работы. Путем
группирования проектов в одно решение вы можете работать с ними в одном экземпляре
Visual Studio. Кроме того, решение упрощает некоторые задачи конфигурирования (вы
можете применять настройки ко всем дочерним проектам решения).
Вы можете также делать "сборку" решения. Как уже упоминалось, сами по себе решения как
таковые не компилируются, но составляющие их проекты могут собираться при помощи
5 3ак 3716
108
Часть II. Подробности о Ю<
одной команды сборки, выдаваемой для всего решения. Решение также является посреди*
ком при размещении файлов: поскольку многие элементы решения являются расположен
ными на жестком диске физическими файлами, то Visual Studio может разными способам
управлять этими файлами (удалять их, переименовывать, перемещать). Поэтому решени
оказываются очень удобными конструкциями Visual Studio.
Самым простым способом исследования возможностей и атрибутов решений является со:
дание решения в интегрированной среде.
Создание решения
Для разработки решения вы сначала создаете проект. Поскольку проекты в Visual Studi
независимо от решения загружаться не могут, то создание проекта приведет к одновремен
ному созданию и решения.
Примечание
В действительности существует все-таки способ создать пустое решение без однс
временного создания проекта. Если вы развернете узел Other Project Types, которьи
имеется в списке Project Types, то увидите вариант Visual Studio Solutions. В не*
есть шаблон Blank Solution (Пустое решение). Такое пустое решение полезно в тог
случае, когда вы создаете новое решение для уже существующих проектов; пусто»
решение избавляет от беспокойства по поводу создания на жестком диске лишни
ненужных проектов.
</> Start Page - .Microsoft Visual Studio
J«*J Edrt View Oat» Tools Test
few ►. Jfl
Developer Window Help
Project. CtrkShitVN p]| "jlji *|
j OP"» ► ! « Web Sit**. Shift* AH* N [ _ ~ X
j Close ! (H File. CM*N ЩШШ *
I ' Dose >oV :<n j
I iA $3<e>es<tediterr« CvUZ
I j S * * t $»■ sctetf itenr-} Л?
*? Save All Ctrt*Shrft>$
Fx|V ♦*"•"», at*.
Recent Files >
|| Recent Projects >
I Exit
I*
Create; °t( jVt
What'i new in Visual C#'
Oe*teY?jt Г 'stApp ic»« pn
HdwDoT *
Pc*i ый'Аьо ttana v.«jp*ttt
H-.* id tfivu* 5ft Им
_; :,,../,;„u'„;':,i?t;;,im„,L,
P
eject From Emeting Code». |BHH
ДгДВУЦрЦДИИЯИИиИЯНИИ '■
Unified C* 1.0 Si**iftc»«on Now Av«Ub
Tue, Л Aug200717:46:49GMT-The Juthc '
Specification wii written hy the people wh
implemented the G* language. This 500 pit v
now available for download
New Hands-on \>ЪьшА Sample* Aval*
Thu 09 Aug 20071B.51 42 GMT - Use these
familiar with the latest version of your f avo
Visual Studio 2008 Beta 2
Download VwmI Studio ?008 DeU 2
Thu, 09 Aug 200718 48:52 GMT - See all of
are coming in Visual Studio 2008 with next-
development, integrated development fort
system, and industry-leading designers for
The [volution Of LINQ And Its Impact On
Thu, 2* May 200717 J9 56 GMT - C* PM As
the relationship between UNQ and the пем 4
such as extension methods and lambda ety
Get the .NET Framework \5 Bet» 2
Thu, 09 Aug 200718 JO 42 GMT - The Micti
lb Beta 2 is the latest preview release of thr
support of ousting users, the NET Frimew<
number of breaking changes. Download it
- -:,[,..i ni(Mj
Ready
Ll.T....aa.-. ■■,,■■■■■■-■-. .ттттт^т.,,,, ,,:,■„', ■ ; . ■ ж,„;^Д4Кит
JSA». ..Л J!
r
__ _JA
Рис. 4.1. Меню File | New | Project
Глава 4. Решения и проекты
109
Откройте диалоговое окно New Project (при помощи File | New | Project (рис. 4.1) или
посредством клавиатурной комбинации <Ctrl>+<Shift>+<N>).
Появится диалоговое окно New Project с установками по умолчанию для названия и
местоположения проекта, а также названия решения (рис. 4.2). Мы подробно рассмотрим
различные типы проектов, имеющихся здесь, когда будем обсуждать проекты далее в этой главе.
Обратите внимание, что в нижней части этого диалогового окна имеется поле Solution
Name. Оно позволяет вам задать имя вашего решения (перед его созданием). Нажатие здесь
кнопки ОК приведет к двум вещам: на диске создается проект указанного типа с заданным
именем (в указанном местоположении), на диске создается также и решение с заданным
названием (вместе со ссылками на проект).
Если предположить, что вы выбрали нечто отличное от пустого проекта Blank Solution, то
Visual Studio сейчас показывает вновь созданное решение и проект в окне Solution Explorer
(мы подробно описываем Solution Explorer в главе 5). В результате Visual Studio создала
иерархию решения, показанную на рис. 4.3.
Project types
л Visual С»
Window*
Web
Office
Test
WCF
Workflow
, Database Projects
Other Languages
Distributed Systems
Other Project Types
■■ Test Projects
*
[emplates
Visual Studio installed tern plates
ijSwindove Forms Application
&-WPF Application
^Console Application
^Windows Service
CIWPF User Control Library
l^pReports Application
r»ty Templates
CPSearch Online Templates..
(.NET Framework 35
£3Class Library
^-WPF Browser Application
Э Empty Project
4k!jWPF Custom Control Library
^Windows Forms Control Library
*РШ
A project for creating an application with a Windows Forms user interface (.NET Framework 25)
blame WinoWsFormsAppbcationl
location:
CAUseMlpowers\D©cumentsWisual Studio 2D0S\Projects
Solution Narrjr WindowsFormsAppkcationl ^y] Create directory f ot sotufmn
firowse...
L^QK | ^ CffKfJ
Рис. 4.2. Диалоговое окно New Project
О Solution: WndowBAppikatlonl
.3 1
Project
Рис. 4.З. Иерархия простого решения
Если предположить, что вы приняли местоположения по умолчанию и не выставили флажок
Create directory for solution, то создается структура физических каталогов и файлов
(рис. 4.4).
110
Часть II. Подробности о IDE
а Ш Desktop
л Щ {powers
>■ ,.: AppData
I Щ\ Contacts
и В Desktop
л Ц_ Document?
а ., Visual Studio 2008
. t< Backup Files
% j» Code Snippets
a J4 Projects
i $, ContosoCommonFramework
I s> VSMacrosSO
I I, WindowsApphcation2
a *< WindowsFormsAppficationl
a |» WindowsFormsApplicationl
л $j bin
j> Debug
A ^ obj
^ ¥> Debug
{> TempPE
J Properties
Рис. 4.4. Иерархия файлов решения
В этом примере первый каталог WindowsFormsApplicationl содержит файл решения и имеет
подкаталог для каждого проекта. Второй каталог WindowsFormsApplicationl содержит
новый проект Windows Forms. Исходные файлы помещаются в корень этого каталога, а любые
откомпилированные выходные файлы находятся в каталоге bin и дальше— в подкаталогах
для конкретных конфигураций сборки (например, Debug или Release).
Предостережение
По умолчанию решение получает имя проекта. Здесь возможна путаница, поскольку
теперь у вас есть два каталога/объекта с названием WindowsFormsApplicationl, Один
относится к решению, другой — к проекту. Это не идеальный вариант физической
организации вашего кода на диске. Рекомендуется во время создания проекта давать
решению уникальное имя путем изменения названия по умолчанию, имеющегося в
поле Solution Name (см. рис. 4.2).
Файл определения решения
Visual Studio хранит информацию о решении внутри двух отдельных файлов: файла
определения решения и файла пользовательских опций решения. В предыдущем примере Visual Studio
создала в указанном каталоге файл определения решения WindowsFormsApplicationl.sin и
файл пользовательских опций решения WindowsFormsApplicationl.suo.
Файл определения решения отвечает за описание связей со всеми проектами решения и за
хранение различных атрибутов уровня решения (которые можно настроить). Файл
пользовательских опций решения хранит все настройки, которые вы (как пользователь Visual
Studio) сделали в смысле способа отображения решения внутри интегрированной среды
разработки (разворачивается ли решение, какие документы решения открыты в
интегрированной среде). Кроме того, здесь хранятся также определенные настройки управления
исходными текстами и прочие конфигурационные данные интегрированной среды.
Глава 4 Решения и проекты
111
Файл пользовательских опций решения является по умолчанию скрытым и имеет двоичное
содержимое. Поскольку его внутренняя структура официально не документирована, то мы
не будем пытаться ее здесь исследовать. Однако файл определения решения — это простой
текстовый файл. В листинге 4.1 показано содержимое файла для очень сложного решения.
; Листинг 4.1. Образец файла решънш
Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Contoso.Fx.Integration",
"ClassLibraryl\Contoso.Fx.Integration.csproj", "{DA0BA585-7 6C1-4F5E-B7EF-
57254E185BE4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Contoso.Fx.Common",
"Contoso .Fx.Common\Contoso.Fx.Common.csproj", "{A7 0 6BCAC-8 FD7-4 D8A-AC81-
249ED61FDE72}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F7 9EFBC}") = "Contoso.Fx.Analysis",
"Contoso.Fx.AnalysisXContoso.Fx.Analysis.csproj", "{EB7D75D7-76FC-4EC0-A11E-
2B54849CF6EB}"
EndProject
Project("{FAE04EC0-301F-llD3-BF4B-00C04F79EFBC}") = "Contoso.Fx.UI",
"Contoso. Fx.UI\Contoso.Fx.UI.csproj", "{98317C19-F6E7-42AE-AC07-72425E851185}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Architecture Models",
"Architecture Models", "{60777432-3B66-4E03-A337-0366F7E0C864}"
ProjectSection(Solutionltems) = postProject
ContosoSystemDiagram.sd = ContosoSystemDiagram. sd
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") =
"Contoso .UI.WindowsForms.OrderEntry",
"Contoso .UI.WindowsForms.OrderEntry\Contoso.UI.WindowsForms.OrderEntry.csproj",
"{49C79375-6238-40F1-94C8-4183B466FD79}"
EndProject
Project("{2150E333-8FDC-42A3-9474-lA3956D46DE8}") = "Class Libraries", "Class
Libraries", "{E547969C-1B23-42DE-B2BB-A13B7E844A2B}"\
EndProject
Project ("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Controls", "Controls",
"{ED2D843C-A708-41BE-BB52-35BFE4493035}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release I Any CPU = Release|Any CPU
EndGlobalSection
112
Часть II. Подробности о IDE
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{DA0BA585-76Cl-4F5E-B7EF-57254E185BE4}.Debug|Any CPU.ActiveCfg = Debugl
Any CPU
{DA0BA585-7 6Cl-4F5E-B7EF-57254E185BE4}.Debug|Any CPU.Build.0 = Debugl Any
CPU
{DA0BA585-76Cl-4F5E-B7EF-57254E185BE4}.Release|Any CPU.ActiveCfg =
Release | Any CPU
{DA0BA585-76C1-4F5E-B7EF-57254E185BE4}.Release | Any CPU.Build.0 = Release!
Any CPU
{A706BCAC-8FD7-4D8A-AC81-249ED61FDE72}.Debug|Any CPU.ActiveCfg = Debugl
Any CPU
{A706BCAC-8FD7-4D8A-AC81-249ED61FDE72}.DebuglAny CPU.Build.0 = Debugl Any
CPU
{A706BCAC-8FD7-4D8A-AC81-249ED61FDE72}. Release | Any CPU.ActiveCfg =
Release I Any CPU
{A706BCAC-8FD7-4D8A-AC81-249ED61FDE72}.Release|Any CPU.Build.0 = Release|
Any CPU
{EB7D75D7-76FC-4EC0-A11E-2B54849CF6EB}.DebuglAny CPU.ActiveCfg = Debugl
Any CPU
{EB7D75D7-76FC-4EC0-A11E-2B54849CF6EB}.DebuglAny CPU.Build.0 = Debugl Any
CPU
{EB7D75D7-76FC-4EC0-A11E-2B54849CF6EB}.Release|Any CPU.ActiveCfg =
Release | Any CPU
{EB7D75D7-76FC-4EC0-A11E-2B54849CF6EB}.Release|Any CPU.Build.0 = Release|
Any CPU
{98317C19-F6E7-42AE-AC07-72425E851185}.DebuglAny CPU.ActiveCfg = Debugl
Any CPU
{98317C19-F6E7-42AE-AC07-72425E851185}.DebuglAny CPU.Build.0 = Debugl Any
CPU
{98317C19-F6E7-42AE-AC07-72425E851185}.Release I Any CPU.ActiveCfg =
Release | Any CPU
{98317C19-F6E7-42AE-AC07-72425E851185}.Release|Any CPU.Build.0 = Release|
Any CPU
{49C79375-6238-40F1-94C8-4183B466FD79}.DebuglAny CPU.ActiveCfg = Debugl
Any CPU
{49C79375-6238-40F1-94C8-4183B466FD79}.DebuglAny CPU.Build.0 = Debugl Any
CPU
{49C79375-6238-40Fl-94C8-4183B466FD79}.Release|Any CPU.ActiveCfg =
Release | Any CPU
{49C79375-6238-40Fl-94C8-4183B466FD79}.Release|Any CPU.Build.0 = Release|
Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{ED2D843C-A708-41BE-BB52-35BFE4493035} = {E547969C-1B23-42DE-B2BB-
A13B7E844A2B}
Глава 4. Решения и проекты
113
{EB7D75D7-76FC-4EC0-A11E-2B5484 9CF6EB} = {E547969C-1B23-42DE-B2BB-
А13В7Е844А2В}
{A706BCAC-8FD7-4D8A-AC81-249ED61FDE72} = {E547969C-1B23-42DE-B2BB-
А13В7Е844А2В}
{DA0BA585-76C1-4F5E-B7EF-57254E185BE4} = {E547969C-1B23-42DE-B2BB-
А13В7Е844А2В}
{98317C19-F6E7-42AE-AC07-72425E851185} = {ED2D843C-A708-41BE-BB52-
35BFE4493035}
EndGlobalSection
EndGlobal
В начале файла имеются ссылки на проекты, относящиеся к решению. Ссылки содержат
название проекта, его GUID и относительный путь к самому файлу проекта (подробнее о
файлах проектов см. далее).
Вы можете также видеть некоторые из конфигурационных атрибутов, примененных к
решению: например, видны настройки Debug и Release. Обратите внимание, что этот проект
содержит несколько каталогов решения: Architecture Models, Class Libraries и Controls. Они
представлены в файле решения почти таким же образом, как и проекты. Единственная
реальная разница состоит в том, что у них нет относительного пути.
Работа с решениями
После того как вы создали решейие, вы уже имеете основное средство взаимодействия с
базой ваших кодов. По существу, оно сводится к управлению способом сборки и
развертывания составляющих решение проектов и файлов. Решения также предоставляют
функциональные возможности, не имеющие отношения к проектам. Основным инструментом
манипулирования решениями и проектами является Solution Explorer. Этот инструмент
подробно обсуждается в главе 5. Здесь мы рассмотрим общие процедуры, используемые для
управления решениями (при помощи меню в Visual Studio). Помните, что большая часть
обсуждаемых здесь команд и действий может быть выполнена из Solution Explorer.
Элементы решения
На практике содержимое, которое вы добавляете в решение, чаще всего имеет отношение к
проектам. Но элементы можно добавлять и напрямую в решение. В собирательном смысле
термин "элемент решения" относится к любому "непроектному" файлу, который
включается в.решение. Поскольку мы знаем, что решения не могут компилироваться, то совершенно
очевидно, что добавленные на уровне решения файлы не имеют практического значения
(с точки зрения компиляции). Однако имеются различные причины, по которым вы можете
добавлять в ваше решение элементы. Например, это удобный способ хранения
документации, которая относится ко всему решению в целом. Поскольку вы можете добавить в
решение файл любого типа, то это может быть и документация, и заметки для других
разработчиков, и проектные спецификации, и даже файлы исходного кода из других решений
(которые могут иметь отношение к текущей работе).
По умолчанию Visual Studio поддерживает несколько типов элементов решения, которые
могут быть созданы непосредственно в интегрированной среде. Они группируются в четыре
114
Часть II. Подробности о IDE
категории. В каждой категории имеются различные типы файлов, которые могут
генерироваться в Visual Studio. В табл. 4.1 показаны поддерживаемые типы.
Таблица 4.1. Типы файлов, поддерживаемые в решениях
(посредством использования команды Add New Item)
Категория
General
Test Run Configuration
Тип элемента
Текстовый файл
Таблица стилей
Схема XML
Файл растрового изображения
Файл курсора
Класс Visual C#
Класс Visual Basic
Страница HTML
Файл XML
Файл XSLT
Файл значка
Шаблон собственного ресурса
Конфигурация тестового прогона
Расширение файла
txt
CSS
xsd
bmp
cur
cs
vb
html
xml
xsl
ico
ret
testrunconfig
Add N^w Item - Soluhon Items
l Categories.
J General
Performance
Distributed System Diagrams
Test Fun Configuration
j
I
|
AbUnklertfile.
| fcjame. TextFileltxt
!
Iemplatei.
Visual Studia installed templates
|s) Text File
A| Style Sheet
A| XML Schema
£1 Bitmap File
I Cursor File
^ Visual C* Class
*\ HTML Page
^ XML File
J XSLT File
tf| Icon File
_*dNative Resource Template
^j Visual Basic Class
L «Jl
19 laa&bd
sR j
i
■
i
i j
I
Cancel
Рис. 4.5. Добавление нового элемента решения
Глава 4. Решения и проекты
115
Примечание
Помните, что вы никак не ограничены по типу файла, добавляемого в решение.
Несмотря на то, что Visual Studio поддерживает только ограниченное количество типов
файлов (которые могут быть созданы внутри интегрированной среды), вы всегда
можете создать файл вне интегрированной среды, а затем добавить его в решение при
помощи команды Add Existing Item.
На рис. 4.5 показано диалоговое окно Add New Item - Solution Items, которое появляется
тогда, когда вы добавляете в решение новый элемент.
Каталоги решения
Для помощи в организации различных файлов вашего решения вы можете использовать
каталоги решения. Это виртуальные каталоги, которые полностью реализованы в Visual
Studio. Создание каталога решения не приводит к созданию физического каталога файлов на
диске; эти каталоги существуют исключительно для того, чтобы обеспечить еще один
уровень группирования внутри решения. Каталоги решения могут быть вложенными и
особенно полезны в больших решениях, которые содержат много различных проектов и
разнообразных файлов. Например, вы можете сгруппировать все проекты ваших Web-сервисов в
один каталог решения с именем Services, а элементы Windows Forms сгруппировать в
каталог UI. Файлы, которые добавлены в виртуальный каталог, физически хранятся на диске в
корневом каталоге структуры каталогов решения.
Кроме предоставления способа визуальной группировки элементов каталоги решения
позволяют также применять определенные команды ко всем проектам внутри
индивидуального каталога. Например, вы можете "выгрузить" все проекты виртуального каталога (при
помощи команды unload для виртуального каталога, при этом данные проекты станут
временно недоступны для решения; это может быть полезным при отыскивании проблем
сборки или решения). После выгрузки проектов каталога можно опять загрузить проекты
обратно (при помощи щелчка правой кнопкой мыши по каталогу решения).
Свойства решения
Внутри интегрированной среды можно настроить несколько свойств уровня решения.
Диалоговое окно Solution Property Pages дает вам непосредственный доступ к этим свойствам
и позволяет:
П настроить стартовый проект решения (этот проект будет запущен при старте
отладчика);
П управлять межпроектными зависимостями;
□ указать местоположение исходных файлов (для использования при отладке);
□ модифицировать конфигурации сборки решения.
Открывается это диалоговое окно через меню View | Property Pages или при помощи
комбинации клавиш <Shift>+<F4>. В этом диалоговом окне категории страниц свойств
представлены в виде дерева с левой стороны; разворачивание узла дерева показывает
имеющиеся отдельные страницы свойств.
116
Часть II. Подробности о IDE
Указываем стартовый проект
На рис. 4.6 представлена страница свойств Startup Project. Она указывает, должен ли
стартовым проектом быть текущий выбранный проект, один проект или несколько проектов.
Solution ContojoCoflimonFramework' Property Pages
1 < -j ' ', WA *]_"'*■ MA
1
1
i
Common Properties
SUrtup Project
Project Dependencies
Debug Source Fife*
Configuration Properties
Configuration
< Current selection
«> Single startup project
[jCwrtwo^xUI
A> Multiple startup projects.
Project
! AdmmConsole
! ContoiO.Fx-Arulyirs
j ContmoFx Common
1 Contoso^x Integration
Contoso.Fx Ul
1 Contoso.ULWindowsForms.EmployeeStitus
j Contoso ULWindowsForms Ordertntry
' HplloWorld
i ToolsOpbonsPtgeWizard
• "i ,„-,.,<,,.■
14
Action
None
Norm
None
None
None
III
None
| OK ) | Cancel
[£ ШЕЙИ]
,V„> <«
•' *
*■
1 UPPfr
Рис. 4.6. Страница свойств Startup Project
По умолчанию указан единственный проект (и этот вариант используется чаще всего).
Проект задается в раскрывающемся списке. Если отмечен переключатель Current selection, то
стартовым будет считаться тот проект, на котором сейчас установлен фокус в Solution
Explorer.
При старте отладчика вы можете также запустить несколько проектов. Каждый проект,
загруженный на данный момент в решение, появится в списке с действием по умолчанию
None. Проекты, установленные в значение None, отладчиком выполняться не будут. Вы
можете также указать опции Start и Start Without Debugging. В полном соответствии со
своим названием действие Start приведет к выполнению указанного проекта внутри
отладчика; действие Start Without Debugging приведет к запуску проекта, но отлаживаться
он не будет.
Настройка зависимостей проекта
Если в решении есть проекты, которые зависят друг от друга, т. е. один проект зависит от
типов другого проекта и использует их, то Visual Studio должна знать порядок сборки
проектов. Для примера рассмотрим проект приложения Windows, который использует типы,
предоставляемые проектом библиотеки классов. Если в последовательности сборки сначала
не будет собрана библиотека классов, то процесс сборки закончится неудачно.
В большинстве случаев Visual Studio способна сама определить правильную
последовательность сборки. Однако иногда вам может понадобиться вручную указать, что некий проект
зависит от других проектов. Для предоставления такой информации используйте страницу
свойств Project Dependencies (рис. 4.7). Выберите проект в раскрывающемся списке, а за-
Глава 4. Решения и проекты
117
тем укажите, от каких решений он зависит (для этого нужно отметить проекты в окне списка
Depends on).
Solution 'CantosoConvnonFrtrnewonV Property P*J« '- ** Ш&Шш
',(••»'j<-j<, > ai * JN,A
! Common Properues j
| Startup Project
I j Project Dependencies. I
I Debug Source Files
j I Configuration Properties I
I Configuration
1
i\
1
i
i
•"j * -nctn W'A -j >:$г<«ол*к,о( М*«йзе» :
Project
Qependsorr
11 AdminCofiiOle i
L ] Contoso>rxArwrys» \ \
W Conroso.Fjf.Common \ \
lJ Contoso.FxJntegratian . j
i ) ContoM>.ULWindowsForms.EmptoyeeStitus ' i
П Contoso ULWindovwFomtt.OrderEntry . j
iDHriloWotld |
[ j ToofsOpuoniPageWrurd j !
i OK j | Caned | | fippiy
.-:■;. rr.Z.^r . ~ ... 'j
Рис. 4.7. Зависимости проектов
Местоположение файлов исходных кодов для отладки
В определенных ситуациях вам может понадобиться явно указать отладчику Visual Studio
файлы исходных кодов для использования в процессе работы отладчика.
Solution 'ContosoCommcmFRmrwcrfc' Property Pages
Т$Вш
\ы
i Common Properties
Startup Project
Project Dependencies
Debus, Source Files
i Configuration Properties
Configuration
Cc^*»5JUt .»r Ma^sger
Directories containing source code
0H*№
CAProgrem FrtesSrVficrosoft Visual Studio 8\VC\ot\src\
CAProgrem FitaAMfcrasoft Visual Studio 8\VC\atlmfc\src\mfc\
CAProgram FrlesNMicrosofr Visual Studio e\VC\aHmfc\srt\atr\
СЛProgram FtlesVMicrosoft Visual Studio 8\VC\atlmfc\include\
fio net look for these source Шее
Рис. 4.8. Местоположение исходных файлов
118
Часть II Подробности о IDE
Одна из таких ситуаций — это когда вы пытаетесь отлаживать решение, которое ссылается
на объект на удаленном компьютере. Если файл исходного кода для этого удаленного
объекта на локальном компьютере отсутствует, то вы можете явно указать для Visual Studio
файлы исходных кодов.
Страница свойств Debug Source Files (рис. 4.8) имеет два различных поля со списками.
Верхнее поле содержит перечень каталогов, в которых хранится исходный код для вашей
отладки. Нижнее поле позволяет указать те файлы, которые отладчик должен игнорировать
(т. е. не должен загружать) при отладке.
Для того чтобы добавить элемент в любое из полей, сначала поместите ваш курсор в поле, а
затем щелкните кнопку New Line (вверху справа в диалоговом окне). Это позволит вам
ввести полностью квалифицированный путь к нужному каталогу. Удаляется элемент путем его
выделения и последующего щелчка по кнопке Cut Line. Кнопка Check Entries позволяет
вам еще раз перепроверить, что все элементы указывают на правильные и доступные пути к
каталогам.
Если вы загрузили решение с проектами на языке Visual C++, то, вероятно, сразу же увидите
несколько элементов в списке Directories containing source code.
Свойства конфигурирования сборки
Конфигурации сборки подробно описываются в главе 10. На странице свойств Build
Configuration (рис. 4.9) укажите, как Visual Studio будет собирать проекты, содержащиеся в
данном решении. Для каждого проекта вы можете настроить конфигурацию и тип
платформы. Кроме того, флажок позволяет вам указать, нужно ли выполнять сборку
данного проекта.
Информацию по эффективному использованию конфигураций сборки в ваших разработках
см. в главе 10.
Solution 'ODntoioCamrnonFranwwork' Property Pag?5 # ^^
i
J
Configuration. Artr*e<D*bugJ ▼] Elatfornv Actrve(.MwedPlatform»}
Common Properties
Startup Project
Pfcject Dependencies
Debug Source Fifes.
Configuration Properties
Configuration
p£Oject contents (check the project
! Project
| AdminConsele
1 Ccmo50.hcAnar/SB
: Corrtoso.F*.Common
j Cantoso FxJntegration
, ContosoFxUi
i Ccntoso,UI WindcwsForms Emp
! Contoco.Ul WindowsForms Ord
I HelloWorld
ToalsOpttonsPageWuard
configurations to build
Configuration
Debug
Debug
Debug
Debug
fPgbug J
ueou^
Debug
Debug
-,
or deploy)-
Platform
Any CPU
An/CPU
AnyCPU
Any CPU
jtJ Any CPU
Ш Any CPU
Any CPU
Any CPU
Any CPU
r~sri
Configuration
Manager.- ] 1
Build
b.
Leissi'J
У '
'J, ■'
If
V i
2
у
L^. i
■J \
i
L*>\ ■<
Рис. 4.9. Свойства конфигурации сборки
Глава 4. Решения и проекты
119
Теперь, когда мы подробно описали концепцию решения, давайте изучим роль проектов в
Visual Studio.
Осваиваем проекты
Именно в проектах выполняется вся реальная работа в Visual Studio. Проекту соответствует
скомпилированный компонент. Visual Studio поддерживает различные типы проектов.
Давайте еще раз изучим процесс создания проекта.
Создание проекта
Как мы уже видели ранее при обсуждении создания решений, вы создаете проект
посредством выбора пунктов New | Project в меню File. Это приводит к открытию диалогового окна
New Project (рис. 4.10).
Ne«v Рш,ес*
Project types:
Миз С*
Window
Web
C'fite
Smart Crv
Database
WO
Wnrfcflc**
Datable» Pn,em
Qlr-er Ln^uegti
Distrr utcd Sy
Other Prrsect
Test Projects
Легг5
"v?«
Template*
Vit^ii Studio п$И11е« ♦emphtes
<J1 Wsrtdovw \orrrs Apphcat'cn
^~ WPF Application
^Щ С с г sole Applic ar or>
£wPF 1>ш Lontfc* Library
J3 Reports Applical cr>
My -Vrnplat»*!
< jj Search Online lerrjrletes,..
NET ~(jwt£*orl
ilCfaSsLhr3r/
fcwV>TFBro*«Pf Acp cation
jH! Fftpty Project
w WFf Г.ttton. <""^Afof f it"*?y
^Window»*, Fouri '.о»Л«с' Libia»
! / < r, ^
A project'sr cestr», an apolksfcon v<> th а Л racws -crra user nterfese (.Ml *-rame<vcrViJ>j
f;4r» e, W ndcwsSei^sAsp' cationl,
Ls.atioo С \L'it'i;\ pс>vef 5X>i.£utr«' ts\i sua stt.^ ci233^P»ojevb\CtmtoioCorrr-;:'r«
Sc ui an: <(T" Add to Sohban
Рис. 4.10. Добавление проекта в текущее решение
В табл. 4.2 показаны некоторые типы проектов, поддерживаемые Visual Studio.
Таблица 4.2. Поддерживаемые типы проектов
Тип
Database
Projects
Язык
Visual Basic, Visual C#
Шаблон
SQL Server Project
120
Часть II. Подробности о IDE
Таблица 4.2 (окончание)
Тип
Office
Smart Device
Test
Web
Windows
Язык
Visual Basic, Visual C#
Visual Basic, Visual C#
Visual C++
Visual Basic, Visual C#
Visual Basic, Visual C#
Visual Basic, Visual C#
Шаблон
Excel Workbook, Excel Template,
Word Document, Word Template
Pocket PC — Device Application,
Pocket PC — Control Library,
Pocket PC — Empty Project,
Pocket PC — Class Library,
Pocket PC — Console Application,
Smartphone 2003 — Device Application,
Smartphone 2003 — Console Application,
Smartphone 2003 — Class Library,
Smartphone 2003 — Empty Project,
Windows CE 5.0 — Device Application,
Windows CE 5.0 — Control Project,
Windows CE 5.0 — Empty Project,
Windows CE 5.0 — Class Library,
Windows CE 5.0 — Console Application
ATL Smart Device Project, MFC Smart Device
Project, Win32 Smart Device Project, MFC Smart
Device ActiveX Control, MFC Smart Device DLL
Test Project
ASP.NET Web Application,
ASP.NET AJAX Server Control,
ASP.NET Server Control,
ASP.NET Web Service Application,
ASP.NET AJAX Server Control Extender,
WCF Service Application
Windows Forms Application, Windows Control
Library, Console Application, Empty Project,
Class Library, Web Control Library, Windows
Service
Примечание
Visual Studio поддерживает возможность создания новых типов проектов и шаблонов.
Поскольку Visual Studio способна к такому расширению, то список типов проектов,
который вы видите в своем экземпляре Visual Studio, может значительно отличаться
(в зависимости от установленных на ваш компьютер Visual Studio SKU,
дополнительных модулей и расширений).
Как уже указывалось, создание нового проекта приведет также к созданию нового
содержащего его решения. Однако если вы создаете проект и у вас уже есть загруженное в
интегрированную среду решение, то диалоговое окно New Project предложит вам возможность
добавить новый проект в существующее решение. Сравните рис. 4.10 с рис. 4.2; обратите
внимание, что имеется новая опция в виде раскрывающегося списка, который позволяет вам
указать, должна ли Visual Studio создать новое решение, либо добавить проект в текущее
решение.
Глава 4. Решения и проекты
121
Проекты Web-сайтов
Для разработки проектов Web-сайтов в Visual Studio 2008 у разработчиков есть два
различных способа: проекты Web-приложений создаются при помощи диалога New Project,
который мы только что обсудили, а проекты Web-сайтов создаются насколько иначе. Вместо
выбора File | New | Project вы выбираете File | New | Web Site. После этого открывается
диалоговое окно New Web Site (рис. 4.11).
Так же как и другие типы проектов, проекты Web-сайтов вы начинаете с выбора одного из
предопределенных шаблонов. Кроме шаблона вы выбираете также целевой язык исходных
текстов и местоположение Web-сайта.
NewWebSete
Template»
Viuial Studio instilled templates
JlASP.NET Wtfc Silt
t* Empty Web Site
J3ASP.NET Reports Web 5rte
My Templates
. ijpSearch Onfcne Templates
& ASP.NET Web Service
J&WCF Service
A btanfc ASP NET Web sfte (.NET Framework 3.5)
Location. jft^lW№te. Ъ^гтнШМШ £»\Usef3\lpowejs\Documents\VtsualSi ▼ [ groove...
Language
HTTP I
FTP [
Рис. 4.11. Создание проекта нового Web-сайта
Местоположением может быть файловая система, сайт HTTP или FTP. В отличие от других
типов проектов Web-сайты обычно не создаются внутри физического дерева каталогов, в
котором хранится ваше решение. Даже при выборе файловой системы полученные
исходные файлы будут (по умолчанию) помещены в каталог Web Sites каталога projects
интегрированной среды Visual Studio 2008.
Примечание
Целевой язык исходных текстов для проекта Web-сайта просто означает язык,
который будет использоваться по умолчанию для любых файлов кода. Он не
ограничивает языков, которыми вы можете пользоваться в проекте. Например, проект Web-
сайта, созданный с языком С# в качестве целевого, может по-прежнему содержать
файлы кода на языке Visual Basic.
После того как вы создали Web-сайт, вы управляете им и обслуживаете его точно так же,
как и проекты других типов в интегрированной среде.
Вы можете заинтересоваться: в чем же разница между проектом Web-приложения и
проектом Web-сайта? Ключевая разница состоит в способе сборки этих двух разных типов проек-
122
Часть II Подробности о IDE
тов. Проекты Web-приложений используют ту же самую модель сборки, что и прочие типы
проектов .NET, т. е. весь код проекта компилируется в единую сборку. Проекты же Web-
сайтов поддерживают модель динамической сборки, при которой код конкретной страницы
генерируется на этапе выполнения — тогда, когда пользователь запрашивает эту страницу.
При такой модели каждая страница имеет собственную сборку. Между этими двумя типами
проектов имеется также много других отличий, которые мы подробно обсудим в главе 14.
Работа с файлами определения проектов
Так же как и решения, проекты хранят информацию о своей структуре внутри файла. Эти
файлы имеют различные расширения (в зависимости от базового языка). В табл. 4.3
показаны различные расширения, которые Visual Studio использует для идентификации файлов
проектов.
Таблица 4.3. Расширения файлов проектов
Расширение файла проекта
vbproj
csproj
vcproj
Язык
Visual Basic
Visual C#
Visual C++
Каждый файл определения проекта содержит всю необходимую информацию для описания
исходных файлов, а также по различным свойствам проекта и опциям, в том числе:
□ конфигурации сборки;
□ ссылки на проекты и зависимости;
□ местоположение исходных файлов кода и их типы.
Файлы определения проекта для языков Visual Basic и Visual C# подчиняются одной схеме.
В листинге 4.2 показан фрагмент файла определения проекта на языке Visual C#.
] Листинг 4.2, Содержимое файла определения проекта на языке Visual C#
<Project DefaultTargets="Build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
Configuration Condition=" '$(Configuration)' == f'">Debug</Configuration>
<Platform Condition»" ^(PlatformI == " ">AnyCPU</Platform>
<ProductVersion>8.0.50215</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{E22301Fl-5AD6-4514-A05D-266158ABlCAB}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>WindowsApplication2</RootNamespace>
Глава 4. Решения и проекты
123
<AssemblyName>WindowsApplication2</AssemblyName>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration) |$(Platform) ' =='Debug|AnyCPU'
">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup
Condition=" ^(Configuration) |$(Platform) ' =='Release IAnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Forml.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Forml.Designer.cs">
<DependentUpon>Forml.cs</DependentUpon>
</Compile>
<Compile Include="Program. cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
124
Часть II. Подробности о IDE
</EnibeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>
Этот файл определения проекта будет выглядеть примерно одинаково как в проекте на
языке Visual Basic, так и в проекте на Visual J#. Однако в файлах проекта на Visual C++
используется совершенно другая схема. Для полноты и для сравнения с Visual Basic/Visual C# в
листинге 4.3 полностью показан экземпляр файла определения проекта на Visual C++.
| Листинг 43. Файл определения проекта на Visual C++ |
<?xml version=.0" encoding="Windows-1252"?>
<VisualStudioProj ect
ProjectType="Visual C++"
Version="8.00"
Name="Contoso.Fx.UI.BrowserShim"
ProjectGUID="{BE574BF5-7FDA-46F2-A42E-4A35E5E338A0}"
RootNamespace="ContosoFxUIBrowserShim"
Keyword="MFCActiveXProj"
SignManifests="true">
<Platforms>
<Platform Name="Win32" />
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration Name="Debug|Win32" OutputDirectory="Debug"
IntermediateDirectory="Debug" ConfigurationType="
UseOfMFC=" CharacterSet="l">
Глава 4. Решения и проекты
125
<Tool Name="VCPreBuildEventTool" />
<Tool Name="VCCustomBuildTool" />
<Tool Name="VCXMLDataGeneratorTool" />
<Tool Name=,,VCWebServiceProxyGeneratorTool" />
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
MkTypLibCompatible="false"
TypeLibraryName="$(IntDir)/$(ProjectName).tlb"
HeaderFileName="$(ProjectName)idl.h"
ValidateParameters="false"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="
PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG;_USRDLL"
MinimalRebuild="true"
BasicRuntimeChecks="
RuntimeLibrary="
TreatWChar_tAsBuiltInType="true"
UsePrecompiledHeader="
WarningLevel="
Detect64BitPortabilityProblems="true"
DebugInformationFormat="
/>
<Tool Name="VCManagedResourceCompilerTool" />
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture=033"
AdditionalIncludeDirectories="$(IntDir)"
/>
<Tool Name="VCPreLinkEventTool" />
<Tool
Name="VCLinkerTool"
RegisterOutput="true"
OutputFile="$(OutDir)\$(ProjectName).ocx"
Linklncremental="
ModuleDefinitionFile=".\Contoso.Fx.UI.BrowserShim.def"
GenerateDebugInformation="true"
SubSystem="
126
Часть II. Подробности о IDE
TargetMachine="l"
/>
<Tool Name="VCALinkTool" />
<Tool Name="VCManifestTool" />
<Tool Name="VCXDCMakeTool" />
<Tool Name="VCBscMakeTool" />
<Tool Name="VCFxCopTool" />
<Tool Name="VCAppVerifierTool" />
<Tool Name="VCWebDeploymentTool" />
<Tool Name="VCPostBuildEventTool" />
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="Release"
Inte2nnediateDirectory="Release"
ConfigurationType="
UseOfMFC="
CharacterSet="l"
>
<Tool Name="VCPreBuildEventTool" />
<Tool Name="VCCustomBuildTool" />
<Tool Name="VCXMLDataGeneratorTool" />
<Tool Name="VCWebServiceProxyGeneratorTool" />
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="false"
TypeLibraryName="$(IntDir)/$(ProjectName).tlb"
HeaderFileName="$(ProjectName)idl.h"
ValidateParameters="false"
/>
<Tool
Name="VCCLCompilerTool"
0ptimization="
PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG;_USRDLL"
MinimalRebuild="false"
RuntimeLibrary="
TreatWChar_tAsBuiltInType="true"
UsePrecompiledHeader="
WarningLevel="
Detect64BitPortabilityProblems="true"
Глава 4. Решения и проекты
127
DebugInformationFormat=M
/>
<Tool Name="VCManagedResourceCompilerTool" />
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture=033"
AdditionalIncludeDirectories="$(IntDir)"
/>
<Tool Name="VCPreLinkEventTool" />
<Tool
Name="VCLinkerTooln
RegisterOutput="true"
OutputFile="$(OutDir)\$(ProjectName).ocx"
Linklncremental="l"
ModuleDefinitionFile=".\Contoso.Fx.UI.BrowserShim.def"
GenerateDebugInformation="true"
SubSystem="
0ptimizeReferences="
EnableC0MDATFolding=M
TargetMachine="l"
/>
<Tool Name="VCALinkTool" />
<Tool Name="VCManifestToolM />
<Tool Name="VCXDCMakeTool" />
<Tool Name="VCBscMakeTool" />
<Tool Name="VCFxCopTool" />
<Tool Name="VCAppVerifierTool" />
<Tool Name="VCWebDeploymentTool" />
<Tool Name="VCPostBuildEventTool" />
</Configuration>
</Configurations>
<References></References>
<Files>
<Filter Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737Fl-C7A5-4376-A066-2A32D752A2FF}">
<File RelativePath=" . \Contoso. Fx. UI. BrowserShim. cpp"x/File>
<File RelativePath=".\Contoso.Fx.UI.BrowserShim.def"></File>
<File RelativePath=".\Contoso.Fx.UI.BrowserShim.idl"x/File>
<File RelativePath=".\Contoso.Fx.UI.BrowserShimCtrl.cpp">
</File>
128
Часть II. Подробности о IDE
<File RelativePath=".\Contoso.Fx.UI.BrowserShimPropPage.cpp">
</File>
<File RelativePath=".\stdafx.cpp">
<FileConfiguration Name="Debug|Win32" >
<Tool Name="VCCLCompilerTool"
UsePrecompiledHeader="l" />
</FileConfiguration>
<FileConfiguration Name="Release|Win32">
<Tool Name="VCCLCompilerTool"
UsePrecompiledHeader="l" />
</FileCorifiguration>
</File>
</Filter>
<Filter„
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
Uniqueldentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
<File RelativePath=".\Contoso.Fx.UI.BrowserShim. h"x/File>
<File RelativePath=".\Contoso.Fx.UI.BrowserShimCtrl.h"x/File>
<File RelativePath=".\Contoso.Fx.UI.BrowserShimPropPage.h">
</File>
<File RelativePath=". \Resource. h"x/File>
<File RelativePath=". \stdafx. h"x/File>
</Filter>
<Filter Name="Resource Files"
Fil-
ter="rc;ico;cur;bmp;dlg;rc2;ret;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif ;png; wav"
Uniqueldentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
<File RelativePath=".\Contoso.Fx.UI.BrowserShim.ico"x/File>
<File RelativePath=".\Contoso.Fx.UI.BrowserShim.rc"x/File>
<File RelativePath=".\Contoso.Fx.UI.BrowserShimCtrl. bmp"x/File>
</Filter>
<File RelativePath=".\ReadMe.txt"></File>
</Files>
<Globalsx/Globals>
</VisualStudioProject>
Работа с проектами
Будучи контейнерами исходных кодов, проекты в принципе работают как средство
применения настроек. Они используются для управления и организации ваших исходных файлов
кода, а также различных настроек, связанных в целом со сборкой и процессом компиляции
(мы подробно описываем процесс сборки в главе 10). Так же как и решения, проекты могут
Глава 4. Решения и проекты
129
содержать различные элементы, которые имеют отношение к их разработке. Проекты
специфичны в отношении языка. Вы не можете смешивать различные языки внутри одного
проекта. Решения такого ограничения не имеют — решение может содержать много
проектов, каждый из которых может быть на другом языке.
Элементы проекта
После создания проекта он будет (по умолчанию) содержать один или более элементов
проекта. Эти элементы по умолчанию будут отличаться в зависимости от выбранного вами
шаблона проекта и от языка проекта. Например, создание проекта при помощи шаблона
приложения Windows для языка С# приведет к формированию файлов Forml.cs,
Forml.Designer.cs и Program.cs. Проекты также настраиваются ссылками и свойствами,
которые имеют смысл только для данного типа проекта — шаблон приложения Windows
содержит ссылку на сборку System.Windows.Forms, в то время как шаблон библиотеки классов
ее не содержит.
Проекты (подобно решениям) могут также иметь подкаталоги, которые вы можете
использовать для управления элементами проекта и их группировки. В отличие от решений
создаваемые вами в проектах каталоги являются физическими; они создаются на диске в
структуре каталогов вашего проекта. Каталоги— это пример физических элементов проекта.
Файлы исходного кода — также физические.
Проекты могут также содержать виртуальные элементы — являющиеся только указателями
или ссылками на элементы, которые не проявляются физически в структуре вашего проекта.
Например, это ссылки на другие сборки, подключения к базам данных, виртуальные
каталоги (см. главу 5). На рис. 4.12 показаны решение и проект.
О ЗЫивоп; WndowaAppfctflonl I
\Ш Ягфсе I
Wtodo«sApplfc«tianl
Рис. 4.12. Структура проекта
Свойства проекта
Подобно свойствам решения, свойства проекта просматриваются и настраиваются при
помощи набора страниц свойств, доступ к которым можно получить через меню Project |
Properties. Эти страницы свойств находятся в диалоговом окне, которое называется
конструктором проекта (Project Designer). На рис. 4.13 показан конструктор проекта, в котором
отображен простой проект библиотеки классов на Visual Basic. Разные языки и разные типы
проектов приведут к появлению разных страниц свойств в конструкторе проектов.
Например, страница свойств Application для проекта на Visual Basic содержит несколько другую
130
Часть //. Подробности о IDE
информацию и выглядит иначе, чем идентичный проект на Visual C# (хотя основная цель
страницы остается той же самой).
Application
Сотри*
Debug
Reference*
Resources
Services
Setting*
Signing
My Exterme*»
Code Analysts
Assembly name:
f.Vb' Л< Ustornck.se.
Root namespace:
mmmmm
Application type,
Cl«* Ubrvy
Startup object
[None)
[ Assembly Wwmaiwn>.,
II
V*e*UAC
UserManagen
Jcoi*
"\
Setting*
Рис. 4.13. Настройка свойств при помощи Project Designer
В общем случае, вы используете свойства проекта для управления: -
□ общими атрибутами проекта, такими как название сборки и тип проекта;
□ способом сборки/компиляции проекта;
□ конфигурацией отладчика для проекта;
□ ресурсов, используемых проектом;
□ подписями и настройками системы безопасности.
Давайте изучим некоторые из самых часто используемых страниц свойств проекта и кратко
обсудим опции, которые можно настроить в каждой из них.
□ Application. Страница свойств Application позволяет вам настраивать название сборки,
корневое пространство имен (и пространство по умолчанию), тип приложения и выхода,
а также стартовый объект. Для приложений Windows Forms через эту страницу
настраиваются также режимы аутентификации и визуальные стили. Обратите внимание, что
имеющиеся в этом диалоге опции зависят от типа проекта и выбранного языка.
• Assembly name— это имя сборки, которая будет получена в результате
компиляции проекта. По умолчанию совпадает с именем проекта. Используемое
расширение определяется выходным типом проекта.
Глава 4. Решения и проекты
131
• Root/Default namespace — здесь указывается пространство имен, которое
используется всеми типами, объявленными в проекте. Это свойство можно также объявить
вручную в коде.
• Output type — для проектов на Visual Basic обозначается как Application type. Это
значение определяет выходной тип проекта (библиотека классов, приложение
Windows, консольное приложение).
. • Startup object — этот объект используется для настройки точки входа проекта. Для
приложений Windows это будет форма по умолчанию (или в случае С# —
программная точка входа для формы), которая должна запускаться при выполнении
приложения. Для консольных приложений это будет главная процедура, которая
реализует консоль. Проекты библиотек классов не имеют точки входа и будут иметь
здесь значение Not set.
• Icon — это значок для сборки. Опция не применима для библиотек классов или
Web-проектов.
• Resource file— это текстовое поле можно использовать для указания пути и имени
файла ресурсов. Файлы ресурсов содержат неисполняемое содержимое (такое как
строки, изображения или даже сохраненные объекты), которые необходимо
развертывать вместе с приложением.
• Visual styles— флажок Enable XP visual styles позволяет вам указать, будет ли
приложение поддерживать темы оформления ХР. Эта опция не применима ни к
каким проектам, кроме проектов приложений Windows.
• Windows application framework properties— Visual Basic предоставляет набор
свойств, которые специфичны для проектов приложений Windows. Эти свойства
позволяют вам настраивать начальную заставку проекта, поддерживаемый
проектом режим аутентификации (аутентификация Windows или самого приложения) и
режим завершения проекта. Режим завершения указывает, должно ли приложение
завершаться при закрывании начальной формы или после закрывания последней
загруженной формы приложения.
□ Build. Страница свойств Build используется с проектами на Visual C# для подстройки
установок, которые связаны с конфигурациями сборки. При помощи этого диалогового
окна вы можете выбрать, нужно ли включать константы debug и trace и указать
символы условной компиляции. Здесь находятся также настройки уровней предупреждений
и ошибок, а также выхода сборки. Более подробное исследование имеющихся здесь
опций см. в главе 10.
□ Build Events. Для каждого проекта Visual Studio порождает событие перед сборкой и
событие после нее. На этой странице вы можете указать команды, которые должны
быть выполнены при возникновении этих событий. Здесь можно также указать
варианты порождения события после сборки: всегда, только после успешной сборки или
только тогда, когда сборка обновляет вывод проекта. События сборки особенно полезны для
запуска системных и модульных тестов для только что перекомпилированных проектов.
Если вы запустите набор модульных тестов из события после сборки, то цикл
тестирования будет встроен в цикл сборки.
132
Часть II. Подробности о IDE
Примечание
Если вы укажете команды в событии до сборки или событии после сборки, то Visual
Studio создаст командный файл для каждого события и поместит их в каталог
bin\debug. Эти файлы (с именами PreBuildEvent.bat и PostBuildEvent.bat) будут
содержать команды, которые вы ввели на странице свойств Build Events. В случае
возникновения ошибки при выполнении команд событий сборки вы можете вручную изучить
и запустить эти файлы (для выявления ошибки).
□ Compile (только для VB). Страница свойств Compile используется в проектах на Visual
Basic для управления оптимизациями компиляции и общими опциями компиляции для
выходного пути, а также предупреждениями и ошибками процесса компиляции.
• Compile Options — для включения или выключения этих настроек вы используете
раскрывающиеся списки Option strict, Option explicit и Option infer. Вы можете
также управлять типом сравнений проекта (двоичные или текстовые) при помощи
раскрывающегося списка Option compare.
• Compiler Conditions — Visual Basic позволяет вам настроить уровень уведомлений,
предоставляемых при обнаружении в процессе компиляции любого из имеющихся
условий. Например, одно из условий — это Unused Local Variable
(Неиспользуемая локальная переменная). Если в исходном коде при компиляции обнаружено это
условие, то вы можете (по вашему выбору) интерпретировать это либо как
предупреждение, либо как ошибку, либо полностью его игнорировать.
• Build Events— Visual Basic позволяет вам получить доступ к странице свойств
Build Events (см. объяснение ранее) при помощи кнопки Build Events, находящейся
на этом экране.
• Misc Compile Options — вы можете отключить все предупреждения компилятора,
интерпретировать все предупреждения как ошибки и генерировать во время
компиляции файл документации XML. Это приведет к созданию XML-файла с таким же
именем, как и у проекта; в нем будут содержаться все комментарии вашего
исходного кода (в определенном формате).
□ Debug. Страница свойств Debug позволяет вам изменить поведение отладчика Visual
Studio.
• Start Action — вы используете эту опцию для того, чтобы указать, следует ли при
старте отладчика запустить какую-либо программу, URL или сам текущий проект.
• Start Options — вы используете эту опцию для того, чтобы указать аргументы
командной строки, которые необходимо передать в выполняющийся проект, чтобы
настроить рабочий каталог проекта или отлаживать процесс на удаленном
компьютере.
• Enable Debuggers — вы используете флажки этого раздела для включения или
выключения таких вещей, как поддержка отладки неуправляемого кода, поддержка
отладки хранимых процедур SQL и использование Visual Studio в качестве хоста
процесса отладчика.
□ Publish. Страница свойств Publish дает вам возможность настроить многие
специфичные для Clickonce-свойства. Вы можете указать местоположение для публика-
Глава 4. Решения и проекты
133
ции приложения, место инсталляции (если оно отличается от места публикации), а
также различные настройки инсталляции (включая предварительные требования и
опции обновления). Вы можете также управлять схемой присваивания версий для
публикуемых сборок.
References (Visual Basic). Страница свойств References используется в проектах Visual
Basic для выбора сборок, на которые ссылается проект, и для импорта в проект
пространств имен. Этот экран позволяет вам также сделать к проекту запрос для того,
чтобы определить, есть ли в нем неиспользуемые ссылки. Это делается при помощи кнопки
Unused References.
Reference Paths (Visual C#). Страница свойств Reference Paths позволяет вам задать
информацию о пути для того, чтобы помочь Visual Studio искать сборки, на которые
ссылается проект. Visual Studio будет сначала пытаться разрешить ссылки на сборки
при помощи поиска в каталоге текущего проекта. Если сборка здесь найдена не будет,
то для ее поиска будут использоваться указанные на данной странице свойств пути.
Visual Studio также проверит каталог obj проекта (но только после того, как использует
указанные вами на этом экране пути).
Resources. Ресурсы — это такие элементы, как строки, изображения, значки,
аудиофайлы, а также те. файлы, которые встраиваются в проект и используются при
проектировании и на этапе выполнения. Страница свойств Resource позволяет вам добавлять,
редактировать и удалять ресурсы, связанные с данным проектом.
Security. Для приложений ClickOnce страница свойств Security позволяет обеспечить
разрешения системы безопасности для доступа к коду при выполнении приложения
ClickOnce. Поддерживаются различные сценарии полных и частичных доверительны*
отношений.
Settings. Настройки приложений— это динамически настраиваемые пары
"имя/значение", которые могут использоваться для хранения информации, специфичной для
вашего проекта/приложения. Страница свойств Settings позволяет вам добавлять,
редактировать и удалять эти пары имя/значение.
Каждой настройке может быть автоматически назначена область действия —
приложение или пользователь, а также и значение по умолчанию. Приложения могут
использовать эти настройки на стадии выполнения.
Signing. Страница свойств Signing позволяет вам сделать так, чтобы Visual Studio
подписывала сборку проекта (и ее манифесты для ClickOnce); для этого надо указать
ключевой файл. Вы можете также указать на этом экране опцию Delay signing.
Резюме
Решения и проекты — это основные средства Visual Studio для организации и управления
вашим кодом. Они позволяют вам справляться с большими решениями и предоставляют
единую точку доступа к различным настройкам (как на уровне решения, так и на уровне
проекта). Решения — это контейнеры высшего уровня и именно их создает Visual Studio в
первую очередь при создании нового проекта.
134
Часть II. Подробности о IDE
Давайте подытожим все, что мы узнали о решениях:
□ решение может собираться (что повлечет за собой сборку каждого из входящих в него
проектов), но не может компилироваться;
□ Visual Studio может загрузить только одно решение одновременно; для работы с
несколькими решениями одновременно необходимо запустить несколько копий Visual
Studio;
□ вы можете создавать каталоги внутри решения для группирования его содержимого; эти
каталоги виртуальные и не являются физическими файловыми каталогами;
□ в первую очередь решения предназначены для группирования вместе нескольких
проектов. Проекты внутри решения могут быть разного типа и быть выполнены на разных
поддерживаемых языках программирования;
□ решения не могут содержать другие решения;
□ кроме проектов, решения могут содержать также разнообразные файлы (называемые
элементами решения), которые обычно представляют собой информацию, имеющую
отношение к решению (файлы Readme, системные диаграммы и т. п.).
Несмотря на то, что решения являются важным и необходимым элементом,
компилированные .NET-компоненты получаются из проектов Visual Studio. Проекты создаются на основе
шаблонов (имеющихся в интегрированной среде), которые охватывают самые разные
сценарии разработки, начиная от разработки Web-приложений и заканчивая разработкой
приложений Windows и мобильных приложений.
Давайте подытожим все, что мы узнали о проектах:
□ проекты существуют для компиляции кода в сборки;
□ проекты основаны на шаблонах проектов; шаблоны проектов определяют различные
объекты, ссылки и т. д. — все, что имеет смысл в контексте проекта;
□ подобно решениям, проекты поддерживают также подкаталоги (для улучшения
организации вашего кода). Эти каталоги реальные (физические), они создаются на диске;
□ проекты содержат элементы проектов. Это могут быть файлы исходного кода, ссылки и
прочие элементы (такие как виртуальные каталоги и подключения к базам данных).
Мы увидели, как физически представляются решения и проекты. В следующей главе мы
опишем основные инструменты Visual Studio, используемые для взаимодействия с
решениями и проектами.
Глава 5
Браузеры и проводники
При помощи браузеров и проводников Visual Studio дает вам цельное и всеобъемлющее
представление ваших решений, проектов и типов внутри ваших проектов. Эти окна
(которые также ошибочно называют окнами просмотра) стараются дать визуально
структурированное представление большого разнообразия элементов, некоторые из которых основаны
на коде, а некоторые — нет.
В общем случае вы получаете доступ к этим окнам через меню View. Некоторые из этих
окон (такие как Solution Explorer и Class View) являются основными инструментами
ежедневной работы разработчика. Остальные окна заведуют теми элементами, которые
используются либо в специфических ситуациях цикла разработки программного обеспечения, либо
более опытными пользователями интегрированной среды Visual Studio.
В этой главе мы подробно изучим каждое из основных окон браузеров/проводников.
Примечание
Подобно многим прочим функциональным возможностям Visual Studio, имеющиеся у
вас браузер и проводник могут отличаться от описанных здесь (это зависит от версии
Visual Studio); те, которые содержатся в версии Visual Studio Team System, мы
опишем в соответствующих главах последней части данной книги.
Solution Explorer
Solution Explorer — это основной инструмент для просмотра и манипулирования
решениями и проектами. Он представляет собой простое, но мощное средство иерархического
представления всех элементов решения или проекта и позволяет вам взаимодействовать
непосредственно с каждым элементом (при помощи контекстных меню и панели инструментов).
При помощи Solution Explorer вы можете запустить редактор для любого файла, добавить
новые элементы в проект или решение, а также реорганизовать структуру проекта или
решения. Кроме того, Solution Explorer предоставляет моментальную информацию по
выделенному проекту, по стартовому проекту данного решения, а также по физической иерархии
решения, его проектам и их дочерним элементам.
136
Часть //. Подробности о IDE
Solution Explorer — это просто еще одно окно Visual Studio. Его можно стыковать,
прикалывать и размещать в любом месте внутри интегрированной среды Visual Studio. Solution
Explorer состоит из заголовка окна, панели инструментов и прокручиваемой области
отображения дерева объектов (рис. 5.1).
Solution Explorer
т
Architecture Models
ajj Conto4oAppDiagr*m.»d
j&j ContosoLogrcalDatacenter.Idd
jj ConhrcoSystemDwgnm.sd
£ ..J Ct**« Libraries
j. Ц Console»
tr ««/ Forms
В {j& Contoso.Ul.WfndavwsForms.ErnplDyeeStitus
\ ; ^ My Project
l*3 CommonFuncsvb
Й ContofoLQWmdowsFormsEmployeeStatus.sdm
: $) CustomCorrtrou.vb
* • 23 Forml.vb
ЕЯ UserControll.vb
И 33 Cofitoio.ULWiiidowiForfnsX>ri«rEntfy
ffi ii Properties
' til ЛЙ References
[li) ContosoUIVVmdowsFormsOrderEritry^drn
Ш T] Formlxs
; S F3 Logics
i [*|* ^ MyComponent.cs
j| ProductCiUlogjoni
<2J Program cs
Ш M Properties
■■* til.,„.£i„faf STEAKS
Рис. 5.1. Solution Explorer
Отображение в виде дерева объектов дает графическое и организационное представление
текущего загруженного решения. На рис. 5.1 показаны все различные элементы и проекты
для решения, состоящего из тринадцати проектов.
Визуальные подсказки и значки
Каждый элемент в Solution Explorer представлен названием и значком. В табл. 5.1 дана
информация по значкам, используемым для представления поддерживаемых типов элементов.
Таблица 5.1. Типы элементов Solution Explorer и значки
Значок
в
щ
Э
Элемент
About Box (Окно About)
Application Diagram (Диаграмма приложения)
ASP.NET Web Site (Web-сайт ASP.NET)
Примечание
Только для Visual Basic
Представляет собой корневой узел
проекта Web-сайта ASP.NET
Глава 5. Браузеры и проводники
137
Таблица 5.1 (продолжение)
Значок
уж
щ
[э
и
\щ
If >ИШ\
щ
щ
\ш
н
и
\Щ
\щ
МП
\ш
[ш
И
ЕЁ
[ш
\ш
\\ш_
]
]
Элемент
Bitmap File (Файл растрового изображения)
Class Diagram (Диаграмма классов)
Component Class (Класс компонента)
Custom Control (Пользовательский элемент
управления)
DataSet (Набор данных)
Dialog (Диалоговое окно)
Folder (Каталог)
Global Application Class (Глобальный класс
приложения)
HTML Page (HTML-страница)
Icon File (Файл значка)
Interface (Интерфейс) (для Visual Basic)
Interface (Интерфейс) (для Visual C#)
Logical Datacenter Diagram (Схема
логического центра данных)
Master Page (Главная страница)
Module (Модуль)
My Project File (Файл моего проекта)
Partial Class (Частичный класс)
Project Reference (Ссылка на проект)
Properties Folder (Каталог свойств)
References Folder (Каталог ссылок)
Resources Folder (Каталог ресурсов)
Примечание
Только для Visual Basic
Каталоги решения или проекта
9
Только для Web-проектов
Только для Visual Basic
Эквивалент в Visual Basic для
каталога Properties языка С#
Только для Visual C#
Эквивалент в Visual C# для каталога
My Project File языка Visual Basic
Только для Visual C#
138
Часть II Подробности о IDE
Таблица 5.1 (продолжение)
Значок
т
I *ц\
| *ЛЛ\
I*
м
\\и
В
Ml
\щ
||*
Е
Е
|S
\Ш
Э
|7\
i i
Г^"
\ш
\\ш
В
^
Элемент
Settings Folder (Каталог настроек)
Site Map (Карта сайта)
Skin File (Файл обложки)
Solution (Решение)
Style Sheet (Таблица стилей)
System Diagram (Системная диаграмма)
Text File (Текстовый файл)
User Control (Пользовательский элемент
управления)
User Control (Web) (Пользовательский
элемент управления для Web)
VBScript/JScript File (Файл VBScript/JScript)
Visual Basic Class File (Файл класса Visual
Basic)
Visual Basic Project (Проект Visual Basic)
Visual C# Project (Проект Visual C#)
Visual C# Class File (Файл класса Visual C#)
Web Configuration File (Файл Web-
конфигурации)
Web Form (.aspx) (Web-форма)
Web Service (Web-сервис)
Windows Form (Форма Windows Form)
Windows Form (Inherited) (Форма Windows
Form (унаследованная))
Windows Form (MDI Parent) (Форма Windows
Form (родитель MDI))
Web Project (Web-проект)
Примечание
•
Только для Web-проектов
Только для Web-проектов
Это самый верхний узел в Solution
Explorer
Любой класс, который наследует
напрямую от класса UserControl
Класс, который наследует от TODO
Это корневой узел проекта Visual
Basic
Это корневой узел проекта Visual C#
Файл, который содержит класс,
реализующий класс Form
Только для Visual Basic
Глава 5. Браузеры и проводники
139
Таблица 5.1 (окончание)
Значок
***)
ш
ш
Элемент
XML File (Файл XML)
XML Schema File (Файл схемы XML)
XSLT File (Файл XSLT)
Примечание
Примечание
Показанные в табл. 5.1 значки являются представительным списком значков,
соответствующих определенным элементам проектов и решений в интегрированной среде.
Прочие файлы (добавленные в проект или решение) будут представлены значками,
соответствующими типу файла. Например, документ Word будет представлен в
Solution Explorer стандартным значком документа Word.
Надпечатки на значках
Для того чтобы дать визуальную подсказку о статусе элемента, Solution Explorer
накладывает на иконку дополнительные элементы. Эти надпечатки называются сигнальными
значками. Например, если включен контроль исходных кодов, то Solution Explorer визуально
индицирует это при помощи графической надпечатки. В табл. 5.2 описаны сигнальные
значки контроля версий, используемые Solution Explorer для обозначения текущего
состояния системы управления версиями для данного элемента. Обратите внимание, что состояние
системы управления версиями зависит от конкретной системы управления версиями,
которую вы используете (например, Visual Source Safe или Team Foundation Source Control).
Таблица 5.2. Сигнальные значки системы управления версиями
Значок
|~о"
н
и
is
н
\к.
Пё"
Описание
Элемент не найден. Элемент был указан как часть решения/проекта, но не может
быть обнаружен
Регистрируется Элемент находится под контролем системы управления версиями
и в настоящее время регистрируется
Регистрируется (монопольно) Элемент находится под контролем системы
управления версиями и в настоящее время регистрируется монопольно
Регистрируется (в режиме разделения) Элемент находится под контролем системы
управления версиями и в настоящее время регистрируется в режиме разделения
Отключено Элемент находится в проекте с включенным управлением версиями, но
не может быть добавлен в систему управления версиями
Редактируемый Элемент можно редактировать
Исключенный. Элемент исключен из системы управления версиями
140
Часть II. Подробности о IDE
Таблица 5.2 (окончание)
Значок
в
и
в
Описание
Брошенный. Элемент повис в системе управления версиями, поскольку одна или
более зависимостей были нарушены
Незаконченное добавление Элемент поставлен в очередь добавления в систему
управления версиями при следующей регистрации
Только чтение. Элемент нельзя редактировать
Solution Explorer поддерживает различные управляющие действия (в зависимости от того,
взаимодействуете ли вы с решением или с проектом). Поддерживаемые команды
отличаются также и в зависимости от типа проекта. Например, кнопка Copy Web Project доступна
для Web-проектов, но не для проектов библиотек классов, в то время как команда Properties
доступна для всех типов элементов.
В табл. 5.3 показаны различные кнопки команд панели инструментов (поддерживаемые
Solution Explorer), а также специфичный для них контекст.
Таблица 5.3. Кнопки панели управления Solution Explorer
Значок
н
о
щ
\ш
\Щ.
и
\ш.
Контекст
Любой
Решение, элемент
решения, каталог
решения
Проект, элемент
проекта
Web-проект,
элемент Web-проекта
Проект, элемент
проекта
Web-проект,
элемент Web-проекта
Web-проект,
элемент Web-проекта
Описание
Кнопка свойств. Запускает диалоговое окно свойств решения
Кнопка добавления нового каталога решения (Add New Solution
Folder). Создает новый каталог решения в текущем
загруженном решении
Обновление. Обновляет представление содержимого окна с
деревом элементов проекта
Вложить соответствующие файлы. Visual Studio способна
группировать некоторые элементы проектов. Чаще всего это
делается с такими элементами, как файлы выделенного кода Это
кнопка-переключатель: при ее нажатии соответствующие файлы
будут вложены уровнем ниже "родительского" файла. При ее
выключении все файлы будут отображаться на одном уровне
(под проектом)
Просмотреть диаграмму классов (Class Diagram). Создает
элемент проекта "диаграмма классов" и запускает для нее
программу просмотра. Все типы, содержащиеся внутри проекта,
будут автоматически добавлены в диаграмму
Копировать Web-сайт. Копирует Web-сайт в указанное
местоположение (только для Web-проектов)
Конфигурация ASP.NET. Запускает в браузере инструмент
ASP.NET Web Site Administration. Это полезно при настройке
глобальных параметров безопасности и специфичных для
приложений опций
Глава 5. Браузеры и проводники
141
Таблица 5.3 (окончание)
Значок
ю
Е
а
Контекст
Решение, элемент
решения, проект,
элемент проекта
Файлы кода
проекта
Файлы кода
проекта с
пользовательским
интерфейсом (Windows
Form или Web
Form)
Описание
Показать все. Показывает любые скрытые элементы решения
Просмотреть код. Открывает текущий элемент в редакторе кода
Показать визуальный конструктор. Открывает визуальный
конструктор для текущего выделенного элемента
Управление решениями
Щелчок по решению в Solution Explorer незамедлительно покажет вам все допустимые
команды управления данным решением. Вы получаете Доступ к этим командам либо через
панель инструментов Solution Explorer, либо через контекстное меню решения
(открываемое при помощи щелчка правой кнопкой мыши по решению).
ЕЙ
Build Solution
Rebuilt! Solution
Clean Solution
Configuration Manager*..
Project Dependencies-.
Project Butld Order.*
Add
Set Startup Projects-.
Add Solution to Source Control».
PSitZ
Rename
Open Folder in Windows Explorer
Properties
►
Рис. 5.2. Контекстное меню решения
Посредством использования панели инструментов или контекстного меню решения Solution
Explorer позволяет вам:
□ просматривать и настраивать свойства решения;
□ собирать/повторно собирать решение;
О напрямую запускать менеджер конфигурации решения;
□ настраивать зависимости проектов и порядок сборки;
142
Часть II. Подробности о ЮЕ
О добавлять различные поддерживаемые в Visual Studio элементы решений и проектов;
П добавлять решение в систему управления версиями.
Вы можете начать выполнение некоторых из этих действий при помощи использования
панели инструментов Solution Explorer; вы можете получить доступ к остальным действиям
из контекстного меню решения (рис. 5.2).
Управление проектами
Точно так же, как и с решениями, Solution Explorer предоставляет различные способы
управления проектами решения, в том числе:
□ открытие элемента проекта;
□ сборку или повторную сборку проекта;
□ добавление элементов в проект;
□ добавление в проект ссылки;
□ вырезание, вставку, переименование или удаление проекта в дереве решения;
□ выгрузку проекта.
Примечание
Текущий стартовый проект решения обозначен полужирным шрифтом (как проект
OrderEntry на рис. 5.1). Если в качестве стартовых выбрано несколько проектов, то
полужирным шрифтом будет выделено название решения.
Действие по умолчанию при двойном щелчке элемента состоит в открытии этого элемента
внутри его соответствующего редактора или визуального конструктора по умолчанию.
Поддерживаются также множественные операции перетаскивания. Например, выбор сразу
нескольких файлов кода позволит вам одновременно открыть их в окнах соответствующих
редакторов.
Вы можете перемещать и копировать элементы внутри решения или проекта, либо между
проектами (при помощи стандартной процедуры перетаскивания посредством левой кнопки
мыши). Вы можете также перетаскивать некоторые элементы из проекта и бросать их на
панель подходящего визуального конструктора. Таким легким способом можно, например,
добавить классы в диаграмму классов: просто выделите файлы кода, которые содержат
нужные вам для добавления типы, и перетащите их на окно визуального конструктора
диаграммы классов.
Class View
Окно Class View (Представление класса) по своему дизайну и функциям аналогично окну
Solution Explorer. Оно тоже отображает иерархическое представление элементов проекта.
Однако это представление основано не на физических файлах, которые составляют решение
или проект; скорее данное окно отображает представление различных пространств имен,
типов, интерфейсов и перечислений проекта.
Глава 5. Браузеры и проводники
143
Окно Class View состоит из четырех основных визуальных компонентов: панели
инструментов, панели поиска, древовидного представления типов (называемого панелью
объектов) и панели членов (рис. 5.3).
<5?аг< Ь>
_j Virtual Fo rftrr
:• ч ]3 Class : jhrw^VXcnJcnc F*.An«lys;i',
<3 (-bss LibrariesxCcrtosc.b.Conmon
;3 Class LibranesKortosc.b.integratJcn
+ 4-j Project Rffesfnce»
- {) Cantca FxJntegrfltiDn
♦• -; MviltK«js:D«-J«-tjat««
^£ T^rsit onState
> J Base bpes
+ {} Coutcso F*Jnteqration C^mDScJjdntequ'iton.^pecia »zed
.^j CUvi i ibtant". ,C»nhc!i'v Cunt&s.» Fs UI
;3 Consoles4 AdmhCDmole
,j3 Ccnsoles^He loWorid
^ Form4\Contorvo.ULW»>dow*FormvOrdBrEntry
<** Beq^nvckefSyrtem^AsyncCaliback, сЫест, •
V FndInvcke(Sys,lemiAsyrt:Rt-su t) '
• Панель инструмеиюа
■ Панель поиска
• Панель объектов
• Панель членов
Рис. 5.3. Окно Class View
Панель инструментов
Панель инструментов окна Class View предоставляет легкий доступ к командным кнопкам
для добавления виртуальных каталогов, для перемещения вперед и назад по элементам
панели объектов, а также для отображения объектов.
В табл. 5.4 описаны различные кнопки панели инструментов в Class View.
Таблица 5.4. Кнопки панели управления в Class View
Значки
|5
\^_
[■»
Описание
Новый каталог для Class View. Создает виртуальный каталог, используемый для
организации объектов в панели объектов
Назад. При этом текущим выбранным элементом становится предыдущий выбранный
элемент
Вперед. При этом текущим выбранным элементом становится самый последний
выбранный элемент. Появляется только после использования кнопки Back
144
Часть II. Подробности о IDE
Таблица 5.4 (окончание)
Значки
\ш
'
и
Описание
Настройки Class View. Отображает выпадающий список, который позволяет выбрать
тип объектов, подлежащих отображению в панелях объектов и членов Вот
имеющиеся варианты
• Show Base Types;
• Show Derived Types;
• Show Project References;
• Show Hidden Types and References;
• Show Public Members;
• Show Protected Members;
• Show Private Members,
• Show Other Members;
• Show Inherited Members
Просмотреть диаграмму классов. Создает диаграмму классов и запускает средство
ее просмотра. Все имеющиеся в проекте типы автоматически добавляются в
диаграмму
Панель поиска
Панель поиска — это раскрывающийся список, который предоставляет быстрый и легкий
способ фильтрации объектов, показанных в панели объектов. Когда поисковый термин
(такой как название типа или пространства имен) введен, то окно Class View очищает панель
объектов, а затем опять заполняет ее, но на этот раз только теми объектами, которые
совпадают с поисковым термином. На рис. 5.4 показан результат поиска для ITranslation.
Для удаления фильтра и восстановления панели объектов нажмите кнопку Clear Search
(справа от кнопки Search).
Недавно использовавшиеся поисковые термины сохраняются для повторного использования
в раскрывающемся списке.
Панель объектов
Панель объектов содержит дерево объектов, которое сгруппировано по проектам (на самом
верхнем уровне). Каждый объект идентифицируется значком и названием. Разворачивание
узла проекта в дереве откроет различные типы, содержащиеся внутри этого проекта. Видны
также и связи "родитель — потомок", такие как связи "пространство имен — класс", а также
связи "тип — родительский тип".
В табл. 5.5 показаны значки, используемые в панели объектов.
Глава 5. Браузеры и проводники
145
\Q* A
Transition
11?
яп
-У 1U
Рис. 5.4. Фильтрация в панели объектов
Таблица 5.5. Значки панели объектов
Значок
5
Ш
@
0
\ш
ро
Описание
Класс/структура
Делегат
Перечисление
Пространство имен
Модуль
Интерфейс
Для визуального представления области действия и информации по доступу к каждому
объекту поверх этих значков также накладываются некоторые сигнальные значки (табл. 5.6).
Таблица 5.6. Сигнальные значки области действия/типа доступа
Значок
[а"
(£]
Описание
Private (Закрытый)
Internal/Friend (Внутренний/дружественный)
146
Часть II. Подробности о IDE
Таблица 5.6 (окончание)
Значок
Не определен
Описание '
Public (Открытый)
Protected (Защищенный)
Глубина различных показываемых для каждого объекта уровней будет зависеть от настроек
просмотра. Например, если включить опцию Show Base Types, то это приведет к
добавлению в дерево дополнительного уровня базовых типов (для каждого типа). Принципиальная
задача панели объектов состоит в быстром и легком переходе вперед и назад по дереву
объектов (для каждого проекта). Другими словами, она дает объектно-ориентированное
представление каждого проекта.
Щелчок правой кнопкой мыши в панели объектов покажет контекстное меню. Это меню по
существу идентично меню Solution Explorer, за исключением различных команд Sort и
Group By. Вот имеющиеся там опции Sort:
□ Sort Alphabetically — проекты, пространства имен и типы в панели объектов будут
сортироваться в возрастающем алфавитном порядке;
□ Sort by Object Type — в алфавитном порядке в панели объектов будут сортироваться
типы (например, в таком порядке: классы, перечисления, интерфейсы, структуры);
□ Sort by Object Access — типы будут сортироваться по модификатору доступа
(открытые, закрытые, защищенные и т. д.);
□ Group by Object Type — для каждого имеющегося отдельного типа объекта будет
добавлен дополнительный уровень каталогов. Например, если проект содержит как типы-
классы, так и типы-интерфейсы, то в дереве панели объектов будут отображены каталог
классов и каталог интерфейсов (с содержащимися внутри них соответствующими типами).
Панель членов
Панель членов реагирует на настройки (сделанные в панели объектов) путем отображения
всех членов — свойств, событий, констант, переменных, перечислений — определенных в
выбранном типе. Каждый член имеет отличительный значок для того, чтобы моментально
показать такую информацию, как область действия и тип; даже сигнатуры членов видны
здесь (обратите внимание, что здесь используются те же самые сигнальные значки панели
объектов, которые описаны в табл. 5.7).
Панель членов идеальна для быстрого представления поведения типа и его атрибутов:
просто выберите в панели объектов класс/тип и просмотрите его члены в панели членов.
Таблица 5.7. Значки панели членов
Значок
|7i"
| w
Описание
Константа
Метод/функция
Глава 5. Браузеры и проводники
147
Таблица 5.7 (окончание)
Значок
щ
[&
Описание
Свойство
Поле
Примечание
Многие разработчики обнаружат, что основную массу своих задач им легче выполнять
здесь, в окне Class View (а не в окне Solution Explorer). Доступные в этих двух окнах
действия виртуально идентичны, а окно Class View предоставляет гораздо более
ориентированный на код ракурс представления ваших проектов. Разработчики могут
заниматься здесь исследованием деревьев наследования и видеть с первого взгляда
различные члены, реализованные в каждом определенном в их проекте типе. Против
использования Class View только то обстоятельство, что здесь не видна информация
по управлению версиями.
Панель членов также имеет контекстное меню, в котором содержатся чрезвычайно ценные
средства для просмотра и редактирования кода. Например, вы можете применить рефакторинг
Rename непосредственно к выбранному члену. Прочие имеющиеся здесь возможности
включают: мгновенный просмотр кода определения члена, нахождение в коде всех упоминаний
выбранного члена и запуск Object Browser с выделенным узлом для выбранного члена.
Здесь также имеется возможность изменить фильтр и настройки отображения. На рис. 5.5
показаны все имеющиеся в этом меню команды.
J8
>
-Л
я/
ы
ш
а
в
и
н
Go To Definition
Browse Definition
Rnd All References
Copy
Rename m.
Show Public Members
Show Protected Members
Show Private Members
Show Other Members
Show Inherited Members
Sort Alphabetically
Sort By Member Type
Sort By Member Access
Group By Member Type
Рис. 5.5. Контекстное меню панели членов
Server Explorer
Окно Server Explorer служит двум целям: оно показывает различные системные сервисы и
ресурсы, которые находятся на вашем локальном компьютере и на удаленных компьютерах,
148 i Часть II. Подробности о IDE
а также дает доступ к объектам подключения данных. Так же как и в окнах других
проводников Visual Studio — системы, сервисы, ресурсы и подключения к данным представляются
в виде дерева. Системы перечислены в узле верхнего уровня Servers (по умолчанию там
будет виден ваш компьютер), а подключения к данным появляются в узле верхнего уровня
Data Connections.
Примечание
Содержимое и конфигурация окна Server Explorer не зависят от того, что в нем
отображается (решение или проект). Настройки Server Explorer сохраняются как часть
настроек интегрированной среды разработки и поэтому не меняются в зависимости от
решения (или проекта).
В верхней части Server Explorer имеется панель инструментов, которая одним щелчком
предоставляет доступ к функциям Add Data Connection и Add Server (рис. 5.6). Вы можете
также выполнить принудительное обновление содержимого окна (имеется также и кнопка
для отмены обновления, поскольку запросы к удаленным компьютерам могут занять много
времени).
Примечание
Редакции Express и Standard интегрированной среды Visual Studio не имеют поддержки
серверов в окне Server Explorer; они ограничены только подключениями к данным.
Фактически эти версии Visual Studio работают с данным окном как с окном Data Explorer
Server Explorer |g|
|3.»ii?Vi s I
\ £ \'ji Data Connections J
и diiBiEEKl
Ы JJ Database Diagrams
W Hi Tables J
It) 111 Views I
it) Zi Stored Procedures | ]
1*1 -J Functions
W y'lJ Synonyms 1
(£1 U Types
1*] 3 Assemblies 1 j
~ ^| Servers j!
p Щ Ipowersl
(U j&| Event Logs J
It) ^fj Management Classes | ]
Ш Jp Management Events J i
№ J$ Message Queues ]j
ГО n^jl Performance Counters i
If] aj** Services |
Рис. 5.6. Окно Server Explorer
Подключения к данным
Подключения к данным (Data Connections) представляют собой физическое подключение к
локальной или удаленной базе данных. Через установленное подключение вы можете полу-
Глава 5. Браузеры и проводники
149
чить доступ к базе данных и манипулировать различными ее объектами. Каждая категория
объектов будет отображаться под узлом Data Connections в виде отдельного узла.
Элементы любого узла дерева позволяют вам напрямую взаимодействовать с их эквивалентами в
базе данных (при помощи целого набора визуальных конструкторов и редакторов, которые
обычно называют визуальными инструментами баз данных (Visual Database Tools). Эти
инструменты подробно описаны в главе 18.
В Server Explorer видны следующие объекты:
□ таблицы;
□ представления;
□ хранимые процедуры;
□ функции;
□ синонимы;
□ типы;
□ сборки.
Вы можете создавать новые объекты баз данных, редактировать или удалять существующие, а
также запрашивать данные из объекта базы данных (такого как таблица или представление).
Примечание
Уровень функциональности и количество типов объектов, доступ к которым вы
можете получить через Server Explorer, зависят как от используемой вами версии Visual
Studio, так и от версии базы данных, к которой вы подключаетесь. Иначе говоря, не
для всех баз данных поддерживаются все функции. Визуальные инструменты баз
данных наиболее эффективно работают с Microsoft SQL Server, хотя самые простые
функции поддерживаются и для многих других реляционных баз данных.
Серверные компоненты
Узел Servers в Server Explorer отображает различные удаленные или локальные сервисы и
ресурсы для непосредственного управления ими или использования их в проектах Visual
Studio. По существу, это консоль управления серверными компонентами. По умолчанию
ваш локальный компьютер будет виден здесь в качестве сервера; для добавления других
серверов щелкните правой кнопкой мыши по узлу Servers и выберите пункт Add Server,
либо просто нажмите кнопку Conneet to Server в панели инструментов Server Explorer.
Диалоговое окно запросит у вас имя сервера или его IP-адрес; в этом же диалоговом окне
имеется возможность подключиться под другой учетной записью.
В узле Servers в качестве дочерних узлов имеются следующие категории компонентов:
□ журналы событий;
□ классы управления;
□ события управления;
□ счетчики производительности;
□ сервисы.
150
Часть II. Подробности о IDE
Для отображения в узле Servers могут также зарегистрироваться и другие категории
компонентов; предыдущий список показывает функциональность по умолчанию, которая имеется
в Visual Studio 2008 "в состоянии поставки".
Журналы событий
В узле Event Logs (Журналы событий) вы можете администрировать для подключенного
сервера журналы событий приложений, системы безопасности и системные журналы. Здесь
можно сделать очистку журналов событий, а также углубиться в изучение отдельных
записей журналов. Выделение журнала событий или записи в журнале событий приводит к
отображению их свойств в окне свойств Visual Studio, что дает вам возможность просмотреть и
изменить их значения. Если вы перетащите один из журналов событий в проект, то будет
автоматически создан экземпляр компонента System. Diagnostics. EventLog или
System.Diagnostic.EventLogEntry.
Классы управления
Элементы узла Management Classes представляют собой различные классы Windows
Management Instrumentation (WMI). Каждый из этих классов соответствует логическому или
физическому элементу, связанному с сервером. Имеющиеся классы показаны в табл. 5.8.
Таблица 5.8. Узлы классов WMI Management
Название элемента узла
Management Classes
Desktop Settings
Disk Volumes
My Computer
Network Adapters
Network Connections
NT Event Log Files
Operating Systems
Printers
Processes
Processors
Services
Shares
Software Products
System Accounts
Threads
Класс WMI
Win32_Desktop
Win32_LogicalDisk
Win32_ComputerSystem
Win32_NetworkAdapter
Win32_NetworkConnection
Win32_NTEventLogFile
Win32_OperatingSystem
Win32_Printer
Win32_Process
Win32_Processor
Win32_Service
Win32_Share
Win32_Product
Win32_SystemAccount
Win32_Thread
^
Глава 5. Браузеры и проводники
151
Подробное обсуждение WMI выходит за рамки как данной главы, так и этой книги; однако в
качестве резюме можно сказать следующее— каждый из этих узлов представляет
различные группы свойств классов (такие как прецеденты, антецеденты, настройки, зависимости)
и каждая из этих групп свойств будет предоставлять несколько команд, которые позволяют
вам напрямую воздействовать на ресурс сервера. Простой пример использования этих
возможностей — это настройка доступа к разделяемому ресурсу удаленного сервера. Если вы
раскроете узлы Server Explorer до уровня разделяемого ресурса (в узле Disk Volumes), то
информацию о доступе можно получить через контекстное меню разделяемого ресурса.
В случае данного примера вам нужно будет выбрать SetSharelnfo, что приведет к появлению
диалогового окна WMI, которое позволит вам изменить различные атрибуты разделяемого
ресурса (такие как его описание и максимальное разрешенное количество пользователей).
События управления
Узел Management Events содержит список запросов для событий; по существу это
"слушатели", которые вы настраиваете на периодический опрос системы событий WMI сервера.
Эти запросы событий настраиваются через диалоговое окно (рис. 5.7), которое открывается
выбором опции Add Event Query в контекстном меню. После создания запроса событий
создается также и дочерний узел в узле Management Events, а под этим узлом будут
появляться события.
Ш^ Build Management Event Query
Sated an event t>pe and a dais for the оьег>
Evert type»
» OaU Operation
Qustoro
fbdclBMcuftahnfl
AvafetfodaMea
[ -J root
1 __CBeheCortrot
I WMI/cllve Event Provider Namespaces
I | WMI Aggregated Events
^Ш!ШШШ?!ВЗЛ
N WMI Evert Coruuner Provider Cache Setthgs
Getter events for theae operation»
[Otjed creator» noctf eaten wdalett»
Evert pofcng rterva)-
«5 seconds
"WMI Oast Provder Regetratons'»the dxptay name »or
_a*wPro<tdwReg»j7«an
Nodetafptun
~Ъ£У'
.
1
г
1
i
*
N
| .ty«"tt«l ] OK [ | Cancel '
Рис. 5.7. Создаем запрос событий управления
Очереди сообщений
Если на сервере инсталлирована поддержка очереди сообщений, то в узле Message Queues
отображаются все имеющиеся очереди сообщений (со всеми находящимися в очередях
сообщениями).
152
Часть II. Подробности о IDE
Счетчики производительности
В узле Performance Counters можно просмотреть любой инсталлированный на целевом
компьютере счетчик производительности. Каждый счетчик производительности
отображается в своей категории. Экземпляры счетчиков производительности также отображаются
(при наличии).
Сервисы
В узле Services перечислены все инсталлированные сервисы.
Программирование при помощи Server Explorer
Кроме изучения и манипулирования подключениями к данным и ресурсами серверов, Server
Explorer служит также и другой цели: при помощи перетаскивания элементов из Server
Explorer на панель конструирования Visual Studio вы можете быстро создавать в коде
компоненты, которые непосредственно относятся к данному элементу. Например, перетаскивание
узла Application Log (из Servers | Event Logs) на существующую форму Windows Form
приведет к созданию экземпляра компонента System. Diagnostics .EventLog, который указывает
на журнал приложений. Затем вы можете сразу написать код, который будет
взаимодействовать с этим компонентом журнала событий. Вы можете использовать этот процесс для
быстрого встраивания в ваше приложение доступа к очередям событий или для чтения/записи в
счетчик прризводительности. В табл. 5.9 перечислены различные возможные операции
перетаскивания и их результаты.
Таблица 5.9. Перетаскивание в Server Explorer
В каком узле
Event Logs
Management
Classes
Management
Events
Message
Queues
Performance
Counters
Services
Что перетаскиваем
Категорию Event Log
Category (например,
Application или
System)
Экземпляр
Management Class
Запрос Management
Event Query
Экземпляр Message
Queue
Performance Counter
или экземпляр
счетчика
Сервис
Что получаем
Создает экземпляр компонента
System. Diagnostics . EventLog, настроенный
для соответствующего журнала событий
Создает соответствующий экземпляр компонента
WMI/CIMv2
Создает экземпляр компонента
System. Management .ManagementEventWatcher
Создает экземпляр компонента
System.Messaging.MessageQueue для
выбранной очереди
Создает экземпляр компонента
System.Diagnostics.PerformanceCounter,
настроенный для соответствующего счетчика
Создает
System.ServiceProcess.ServiceController
для указанного сервиса
Глава 5. Браузеры и проводники
153
Примечание
Элементы подключений данных в Server Explorer перетащить на панель
конструирования нельзя. Более подробную информацию по разработке решений баз данных при
помощи перетаскивания см. в главе 18.
Object Browser
Браузер объектов Object Browser похож по своей функциональности и внешнему виду на
окно Class View. Он отображает иерархическое представление проектов, сборок,
пространств имен, типов, перечислений и интерфейсов. Однако в отличие от окна Class View
окно Object Browser может показывать гораздо более широкий диапазон объектов. Кроме
текущих загруженных проектов Object Browser может отображать элементы всей .NET
Framework, вплоть до компонентов СОМ и внешних объектов. Это замечательный
инструмент для поиска и изучения типов независимо от их физического местоположения.
Изменение области действия
Вы можете использовать раскрывающийся список Browse панели инструментов для
фильтрации или изменения области действия объектов, отображенных в окне Object Browser.
Имеющиеся опции области действия представлены в табл. 5.10.
Таблица 5.10. Опции области действия в Object Browser
Область действия
All Components
.NET Framework
My Solution
Custom Component
Set
Результат
Это надмножество всех остальных опций. Выбор этого варианта
покажет все типы и члены NET Framework, текущее решение, любые
библиотеки (на которые имеются ссылки в текущем решении), а
также любые отдельные компоненты
Показывает все объекты в конкретной версии .NET Framework
(например, .NET Framework 2.0, .NET Framework 3 0)
Показывает все объекты текущего загруженного решения (включая
все те компоненты, на которые имеются ссылки)
Показывает все объекты, которые были добавлены в
пользовательский набор компонентов
Редактируем пользовательский набор компонентов
Пользовательский набор компонентов — это список компонентов, которые вы указываете
вручную. Применение пользовательского списка может быть полезным в тех ситуациях,
когда вы хотите просматривать список компонентов из различных мест. Вместо того чтобы
рыться в разных областях действия, вы можете просматривать в списке компонентов только
те типы, которые вас интересуют.
154
Часть II Подробности о IDE
Вы добавляете элементы в список пользовательских компонентов п\тем выбора опции Edit
Custom Component Set в раскрывающемся списке Browse или при помощи нажатия на
кнопку с многоточием справа от этого списка. Это приведет к запуску диалогового окна
редактора, в котором вы можете добавлять или удалять элементы этого списка (рис. 5.8)
v»*4 £d t Custom Component Set
•NET COM | Project! | 8ro*i* | Recent
Component Name Version
envdtefM 9 ODD
FnvDTHH) 9 ййй
EnceptjonMtisageBo* 9Я.242 0
Mtenmbilrty 7 G 3300 0
lEEvecFemote 2ОЛ.0
JEHo* 2 0.0 0
IIEHost 20 0 0
JSym'Arapper 2U0.0
MictosoftSQL Mobile 9Д2420
Microsoft AnalyusServices 91} 242.0
Mictosoft AnalysisSen. ices 9П242 0
< m
Selected projects and «_ompor%entu
Runtime
vlQ3705
ч 103705
v2 0 50727
410J705
v2 Q 50727
v2 030727
v? Q50727
v2 030727
v2 0 50727
vZO 30727
v2 Q 50727
! Add^
Component Name Type Version Source
1 l«^d)
Prth
С \Program
С 'Piogram
c'Prcigieml
OPiogram
С 4Wmdo.« j
С'Windows j
С \Windo.« '
С \'A'indo«s
LXProgram j
c\Programl |
i ^Prog^ml -
Remove +-
Microsoft AnalysuServ NET 9 0 242.0 csProgram Files'* Micr
! ok
| [ Cancel ]
Рис. 5.8. Редактирование набора пользовательских компонентов
Добавление компонента в набор делается простым выбором его из списков объектов
(имеющихся на вкладках .NET, COM или Projects) или при помощи перехода
непосредственно к содержащей его сборке (посредством использования вкладки Browse). Вы можете
выбрать объект или объекты, а затем нажать кнопку Add. Текущие члены набора видны в
нижней части диалогового окна. Вы можете также выбрать текущий член и удалить его из
списка при помощи нажатия кнопки Remove.
Просмотр объектов
Браузер Object Browser состоит из панели инструментов и трех различных панелей: панели
объектов, панели членов и панели описания. Сходство с окном Class View здесь совершенно
очевидно. Панель инструментов, панель объектов и панель членов работают идентично
соответствующим элементам окна Class View. Для просмотра отдельных членов объекта вы
перемещаетесь по представлению в виде дерева при помощи щелчков мышью; панель
инструментов помогает перемещаться по глубоким деревьям (предоставляя кнопки Forward и
Back). На рис. 5.9 показан браузер Object Browser в действии.
Допустимые в панелях иерархические связи, значки и действия точно такие же (и поэтом)
мы не будем здесь повторяться). Однако панель описания — это новая концепция.
Глава 5. Браузеры и проводники
155
«/»ContospConwnonFi?!
ж*
Eroject
F_i!e Edit View Enactor
Л • -J • -J d * *
Object Browser
Browse My Solution
<Search> - Jj[
* j AxInlerop.Microioft Offkblnterop.Gutlo
d> 31 Class Ltbranes\Contoso F* Analysis
i ^ Class Libranes\Conto*o Fx Common
[-1 (} Contoso.FscCommon
— ,J? EmplcyeeBase j5
o_j Вам Types
♦ J*1 EmplayeeType I
<•-'' 3 ^-,a5S LibranesXContoso Fx.Integration j
U () Contoio Fxlntegrattan '-->
S' rTfansrtior»
Jt ^ OnTratniticnCompletf
f J5. TransrtionState
H {} Contcso Fx Integration Contoso.Fxln
t ^ CantextTokerUnternalTaken
♦ ij MessegeBus
♦ -1$ MessageMapper
1 {3 Class Libraries\Centro{s\ContoseFxUi
* СЭ Ccnsoles\AdmtnCorvscle
* 3 CcrwotaWdteWorld
i> i_J! Contoso.UJ WindowsForms EmployeeSta т
*Й|ШШ-
fiutld Qebug Oflla
h^l^-MJM
Jools Tejt
V Debug
Window FJelp
» Mixed Platforms
• \3
* « 1-
V ContntTokenU
V ContextTcken(itnng]
лЧ> ResetQ
'I!f SystemCcntrrtld
^ intematGuid
/V Messageld
* MrssageTnld
j** syrtemContortld
il MSG_rvWP_lNDEA •
public class ContextToken
Member of Conto£o^*-lute5£»Uo«_Cont<«o:.F>Lljriteg!ratiQn Special!,
Ready
Рис. 5.9. Браузер Object Browser
Панель описания
Когда элемент выделен в панели объектов или панели членов браузера Object Browser, то
панель описания предоставляет информацию о выделенном элементе. Предоставляемые
данные чрезвычайно подробны, в том числе:
□ название выделенного объекта;
□ название родителя выделенного объекта;
□ комментарии кода и встроенная помощь, связанная с выделенным объектом.
Там, где это возможно, панель описания содержит гиперссылки для упрощения перехода к
связанным элементам. Например, объявленное свойство типа string может
продемонстрировать следующее описание:
public string SystemContextld { set; get; }
Member of Contoso.Fx.Integration.ContextToken
Обратите внимание на использование гиперссылок: щелчок по строковому идентификатору
переносит нас на тип данных string в окне Object Browser. Аналогично, щелчок по
гиперссылке Contoso.Fx.Integration.ContextToken переносит нас в браузере на определение
класса ContextToken.
Совет
Вы можете щелкнуть по сборке в панели объектов и быстро добавить ее в текущий
проект в виде ссылки (для этого надо нажать кнопку Add to References, находящуюся
в панели инструментов браузера Object Browser).
156
Часть II. Подробности о IDE
Document Outline
Окно схемы документа Document Outline (открываемое из меню View | Other Windows)
отображает иерархическое представление элементов, находящихся на Windows-форме или
Web-форме. Это окно — совершенно фантастический инструмент для изменения родителя
элемента формы или изменения порядка по координате Z для элемента управления внутри
его родителя. Кроме того, оно помогает понять логическую структуру формы, в которой
может происходить много визуальных событий.
На рис. 5.10 и 5.11 показаны окна Document Outline для простой Web-формы и для чуть
более сложной Windows-формы.
Панель инструментов окна Document Outline позволяет вам управлять отображением типов в
виде дерева, а также облегчает перемещение и переупорядочивание элементов изображения.
В табл. 5.11 перечислены команды панели инструментов, имеющиеся в окне Document Outline.
*& CcHitosoCommcnFramevrork - Microsoft Visual Studio
ч тт*ш
Ette fcdtt $ew E?pjea guild Qebug Dft* Ffirmat loots Test Window bjdp
J! * wJ " tti У <P # ЯЛ t& | л. ' ?< - ~ ■ I j ► Debug * Mned Platforms
*' *i J W &-fZ ~ , XHTML 10 Trtnvtion,» $ 1 $ty1e AfpRcatwn; Manual •
CVent Objects & Events - (No Events)
~<%a Page T^7cf7i^F Av^7~;
«'ЭСЛУРЕ ч гг}
f4J (C "-//W3C//DTD XHTML 1.0 *'
13<hnal /ttrlr,s-»fcTyi://www.w5.ora/19S9/Khtatl- >
£ <г.ев2 г<Л:1Т.-е'эегтег,'>
<ti::le>Ontitled Page</title>
</Mead>
-,<body>
[«for» ^-"гага!" Т2ъ*г-"аетг7егп>
<div>
</div>
у.-.
;.EJ«HI
j ApptedRdM
! (no rviK appted)
L? D^in HJjPJ'C] 3 Source Rjhtml>l <bodyj^ В j■ 1 £) CSS pf°Peft№S ffr>&n*o* 5Ы« [*j,AppT/Styi« |
document Outline
_J DefiulLaspx
id <%OPage%>
«j <IDOCTYPE»
-' f <HTML>
_- !^j <HEAD>
^ <TITLE>
'- Jj <BODY>
И ^ forml
8' <DIV>
[>«=»< 4НП
I&^SoMicn Explore? ^ Document Outline
Ready
Рис. 5.10. Web-форма
Таблица 5.11. Команды панели инструментов окна Document Outline
Значок
гп
*
Описание
Стиль отображения имен типов. Эта выпадающая кнопка позволяет вам управлять
отображением имен типов в дереве'
• None — имена типов не отображаются,
• Short — отображается локальное (неквалифицированное ) имя;
• Long — отображается полностью квалифицированное имя типа
Глава 5. Браузеры и проводники
157
■ Таблица 5.11 (окончание)
Значок
и
а
и
а
в'
и
Описание
Развернуть все. Приводит к раскрыванию всех родительских узлов
Свернуть все. Приводит к сворачиванию всех родительских узлов
Переместить вниз по контейнеру. Перемещает текущий выделенный элемент на одну
позицию вниз в текущем контейнере
Переместить вверх по контейнеру Перемещает текущий выделенный элемент на
одну позицию вверх в текущем контейнере
Переместить из текущего контейнера. Перемещает текущий выделенный элемент из
его текущего контейнера и помещает его в следующий контейнер более высокого
уровня (или на корневой уровень, если такого контейнера не существует)
Переместить в следующий контейнер. Перемещает текущий выделенный элемент из
его текущего контейнера (или корневого уровня) и помещает его в следующий
контейнер
</> ContmoConunonFramework ■ Microsoft Vuual Stud» (^ШШКШ
\ £»fr Edit ¥<«" £">><* flo*M Qebug Data Ffirmat loots Tcgt Window Help
!:$"У-#Ы Ш\ ф ^,Д .?. 1N • ^''4 ►..Debug - Mned Platform» • Ш ~|
, Л i L i> :i if j|... J1 -r a И* ?? % К i i
] Fpnvl.vbpvagulf
it? Order bitty oirW' Я 1
jufHii * 4 д i»
1*шШт ^MdtaM
:
ft" #i <»! *LJ* **- i^l^U |
x НИ^^
* • jSL" ! + " ' *• * * * 1
i w n TiffiyfMSffll - j
j А Г", TabControll TabContrcl ; 1:
i «i {' i TabPagel 7*bPag« j Г
i s jJ DaUGridVlewl DstaGndView
j | c$ ,£3 TahPage? TabPage j j
|*|. jff TaxtBfmAddress Техсвож ;
j | «БГ TextBaKl TtxtBox | 1
i /; -«M TextBoxNene TextBcx !e
\ Wi ComboBoxStjte CorrboBox | ]
j ij i A LabeM Label j
{ , A LabelB Label j 1 ;
; " I A LabeU label j
. A Labell Labrl j
|! ®buttooOk Button
® buHonCanccI Button
Ы&*ТооВЫр1 TooIStnp 1
T' 1 (*] newToofitrtpButton ToalStnpButton 1
jj ' ' ® savcTooBtripButton TodSinpButton j
j ^ToolStfipl L_S«us*npl
'!• | ® prlntTooBtripButton ToclStnpButton ,1
!3^1ЫиЙО» fxpfottr | ,J Document Outline j j
[toady |
Рис. 5.11. Windows-форма
Редактирование элементов
Окно Document Outline позволяет легко перепрыгивать из иерархического представления
элементов в соответствующий им код. Если элемент в данное время редактируется в окне
визуального конструктора/редактора, то он будет выделен в дереве объектов. И наоборот,
158
Часть II. Подробности о IDE
выделение элемента в дереве объектов приведет к выделению элемента в окне
конструктора/редактора.
Помимо описанных в табл. 5.11 команд панели инструментов вы можете использовать
также перетаскивание для перемещения элементов в дереве объектов.
Резюме
В этой главе мы увидели, что браузеры и проводники — это окна Visual Studio, которые
обычно отображают свое содержимое в иерархическом виде. Они обычно используют одни
и те же элементы интерфейса (деревья объектов, панели инструментов и элементы) и
фактически являются основными средствами визуализации и взаимодействия с элементами
проекта в интегрированной среде.
Браузеры и проводники предоставляют простой интерфейс для:
П визуализации и организации ваших решений и проектов в разрезе файлов;
□ визуализации и организации ваших решений и проектов в разрезе типов и классов;
□ выполнения запросов и взаимодействия с ресурсами серверов, такими как базы данных,
счетчики производительности и очереди сообщений;
□ просмотр библиотек типов.
Несмотря на то, что некоторые браузеры/проводники используют чрезвычайно глубокие и
сложные концепции (например, WMI), они направлены на одну общую цель: расширить
возможности интегрированной среды (как инструмента быстрой разработки) для того, что-
5ы она могла справляться не только с задачами простого редактирования файлов кода.
Глава 6
Редакторы
и визуальные конструкторы
Несмотря на то, что Visual Studio предоставляет впечатляющий набор функциональных
возможностей для всех областей процесса разработки, сердцем интегрированной среды
являются ее редакторы и визуальные конструкторы. Это "хлеб насущный" для программиста:
они позволяют вам писать код, редактировать ресурсы, конструировать формы и
проектировать схемы. И, конечно же, каждый из этих инструментов имеет ключевые функции,
предназначенные для повышения вашей производительности и качества ваших результатов.
Данная глава сосредоточена непосредственно на использовании этих редакторов и
визуальных конструкторов для создания решений внутри интегрированной среды разработки.
Основы
В широком смысле редактор Visual Studio— это текстовый редактор (или текстовый
процессор), который помогает вам эффективно писать специфические тексты (код Visual Basic,
HTML, XAML и т. д.). С другой стороны, визуальный конструктор — это визуальный
редактор, который позволяет вам работать напрямую с визуальными концепциями (вместо
текста). Визуальные конструкторы и редакторы поддерживают множество типов документов:
например, вы можете создать форму при помощи удобного перетаскивания в визуальном
конструкторе Windows Forms либо посредством написания кода в текстовом редакторе; при
помощи таких же средств можно создать и XML-файл.
Текстовый редактор Visual Studio обеспечивает всю основную функциональность по
редактированию текстов для всех редакторов. Эта функциональность наследуется и дополняется
для создания редакторов, специфичных для данного типа документов. Таким образом, вы
получаете редактор кода для исходных файлов, редактор XML для разметки, редактор CSS
для таблиц стилей и т. д.
Визуальные конструкторы также проявляют себя специфичным для своей роли образом.
Визуальный конструктор является частично текстовым редактором и частично графическим
инструментом, а визуальные конструкторы Web- и Windows-форм являются превосходными
построителями форм WYSIWYG.
160
Часть II. Подробности о IDE
Текстовый редактор
Есть несколько функциональных возможностей редактирования текста, которые все мы
считаем гарантированными: выделение части текста, вставка текста в документ,
копирование и вставка текста и т. д. Как и следует ожидать, окно текстового редактора поддерживает
все эти функциональные возможности таким образом, который знаком каждому, кто
пользовался текстовыми процессорами под Windows.
Например, текст можно выделить при помощи следующих знакомых действий:
1. Поместить курсор в начало текста, который вы хотите выделить.
2. Нажав левую кнопку мыши, переместите указатель мыши к концу текста, который вы
хотите выделить.
3. Отпустить левую кнопку мыши.
Кроме этого "стандартного" метода выделения текстовый редактор Visual Studio
поддерживает выделение "столбцами". В режиме "столбцов" вместо выбора текста линейным образом
(слева направо по строкам) вы растягиваете рамку выбора вокруг текста. Любой текстовый
символ, оказавшийся внутри рамки выбора, является частью выделенного текста. Это
называется режимом столбцов, поскольку он позволяет вам создать область выделения, которая
захватывает столбцы текстовых символов вместо строк. Процедура в основном такая же:
1. Поместить курсор в начало текста, который вы хотите выделить.
2. Удерживая нажатой клавишу <Alt> и левую кнопку мыши, растянуть границы рамки
выделения до тех пор, пока она не захватит желаемый текст.'
3. Отпустить левую кнопку мыши.
После выделения текста вы можете копировать, вырезать или перетаскивать его на новое
место внутри текстового редактора. Так же как и выделение текста, команды вырезки,
копирования и вставки текста остаются такими же, как команды стандартных приложений
Windows: сначала вы выделяете текст, а затем вырезаете или копируете его при помощи
меню Edit, панели инструментов или контекстного меню текстового редактора.
При помощи перетаскивания выделенного фрагмента текста вы можете переместить его
внутри текущего текстового редактора, перенести его в предварительно открытое окно
другого текстового редактора или даже перетащить выделенный фрагмент в окно команд или
наблюдения.
Перенос строк и виртуальное размещение
Поведение по умолчанию текстового редактора не предусматривает автоматического переноса
текста. Иначе говоря, когда вы набираете текст или код, то ваша строка будет просто
продолжать удлиняться вправо. Если вы выйдете за пределы видимой области, то окно редактора
просто переместится вправо для того, чтобы вы могли продолжать набор текста. Однако окно
текстового редактора может вести себя как текстовый процессор, в котором содержимое
документа обычно ограничено по горизонтали размером виртуального листа бумаги.
Совет
При включенном переносе строк Visual Studio будет автоматически переносить ваш
текст на следующую строку. Вы можете также заставить интегрированную среду ста-
Глава 6. Редакторы и визуальные конструкторы
161
вить визуальный глиф (glyph), который обозначает перенос строки. Обе эти операции
можно выполнить в диалоговом окне Options на странице Text Editor | All
Languages | General (рис. 6.1).
Options
Tot Editor
General
1 File Eitenakm
i AS Languages
i Tabs
Basic
i "
I «s
1 HTML
| PL/SQL
! Plain Text
|! SQLScrtpt
1 T-SQL
i T-SQL7
«j
TSQL80
1 T-SQL»
i XAML
! s XML
ишш
Statement completion
i Auto fist members
Ш b»dt Advanced members
i/JEaram«ter information
Setting»
£>ыЬ'е >£"!<» ър»л
V'Wordwrap
jv Show visual glyphs for word wrap
[</| Apply £ut or Серу commands to blank lines when there is no selection
Display ~ • »
""llfne numbers
~7] Enable single-cJicfcyRL navigation
^ifcy*S$!£^J*arj
Note- This page sets options for all languages To change options for enly one
language, select the desired language from the tree on the left
i I OK j ( Caned J
Рис. 6.1. Диалоговое окно Options
Если вы измените поведение по умолчанию (включите перенос строк), а затем введете
строку кода, которая превышает ширину редактора, то увидите, что окно редактора (рис. 6.2)
автоматически переносит строку (чтобы она помещалась в границы окна) и ставит значок у
правой границы окна редактора (чтобы обозначить выполненный перенос). Перенос строк
полезен для того, чтобы держать в поле зрения весь ваш код (без необходимости выполнять
горизонтальную прокрутку)! v
^i &-'
f Progra>TLM[
I Bjusiou System;
' | using System.Collections.Generic;
-using System.Text;
Dnamespace IdmlnConsole
! | (
I p с leas i'l'^T «m
! '
' const strino; CONCAT -
I ] 23kdsjlksjdklet9)cjl231k«ecljlclakdjalcli«lsclli3
I lkjdlkajdlakjdlad";
| О static void H»ln(string[] args)
1 ! '
i | ~c>nsoli.lrlteLine ("Hunnino;
, ! concatenation test...");
Юг (int 1-0; 1 <- 10000; i++)
Рис. 6.2. Перенос строк в редакторе
Другая опция (Enable virtual space) диалогового окна Options — взаимно исключающая
для опции переноса строк. То есть вы можете использовать либо виртуальное размещение,
162
Часть II. Подробности о IDE
либо перенос строк, но не обе вместе. Виртуальное размещение — это способность вводить
текст в любом месте окна редактора без необходимости вводить пробелы или знаки
табуляции. Эта опция полезна в таких ситуациях, когда вы хотите, например, разместить
комментарий справа от группы строк кода. Вместо того чтобы при помощи знаков табуляции или
пробелов добиваться аккуратного выравнивания строк комментария, вы можете просто
поставить курсор в ту позицию текстового редактора, где должен оказаться ваш комментарий.
Пример смотрите на рис. 6.3; комментарии на этом рисунке не выравнивались при помощи
пробелов или знаков табуляции. Они были просто набраны непосредственно на своих
нынешних местах.
Program с«*} ▼ >
^JAdmnConsols Program v ^МагЧйплдП argj) >
l{j oas t /.- j ш -
r.onat string CONCAT - 23k J^Jf k^dkliskU^ ! k^d]'"-!'*™. Mi11«l 'id ?
[ti static void HainCtrlriC[] argja)
{
'"' j ; . WriteLine ('"'unnlTirj ^n^rftt^rjatinrj te*?r . ") ;
string test ■ '"',
for (int i - 0, i <- 10000; i-w-)
teat ■ BuilderConcat (test) ; -'/ tn'sv 1'i ji
test - StringConcat(test); // .;<<±ii По :
test - NativeConcat(teat); /' t lien
zsi*. VriteLine ("„esc conca'. ccmpiete ") ;
^uiT.WriteLine("die any key tj e-it...");
Рис. 6.З. Виртуальное размещение в окне редактора
Визуальные конструкторы Visual Studio
Визуальные конструкторы гораздо более визуальны по своему характеру, чем текстовые
редакторы Visual Studio; они дают графическое представление данного элемента решения.
Таким образом, форма будет выглядеть в визуальном конструкторе точно так же, как ее
увидит конечный пользователь: как визуальная конструкция из кнопок, рамок, меню и
кадров. Показанный в визуальном конструкторе код реализации этих элементов фактически
написан самой Visual Studio.
Так же как и редакторы, все визуальные конструкторы похожи по форме и по функциям.
Они размещаются в области документов интегрированной среды разработки (так же, как и
редакторы). Они могут вести себя по-разному (в зависимости от своего предназначения).
Визуальный конструктор Windows Forms и конструктор компонентов выглядят почти
одинаково, но в их использовании имеются некоторые тонкие отличия.
Кодирование в редакторе кода
Написание кода и создание других файлов, подчиняющихся правилам какого-либо
синтаксиса — это ввод текста. Окно текстового редактора — это инструмент Visual Studio, непо-
Глава 6. Редакторы и визуальные конструкторы
163
средственно предназначенный для создания текстовых файлов исходных кодов. Это
краеугольный камень разработки в интегрированной среде. Оно поддерживает ввод текста и
базовые текстовые операции, такие как выделение областей текста, перетаскивание
фрагментов текста и настройка табуляции. Даже при наличии одних только базовых функций
редактора было бы вполне достаточно для написания кода. Однако дополнительные
функции для отладки, форматирования кода, подсказки по кодированию и возможности
настройки делают этот инструмент просто блестящим.
Как мы уже упоминали, текстовый редактор интегрированной среды многолик — редактор
кодов поддерживает создание и редактирование файлов исходных кодов, редактор XML
предназначен для файлов XML, а редактор CSS — для файлов CSS. Несмотря на то, что в
способах отображения кода или разметки могут встречаться некоторые отличия, все эти
окна имеют один и тот же интерфейс пользователя и один и тот же набор функциональных
возможностей редактирования.
Совет
Каждый редактор можно полностью настроить. Просто запустите диалоговое окно
Options (посредством выбора Tools | Options) и найдите узел Text Editor. В этом узле
имеются страницы, которые позволяют произвести настройку редакторов всех типов.
Открытие редактора
Есть два способа запустить текстовый редактор (а также любой другой редактор
интегрированной среды). Первый способ — с использованием Solution Explorer: выделите
существующий файл кода, текстовый файл или файл другого типа и дважды щелкните по нему.
Если это файл кода, то вы можете также щелкнуть по нему правой кнопкой мыши и выбрать
команду View Code. Содержимое файла загрузится в новое окно редактора.
Второй способ запустить редактор — выбрать в меню File | New | File. Это приведет к
открытию диалогового окна New File. Выбор в этом окне шаблона кода приведет к запуску
окна редактора кода, заполненного начальными кодовыми заглушками (соответствующими
выбранному шаблону).
Совет
Окна редактора кода занимают самые лучшие места в центре интегрированной среды
(в виде окон со вкладками). Если открыто несколько редакторов кода, то можно
получить доступ к любому из них при помощи его вкладки. Если одновременно открыто
много редакторов, то найти нужное вам окно при помощи вкладок может быть
непросто. Есть четыре способа быстро найти и выбрать окно редактора кода. Во-первых, вы
можете использовать Solution Explorer. Двойной щелчок по файлу кода в Solution
Explorer приведет к выбору и показу соответствующего окна редактора кода. Во-
вторых, вы можете использовать меню Window. Каждое открытое окно редактора
кода показано в списке окон в меню Window. В-третьих, справа от вкладок редакторов
(рядом со значком Close) имеется маленькая кнопка в виде стрелки Нажатие этой
кнопки приведет к выпадению списка всех открытых окон редактора, что позволит вам
выбрать одно из них. И наконец, Visual Studio имеет собственную версию Windows-
переключения: удерживайте нажатой клавишу <Ctrl> и повторно нажимайте клавишу
<ТаЬ> для перебора всего списка открытых окон интегрированной среды.
164
Часть II. Подробности о IDE
Написание кода в редакторе кода
Поскольку основная цель редактора кода — это обработка текста исходного кода, то
давайте сначала рассмотрим написание с нуля простейшей процедуры — функции "Hello, World".
На рис. 6.4 показан редактор кода с файлом консольного приложения (со всеми начальными
кодовыми заглушками). Он был сгенерирован путем создания нового проекта типа Visual
С# Console project при помощи Solution Explorer. Двойной щелчок по файлу Program.cs
этого нового проекта показывает исходный код этого консольного приложения.
Hiiatng System; -^Л
| using System.Collections.Generic; 1
I using System.Text;
Gnamespace HelloHarld
I (
l-j claes Pr'K«ftj.i J
I (
Q static vald Haln(striug[] ergs) Л
T * I
г * I
< „„„„„„.^ „„„„,, „„l,,,,,,,, _,* J
Рис. 6.4. Начальный код шаблона консольного приложения
Как вы видите, Visual Studio уже вписала некий код (в соответствии с шаблоном,
использованным для создания проекта):
using System;
using System.Collections.Generic-
using System.Linq;
using System.Text;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
}
}
}
Для того чтобы продемонстрировать редактор кода в действии, вы создадите консольное
приложение, которое выдает на консоль строку "Hello, World!".
Глава 6. Редакторы и визуальные конструкторы
165
Внутри процедуры Main добавьте следующее:
Console.WriteLine("Hello, World! ") ;
Для того чтобы начать писать код, вам нужно просто установить курсор в окно (при помощи
щелчка мышью внутри скобок процедуры Main), нажать клавишу <Enter> для того, чтобы
получить место для новой строки кода, и набрать вышеприведенную строку.
Эти и прочие способы повышения производительности подробно описаны в следующей
главе. Здесь мы сосредоточимся на основах редактирования и написания кода в окне
редактора.
Теперь, когда вы видели редактор кода в действии (хотя и с очень простым примером), вы
уже готовы углубиться в изучение компонентов окна редактора.
Анатомия окна редактора кода
Окна редактора (как вы уже убедились) видны в интегрированной среде как окна с
вкладками, и обычно они занимают центральное место. Как вы видите в окне редактора на рис. 6.5,
каждое окно текстового редактора состоит из трех основных областей: панели кода, поля
выделения и поля индикаторов. Имеются также как горизонтальная, так и вертикальная
полосы прокрутки (для перемещения по файлу).
Поле индикаторов
Поле выбора Панель кода
I'
ч j иа*.вз 3v3tea;
4siu7 3y3£C».Coli.scr.iona.Generic;
; иа^ч Syv,e*n..T***t;
'inaa.esy*2e HelloWoclci
ч( static voxel R»injscriK£j[] args)
Рис. 6.5. Компоненты окна редактора кода
Эти области и их функциональность остаются постоянными для всех типов редакторов
интегрированной среды.
Редактор кода добавляет дополнительный набор элементов управления пользовательского
интерфейса, которых нет в других редакторах: два раскрывающихся списка в верхней части
окна редактора кода позволяют вам быстро перемещаться по исходному коду при помощи
выбора типа в левом раскрывающемся списке и последующего выбора члена типа (свойства,
166
Часть II. Подробности о IDE
поля, функции и т. д.) в правом раскрывающемся списке (эти списки называются
соответственно именем класса и именем метода в Visual Basic). Это приведет к перескакиванию
курсора прямо на указанный тип.
Примечание
Раскрывающийся список типов показывает только те типы, которые объявлены в
отображенном в редакторе файле; вы не увидите в нем глобального списка типов для
всего решения, проекта или даже пространства имен. Точно так же и
раскрывающийся список членов типа отображает только члены выбранного типа.
Панель кода
Панель кода— это то место, где документ (исходный код, XML и т. д.) отображается и
редактируется. Эта область предоставляет базовую функциональность редактирования текста,
а также и более сложные функциональные возможности редактора (такие как IntelliSense).
Щелчок правой кнопкой мыши внутри кодовой панели покажет вам контекстное меню
(рис. 6.6), которое содержит стандартные операции вырезания, копирования и вставки
(наряду с другими удобными операциями редактирования).
п
а
А
■А
*3
&
-а
*
View Designer
Ref actor ►
Organize things ►
Create Unit Tests...
Insert Snippet.*.
Surround Wrtb..
GoToDefinrton
Find All References
Breakpoint ►
Run To Cursor
Cut
Copy
P*ae
Outlining ►
Рис. 6.6. Контекстное меню редактора кода для файла Windows Forms
Поле индикаторов
Поле индикаторов — это узкое поле серого цвета с левого края окна редактора. Это поле
используется для отметки строк кода, в которых имеется точка останова или закладка. На
рис. 6.7 показан пример "Hello, World!" с закладкой в процедуре Main и точкой останова на
команде Console.WriteLine.
Щелчок в поле индикаторов приведет к включению или выключению точки останова для
указанной вами строки кода (мы описываем точки останова более подробно далее в этой же
главе, а также в главе 10).
Глава 6. Редакторы и визуальные конструкторы
167
П using System,
using System.Collections.Genetic;
--usinq System.Text,
Unampspate HelloWorld
Рис. 6.7. Закладка и точка останова
Поле выделения
Поле выделения — это узкая область между полем индикаторов и областью редактирования
панели кода. Оно обеспечивает следующее:
□ возможность выделить всю строку текста посредством щелчка в этом поле;
□ визуальную индикацию при помощи цветных полос — тех строк кода, которые измени-,
лись во время текущей сессии редактирования;
□ отображение номеров строк (если эта опция включена). Обратитесь к следующему
разделу, где мы обсуждаем настройку поведения текстового редактора.
Вы можете ясно видеть индикатор "измененного текста" и номера строк на рис. 6.8.
Program.cs*
£ $ Hello World. Program
V, ^Maln(string[]argS)
1П using System;
uning System.Collections.Generic;
using System.Text;
•i
' i-j nnrnrspraci» HelloWorld
cla
<
static void Main(sttlnff[] ergs)
for (lnt i - 0; 1 <- 5; i++)
(
t.UriteLine("Anyone listening?");
Рис. 6.8. Индикаторы измененного текста
168
Часть II. Подробности о IDE
Совет
Visual Studio предоставляет для текстового редактора специальную панель
инструментов. Вы можете увидеть эту панель посредством выбора в меню View |
Toolbars | Text Editor. В ней имеются кнопки Member List, Quicklnfo, Parameter List и
Word Completion для технологии IntelliSense, а также кнопки для отступов,
комментариев и перемещения по закладкам. Кнопки перемещения, вероятно, являются
здесь самыми полезными, поскольку они обеспечивают простой переход вперед и
назад по вашему коду.
Инструменты перемещения по коду
По мере увеличения количества строк кода в проекте эффективное перемещение по нему
(т. е. быстрое и простое нахождение нужных строк среди тысяч или даже миллионов строк)
становится проблемой.
Текстовый редактор имеет несколько инструментов для пометки строк кода, поиска и
замены текста в исходных файлах, и для того, чтобы вы понимали свое местонахождение внутри
длинного кодового файла.
Нумерация строк
Как мы уже упоминали при обсуждении поля выбора текстового редактора, нумерацию
строк можно включить для любого документа, загруженного в редактор. Эта опция
управляется из диалогового окна Optipns в меню Text Editor | All Languages | General, либо
выборочно для отдельных языков на их страницах General.
Сами по себе номера строк практически бесполезны. Однако для перемещения по коду
очень полезна возможность перейти на определенную строку кода. Для-такого перехода
нажмите в редакторе комбинацию клавиш <Ctrl>+<G>. Это приведет к появлению
диалогового окна Go To Line (рис. 6.9), в котором имеется поле для указания номера строки, на
которую необходимо перейти, и даже указана возможная "область" для перехода
(приводится диапазон номеров строк для текущего документа). Ввод верного номера строки приведет
к переходу курсора на начало указанной строки.
Go To Line
Line number (I - 23):
Ш
■ I ок
■ОН]
1 <w 1 I
Рис. 6.9. Переход на строку
Закладки
Закладки помогают решить проблему перемещения по большим кодовым файлам. После
размещения закладки на строке кода вы в любое время сможете мгновенно вернуться к этой
строке. Когда вам приходится работать со множеством закладок, вы можете свободно
перемещаться между помеченными закладками строками кода. Это чрезвычайно полезная воз-
Глава 6. Редакторы и визуальные конструкторы
169
можность. Если вы — разработчик, которому приходится иметь дело с большой базой
исходных кодов, то в этих кодах неизбежно будут иметься интересные места, которые вы
захотите просмотреть в редакторе. Вспомним, что окно текстового редактора имеет средство
навигации (раскрывающиеся списки типов л членов), однако это не лучшие инструменты
для таких случаев, когда интересующая вас строка может быть произвольным оператором,
похороненным под миллионами строк кода.
Закладки визуально отображаются в поле индикаторов текстового редактора (на рис. 6.8
закладка установлена на строке 9).
Для того чтобы добавить закладку или перемещаться по закладкам, необходимо
использовать либо панель инструментов текстового редактора, либо окно Bookmarks.
Вы можете увидеть окно Bookmarks (рис. 6.10) посредством выбора в меню View | Other
Windows | Bookmark Window. Вы увидите, что это окно представляет собой панель
инструментов для операций с закладками и список всех имеющихся закладок вместе с их
реальным физическим местоположением (это имя файла и номер строки в этом файле).
Bookmarks
[^^.^^«a^fS!^
Bookmark
he '..эйУДУ!
У ГЭ Bookmark2
l'L„—^—
File Location
m
CADocumtnts and SettingsMpoweri\My DotumenfeWtsual Studio 2005\Pro|
C\DocumentiancJ
тл ^~.....'. "..
5etttngi\lpowers\My DocumentsWisual Studio 2005\Pro|
J J
Рис. 6.10. Окно закладок Bookmarks
Для того чтобы установить закладку на данную строку кода, необходимо сначала поместить
курсор в текстовом редакторе на нужную строку, а затем нажать кнопку Toggle Bookmark.
Такой же процесс используется и для снятия закладки. Нажатие кнопок Forward и Back в
окне закладок приведет к перепрыгиванию курсора текстового редактора вперед и назад по
всем имеющимся закладкам.
Совет
Используйте окно Bookmarks для перемещения по коду между проектами. Вы не
ограничены закладками текущего кодового файла, они могут находиться в любом
загруженном кодовом файле. Список закладок этого окна является также полезным
механизмом для быстрого включения или отключения закладки (при помощи флажка
рядом с закладкой) и для присваивания закладке осмысленного названия. Щелчок
правой кнопкой мыши по закладке позволит вам переименовать ее в нечто более
осмысленное, нежели "Bookmark7".
Каталоги закладок
Интересной особенностью окна Bookmarks является возможность создать каталог закладок.
Это средство организации связанных друг с другом закладок. Например, вы можете поже-
170
Часть II. Подробности о IDE
лать поместить закладки для определенного математического алгоритма в каталог
MathFuncs. Для этого вы сначала создаете каталог при помощи кнопки New Folder панели
инструментов. Вы можете переименовать этот каталог так, чтобы он имел осмысленное для
вашего случая имя. Затем вы можете создать закладку и перетащить ее в каталог.
Окно Bookmarks показано на рис. 6.11. Обратите внимание, что используется несколько
каталогов (помимо закладок в различных кодовых файлах).
Bookmarks jjij
I .Ъ Р^ W4P К I
Bookmark File Location
. * jgaa
* П GeoDist C\DocLmentsandSettings4pc*remMy Documtnts\Visual Studio 2005\Projed
V !_J Diff С \Documents and SettlngsMpov/ersXMy DocumentsWisual Studio 2005\Projecl
У Q GecDiff С *> Documents and SrttingiMpovviers\MyDocument5\V1iUBlStudic2005\Projec1
L 2A Security
• 'J3 Bookmarkl CADocuments and ScttingsMpon«ven\My Documtnt$\Visual Studio 2005\Projed
V С i Bookmark! С \Documenb and SctttngiMpovversNMy DocumentsWiiual Studio 2005\Projecl
\4 r" . I M
Рис. 6.11. Окно закладок Bookmarks с каталогами
Поиск в документах
Окно текстового редактора предоставляет мощные возможности поиска и замены.
Поддерживаются три основных способа поиска: Quick Find (идеален для поиска текстовых
фрагментов в текущем документе или наборе открытых документов), Search In Files (идеален
для поиска текста в файле, который находится в произвольном месте структуры каталогов)
и Find Symbol (идеален для поиска объектов или членов по имени). Все эти механизмы
поиска запускаются из окна Find and Replace; кнопка в окне Find and Replace управляет
режимами окна (которые соответствуют трем только что описанным способам поиска).
То же самое окно используется и для выполнения текстуальных замен. Эта функция Replace
имеет два различных режима, которые совпадают с первыми двумя способами поиска. То
есть у вас имеется Quick Replace (который работает аналогично Quick Find) и Replace In
Files (который работает аналогично Search In Files).
Это дает в сумме пять различных режимов работы инструмента Find and Replace:
□ Quick Find;
П Find In Files;
□ Find Symbol;
□ Quick Replace;
О Replace In Files.
Давайте подробнее рассмотрим по отдельности каждый из этих режимов поиска и замены.
Глава 6. Редакторы и визуальные конструкторы
171
Quick Find/Quick Replace
На рис. 6.12 показано окно Find and Replace в режиме Quick Find. Здесь нужно ввести три
элемента информации: что вы ищете, в чем вы хотите искать, а также опции для настройки
параметров поиска.
Ftnd end Replace
Firjd what
*jj Quick Replace
MathFuncq
Look in:
I Current Document
"^ Findjtptions
_J Match ce«
~1 Match ^hole word
„J Search i|p
Vj Search bidden text
I £md Next I
gookmarlcAU
Рис. 6.12. Режим Quick Find
Раскрывающийся список Find what очевидно указывает строку поиска. Этот список будет
помнить последние 20 строк, применявшихся в операции поиска, что облегчает повторное
использование предыдущего поиска (нужно просто выбрать его из списка).
Раскрывающийся список Look in настраивает область поиска. Для поисков типа Quick Find
у вас есть несколько опций:
□ Current Document — эта опция указывает поиск в текущем активном документе
текстового редактора;
□ Selection — если в текстовом редакторе выделена часть документа, то эта опция
ограничит поиск только выделенным текстом;
□ All Open Documents— при использовании этой опции поиск будет выполняться по
всем открытым документам;
□ Entire Solution — эта опция расширяет поиск на все файлы решения;
□ Current Type — если курсор в данный момент стоит на блоке кода объекта или
пространства имен, то данная опция позволит вам выполнить поиск в этом блоке кода.
Обратите внимание, что в этой опции будет использоваться имя самого блока кода (не
будет написано "Current Type"). Рассмотрим такой пример: окно редактора кода открыто,
и курсор стоит внутри определения класса MessageBus (внутри пространства имен
Contoso. Fx. Integration). Для ограничения поиска текущим классом
раскрывающийся список Look in покажет опцию Contoso.Fx.Integration.MessageBus. Если курсор
не находится внутри блока кода, то эта опция просто не появится.
7 3ак 3716
172
Часть II. Подробности о IDE
Настройка поиска
Ниже элемента управления Look in имеется целый набор флажков для настройки поиска. Их
влияние на процесс поиска пояснений практически не требует:
□ Match case приводит к тому, что при поиске учитывается регистр введенной в Find
what строки;
□ Match whole word приводит к тому, что при поиске учитываются только полные
совпадения с указанной в Find what строкой;
□ Search up приводит к поиску в документе от конца к началу (значение, которое
противоположно значению по умолчанию — поиск от начала к концу документа);
□ Search hidden text (выбран по умолчанию) ведет поиск в областях кода, которые в
данный момент не видны (иначе говоря, в свернутых областях кода, области скрытого
краткого содержания, метаданных стадии проектирования и т. д.);
□ Use: Wildcards/Use regular expressions изменяет то, как ядро системы поиска
выполняет сравнение с указанной в Find what строкой. Стандартный поиск выполняет
посимвольное сравнение с указанной строкой. Однако вы можете также использовать
групповые символы (такие как Message*— для того, чтобы найти любую строку,
начинающуюся с текста Message) или полноценные регулярные выражения для
выполнения еще более сложных поисков. Регулярное выражение вводится при этом в поле
Find what.
Совет
Если вы решите использовать для вашего поиска групповые символы или регулярные
выражения, то для помощи в правильном синтаксическом написании поисковой
фразы имеется специальный инструмент. Если установлен флажок Use, то активируется
маленькая кнопка справа от раскрывающегося списка Find what. Эта кнопка вызовет
показ построителя выражений: выпадающее меню вариантов выбора синтаксических
конструкций (вместе с их описаниями). Контекст этого меню будет изменяться в
зависимости от того, что вы указали — Wildcard или Regular expressions.
Отыскивание результатов поиска
После того как вы указали все критерии вашего поиска, кнопкой Find Next в нижней части
окна поиска необходимо запустить сам поиск. Любые совпадения в указанной области
поиска внутри документа будут выделены подсветкой. Нажатие кнопки Find Next приведет к
переходу на следующее совпадение (до тех пор, пока совпадения не закончатся).
Вы можете также установить закладки на все совпадения. Для этого нужно просто нажать
кнопку Bookmark All.
Замена текста
Вы настраиваете режим Quick Replace (рис. 6.13) при помощи нажатия правой кнопки
режимов (аналогично тому, как вы настраиваете режим Quick Find). Процесс Quick Replace
виртуально идентичен процессу Quick Find; в диалоговое окно добавлено единственное
Глава 6 Редакторы и визуальные конструкторы
173
дополнительное поле, используемое для указания заменяющего текста. Элементы Find
what, Look in и Find options — точно такие же и по виду, и по функциональности.
Find and Replace
ш\
J^ Quick Find - [*ц Quick Replace -
Find л-hat
MathFunc$
Reglacewrth,-
MathFunctions
look in:
| J Current Document
r-j Find options
О Match gase
[ ] Match who\t word
I ] Search up
[7] Search hidden text
DU**
F4ijn ir f Tennis
[ FindNert ][
f
" * -
" *'
4
1
il
v| 1
Bcpbce 111
1 I
Replace £11 j
Рис. 6.13. Режим замены Quick Replace
В диалоговое окно добавлены две кнопки для запуска замены строк: Replace, которая
заменяет первое найденное совпадение текстом из поля Replace with, и кнопка Replace All,
которая заменяет все найденные совпадения текстом из поля Replace with. Обратите
внимание, что все произведенные замены можно всегда отменить при помощи команды Undo в
меню File. Эти две кнопки занимают место кнопки Bookmark All, которая в этом режиме
отсутствует.
Примечание
Несмотря на то, что подробное обсуждение регулярных выражений выходит за
пределы этой книги, вы должны обратить внимание, что поле Replace with может
поддерживать выражения с тегами. Более подробную информацию об использовании
этой возможности при операциях замены ищите в пособиях по использованию
регулярных выражений, а также в теме "Regular Expressions" документации MSDN для
Visual Studio.
Find In Files/Replace In Files
На рис. 6.14 изображено диалоговое окно Find and Replace в режиме Find In Files. Работа в
этом режиме похожа на режим Quick Find (с несколькими небольшими отличиями). Вам
по-прежнему необходимо указать "что" и "где" искать. И вы по-прежнему можете настроить
ваш поиск, хотя опций Search Up и Search Hidden у вас больше нет (поскольку они не
имеют смысла для поиска по файлам). Основные отличия этого режима — это доступные
области поиска, которые вы можете указать в раскрывающемся списке Look in, и способы
отображения результатов поиска. Давайте же рассмотрим эти отличия по очереди.
174
Часть II. Подробности о IDE
Ftnd and Replace
m
|k$ Find In Files | * j *J Qu+ck Replace ~
Find whet:
MathFunci
Uickire
Entire Solution
'•rldti-L^Wfi
[_] Find spticms
yj Match iase
j£. Mate h ghole word
JUsff
Ff<jnlv3"-<('ifess>ofi;
Lock at these file types
MlllffllffliSffl
Q Result options
List results in:
«< Find resu lb 1 window
i Find results 2 window
, i £isplayfile names onfy
* '-££• il <•'<• f eJ hLi ope'»
i
* ►
" -E
•1
у^д^ ^
a tt*
Find All | 1
Рис. 6.14. Режим поиска Find In Files
Область поиска примечательна тем, что она позволяет вам в качестве объекта поиска
выбрать целиком все решение (помимо областей, поддерживаемых в режиме Quick Find).
Кроме того, обратите внимание, что теперь у вас есть кнопка Choose Search Folders,
расположенная справа от выпадающего списка Look in.
Создание наборов каталогов поиска
Нажатие кнопки Choose Search Folders открывает диалоговое окно, которое позволяет вам
создать набор каталогов в качестве области поиска. Вы можете дать название этому набору
каталогов и даже настроить порядок поиска по этим каталогам. На рис. 6.15 показано это
диалоговое окно в момент создания набора поиска ClassLibCode. Вы видите, что в набор
включены три каталога и что вы можете добавить еще (для этого надо просто перейти в
область Available folders и добавить каталоги в список Selected folders).
Окно Find Results
При использовании Quick Find результаты поиска просто выделяются подсветкой (или
закладками) прямо в окне текстового редактора. Режим Find In Files отображает результаты
своего поиска в специальном отдельном окне Find Results (рис. 6.16). Вы можете
перенаправить вывод в одно из двух окон результатов путем выбора либо опции Find Results I
Window, либо опции Find Results 2 Window в нижней части диалогового окна Find and
Replace. Эти окна идентичны; два указанных варианта позволяют вам разделять результаты
поиска и избежать путаницы, которую могло бы породить смешивание результатов поисков
в одном окне вывода.
Глава 6. Редакторы и визуальные конструкторы
175
Choose Search Mders
Cheese the search fclderj from the ava4able folt
\ an existing set ot search folders.
Folder jet.
i ClassLbCode
Agitable folders
lects^ContosoCommonFramewoftJ ▼ L^
.
_UpgradeReport_ Files *
AdmmCcnsale |
OessLibraryl
CclorPallette i \
CclorPallette2
ContescFx Analysts
Conto$o,Fx.Commcn
Contoso.Fx UT
Contaso F* UI BrcwserShim
Conto-so UI WindowsForms.EmplayeeSt
< Conto-so Ul.WindDwsForms.OrderEntrv w
[.* — _ _i" — L__
ers You m
%r*^ '. i? \т£Ы'
ay afsc create а пел set of search folders w modify
• I «и* I ***' I
Selected folders-
iSContosoCommonFramev<ork\Contoso *
^ContosoCommonFrameworkSDataVii
rAConto5oCornmonFramert.'ork\HelloVVcr
is.
i
i
4 LA i >
||
!±J
Л]
{ OK ] f Cancel I
—.■■■■■■■ ■-■-■--■■■■■-■ -■■■■■■■■■■■■■■■■■■■■■■■■■■■■■iw..l.vjaa-.".'.-.v.v.'.'
Рис. 6.15. Создание набора каталогов поиска
Find ill "MeatageBus", Mitch c«s«r Whol* verd, Sub?old*r*, Find Reiults 1, " -
| С \DEeca\lpcvers.5lSEMCKTJi\I>QCU3t*nti«\ViiUAl Studio 2Q05\Pro]*ctJ\C<ntoscCainr
С \D»er3\lpojezs.Ri£MCKD\3ocuaent,»\Vi«u*l Studio 2003\PxDj»ct»\Contosc-Caex:
С NUiersUpcwers R£»JOKD\Document*\Visual Studio 20G5S ProjectaXContQaoCoraa
Katcbinj lines. 3. Matching file» 1 Total files secrcaed. 61
Рис. 6.16. Окно Find Results
На рис. 6.16 вы видите результаты простого поиска, выполненного по всем файлам
решения. Внутри окна Find Results имеется следующая информация:
□ описание выполненного поиска (например, Find all "MessageBus", Subfolders, Find
Results 1, "Entire Solution");
□ совпадения, полученные при поиске. Информация о совпадениях включает путь к файлу
и его название, номер строки в файле, а также дословный повтор той строки кода, в
которой имеется совпадение;
□ резюме по результатам поиска, в том числе: количество строк с совпадениями,
количество файлов, содержащих совпадения, а также общее количество просмотренных при
поиске файлов.
Двойной щелчок по одной из строк результатов в этом окне приведет к перепрыгиванию
курсора непосредственно на соответствующую строку в редакторе. Обратите внимание, что
это окно имеет панель инструментов. Кнопки этой панели (слева направо) позволяют вам
делать следующее:
□ перепрыгивать на соответствующую строку кода внутри текстового редактора (сначала
поместите курсор на совпадение внутри окна Find Results, а затем нажмите кнопку Go
to the Location of the Current Line);
176
Часть II. Подробности о IDE
П перемещаться вперед и назад по списку совпадений. Каждый совпавший элемент
выделяется подсветкой в окне Find Results и в окне Text Editor;
□ очистить окно Find Results;
□ отменить любой выполняющийся поиск.
Замена в файлах
Режим Replace In Files основан на режиме Find In Files, он обеспечивает всю его
функциональность и добавляет возможность перебора результатов в окне текстового редактора.
Кнопки Replace, Replace All и Skip File в этом режиме также имеются (рис. 6.17).
Find and Replace
| ,£ Quick Find - j[jjjj|ge!&<
f Rod what:
I 1аьЯЯШяЯ
1 Replace with
1 MessageAdapter
I Look in-
[ Entire Solution
f Ji'""» i>M st»j> frldrrc
Cj Find options
Sfl Match £ase
1 #| Match *hole word
Du*
JRecj.yUj^r^^cH
Look at these Ш type»
Ш
c^|j*J- 11
" JL<|
-.►j
~u
" 1
*.«;* re«;*jBdk*.wsdl;*Jumb*.xmfc%ht » jlj
L [-J Rejuft options
[ Lfct results ia-
I fr Find results Iwindo»
[ VFmd result* 2 window
1 £»ф1<г >1'*-f <n«. t ry
f F) Keep modified files open after 1
| Replace All 1
1 bndhle* |[
| Г'^РЙе"" |P
B*p*i«« 11
RepUceAJ4 ]I
Рис. 6.17. Режим Replace In Files
Мы уже описывали функции Replace и Replace АН. Каждый файл, в котором имеется
поисковая фраза, будет открыт в отдельном окне текстового редактора, и замены будут
выполнены прямо в этом окне. Если вы нажимаете кнопку Replace All, то замены будут
выполнены, а затем сохранены непосредственно в содержащем их файле. У вас есть также
возможность (при помощи флажка Keep modified files open after Replace All) оставить
все модифицированные файлы открытыми в соответствующих им текстовых редакторах.
Это позволит вам избирательно сохранить или отменить сделанные замены по вашему
усмотрению.
Вы можете также пропускать файлы в процессе поиска и замены (при помощи кнопки Skip
File). Эта кнопка доступна только тогда, когда в качестве области поиска указано более одного
Глава 6. Редакторы и визуальные конструкторы 177
файла. Нажатие данной кнопки говорит движку поиска о том, что необходимо пропустить
текущий обрабатываемый файл и продолжить обработку со следующего файла области поиска.
Поиск символа
Последний режим, который поддерживает диалоговое окно Find and Replace, называется
Find Symbol. Он применяется для поиска тех строк кода, в которых данный символ
определяется, используется, и где на него имеется ссылка.
Такая более ограниченная область поиска делает этот режим предпочтительным при поиске,
например, всех ссылок на класс CustomAnalyzer. Вы могли бы использовать для
нахождения этого текста и другие режимы Find, но более ограниченная область поиска режима Find
Symbol гораздо лучше подходит для такого типа поиска, поскольку он не будет перерывать
весь несимвольный текст документа. Кроме того, для поиска ссылок на символы функция
Find Symbol использует отражение и компилятор, поэтому это не просто текстовый поиск с
особенной областью поиска.
Поиск Find Symbol имеет еще два отличия от нормального Find/Replace. Он может искать
и во внешних компонентах, причем даже в отсутствие исходного кода. Для примера вы
можете выбрать в ракрывающемся списке Look in опцию .NET Framework. На рис. 6.18
показаны результаты поиска символа String в самой Framework.
Find Symbol Result; - 2 matches found ^
, -"$ C.\Ujen\lpowen REDMOND\Documents\Vinjal Studio 2^\Projectj\Cont«oCommonFramework\Clas5Libra1
| "^ C\lhers\lpo*e/s REDMGND\Documenti\Vifuaf Studio 2QG8\Proje<t$\Conto*DCommonFreme»»orlr\CJas*LibM]
| V MessagcBusO (Contoso FxJntegraticn.Contoso.Reintegration Specialized MessageBus) - GMteersUpowerc REDMOy
Г V С Xllser&Mpowers FEDMOND\Dccuments\Viiual Studio 2OT8\PiojecH\ContojoCommonFrameworfc\Cla5sLibra| i
Рис. 6.18. Окно Find Symbol Results
Второе отличие — это возможность Find Symbol моментально перепрыгнуть на определение
объекта или просмотреть его определение при помощи браузера объектов. Вы можете
получить доступ к обеим этим функциям (Go To Definition и Browse Definition) при помощи
щелчка правой кнопкой мыши по любому из совпадений, показанных в окне результатов.
Примечание
Если вы ищете символ внутри библиотеки, к исходному коду которой у вас нет
доступа, то опция просмотра определения символа в исходном коде (например, опция Go
То Definition) будет недоступна. Однако вы по-прежнему можете использовать
функцию Browse Definition для быстрого открывания определения в браузере объектов.
Это отличный способ исследования библиотек, которые были созданы не вами.
Инкрементальный поиск
Инкрементальный поиск работает без помощи диалогового окна. В открытом текстовом
редакторе выберите Edit | Advanced | Incremental Search (либо нажмите комбинацию кла-
178
Часть II. Подробности о IDE
виш <Ctrl>+<I>). Когда инкрементальный поиск находится в активном состоянии, то вы
будете видеть визуальную подсказку в виде бинокля со стрелкой вниз. Если вы начнете
вводить строку поиска (символ за символом), то первое совпадение будет выделено
подсвечиванием в самом окне текстового редактора. С каждым следующим символом строка поиска
будет меняться, и сам поиск будет выполняться повторно. Текущая строка поиска
отображается в строке состояния Visual Studio. На рис. 6.19 показан инкрементальный поиск в
действии; введены символы MESSA, и вы можете видеть первое совпадение, отмеченное в
текстовом редакторе.
tntegration.es I
j Ц Contoso Fx.Integration.MessagaMapper
71 using System;
I aairuj System. Col lections. Generic,
I using System.Text;
[]namespace Contoso.Fx.Integration
public е1ая"!
public HessageHapper [)
Jv-sno^inJ-
putolic class Jte^^eFu' : J5>- - v *y*i* чру . r
pub 1 ie HessageBus ()
{
}
public class -en'.ex' joks:..
{
public const irt HSG_HAP_TNDEX - 1009;
protected string Heasageld;
public string HeasageTrxId;
pilvatr atrmg lnternalGuld,
internal string systemContextld;
Рис. 6.19. Инкрементальный поиск
По умолчанию функция поиска работает в документе сверху вниз и слева направо. Вы
можете изменить это направление на противоположное при помощи комбинации клавиш
<Ctrl>+<Shift>+<I>.
Для перехода на следующее совпадение в документе используйте комбинацию клавиш
<Ctrl>+<I>.
Отменить инкрементальный поиск можно либо щелчком мыши внутри документа, либо
нажатием клавиши <Esc>.
Примечание
Инкрементальный поиск всегда выполняется нечувствительным к регистру образом и
всегда дает совпадения по подстрокам.
Глава 6. Редакторы и визуальные конструкторы
179
Отладка в текстовом редакторе
Текстовый редактор (а точнее, редактор кода) имеет несколько интерактивных
функциональных возможностей, которые облегчают процесс отладки кода. Отладка в текстовом
редакторе состоит в основном из точек останова и управления кодом во время выполнения.
Мы опишем общие процедуры отладки Visual Studio более подробно в главе 10.
Точка останова — это просто место (например, строка кода), которое помечено для
отладчика. Когда отладчик встречает точку останова, то выполняющаяся программа моментально
останавливается (до выполнения данной строки кода). Когда программа находится в таком
приостановленном состоянии, вы можете изучить состояние переменных или даже повлиять
на них путем присваивания переменным новых значений. Вы можете также интерактивно
управлять ходом выполнения кода в данной точке (вы можете пропустить следующую
строку кода или перейти напрямую на другую строку кода и продолжить выполнение с нее) —
и все это не выходя из интегрированной среды разработки.
Установка точки останова
Для настройки точки останова при помощи редактора кода сначала необходимо найти ту
строку кода, на которой вы хотите приостановить выполнение, а затем щелкнуть мышью в
поле индикаторов. Это создаст точку останова, которая теперь будет визуально видна (по
красному шарику в поле индикаторов).
Integration.» ▼ X
pfj Contoso.Fx Integration MessageMapper v $»MessageMapperO v'
Пusing System; ~~*
using System.Collections.Generic,
uilng System.Text; i
^namespace Cantoso.Fx. Integration
<
g public class I'-- * » 'rKipr^L : ir-=_^4q- ir к. ,
(
public HesaageJIapper(j|
1
ntegrntlon.es, line 9 ['Contoso.Fx.lntegration.MessageMapper', line 3) [
>
public class }\f*~«v;r'lxk~
i
public HessageBus()
(
}
public с1азз •'" >i ' '* . ) «j
{
public const mt HSG_HJLP_INDEX - 1009;
protected string Hessageld;
public string HesaageTrxId;
private string internalGuld;
internal string systemContextld;
Рис. 6.20. Настройка точки останова
180
Часть II. Подробности о IDE
При наведении курсора на поле индикаторов точки останова вы увидите подсказку ToolTip,
в которой будет указана некая базовая информация об этой точке останова: имя файла кода;
номер строки в этом файле кода; тип, в котором вы находитесь (если таковой имеется), а
также номер строки внутри этого типа.
На рис. 6.20 точка останова создана внутри класса MessageMapper. Информация ToolTip
показывает, что вы находитесь на строке 3 типа MessageMapper, но в кодовом файле
Integration.cs вы находитесь на строке 9.
Повторный щелчок по точке останова удалит ее.
Точка останова, которую мы настроили, очень простая — поскольку она вызовет
приостановку выполнения программы на данной строке кода независимо от других переменных или
факторов. Однако простые точки останова — это только вершина айсберга. Точки останова
поддерживают широкий набор условий, используемых для настройки и управления их
срабатыванием. Например, вы можете настроить срабатывание точки останова по состоянию
переменной или по количеству раз прохождения программой данной точки останова. Вы
можете также настроить условные точки останова (при помощи простых операций работы
мышью в окне редактора кода).
Настройка точки останова
Щелчок правой кнопкой мыши по индикатору точки останова покажет вам контекстное
меню (рис. 6.21) для настройки точки останова.
*
&
Delete Breakpoint
Disable Breakpoint
Location...
Condition.,.
Hit Count, .
niter,.
When Hit...
Рис. 6.21. Настройка точки останова
Именно здесь вы можете указать специальные условия срабатывания точки останова и даже
включить или отключить ее. Отключение точки останова (в отличие от удаления) сохраняет
ее местоположение в неприкосновенности (на случай, если она вам когда-нибудь вновь
понадобится).
Совет
Visual Basic фактически предоставляет команду, которая позволяет программным
образом осуществить срабатывание точки останова в вашем коде. Оператор stop
приостановит выполнение кода (подобно точке останова). Эта возможность полезна
тогда, когда вы выполняете приложение вне интегрированной среды разработки.
Каждый раз, когда при выполнении встречается оператор stop, отладчик Visual Studio
будет запускаться и подключаться к программе.
Несмотря на то, что язык С# не имеет аналогичного оператора, вы можете
использовать для той же самой цели класс Debugger: для программного срабатывания точки
Глава 6. Редакторы и визуальные конструкторы
181
останова надо просто вызвать Debugger.Break. Класс Debugger находится в
пространстве имен System.Diagnostic.
Управление ходом выполнения кода
Когда программа выполняется внутри интегрированной среды, то она будет продолжать
свое выполнение до тех пор, пока не наткнется на точку останова или оператор stop, либо
будет приостановлена вручную, либо завершится по окончанию кода (или будет
остановлена вручную).
Совет
Элементы управления типа VCR (как на видеомагнитофоне) и их сокращенные
клавиатурные комбинации (имеющиеся в меню Debug или на панели инструментов
Debug) являются самыми простыми средствами для запуска, приостановки и остановки
выполнения кода внутри интегрированной среды.
Когда происходит попадание на точку останова, редактор кода визуально показывает ту
строку кода, где выполнение приостановилось. На рис. 6.22 показана несколько
модифицированная версия программы "Hello, World!" в состоянии приостановки на точке останова.
Желтая стрелка в поле индикаторов указывает следующий оператор, который будет
выполняться после возобновления выполнения программы. В данном случае (поскольку точка
останова также находится здесь) индикатор следующего оператора (в поле индикаторов)
наложен на глиф точки останова.
Program.cs [
- iJbWcWati Progrvn vj ^Mdn(strhgQ «gs)
l", using System;
I using System.Collections.Generic;
1 using System.Text;
Gnamespace Hello¥orld
class
(
aiatlc void Hain(stcing[] orgs)
<
Idc (int i - 0; l <- 5; i++)
{
Console.VriteLlne("BeUo, lorldl try#<0>", i);
-so as Jle.IriteLineC Anyone listening?") ;
Рис. 6.22. Остановка на точке останова
Когда выполнение приостанавливается, вы можете изменить строку кода, которая будет
выполняться следующей. Разумеется, по умолчанию — это та строка кода, где выполнение
было приостановлено (вспомните, что выполнение останавливается до выполнения кода
строки, в которой создана точка останова). Вы можете вручную указать для выполнения
следующую строку кода (для этого нужно щелкнуть правой кнопкой мыши по нужной
строке и выбрать команду Set Next Statement).
182
Часть II. Подробности о IDE
На рис. 6.23 эта функция была использована для выхода из цикла WriteLine. Нормальный
ход выполнения кода был таким образом нарушен и вместо того, чтобы продолжать
крутиться в цикле for, программа немедленно перейдет на строку кода сразу после цикла. Вы
можете видеть стрелку и выделение подсветкой, которые показывают, что следующая
строка кода и точка останова больше не совпадают.
Вы можете также создать виртуальную точку останова (путем выбора опции Run To Cursor
в контекстном меню редактора). После этого программа будет выполняться до попадания на
выбранную вами строку кода, где и произойдет ее приостановка (так, как будто вы создали
здесь точку останова).
Program.cs j
^HettoWorld.Program <
Uusing System.
I using System Collections.Generic;
■• using System.Text;
Unamespace Hellotforld
^MaWstrtngQ ergs)
^
г эф
Ф
class* *>* -in vii
(
stfiLir- vrjirt Hain(at.T:iTirj[] orgs)
<
foL (int 1-0; 1 <- 5; 1-й-)
(Console.BriteLine ("Anyone listening?").
Рис. 6.23. Настройка следующего выполняемого оператора
Печать кода
Для того чтобы распечатать текущее содержимое текстового редактора, выберите Print из
меню File. Диалоговое окно Print совершенно стандартное, в нем вы можете выбрать ваш
принтер и настроить основные свойства печати. Здесь заслуживают упоминания только две
специфичные для Visual Studio опции. Раздел Print What данного диалогового окна
управляет тем, будут ли печататься номера строк и будут ли включаться в распечатку свернутые
области.
Цвета и шрифты
По умолчанию цвета шрифтов и разметка, которую вы видите в окне текстового редактора,
будут отправлены на принтер так, как есть (в предположении, что вы печатаете на цветном
принтере). Если вы хотите, вы можете изменить все эти настройки на странице Fonts and
Colors диалогового окна Options (рис. 6.24).
Это же диалоговое окно используется и для управления настройками шрифтов и цветов во
многих других частях Visual Studio. Доступ к настройкам принтера вы получаете при
помощи выбора опции Printer в раскрывающемся списке Show settings for в верхней части
диалогового окна.
Глава 6. Редакторы и визуальные конструкторы
183
Options
и
d Environment
General
Add-in/Mecros Security
AutcRecover
Documents
Find and Replace
Fonts and Colors
. Help
Import and Export Settings
International Settings
Keyboard
Startup
Task List
Web Browser
Projects and Solutions
Source Control
Tut Editor
Database Tcots
Pebtigfljflg
Show settings for
T«d Editor
~z\ L^5e Defeults
font (bold type indicates faed-wdth fonts)'
Courier New
San
10
display items-
Selected Text
Inactive Selected Text
Indicator Margin
i Line Numbers
Visible White Space
Bookmark
Brace Matching (Highlight)
Brace Matching (Rectangle)
Breakpoint (Disabled)
Breakpoint (Enabled)
Breakpoint (Error)
kern foreground:
Item background-
□ Default
turtonvn
Custom
J BoW
Sample:
i
AaBbCcXxYyZi
J
Рис. 6.24. Диалоговое окно Options, страница Fonts and Colors
На рис. 6.25 показан снимок вывода, полученного при распечатке файла кода.
с
. ч
: и
, »
SDdsi
txa,
"»1
"«»
niti mad 9*etLngs\lpovaxaV]fy ЛН«11оЖзх14л?хоггжм.а»
3y»Dcm;
Эуаг.я Col1«ос1ои».в»в«lie;
Sy.e.» !«»«;
niiiipiei Htllolltxld
- .
{
>
i"tic void BilnlitiSriM ic«>)
{
f»x U&x 1 - 0; i <■ 5; _-»•♦)
>
)
.
*. A1.
Рис. 6.25. Распечатка кода
Окно определения кода Code Definition Window
Окно определения кода является вспомогательным окном, которое работает совместно с
окном редактора кода (в нем отображаются определения для выделенных в редакторе кода
символов). Это фактически клон окна редактора кода, с одним существенным отличием: оно
"только для чтения" и не позволяет выполнять редактирование своего содержимого.
Содержимое окна определения кода обновляется каждый раз, когда меняется позиция
курсора в окне редактора кода. Если курсор находится в символе/типе, то окно определения
кода показывает вам его определение.
На рис. 6.26 показаны открытый редактор кода и окно определения кода; курсор в редакторе
расположен на внутреннем поле state, определенном в классе TransitionState.
Окно определения кода отрабатывает положение курсора и показывает исходный код,
который определяет тип поля state. На рисунке вы можете видеть, что окно определе-
184
Часть //. Подробности о IDE
ния кода — это очень функциональная адаптированная версия окна текстового редактора:
оно поддерживает закладки, точки останова и различные подсказки для навигации. He-i
смотря на то, что вы не можете редактировать код в этом окне, вы можете копировать его
из этого окна.
ЕР» fc* Yew gehctar Project ffM ДОид Data Took Test
Lj3 - _J - Jf У J Л л i - 4J' ^ ^ ^^
Integratfon.es
о; ' " ~
- Ь ^Cjntow Fbc Integration Conte*tTcjken Ifiterr v ^ j^ete
И 'J puollc ilaaa Co ictT 'si
i
Г
>
public ennsr iat H3G_HAP_INDEX - 1009,
prnrprreri string Heasageld,
public airing HeasageTrxId,
private strlna internalGuid;
internal atгint ayatemCautextld,
] private class ' i. •-• .■«• 1 •c'-n
<
private '*<м, .,' - on-1 •>, atate.
}
j public ContextTokenl)
Wjndow
•
using Syataia Collection».Generic.
using SyaceK.Texc;
1 t_ namespace Contoso.rx,Integration
p[ claas с » <4 » • **
j private int _chreshold;
private atrinj _scate;
ц. public int Threshold
Jjj Error Lit ^ Code Definition Window
j Ready Ln36 СЫЭ6
Community
Z. x
i
*i
>
4* X
л
►
СпЭЬ
1Я1нм1&Д||
iJ
* Js 1
i
< >
pt>. * 4 x 1
::IE
PC j
Рис. 6.26. Окно определения кода
Вы можете открыть окно определения кода при помощи меню View.
Создание и редактирование XML-документов и схем
Текстовый редактор так же хорош и производителен и при редактировании документов с
XML-контентом (включая XML-схемы). Редактор XML запускается при открывании внутри
Visual Studio файла с расширением xml. Он запускается также для xsl- и conflg-файлов и
всегда доступен при использовании команды Open With в Solution Explorer (для любого
элемента проекта).
Поскольку XML-документы содержат структурированное содержимое с узлами, тегами,
атрибутами и контейнерами узлов, то XML-редактор поддерживает структурирование
документов аналогично редактору кода: вы можете разворачивать или сворачивать узлы в
редакторе для того, чтобы показать или скрыть содержимое узла (рис. 6.27). И точно так же, как и
в редакторе кода, в XML-редакторе полностью поддерживаются и проверка синтаксиса, и
технология IntelliSense. XML-редактор знает о синтаксических требованиях к текущему до-
Глава 6. Редакторы и визуальные конструкторы
185
кументу и предоставляет соответствующие подсказки IntelliSense и помощь по
форматированию везде, где это возможно.
f>fodttctCa1alo9Jcs4[
«1 еше п \. i uriiute i л и 1 ^
<">хя1 vex\4ic)r«.0* »nc;od3rt3-*utff-3" ~>
и <ха:зсЬелА &ttrxt;utefcc;rвsi>.;tault«■г^пqllallfled,
£■ <xs:elejaeivt jiaxue-"products">
£ <кз:сш&р1ехТ/ре>
\г <хз: aeq\3(tnce>
|~ <x3:eltifiertr 2N.avne™"producc">
£• <xe:ccfsplex7ype>
£. <x3:aeque«cc>
<хз:element name— "displayname'* гур*тЩ*з:string" /:
<хя:element «*«№—"price" т,ур»»«"хз: decimal" />
<хз:е1етгет1Г n*mc—"stai" ypic»"xs:un3ignedlnr" />
<хз: element: n«iw—"in3tock" «•/*•> '™"хэ: acring" />
<хэ: elerrent n*n!wr«"mfr" ^урр-"хз:string" />
> </x3:sequence>
<хз.attribute n*mr-»"id" гург»»"ха: string" u*f-"requi
</xs: cereplexTypo
«</хэ:е1етг.й.п.Г,>
</хя:sequence>
</хз: ccrtplexType>
► </xa:rlem)?it>
- </xn:3chf«a>
Рис. 6.27. Редактирование документа XML-схемы
Используя XML-редактор, вы можете выполнять следующие действия:
□ редактировать документы XSD-схем;
□ генерировать документы схем из документов XML;
□ редактировать таблицы стилей XSLT;
□ редактировать документы типа Document Type Definition (DTD) и XML-Data Reduced
(XDR);
□ вставлять фрагменты XML.
Для освоения различных имеющихся в данном редакторе вспомогательных средств
редактирования, проверки и повышения производительности см. главу 8. Здесь же мы
исследуем две основные XML-функции: генерирование схемы и редактирование таблицы
стилей XSLT.
Выведение схемы
Редактор XML может автоматически генерировать документ XML-схемы (XSD) на базе
правильного документа XML. Когда документ XML открыт, выберите в главном меню XML
опцию Create Schema. После этого XSD-документ будет создан и открыт в редакторе XML
(как отдельный документ). Здесь вы можете сделать любые необходимые изменения в XSD-
документе и сохранить их на диск. Вы можете также включить его в ваш проект.
186
Часть II. Подробности о IDE
Примечание
Если вы примените команду Create Schema к XML-документу, который уже содержит
DTD- или XDR-схему, то алгоритм выведения будет использовать как основу для
преобразования именно эти схемы (а не фактические данные в XML-документе).
Редактирование таблиц стилей XSLT
XSLT-файлы — это XML-файлы, поэтому процесс редактирования таблицы стилей XSLT
точно такой же, как уже описанный процесс редактирования XML-документов. Имеется
однако несколько дополнительных функциональных возможностей, специфичных для
XSLT-документов. Во-первых, ключевые слова распознаются и выделяются в редакторе при
помощи затенения (точно так же, как и в кодовых документах). Во-вторых, редактор XML
автоматически обработает текущее состояние документа в соответствии со стандартной
схемой таблиц стилей XSLT и покажет вам все ошибки. И наконец, Visual Studio понимает
любые скрипты, встроенные в XSLT-документ. Вы можете установить точки останова в
блоке скрипта и получить полную поддержку отладки скрипта, которая позволит вам
пошагово проходить код, видеть текущее состояние переменных и т. д. На рис. 6.28 показана
таблица стилей XSLT с точкой останова, созданной во встроенном скрипте.
HuLTTBeLxsIt
П <хз! - ^'- /1^9Гг.е v verainr =". О*
хаЛ.-д. x>4l-w^ttp://-wwv.w3.cra/1999/Xgl/Trar3fanb"
хдЛл'д •uar?r-"htfp; //дусогесаг.у. coir./irvr.me3racc*>
[J <JfcJX2l: 2fJii.pt, \>>M;',^g"-"JScrX|2t" Ut^I»'» Г V'< ncffiv"'
\<Ф ] function дв.1 (node 13.3b) {
return nodelist.aextNodeC).xml;
</пЗХ31 • 9СГ2.РО
</y
Рис. 6.28. Отладка скрипта, встроенного в XSLT-документ
Выполнение XSLT
После создания таблицы стилей и прикрепления ее к XML-документу вы можете выполнить
эту таблицу стилей XSLT и просмотреть вывод в новом окне редактора. Для прикрепления
таблицы XSLT к XML-документу используйте окно Properties для XML-документа и
настройте свойство Stylesheet. Для прикрепления таблицы стилей в этом свойстве нужно вве-
Глава 6. Редакторы и визуальные конструкторы
187
сти полный путь и имя файла XSLT. Либо можно вручную закодировать таблицу стилей в
раздел пролога XML-документа. Для этого нужно ввести в пролог документа команду xml-
stylesheet вроде:
<?xml-stylesheet type=*text/xsl' href=?myxsl.xsl'?>
Когда таблица стилей будет привязана, выбор опции Show XSLT Output в меню XML
выполнит преобразования XML-документа и покажет вам результаты в отдельном окне
редактора.
Каскадные таблицы стилей
Редактор CSS (каскадных таблиц стилей) позволяет вам создавать и редактировать
документы каскадных таблиц стилей. Поскольку документы CSS являются в своей основе
текстовыми, то для эффективной работы редактору не нужно обеспечивать ничего, кроме
стандартных функций редактирования текста. Однако в редакторе имеется и несколько встроенных
инструментов, которые позволяют вам добавлять правила стилей и создавать стили при
помощи диалоговых окон (в отличие от обычного ввода текста в свободной форме).
Добавление правил стилей
Щелкните правой кнопкой мыши в редакторе CSS для того, чтобы получить доступ к
контекстному меню. Здесь выберите опцию Add Style Rule. Диалоговое окно Add Style Rule
позволяет вам ввести элемент, имя класса или идентификатор класса и даже определить
иерархию правил. Фиксация внесенных в этом диалоговом окне изменений приведет к
вставке необходимого контента в редактор CSS (для создания правила).
Определение атрибутов таблицы стилей
После того как вы добавили стиль в CSS-документ (при помощи либо написания стиля
вручную, либо использования вышеупомянутого диалогового окна Add Style Rule), можете
редактировать атрибуты этого стиля при помощи диалогового окна Style Builder. Вы
открываете это диалоговое окно щелчком правой кнопкой мыши внутри блока стиля и
выбором опции Build Style. При использовании этого диалогового окна можно полностью
описать стиль для нескольких различных категорий (от шрифта и раскладки и до
форматирования списков).
Разработка клиентских приложений под Windows
Для разработки клиентских приложений под Windows используются две технологии .NET:
Windows Forms (WinForms) и Windows Presentation Foundation (WPF). Обе эти
технологии — по сути, набор классов и элементов управления пользовательского интерфейса
(предоставляемых .NET Framework), позволяющих разработчикам быстро создавать
приложения, которые инсталлируются и работают под управлением операционной системы
Microsoft Windows.
188
Часть II. Подробности о IDE
Классы и компоненты WinForms являются уже вполне зрелой технологией, они
представляют собой главное направление разработки клиентских приложений под .NET. Напротив,
WPF является новой технологией, которая обещает обеспечить скачок вперед в создании
приложений, сочетающих в себе средства мультимедиа, документы и выразительные
элементы пользовательского интерфейса.
WPF использует язык разметки, называемый XAML (Extensible Application Markup
Language), для описания объектов приложений, значений свойств и поведения. В этом
отношении он очень похож на Web-приложение, которое использует HTML для описания
различных элементов Web-страницы. WPF (как технология) интенсивно использует векторную
графику и аппаратное ускорение графики для отображения пользовательского интерфейса
приложения.
Visual Studio поддерживает WinForms уже много лет. С другой стороны, Visual Studio
2008 — это первая версия Visual Studio, которая предоставляет разработчикам и редакторам
технологию WPF.
Независимо от типа клиентского приложения, которое вам необходимо создать, этот
процесс в основном одинаков: как визуальный конструктор WinForms, так и визуальный
конструктор WPF позволяют выполнять разработку при помощи перетаскивания, и оба они
имеют в Visual Studio шаблоны проектов.
Создание проекта Windows Forms
Процесс создания приложения Windows Forms начинается точно так же, как и проекты всех
других типов в Visual Studio: вы выбираете шаблон проекта Windows Application в
диалоговом окне New Project и настраиваете местоположение исходных кодов приложения. По-
:ле этого Visual Studio наполняет заглушками начальный проект и загружается визуальный
конструктор Windows Forms (рис. 6.29).
fonnlis lD«ignf ~ ~~ ~~~~ -■ X |
* *>««* LsLfiJlJEi I
Рис. 6.29. Начальная форма в визуальном конструкторе Windows Forms
Глава 6. Редакторы и визуальные конструкторы
189
Как вы видите из рисунка, внутри визуального конструктора находится макет реальной
формы. Это холст для вашего интерфейса пользователя. При помощи этого холста вы
можете добавлять на форму элементы управления и визуальные элементы, подстраивать внешний
вид самой формы и переходить непосредственно к коду, который связан с формой. Для
исследования работы самого визуального конструктора начните с простой конструкторской
задачи: предположим, что вы хотите взять пустую форму, которую сгенерировала для вас
Visual Studio, и создать из нее диалоговое окно регистрации, позволяющее пользователям
вводить имя и пароль и подтверждать свой ввод при помощи нажатия кнопки ОК. Должна
иметься также и кнопка Cancel для того, чтобы убрать форму.
Примечание
Не смущайтесь тем разнообразием представлений, которое могут иметь формы (окно
сообщения, диалоговое окно). С точки зрения разработки это все — окна, и поэтому
все они — формы.
Визуальный конструктор в этом примере позволит вам (разработчику) создать форму и ее
действия с минимальным написанием кода. При помощи операций перетаскивания и
диалоговых окон Property вы должны суметь настроить внешний вид приложения без
использования редактора кода.
Настройка внешнего вида формы
В дизайнере имеется несколько заметных визуальных элементов. Во-первых, показана сама
форма со всеми ее рамками, заголовком, клиентской областью и кнопками Min/Max/Close.
i .- forml.aIDciJj»)l - X
'О " * '> О
Рис. 6.30. Редактирование размера и заголовка формы
190
Часть II. Подробности о IDE
Кроме того, вы можете захватывать метки-манипуляторы на нижнем и правом краях формы
а также в ее правом нижнем углу. Эти метки используются для изменения размера формы
Для изменения прочих атрибутов формы вам необходимо использовать свойства формы
Они позволяют вам устанавливать цвет фона, вид рамки и ее поведение, текст заголовке
и т. д.
На рис. 6.30 заголовок формы изменен на Login, а поведение границы изменено на
диалоговое окно (в отличие от нормального окна с изменяемым размером).
Добавление на форму элементов управления
Элементы управления — это украшения формы, которые имеют собственный
пользовательский интерфейс. (Существуют также и элементы управления без пользовательского
интерфейса; мы рассмотрим их в разд. "Программирование компонентов и элементов
управления".) Они представляют собой основной механизм взаимодействия с формой. Иначе
говоря, форма — это в действительности просто контейнер для различных элементов
управления, которые реализуют необходимую для формы функциональность.
Вы можете очень просто добавлять на форму элементы управления (при помощи
перетаскивания их из панели Toolbox). Продолжая метафору: если визуальный конструктор— это
холст, то панель инструментов — это палитра.
Панель Toolbox
Панель Toolbox — это стыкуемое окно внутри интегрированной среды; оно видно только
тогда, когда вы редактируете элемент проекта, который поддерживает функциональность
этой панели. Для того чтобы обеспечить видимость панели инструментов, выберите ее в
меню View (или используйте комбинацию клавиш <Ctrl>+<W>, <X>).
Панель Toolbox группирует элементы управления в виде дерева со вкладками. Просто
разверните группу (такую как Common Controls или Menus & Toolbars), и вы увидите список
имеющихся элементов управления. В нашем случае вам нужны два элемента управления
типа "текстовое поле" для идентификатора регистрационной записи и текста пароля,
несколько элементов управления типа "метка" для описания элементов управления типа
"текстовое поле", а также кнопки ОК и Cancel для фиксации или отмены введенных данных.
Все эти элементы управления можно найти в группе Common Controls (рис. 6.31).
Для того чтобы разместить на форме элемент управления, перетащите его представление из
панели инструментов на форму. Некоторые элементы управления (называемые
компонентами) не имеют видимого пользовательского интерфейса. Один из таких компонентов —
это таймер. Когда вы перетаскиваете компонент на форму, то он размещается в отдельной
области визуального конструктора (называемой лотком компонентов). Лоток компонентов
позволяет вам выбрать один из добавленных компонентов и получить доступ к его
свойствам при помощи окна Properties.
Совет
Панель Toolbox имеет возможность настройки содержимого и размещения Вы
можете добавлять или удалять вкладки из панели, перемещать элементы управления из
одной вкладки в другую простым перетаскиванием, и даже переименовывать отдель-
Глава 6. Редакторы и визуальные конструкторы
191
ные элементы панели Toolbox Для выполнения многих из этих действий необходимо
попасть в контекстное меню панели Toolbox (при помощи щелчка правой кнопкой
мыши по вкладке или элементу).
Toolbox
ii^
I Ш CootofaULWifKfow^Forn^OfderEntiy Со^ - 11
0 Coflt©so.Fx«U£ Components
| R All Windows Forms
IfP Common Controls
>^ Pointer
© Button
0 CheckBox
H CheckedListBox
| Щ ComboBox
I *рй DateTimePicker
A Label
A LinkLabd
[*3 ListBox
\\ ty ListView
[■- MeskedTextBox
G£ MonthCalendar
TS7J Notifykon
{{$ NumericUpDnwn
ijj PictureBox
CD ProgressBar
0 RadioButton
| *~X RkhTextBox
i
I
1
z
J
CombaGox
Versior 2.0 0.0 Ire
HU Component
Displays an editat
permitted values.
lj
Рис. 6.31. Панель Toolbox
Размещение элементов управления
Когда вы конструируете форму, размещение элементов управления становится важным
вопросом. Обычно нужно обеспечить выравнивание элементов управления (по горизонтали
или по вертикали), размещение элементов (и групп элементов) управления на равных
расстояниях, наличие полей вдоль границ форм и т. д.
Визуальный конструктор предоставляет три отдельных набора инструментов, которые
помогают при размещении. Во-первых, у вас есть опции меню Format. При наличии
загруженной в визуальный конструктор формы вы можете выделить различные группы
элементов управления и использовать команды меню Format для выравнивания этих элементов
вертикально или горизонтально, увеличения или уменьшения расстояний между
элементами, центрирования элементов на форме и даже для изменения атрибутов внешнего вида
элементов управления (для того чтобы они имели равный размер по всем измерениям).
Другой набор инструментов размещения по своей природе интерактивен и используется в
двух разных режимах: линий привязки (snap line) и размещения по сетке (grid positioning).
Вы можете переключаться между этими двумя режимами в диалоговом окне Windows
Forms Designer Options (выберите Tool | Options и затем страницу Windows Forms
Designer). Свойство LayoutMode можно установить в значение SnapToGrid или SnapLines.
192
Часть II. Подробности о IDE
Использование Layout Grid
Сетка размещения (в полном соответствии со своим названием) — это сетка, которая
накладывается поверх формы. Сетка визуально представляется в конструкторе точками, которые
являются пересечениями квадратов сетки. Когда вы перетаскиваете элементы управления на
поверхность сетки (или перемещаете по ней), то визуальный конструктор автоматически
фиксирует края элементов управления к краям квадратов сетки.
Совет
Даже при включенном режиме размещения по сетке вы можете избежать
фиксирования — для этого надо выделить элемент управления, нажать клавишу <Ctrl> и при
помощи стрелок перемещать элемент управления вверх, вниз, вправо или влево (по
одному пикселу).
Размер квадратов сетки (и, следовательно, расстояние между этими направляющими
точками сетки) управляется свойством GridSize (также находится в диалоговом окне Options).
Меньший размер сетки соответствует более близкому расположению направляющих точек,
что в свою очередь приводит к более точному управлению размещением элементов
управления.
На рис. 6.32 показана форма регистрации с сеткой размещения. Обратите внимание, что
сетка была использована для того, чтобы:
□ текстовые поля были выровнены друг относительно друга (и имели одну длину);
□ метки были выровнены по вертикали с текстовыми полями и по горизонтали друг с
другом;
□ кнопки были выровнены по вертикали и имели необходимое свободное пространство
между собой и границами формы.
_______________ _ _____
' ю I
Pwawor. Т
Рис. 6.32. Сетка размещения
Глава 6. Редакторы и визуальные конструкторы
193
Использование линий привязки. Линии привязки — это несколько более
интеллектуальный механизм позиционирования элементов управления. При их использовании видимая
сетка на поверхности формы отсутствует. Вместо этого визуальный конструктор рисует
визуальные подсказки (при перемещении элемента управления по форме).
На рис. 6.33 показаны линии привязки в действии; этот рисунок показывает процесс
позиционирования кнопки ОК.
Обратите внимание, что элемент управления — в данном случае кнопка ОК —
зафиксировался в положении, которое находится на заданном расстоянии от границы формы
(указанном тонкой синей линией (цвет линии вы увидите на своем экране), идущей от кнопки до
границы формы). Положение фиксации кнопки также достаточно хорошо отдалено от
соседней кнопки Cancel (это расстояние указано тонкой синей линией от правого края кнопки
до левого края кнопки Cancel). Алгоритм линии привязки определил также, что вы
пытаетесь создать ряд кнопок, и поэтому вам нужно выровнять данный элемент управления по
вертикали с его соседом. Фактически это делается по внутреннему тексту кнопок; тонкая
розовая линия под текстом обеих кнопок ясно показывает, что они отлично выровнены.
Алгоритмы линий привязки автоматически учитывают рекомендуемые поля и расстояния
между элементами (как это описано в опубликованном руководстве "Windows User Interface
Guidelines" фирмы Microsoft). Эта функция избавляет от необходимости задумываться над
многими вопросами компоновки и помогает обеспечить определенное единообразие и
соответствие стандартам внутри приложений Windows Forms.
Примечание
Изменение режима компоновки визуального конструктора обычно происходит не
мгновенно. После такого изменения вам может понадобиться закрыть конструктор и открыть
его снова (например, при изменении с режима SnapLine на режим SnapToGrid).
, Ю- ' ~ ' "*" | |
Pwfwod I
Рис. 6.33. Использование линий привязки
194
Часть II. Подробности о IDE
Изменение размеров элементов управления
и редактирование атрибутов
Когда элемент управления уже находится на своем месте на родительской форме, вы
можете взаимодействовать с ним различными способами. Вы можете настроить свойства
элемента управления при помощи окна Properties. Вы можете также изменить размер и форму
элемента управления при помощи меток-манипуляторов на рамке элемента управления.
Написание кода
Несмотря на то,, что визуальный конструктор превосходен для визуального конструирования
пользовательского интерфейса, его возможности в смысле реализации поведения
ограничены. Вы можете использовать конструктор для размещения кнопки, но обработка нажатия
кнопки и реакция на него — это по-прежнему область действия кода.
На уровне кода форма— это просто класс, который инкапсулирует все поведение формы.
Для простоты разработки Visual Studio сводит весь код, который она пишет при помощи
визуальных конструкторов, в отдельные четко маркированные области, а в случае Windows
Forms — в отдельный файл кода. Этот файл называется в соответствии с именем основного
файла кода формы примерно так: FormName.Designer.<pacuiHpeHHe языка>. Например,
форма регистрации сопровождается файлом Login.Designer.cs, который реализует
написанный визуальным конструктором код.
В листинге 6.1 показано, что Visual Studio сгенерировала в виде кода для реализации
изменений, сделанных в визуальном конструкторе.
\ Листинг 6.1, Сгенерированный визуальным конструктором Windows Forms код
namespace Contoso.UI.WindowsForms.OrderEntry
{
partial class Login
{
/// <summary>
/// Необходимая для конструктора переменная.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Очистка всех используемых ресурсов.
/// </summary>
/// <param name="disposincfM> true, если нужно очистить управляемые
/// ресурсы; в противном случае false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
Глава 6. Редакторы и визуальные конструкторы
195
components.Dispose ();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Необходимый для поддержки конструктора метод - не изменяйте
/// содержимое этого метода средствами редактора кода.
/// </summary>
private void InitializeComponent()
{
this.labell = new System.Windows.Forms.Label();
this.label2 = new Systern.Windows.Forms.Label();
this.textBoxID = new System.Windows.Forms.TextBox();
this.textBoxPassword = new System.Windows.Forms.TextBox();
this.buttonCancel = new Systern.Windows.Forms.Button();
this.buttonOk = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// labell
//
this.labell.AutoSize = true;
this.labell.Location = new System.Drawing.PointF1, 23);
this.labell.Name = "labell";
this.labell.Size = new System.Drawing.SizeA7, 13);
this.labell.Tablndex = 0;
this.labell.Text = "ID:";
//
// label2
//
this.Iabel2.AutoSize = true;
this.Iabel2.Location = new System.Drawing.PointB6, 46);
this.Iabel2.Name = "label2";
this.Iabel2.Size = new System.Drawing.SizeE2, 13);
this.Iabel2.Tablndex = 1;
this.Iabel2.Text = "Password:";
//
// textBoxID
//
this.textBoxID.Location = new System.Drawing.Point(85, 20);
196
Часть II. Подробности о IDE
this.textBoxID.Name = "textBoxID";
this.textBoxID.Size = new System.Drawing.SizeA95, 20);
this.textBoxID.Tablndex = 2;
//
// textBoxPassword
//
this.textBoxPassword.Location = new System.Drawing.Point(85, 46);
this.textBoxPassword.Name = "textBoxPassword";
this.textBoxPassword.Size = new System.Drawing.SizeA95, 20);
this.textBoxPassword.Tablndex = 3;
//
// buttonCancel
//
this.buttonCancel.DialogResult =
System.Windows.Forms.DialogResult.Cancel;
this.buttonCancel.Location = new System.Drawing.PointB05, 72);
this.buttonCancel.Name = "buttonCancel";
this.buttonCancel.Size = new System.Drawing.SizeG5, 23);
this.buttonCancel.Tablndex = 4;
this.buttonCancel.Text = "Cancel";
//
// buttonOk
//
this.buttonOk.Location = new System.Drawing.PointA24, 72);
this.buttonOk.Name = "buttonOk";
this.buttonOk.Size = new System.Drawing.SizeG5, 23);
this.buttonOk.Tablndex = 5;
this.buttonOk.Text = "OK";
//
// Login
//
this.AcceptButton = this.buttonOk;
this.AutoScaleDimensions = new System.Drawing.SizeFFF, 13F) ;
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.buttonCancel;
this.ClientSize = new System.Drawing.SizeB92, 109);
this.Controls.Add(this.buttonOk);
this.Controls.Add(this.buttonCancel);
this.Controls.Add(this.textBoxPassword);
this.Controls.Add(this.textBoxID);
this.Controls.Add(this.Iabel2);
this.Controls.Add(this.labell);
Глава 6. Редакторы и визуальные конструкторы
197
this.FormBorderStyle =
System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "Login";
this.ShowInTaskbar = false;
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
this.Text = "Login";
this.ResumeLayout(false);
this.PerformLayout();
#endregion
private System.Windows.Forms.Label labell;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox textBoxID;
private System.Windows.Forms.TextBox textBoxPassword;
private System.Windows.Forms.Button buttonCancel;
private System.Windows.Forms.Button butxonOk;
Создание проекта Windows Presentation Foundation
Проекты Windows Presentation Foundation ведут себя во многом аналогично проектам Win-
Forms. Фактически одной из целей при создании визуального конструктора и редактора
WPF было сделать так, чтобы они работали знакомым образом для тех разработчиков,
которые привыкли к разработке Windows Forms. Точно так же, как мы делали ранее с нашим
проектом WinForms, мы начинаем процесс разработки и конструирования с выбора шаблона
WPF Application в диалоговом окне File | New Project.
В проекте автоматически создаются два XAML-файла: Windowl.xaml, который
представляет собой главное окно приложения, и App.xaml, который представляет собой само
приложение. Это аналогично файлам Forml.cs/Forml.vb и Program.cs/Modulel.vb, создаваемым в
новом проекте Windows Forms.
Первое отличие, которое вы заметите в проектах WPF, — это то, что по умолчанию вам
предоставляются две разные панели: в одной панели вы видите поверхность для
конструирования окна, а в другой — редактор, в котором содержатся XAML-объявления для формы.
Это фактически такое же представление, какое используется для Web-приложений (которые
мы будем изучать в следующей теме). На рис. 6.34 вы можете увидеть файл Windowl,
загруженный в интегрированную среду.
Обе эти панели — это просто разные представления одного и того же окна: визуальное
представление и представление "текст/XML". Например, я могу добавить в окно кнопку
198
Часть //. Подробности о ЮЕ
либо при помощи перетаскивания ее из панели инструментов на поверхность
конструирования, либо при помощи ввода XAML-объявления непосредственно в панели XAML
примерно так:
<Button Height=3.07" Name="buttonl" Width=5.362">Button</Button>
Window louml
dDes.gn H И XAML Ш0В
I j <>7ir,d<SW • ..-'^.'•^2 = "Dat£.•Гlz.Wl':dowL*, —$
I *, j = ">vttp./'scne:r23.microsoft ccn/wirf 4/ Z3C6/ «aibl/presc-^atiQii"
j xi „■» -"ficti ',> 3chsn.ua dLcr^soft . can:< v.iifx/200 6/xssLL"
»- 7 t ."-"Wiidovl" - ' -^--"SOO" %> ^dr. »°30:и . -a ^'.-"KicdQ'* Loadea«\-<''K^n-l(
Window /»ind£w
Рис. 6.34. Начальное окно визуального конструктора WPF
Window 1.хмл1
Button
Ц Dtsign tl E3 XAML
ШВЕ
v
i
я
! " '. -"Kjwlnv,." - ^
'./JLr"' ' """"w'
Window Wine aw /•»
= '»-jr.(-,» >? ,}f -"ЗОС*
j' '-"battanl" *' -if
m
" о-*<;* '.="Kifidnv. Lcmded" >
=■H 7 E *' >8итл r </ r it o» >
, ; ;;_„;;„ _. _
"
Рис. 6.35. изменение масштаба элемента WPF
Глава 6. Редакторы и визуальные конструкторы
199
Синхронность представления конструирования и XAML-представления поддерживается
автоматически.
Поскольку WPF основана на векторной графике, то вы можете изменять масштаб
изображения визуального конструктора при помощи ползунка в левой верхней части конструктора.
На рис. 6.35 показана форма Windowl с кнопкой, увеличенная в 10 раз.
Использование разделенных панелей
Вы можете управлять отображением и размещением панелей конструирования и XAML
внутри интегрированной среды. Там есть маленькая кнопка со стрелками в обе стороны,
которая при нажатии меняет эти панели местами. Вы можете также изменить ориентацию
панелей с горизонтальной на вертикальную (или наоборот) при помощи нажатия кнопок
Horizontal Split или Vertical Split. И наконец, вы можете свернуть любую панель при
помощи нажатия кнопки Collapse/Expand Pane.
Погзунок изменения
масштаба изображения
Кнопка для обмена
ганелей местами
Window Цмт!
jjjbitijl—Кнопка для изменения
ориентации панелей
• Селектор тегов XAML
Рис. 6.36. Элементы управления редактора WPF
Есть еще одна интересная функциональная возможность, которая уникальна для
визуального конструктора WPF: вы можете перемещаться вперед и назад по выделенным вами
объектам при помощи селекторов "вперед" и "назад", имеющихся в нижней части визуального
конструктора. Элементы управления для навигации по объектам, управления панелью и
изменения масштаба изображений отмечены на рис. 6.36.
200
Часть II. Подробности о IDE
Добавление элементов управления
Окна WPF заполняются элементами управления при помощи все тех же операций
перетаскивания из панели инструментов. Размещение элементов управления и изменение их
размера облегчается использованием линий привязки и блоков управления размером, которые
выглядят несколько иначе, чем соответствующие элементы WinForms, но выполняют те же
задачи (рис. 6.37).
Window L»ml*
Ц DKtgr» , "fi "bxAML \ ШЙШ!
xir .ri" •x-"ftt-p: //sc^erp6s.nilcro3C'Cc.ccm/Hi.ntx/2D0e/xaral" —|j
. ^^«"Windowl" .<eiesbr-00" Wiat,i-0Q" 12adfffl-,cHindcw_Loeded',>
<Pa;wa* H*u*J t=<5" J-J шо=" raTtva.il" Wt«^h="?66">
i'Buv.rcr. Cdf.vds l«£L»,,20n ьаг.Л!*э.Тоу»и23м Kei9f~v.-H23M 4ait!ei"Mbut.ccr-
<ЫЬ«Щ Cnnvas ->£<=«" KH.0<;2» C*v« ??p-3.322" Ji"i <<>»'—'22 . 67S"
<l i Button (ЬиПоп2] Windo*/Canv»s/Bufcon
Рис. 6.37. Рекомендации по размещению элементов управления
Мы подробно описываем разработку WPF в главе 16.
Разработка Web Forms
Web Forms представляют собой элемент пользовательского интерфейса для Web-
приложения. Традиционно в .NET термин "Web-форма" используется для обозначения
страниц, которые динамически обрабатываются на сервере (при помощи ASP.NET). Здесь
мы используем более широкое определение и применяем этот термин для обозначения
любых Web-страниц (статических или динамических), которые можно разрабатывать и
конструировать в интегрированной среде разработки Visual Studio.
Визуальный конструктор HTML (называемый также Web-конструктором)— это
родственное для визуальных конструкторов Windows Forms и WPF приложение; он позволяет вам
визуально конструировать и редактировать разметку Web-страницы. Точно так же, как и два
вышеупомянутых визуальных конструктора для приложений, он работает в сочетании с
визуальным конструктором HTML и исходным кодом (для того чтобы учесть все необходимое
для создания Web-страницы). Мы подробно опишем весь процесс разработки Web-
Глава 6. Редакторы и визуальные конструкторы
201
приложения в главе \4\ в следующих разделах мы просто опишем основы использования
Web-конструкторов и редакторов.
Конструирование приложения Web Form
Конструирование Web-страницы начинается с Web-проекта. Как уже обсуждалось ранее,
есть два разных способа конструирования Web-страницы или Web-сайта при помощи Visual
Studio. Оба этих подхода представлены своими собственными шаблонами проекта. Мы
говорим сейчас о проектах "Web-приложения" и "Web-сайта". В главе 4 мы выявили
некоторые фундаментальные отличия между этими двумя типами проектов; дополнительные
подробности ждут вас в главе 14. Однако поскольку реальное конструирование Web-страницы
при помощи Web-конструктора совершенно идентично в обоих типах проектов, то здесь мы
сосредоточимся на проекте Web-сайта.
Выберите File | New Web Site и в диалоговом окне отметьте вариант ASP.NET Web Site.
После указания каталога с исходными кодами и языка нажмите кнопку ОК для того, чтобы
Visual Studio создала проект и его начальную Web-страницу.
Web-конструктор похож на визуальный конструктор WPF; у него есть поверхность
конструирования, которая работает как холст, на котором можно размещать объекты из панели
инструментов. Несмотря на то, что элементы управления панелью несколько отличаются от
тех элементов управления, которые мы видели в конструкторе WPF, они имеют те же самые
базовые функции. Вы можете работать в "разделенном режиме", когда визуальный
конструктор и редактор развертки видны в разных панелях, или вы можете работать в таком
режиме, когда открыт либо только визуальный конструктор, либо только редактор.
Теперь изучим то, что происходит, когда вы пытаетесь воспроизвести форму регистрации,
которую мы создали ранее при помощи Windows Forms. (Существует готовая форма
регистрации, которую вы могли бы здесь использовать; однако для иллюстрации процесса
разработки мы соберем на скорую руку собственную примитивную форму — исключительно для
сравнения.)
Добавление и размещение элементов управления
Процесс добавления и размещения элементов управления не отличается от аналогичного
процесса в визуальном конструкторе Windows Forms. Просто перетаскивайте элементы
управления из панели Toolbox на поверхность конструктора. В данном случае вам нужны
две метки, два текстовых поля и кнопка ОК (поскольку это не диалоговое окно, то выходить
из него можно при помощи кнопки Cancel). Изменение свойств элементов управления
выполняется точно таким же способом — через окно Properties. Здесь вы можете выбрать
метки и командные кнопки и настроить их текст.
Примечание
По мере того, как вы добавляете элементы управления на Web-страницу, вы должны
заметить, что режим размещения по умолчанию является относительным. То есть
элементы управления размещаются на экране не в абсолютных координатах, а
относительно друг друга. Абсолютное позиционирование обеспечивается использованием
таблиц стилей. Например, вы можете выбрать метку, отредактировать свойства ее
стиля и выбрать Absolutely Position в качестве режима ее позиционирования. Это
позволит вам свободно перемещать метку по форме.
202
Часть II. Подробности о IDE
По умолчанию имеется и панель форматирования; она предоставляет кнопки для обычных
действий форматирования текста, таких как: изменение шрифтов, цветов, отступ параграфов
и выделение спецсимволами.
Для выравнивания элементов управления вы можете нажать комбинацию клавиш
<Shift>+<Enter> для вставки необходимого интервала между элементами (при этом в HTML
будет создан тег разбивки строки <br>). В данном случае тег разбивки был добавлен между
первым текстовым полем и второй меткой, а также между вторым текстовым полем и
первой кнопкой. На рис. 6.38 показан процесс конструирования. Текстовые поля не выровнены,
и, вероятно, вы захотите применить стиль к шрифтам меток и кнопкам; но общее
размещение уже понятно. Обратите внимание, что визуальный конструктор отображает поле над
текущим выделенным элементом управления, в котором указаны тип элемента управления и
имя экземпляра элемента управления на данной странице.
ь& ContojoCommtnFfarncvvork - Microsoft Visual Studio wj^^ .. .
File £dtt View Website guild D_ebug Format Table look Test Vtfndow Help
j3'_L)'Lj<d<i^ £ AA -&' ") ~ s • ^b . V Debug » Mixed Platforms - J}
£] S ;£ <-> AHTMLLOTransftton, - $$, - Style Application» Manuel •* £ (None)
\ Defouil.aspx* -■ X
3 i ~
§ | CRetit Objects & Events ▼ (No Events) ▼ j
<*Г!ОСТУРЕ V"-I Л.'! .C "-//K33//DTD XFTKL 1.Э 7zansici::ral//EN" "h^tpiZ/wwy. w3 ai £•
! LK^tnl КП ^"ftt x, //rfww. w3 ■ эга/199«/жг ..ia»>
' п<^еал . -' c^^ssr/sr^
<'iri*>Un-Ci-led Fage</tice>
</t.e id>
Ш-i lasp te«tbox#TextBtw2J
Passw
woidL_
4 Design 2 Split id Source |<||<htr"l> j<body>j|<fom>»fonT>l>|j<div>jl<dspTextBo^<TgxtBox2>
Reedy
Рис. 6.38. Создание Web-формы
Совет
Для облегчения выравнивания элементов управления включите либо линейку, либо
сетку позиционирования, либо и то, и другое вместе; доступ к ним можно получить из
меню View | Ruler and Grid.
Редактирование разметки
По мере добавления на поверхность визуального конструктора элементов управления
(и прочих элементов), для реализации данного дизайна и компоновки создается код HTML.
Как дизайнер (или разработчик) вы можете работать либо на визуальном уровне при помо-
Глава 6. Редакторы и визуальные конструкторы
203
щи визуального конструктора, либо на уровне исходных текстов при помощи редактора
HTML Source Editor. Подобно прочим редакторам Visual Studio 2008, HTML Source Editor
поддерживает технологию IntelliSense и другие интерактивные функциональные
возможности для навигации по разметке и ее проверки.
Возвратитесь к рис. 6.38 и обратите внимание на разметку, сгенерированную визуальным
конструктором при добавлении элементов управления на страницу регистрации.
Так же, как и в случае других пар "визуальный конструктор/редактор", вы можете писать
собственный HTML-код и мгновенно видеть его реализацию в представлении визуального
конструктора. Редактор HTML также имеет панель инструментов: панель инструментов для
редактирования исходных HTML-кодов предоставляет быстрый доступ к перемещению
"вперед и назад" по коду, комментированию, а также опциям проверкисхемы (мы обсудим
это в разд "Вывод в браузере и проверка" далее в этой главе).
Ключевая функция, реализованная в редакторе HTML — это сохранение форматирования
исходного кода: редактор HTML очень уважительно относится к вашему форматированию
разметки. Сюда входят: размещение возвратов каретки и пробельных символов,
использование отступов, и даже обработка переноса слов и строк. Короче говоря, Visual Studio
никогда не станет переформатировать написанный вами HTML-код!
Работа с таблицами
HTML-таблицы обеспечивают быстрый и легкий способ выравнивания элементов
управления на Web-странице. В Visual Studio 2008 имеется специальное диалоговое окно Insert
Table, которое предоставляет обширные возможности управления компоновкой и внешним,
видом таблиц. Для того чтобы поместить таблицу на поверхность конструирования,
выберите в меню Layout | Insert Table. Диалоговое окно Insert Table поддерживает нестандартные
компоновки таблиц, где вы можете указать атрибуты строк и столбцов, а также общие
атрибуты стиля (такие как рамки и дополнение пробелами). При помощи этого диалогового окна
вы можете также выбрать готовый шаблон таблицы из списка.
После добавления таблицы в визуальный конструктор она полностью интерактивна и
отзывается на изменение размера столбцов и строк стандартными способами.
Опции форматирования
Кроме сохранения формата написанного вами HTML-кода Visual Studio 2008 предоставляет
также возможности тонкого управления тем, как визуальный конструктор генерирует и
форматирует HTML-код. Вы можете использовать страницу HTML диалогового окна
Options (меню Tools | Options | Text Editor | HTML) для настройки стиля отступов,
использования цитирования, переноса слов и регистра тегов (рис. 6.39).
Настройки могут быть применены глобально ко всей разметке, либо вы можете выполнить
настройку для каждого тега отдельно (при, помощи нажатия кнопки Tag Specific Options
в Text Editor | HTML | Format). Например, такой уровень детализации полезен тогда, когда
вы в вашем стиле кодирования используете перенос строки в тегах столбцов таблиц (<td>),
но не используете его в тегах строк таблиц (<tr>). На рис. 6.40 тег <tr> настроен так, что
он поддерживает перенос строки до и после тега, но не внутри его.
8 3ак 3716
204
Часть II. Подробности о IDE
Option!
j л Text Edrtor
General
File E*tf nsmn
All Languages
| C*
f CSS
л HTML
General
Tabs
I Miscellaneous
Validation
PL/SQL
Plain Text
! SQL Script
i T SQL
T SQL7
j T SOLW
Iе jmBJ-
Statement completion
/ Auto list members
;. j<r ^ it cJ , 4.t u
У Parameter information
Settings
i Enable virtual space ■
yVordwrap
-j»» J.*<. .id < .
V Apply Cut or Copv commands to blank lines v»hen there is no selection
Display
, Ljne numbers
[J Enable single-click iJRL navigation
I/1 Navigation bar
'
| Ok [ Cancel |
Рис. 6.39.
{"УЫ
Tag Specific Optiors
kbd
legend
Ir
option
q
script
small
span
rtnke
strong
sub
sup
table
tbody
td
tfoct
thead
title
tr
New lag
| Dfitete
t j Per tag formatting
1 CJo-sing tag:
| Stparate closing tag
fitew Folder,-
i Line break's.
■ |&ef«**JKi«ft*£
j E Indent contents
I Outlining in cede editor
i L£ ЕлаЫе fiutlming for tag
fcdirumum lines.
Per tag colomation
Tag foreground: |
Tag background
I i£°ld
Preview
before tag
<tr>contents</tr>
after t«g~
щ Automatic
\Z\ Automatic
Custom...
Custom
Рис. 6.40. Настройка форматирования HTML на уровне тегов
Управление стилями и таблицами стилей
Visual Studio 2008 вводит совершенно новый набор инструментов для управления стилями и
каскадными таблицами стилей. Окна Manage Styles и Apply Styles используются для
выполнения обычных задач редактирования стилей, включая и применение стиля к текущему
Глава 6. Редакторы и визуальные конструкторы
205
HTML-документу или прикрепление/открепление файла каскадных таблиц стилей к/от
текущему HTML-документу. Третий инструмент— окно свойств CSS Properties—
перечисляет все свойства каскадных таблиц стилей для текущего выделенного элемента страницы,
позволяя быстро выполнить изменения любых значений свойств.
Типичный процесс редактирования стилей выглядит следующим образом:
1. Открыть Web-страницу.
2. Определить новый стиль.
3. Применить стиль.
4. Подстроить стиль.
На рис. 6.41 показано окно Manage Styles, а также его способность показать все элементы
форматирования в таблице стилей. Кнопка Options в правом верхнем углу окна
используется для управления тем, как отображается список элементов в таблице стилей (по порядку, по
типу и т. д.), или для фильтрации показанных элементов (все, только используемые на
данной странице и т. д.).
Manage Styles
m
АА N*w Style... ЁЙ5Я11J |
4t Attach StHe Sheet...
| CSS style»:
| й tfiv.sabbiiGvrtext_l
d div#about_wiJext_2
J .ws_btie
tt ,ws_ttle_a
ч> .wsetect
^ .ws-aff
a .ws_sdect_bg
a td
1 Ф td.bottom
1 »> .fatiel
] *J .tfflela
<Л hHj-3
Selected style preview:
AmBbYjCtLUj
1AJ, Apply Styles <jk? Manage Styles ^CSSPropf'ties
* 1
™
"" j
J
J
Рис. 6.41. Окно Manage Styles
Оба окна (Manage Styles и Apply Styles) по умолчанию видны при редактировании Web-
страницы; их можно также открыть через меню Format | CSS Styles. Оно свойств каскадных
таблиц стилей доступно через меню View.
Вывод в браузере и проверка
Результат всех усилий по проектированию HTML-документа — это его отображение в
браузере. С учетом большого количества используемых браузеров (которые поддерживают
различные уровни спецификаций HTML (и в том числе и XHTML)), очень трудно обеспечить
соответствие реальности и первоначального замысла дизайна страницы. Настройка целевого
206
Часть II. Подробности о IDE
браузера в Visual Studio помогает вам решить эту проблему— вы можете вести разработку
под конкретный стандарт HTML или конкретный браузер. Когда вы вводите HTML-код в
редакторе исходного кода, то Visual Studio "на ходу" проверяет соответствие синтаксиса
выбранному вами браузеру. Если какой-то элемент разметки нарушает правила целевого
браузера вашей разработки, то он будет помечен знакомой красной волнистой чертой (а
также и подсказкой ToolTip, в которой будет объяснено само нарушение), при этом ошибка
будет включена в список окна Task List.
Цель разработки можно выбрать в панели инструментов визуального конструктора HTML
или редактора исходных кодов: надо просто выбрать цель из выпадающего списка.
Примечание
Правила проверки для конкретного браузера или стандарта можно настроить таким
образом, чтобы они поддерживали и такие цели разработки, которые в комплекте
поставки Visual Studio отсутствуют.
Соответствие стандартам
Код HTML, сгенерированный визуальным конструктором HTML, по умолчанию
соответствует XHTML. Например, теги сформированы в соответствии с требованиями XHTML. Ис1
пользование различных XHTML-целей для проверки разработки позволит вам обеспечить
совместимость написанного вами кода.
Visual Studio также старается обеспечить соответствие требованиям стандартов
доступности — это стандарты, которые определяют отображение Web-страниц для людей с
ограниченными возможностями. Инструмент проверки Accessibility Checker можно запустить при
помощи кнопки Check Page for Accessibility в панелях инструментов Source Editing .или
Formatting.
Accessibility Vafjdation
Check for
.VZAGP'tcfitv^
[^JWCAG Priority jj
b£ Access Board Section 598
Show
[7 Errors
R! Warnings
[~~ Manual checklist
J [ Validate \
1
»
ИНшОмГ
L
[ Cancel J 1
Рис. 6.42. Настройка опций проверки доступности
На рис. 6.42 показано диалоговое окно Accessibility Validation. Можете выбрать
конкретные стандарты, на соответствие которым вы хотите проверять ваш HTML-код. Вы можете
также выбрать уровень обратной связи (ошибки, предупреждения или текстовые списки).
Каждый помеченный при проверке элемент появится в окне Task List. Подробности отно-
Глава 6 Редакторы и визуальные конструкторы 207
сительно двух поддерживаемых здесь стандартов (WCAG и Access Board Section 508) см. на
соответствующих Web-сайтах: http://www.w3.org/TR/WCAG10 и http://www.access-
board.gov/508.htm.
Программирование компонентов
и элементов управления
Как уже упоминалось в нашем предыдущем обсуждении Windows Forms,
компоненты — это невизуальные элементы управления или классы. Это хорошее обобщенное
определение, но вот более точное: компонент— это любой класс, наследующий от
System. ComponentModel. iComponent. Этот конкретный интерфейс предоставляет
поддержку конструктивной реализуемости и управления ресурсами. Если вам нужен элемент
управления, который не имеет своего пользовательского интерфейса, то вам нужен
компонент. В Visual Studio для разработки компонентов используется визуальный
конструктор компонентов.
Элементы управления похожи по своим функциям, но не по форме: элемент управления —
это многократно используемый блок кода, который имеет соответствующий ему
визуальный элемент.
Создание нового компонента или элемента управления
Вы начинаете процесс написания компонента с диалогового окна Add New Item (в меню
Project). Выбор Component Class в этом диалоговом окне приведет к добавлению файла
заглушённого кода в ваш текущий проект и к запуску визуального конструктора
компонентов. Для того чтобы начать разработку элементов управления, используйте диалоговое окно
Add New User Control.
Примечание
С помощью Visual Studio можно писать два принципиально разных типа элементов
управления: нестандартные и пользовательские элементы управления.
Нестандартные элементы управления наследуют непосредственно от класса
System, windows. Forms. Control; они обычно содержат большое количество
кода, поскольку вы (разработчик) отвечаете за написание всего кода, необходимого
для отображения видимой части элемента управления. Пользовательские
элементы управления (иногда называемые составными элементами управления)
наследуют от класса System.windows, forms.UserControl. Пользовательские
элементы управления выгоднее, поскольку вы их можете быстро составлять из
других элементов управления (которые уже имеются в панели Toolbox). Эти элементы
управления уже имеют готовый код своего пользовательского интерфейса.
Визуальные конструкторы элементов управления и компонентов работают на тех же
принципах, что и визуальный конструктор Windows Forms: конструкторы позволяют вам
перетаскивать объекты из панели инструментов на поверхность конструирования.
Предцоложим, что вам нужен компонент, который будет посылать сигнал через
последовательный порт каждые х минут. Поскольку Visual Studio уже предоставляет компоненты
таймера и последовательного порта (которые доступны через панель инструментов), то вы мо-
208
Часть II. Подробности о IDE
жете использовать визуальный конструктор компонентов для добавления этих объектов в
ваш собственный нестандартный компонент, а затем использовать их встроенные свойства и
методы (т. е. использовать эти объекты как строительные блоки для создания необходимой
вам функциональности).
«/> ContoioCommonFrBmework- Microsoft \fisu§|Studk>
"!ф
l^'mtotead
File £dlt
'Л Ь i
tfew Efoject guild
Qebug
43»
О ti'merl
31ртосел1
DiU loot Test Window hje'P
p* v ^g , j-^ j ^ Dtbug » Meed Platforms
» x I Solution Explorer - Solution 'CentosoCommonFrarnewerk .
1&1&ЖЧЖЗ .
I y „(.' Class Libraries
,- ^ Controls
■ if £j9Contofo.FxUI
I$i Л Properties
k) y£ References
03 j| CekndafControl.es
№ 4Й Compcnentl rs
j _-"' ^3 Contoso.FxAn*lysis
; Tt ad Rfooertics. ; ^ . .^
■ ^Solution Explorer ^J fc&eument СКгЙле f
^ЪЪ
I Properties
j processl System Diagnostics Process
(Name) processl
EnableRsisingEvents False
GrnerateMember True
Modifiers Private
Indicates the name used in code to identify the object
Ready
Рис. 6.43. Визуальный конструктор компонентов
На рис. 6.43 показан визуальный конструктор компонентов в процессе создания такого
вымышленного нестандартного компонента. Добавлены два объекта: таймер и компонент
процесса.
Аналогичный сценарий можно представить себе и применительно к пользовательскому
элементу управления. Вы можете взять наш пример формы регистрации, состоящей из двух
текстовых полей, двух меток и двух кнопок, и сделать из этого элемент управления, который
можно будет легко включить в состав панели инструментов, а потом перетаскивать на
форму Windows или Web-форму.
Дальнейшие замечания
по поводу написания кода компонентов
Поскольку компонент не имеет визуального представления, то у вас нет функций
размещения и форматирования, которые вы видите в визуальном конструкторе Windows Forms.
Однако концепция программирования перетаскиванием живет и здравствует и здесь. Visual
Studio (за кулисами) вставляет код для программного добавления данного класса в
контейнер компонента. Здесь вы можете редактировать различные свойства объекта; дважды
щелкнуть по объекту, чтобы перейти в его код, и т. д.
Глава 6. Редакторы и визуальные конструкторы
209
Когда вы просто перетаскиваете объекты таймера и процесса из панели Toolbox, то Visual
Studio интегрирует эти объекты в компонент при помощи автоматического написания,
показанного в листинге 6.2 кода.
I Листинг BJL Сгенерированный визуальным конструктором код компонента
namespace Contoso.UI.WindowsForms.OrderEntry
{
partial class Componentl
{
/// <summary>
/// Необходимая для визуального конструктора переменная.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Очистка всех используемых ресурсов.
/// </summary>
/// <param name="disposing">true — если необходимо очистить
/// управляемые ресурсы, в противном случае false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Необходимый для поддержки визуального конструктора метод -
/// не изменяйте содержимое этого метода при помощи редактора кода.
/// </summary>
private void InitializeComponent()
{
this.components = new Systern.ComponentModel.Container();
this.timerl = new Systern.Windows.Forms.Timer(this.components);
210
Часть II. Подробности о IDE
this.serialPortl = new System.10.Ports.SerialPort(this.components);
}
#endregion
private Systern.Windows.Forms.Timer timerl;
private System.10.Ports.SerialPort serialPortl;
}
}
Написать код для одного из этих (помещенных на холст конструктора компонентов)
объектов не сложно: дважды щелкните по значку объекта, и будет запущен редактор кода.
Например, двойной щелчок по значку таймера на поверхности конструктора приведет к
созданию процедуры timerlTick, которая и будет открыта в редакторе кода.
Резюме
Visual Studio предоставляет целый набор редакторов и визуальных конструкторов. Они
обеспечивают широкую гамму задач по разработке решений, начиная с размещения
графических элементов управления в режиме WYSIWYG и заканчивая тонко настраиваемым (под
конкретный язык, синтаксис или разметку) редактированием текстов.
В этой главе было описано, как использовать основные возможности этих редакторов и
визуальных конструкторов. Здесь было также описано, как взаимодействие редактора и
визуального конструктора обеспечивает два взаимодополняющих представления одного и того
же объекта решения — ив итоге получается необходимый для разработчика инструмент
решения задачи.
В последующих главах мы рассмотрим более сложные опции и функциональные
возможности, имеющиеся в этих инструментах, и даже познакомимся с последовательностью
операций, необходимых для разработки от начала и до конца Web-приложения или приложения
Windows Forms.
Глава 7
.NET-сообщество: использование
и создание разделяемого кода
.NET-сообщество — это большая и разнообразная группа. Поищите в Интернете, и вы
быстро найдете бесчисленное количество контента и помощи по созданию приложений. По
сравнению с предыдущей версией (Visual Studio 2005) фирма Microsoft добавила несколько
функциональных возможностей для сообщества. Эти возможности помогут вам быстро
получать доступ к информации, образцовым кодам и прочим средствам повышения
производительности, предоставляемым сообществом. Visual Studio помогает создавать пакеты
такого контента, управлять им и упрощать доступ к нему.
В этой главе описано, как разработчики могут использовать возможности Visual Studio
2008 для работы с сообществом разработчиков. Вы узнаете, как настроить контент
сообщества, как получить поддержку сообщества, а также как найти и использовать коды
сообщества разработчиков. Наконец, вы узнаете, как нужно оформлять ваши собственные
образцы кодов и средства повышения производительности для того, чтобы поделиться
ими с сообществом.
Функциональные средства Visual Studio
для работы с сообществом разработчиков
Разработка программного обеспечения приобретает все более "подключенный" характер.
Web-сервисы, новостные ленты RSS, Web-сайты и т. п. дают теперь доступ к обширному
контенту, значительно превышающему все то, что когда-либо можно было сохранить на
локальном жестком диске или в локальной сети. Этот контент больше не поставляется и не
управляется фирмой Microsoft. Фирма Microsoft предоставляет огромное количество
помощи для разработчиков, образцы кодов и информацию, но она также признает важность
вклада огромного .NET-сообщества. Visual Studio 2008 предоставляет ссылки на этот
контент. Ее цель — обеспечить разработчиков важной (и целевой) информацией по продукту и
разработке, а также обучающей информацией там, где они ее смогут найти: в
интегрированной среде разработки. Идея состоит в том, чтобы увеличить производительность и
обеспечить использование передового опыта при помощи подключения разработчиков к
имеющейся информации.
212
Часть II. Подробности о IDE
Команда разработчиков Visual Studio встроила эти ссылки и функциональные
возможности в интегрированную среду таким образом, чтобы они были интуитивно понятными и
ненавязчивыми, но всегда доступными. Вам не нужно заниматься поиском для
подключения к вашему сообществу. Вместо этого сообщество "доставляется" вам при помощи
вашего инструмента разработки. Если вы ищете специфическую информацию, либо хотите
исследовать то, что имеется в наличии, или опубликовать собственный контент, то
можете сделать это непосредственно из Visual Studio 2008. Следующие разделы иллюстрируют
то, что имеется в интегрированной среде на стартовой странице Visual Studio Start Page
и в меню Help.
Примечание
В Visual Studio 2005 имелось специальное меню Community. Все функции этого меню
перенесены в меню Help. Это несколько расчистило панель инструментов и
обеспечило единый источник сведений по поиску информации и вспомогательных средств
разработки.
Стартовая страница Visual Studio
Разработчики, которые ранее не сталкивались с Visual Studio 2008, впервые войдут в
интегрированную среду через стартовую страницу Start Page. Эта страница работает как простой
портал среды разработки и содержит ссылки на ваше любимое сообщество. Четыре
основные части стартовой страницы — это Recent Projects (Недавние проекты), Getting Started
(Начинаем работать), заголовки Visual Studio Headlines и канал новостей MSDN. На рис. 7.1
показан образец стартовой страницы интегрированной среды.
File Edit View Tools Test Window Help
Start Page
it»
* Visual Studio 2008
«£]CtassLibreryl
3JClMiUbraiyl
^WebSrtel
^JWrndovvsForrnsApplicfltionZ
3J Solution!
Open, V i t t
Create. P'<.y;u
What s new in Visual C*>
Cres'e > г> ' Пгй Аср rstici
Hew Г J -
Lwrivi' i*l С *
Do \"ilc«d Addition*} С cnfe-ii
I ^ Ere list
Rudy
Uui'ied C* 3 Q Specification Mow Av<ulab)e *
Tue, 21 Aug 20071746 49 GMT - The authoritative C* 3D Specrf icaticn i _
was written by the people who created and implemented the C* !=
language, This 500 plus page document a now available for dcwnload. I
N ew Hinds on L »b% and Sample* Avails ofe for Vttuai S tudio 2COG В ..
Thu, 09 Aug 2007 18 51 42 GMT Use these resources to get familiar with
the latest version of your favorite C* compiler in Visual Studio 2008 Beta
L
Download VKual 51.«feo 2008 Bet» 2
Thu, 09 Aug 200718.48 52 GMT - See all of the improvements that are
coming in Visual Studio 2008 wrth next-generation Web development,
integrated development for the Microsoft Office system, and
industry-leading designers for Windows Vista
The Evolution Of IINQ And Hs lr»p*ct On The Design Of C»
Thu, 24 May 20071739.56 GMT - C* PM Anson Norton explains the
relationship between UNQ and the new features in CSharp 3 0 such as
extension methods and lambda expressions-
Рис. 7.1. Стартовая страница Visual Studio
Глава 7. .NET-сообщество: использование и создание разделяемого кода 213
Обратите внимание, что образец стартовой страницы (портала), который показан на рис. 7.1,
будет выглядеть так для разработчика, который установил настройки по умолчанию
интегрированной среды в значение Visual C# Development Settings. Стартовая страница (и
прочие элементы интегрированной среды, такие как панели инструментов и размещение) будет
меняться в зависимости от настроек вашего профиля по умолчанию для интегрированной
среды. Например, если вы выберете Web Development Settings, то ваш канал новостей
MSDN будет настроен на новости ASP.NET, а информация раздела Getting Started будет
предназначена для разработчика ASP.NET. Теперь давайте рассмотрим каждый раздел
стартовой страницы.
Совет
Вы можете изменить настройки по умолчанию для интегрированной среды (на
использование VB, С#, C++, Web и т. д.). Это приведет к изменениям в самой
интегрированной среде, а также и конфигурации ее стартовой страницы. Для этого откройте
меню Tools и выберите опцию Import and Export Settings. В мастере Import and
Export Settings Wizard вы можете не только импортировать или экспортировать ваши
настройки интегрированной среды, но и сбросить все настройки в состояние "профиль
по умолчанию". Выбор нового профиля приведет к автоматической настройке вашей
стартовой страницы в соответствии с новым профилем.
Недавние проекты
Раздел Recent Projects стартовой страницы хранит список проектов, над которыми вы
работали. Это позволяет вам легко получать доступ к тем проектам, которыми вы занимаетесь в
данное время. Естественно, при щелчке по проекту из этого списка он открывается для per
дактирования. На рис. 7.2 показан пример списка Recent Projects.
«$Э DatsAccessLayer
<ТЗ Fabrikam
Open: Web Site.., | Project..
Create: Wet Site.» | Project .
Рис. 7.2. Список Recent Projects из стартовой страницы
Обратите внимание, что список Recent Projects содержит также ссылки для открытия и
создания других проектов (отсутствующих в списке). При помощи этих ссылок вы можете
быстро начать новый проект, создать новый Web-сайт, а также перейти к другому проекту (не
входящему в данный список). Быстрый доступ к этим возможностям делает стартовую
страницу пригодной для использования в качестве начальной точки вашей каждодневной
работы.
Начинаем работать
Раздел Getting Started стартовой страницы обеспечивает для тех разработчиков, которые
впервые сталкиваются с Visual Studio 2008 (или тех, кто хочет узнать что-либо новое), удоб-
214
Часть II. Подробности о IDE
ное место для начала. Ссылки этого списка обычно посвящены созданию нового проекта,
использованию шаблонов, ответам на вопросы, либо изучению новых вещей. Этот раздел
может быть отличной начальной точкой для ваших собственных исследований. На рис. 7.3
показан пример раздела Getting Started из стартовой страницы для С#. Конечно, этот
раздел меняется в зависимости от вашего профиля разработки (VB, С#, C++, Web и т. д.).
Getting Started
What's new in Visual C#>
С ttate vo.,f Г rr Appl crtion
How Do ).. ?
LeamV:-dlC«<
Uovvn oa J Add tiortsl Lent*' t
Lxtrnrf W>u?l*;turiic
Рис. 7.З. Список Getting Started из стартовой страницы
Из рис. 7.3 вы можете видеть, что блок Getting Started предоставляет ссылки
непосредственно на MSDN (новости и возможности обучения). Вы можете также подключиться
непосредственно к сайтам сообщества разработчиков или скачать различные дополнительные
модули.
Новости Visual Studio
Раздел новостей Visual Studio стартовой страницы показывает объявления и заголовки
новостей, имеющие отношение к Visual Studio. На рис. 7.4 показан пример. Здесь вы можете
видеть, что в разделе имеются заголовки и ссылки на контент MSDN. Эти заголовки являются
для разработчика весьма важной информацией (они относятся к обновлениям продуктов,
изменениям и т. п.).
Visual Stodfo Н eadBnes
Prejwff fof D^yltt}ht S-awiuq lime
Changes; Information on MtermoH
Products and Updates
Рис. 7.4. Заголовки Visual Studio на стартовой странице
Канал новостей на стартовой странице
Информация о канале новостей находится внутри главного раздела стартовой страницы. На
рис. 7.1 этот раздел был назван MSDN: Visual C#. На рис. 7.5 показан кое-какой контент,
имеющийся в этом канале новостей. Показанный здесь канал новостей специфичен для
Visual Studio. Эта информация касается анонсов новых книг, новых бета-версий, новых
инструментов, Web-кастов и т. д. Она помогает вам быть в курсе даже в том случае, если вам
не хватает времени для чтения MSDN.
Глава 7. .NET-сообщество: использование и создание разделяемого кода
215
Контент канала новостей предназначен для определенного разработчика. Вы можете
выбрать из нескольких различных каналов новостей. Канал новостей по умолчанию
настраивается в вашем профиле разработчика (VB, С#, C++, Web и т. д.).
ЩШШШ*ш8Ь
Download Vrsuel Studio 2008 Beta 2
Fri, 27 Jul 200716.21:16 GMT - See «II of the improvements that are
coming in Visual Studio 2008 with next-generation Web development,
integrated development for the Microsoft Office system, and
industry-leading designers for Windows Vista.
Download.NET framework 3 5 Bets 2
Fri, 27 Jul 200716-23.11 GMT - See all of the improvements that are
coming in Visual Studio 2008 with next-generation Web development,
integrated development for the Microsoft Office system, and
industry-leading designers for Windows Vista.
Download the Sarmkasfie June CIP Documentation Compilers for .
Thu, 28 jun 2007 22-54*09 GMT - Documentation Compilers for
Managed Class Library Sandcastle produces accurate, MSDN style,
comprehensive documentation by reflecting over the source assemblies
and optionally integrating XML Documentation Comments. Sandcastle
enables Microsoft teams customers to efficiently produce Help
documentation for products, Sandcastle ships as a standalone download
and as a part of the Visual Studio SDK. The Sandcastle engines modular
design provides many extensibility points that allow users to customize
Рис. 7.5. Канал новостей стартовой страницы
Настройка канала новостей
Информация канала новостей приходит в интегрированную среду с новостных лент RSS.
Если вы знакомы с RSS, то должны знать, что RSS обозначает Rich Site Summary (или Really
Simple Syndication, либо RDF Site Summary— в зависимости от используемого вами
определения). Суть в том, что RSS предоставляет структурированный XML-список, который
содержит сводки и ссылки на ключевую информацию конкретного сайта. При помощи этой
технологии пользователи Visual Studio могут получить сводки основных новостей для
конкретного центра разработки MSDN.
Для настройки канала новостей стартовой страницы вам нужно воспользоваться
диалоговым окном Options (доступно из меню Tools | Options). С левой стороны диалогового окна
в представлении в виде дерева выберите пункт Environment, а под ним — Startup. После
этого вы получите несколько опций (рис. 7.6).
Первая опция диалогового окна позволяет вам выбрать, что происходит при запуске Visual
Studio. Конечно, мы предлагаем вам оставить показ стартовой страницы (по умолчанию).
Однако вы можете также открыть последний проект, над которым вы работали, или
показать одно из диалоговых окон для открытия проектов.
Совет
Если вы отказываетесь от показа стартовой страницы при запуске интегрированной
среды, то все равно можете перейти туда. Это можно сделать либо при помощи
значка Start Page панели инструментов (рис. 7 7), либо посредством выбора из меню
View | Other Windows | Start Page.
216
Часть II. Подробности о IDE
Environment
General
Add-m/Macrcs Security
AutoReccver
Documents
Find and Replace
Fonts and Colors
Help
Import and Export Settings
International Settings
Keyboard
Startup
Task List
Web Browse/
Projects and Solutions
Source Control
Text Editor
Database Tcols
DebuDainn
At startup:
[Show Sut Page
Start Page news channel
http cVgc microsoft ccm/f*linlcrtinlad=S4795&clcid=409
jv] Download content every
60 t minutes
Рис. 7.6. Настройка канала новостей стартовой страницы
Рис. 7.7. Доступ к стартовой странице
при помощи значка панели инструментов
Нас интересует вторая опция диалогового окна — Start Page news channel. Здесь вы
можете настроить URL на ленту новостей RSS. Это позволяет легко настроиться и подключиться
к любому каналу RSS. Изменение этой настройки приведет к изменению данных,
отображаемых в разделе канала новостей стартовой страницы.
Некоторые общеизвестные каналы новостей и их URL перечислены в табл. 7.1. Они
соответствуют центрам разработки MSDN, созданным фирмой Microsoft. Существует гораздо
больше центров разработки (и новостных лент RSS), чем указано в таблице. Вы можете
найти их по адресу: http://msdn2.microsoft.com/developercenters.
Таблица 7.1. Общеизвестные новостные ленты RSS для стартовой страницы Visual Studio
Описание
Архитектура и .NET Framework
• NET Framework
• архитектура
• шаблоны и практики
• мобильные устройства
• безопасность
URL
http://msdn.mJcrosoftxom/netframework/rss.xml
http://msdn.microsoft.com/architecture/rss.xml
http://msdn.microsoft.com/practices/rss.xml
http://msdn.microsoft.com/windowsmobile/rss.xml
http://msdn.microsoft.com/security/rss.xml
Глава 7. .NET-сообщество: использование и создание разделяемого кода 277
Таблица 7.1 (окончание)
Описание
Web-разработка
• ASP NET
• Silverlight
• Web-сервисы
Visual Studio и языки
• Visual Studio
• Team System
• новости C#
• новости VB
• новости C++
• Microsoft Office
• SQL Server
• BizTalk
• Windows Vista
URL
http://msdn.microsoft.com/asp.net/rss.xml
http://msdn.microsoft.com/silverlight/rss.xml
http://msdn.microsoft.com/webservices/rss.xml
http://msdn.microsoft.com/vstudio/rss.xml
http://msdn.microsoft.eom/vstudio/teamsystem/rss.x
ml
http://msdn.microsoft.com/vcsharp/rss.xml
http://msdn.microsoft.com/vbasic/rss.xml
http://msdn.microsoft.com/visualc/rss.xml
http://msdn.microsoft.com/office/rss.xml
http://msdn.microsoft.com/sql/rss.xml
http://msdn.microsoft.com/biztalk/rss.xml
http://msdn.microsoft.com/windowsvista/rss.xml
Совет
Все URL, перечисленные в табл. 7.1, не только указывают на ленты новостей RSS
(которые можно поместить в Visual Studio), но также являются и ссылками на
соответствующие центры разработки на сайте фирмы Microsoft. Просто уберите из ссылки
rss.xml — и у вас получится URL на соответствующий центр разработки.
Меню Help
В Visual Studio 2008 все функции меню Community версии 2005 года перенесены в меню
Help. Меню Help предоставляет доступ к меню помощи. Оно дает также быстрый доступ к
таким вещам, как форумы MSDN, контент, образцы кодов и т. д. Вы можете быстро найти
ответ на вопрос, сообщить об ошибке Visual Studio или Framework, а также получить доступ
к образцам кодов. На рис. 7.8 показано меню Help. Мы опишем пункты этого меню в
последующих разделах.
Форумы MSDN
Пункт MSDN Forums в меню Help позволяет вам вести в форумах сообщества поиск
ответов на вопросы, которые могут возникнуть у вас по Visual Studio или .NET Framework и
соответствующим языкам. При выборе этой команды Visual Studio запускает Microsoft
Document Explorer для MSDN и переходит на страницу поиска по форумам MSDN Community
Forums. На рис. 7.9 показан пример этой страницы поиска.
218
Часть II. Подробности о IDE
[Help]
У
'Л
т
13
3?
^
«i
о»
How Do I
Search
Contents
Index
Help Favorites
Dynamic Help
Index Results
MSDN Forums
Report a Bug
Samples
Ctrl+Fl, H
CtrKFl,S
Ctrl-Fl,C
CtrkFl.l
Ctr1+F1,F
СЫ-Fl, D
CtrkFl,T
_ _ _
Customer Feedback Options .
Register Product
Check for Updates
Technical Support
About Microsoft Visual Studio
Рис. 7.8. Меню Help в Visual Studio 2008
е1*ШУшМ
*# АЛа Оуимфр^
File £drt View Tools Window Help
&"* < '.jU^kfiC U How Do I - ^Swtch Lb Index ^Content* ^}H4pf avorxa J" *^ MSDN Forums ♦£ 9
AdcaQurrtKMt^^tb; _ ^^ ^^ ^ - X
URL http://»arums microsoft com/qawizBrd/esk aspx*>rteID=l
msdrr
Search Community Forums
The Microsoft Community is a public forum where you can ask questions and get answers from other people
using Microsoft products.
Enter Keywords.
change default language setting
example VB database connect
English •»■ GQ Search Tips
Mjnaq* YwjrFtofil*
#.0 ?Mkic.»U"
( n<)>>: i*s«rv*4 I»!"'
(r*d*Turf« Prw*ry
iBIIil
Ready
Рис. 7.9. Поиск ответа на ваш вопрос
Форумы MSDN Community Forums позволяют разработчикам находить информацию по
обычным проблемам, либо публиковать специфические проблемы и получать отклик от
сообщества. Цель этих модерируемых форумов — обеспечить разработчику помощь от
сообщества разработчиков.
Когда вы попадаете на форумы MSDN, то начните поиск ответа на свой вопрос с проверки,
не задавался ли этот вопрос раньше (и не был ли на него уже дан ответ). Например, на
рис. 7.9 показан вопрос по изменению языка по умолчанию для Visual Studio. Когда вы на-
Глава 7. .NET-сообщество: использование и создание разделяемого кода
219
жмете кнопку Go, то MSDN выполнит поиск по форумам сообщества. На рис. 7.Ю показаны
результаты, полученные в ответ на этот вопрос.
fsearch - М^
Fife Edit View Tools Window Help
<jBack <; ^J $& A* & How Do! * Ц Search t4>IndB< ^Contents .^j Hdp Favorites J"
_~*rcMgi!$g
URL http-/r/forums.m(crosoFt convqawurard/search asp*"|cid=lCr33&rtord4=change+def«iirt-(incjijage->
English ~ Go^ Search Tips
il*B^£5*ifi
Enter Keywords
change default language setting
Results fDr4hamj{>/ji<,}auJl,lrtn<}Udge/i<,tti«g
Results 1 - 10 of 108
® Re: How do 1 change the default language in Visual Studio
2005? [Helpful]
Use the Import and Export Stilling Wizard 1 Choose Tools -> Import and
Export Settings . 2. Select Reset All S^Umqs and click Next 3 Select
whether you would Wee to save the current settings .
Posted by Dn 4/2S/200S 10 18:05 AM UTC in Visual C* IDE
^ Re: How can I change "Language" setting using "Locale Identifier"
of DBPromptfnitialize dialog?
I'm not sure if there is a generic OLEDB way. Session 1лпдш)г;р for the SQL
Server is a provider specific property SSPROP_INU_CURRENTt ANGUA££
http //msdn2 microsoft.com/en-us/t4jrary/msl42797 aspx .
Posted by MSFT on S/17/2007 6:58:15 PM UTC in SQL Server
Delta Access
"Zj MSDN Forum:. -& _
$eUing&srteid=l&Jccalechoice »• |
if no one asked this
question before, /ou can
post it into the most
appropriate forum below
< SQL Se ve^ Seluo ?< j
Lpq'3de i
SQL 5e*v«<- E«cr25S j
> viaml C* Gene-a I j
< T»im =ouncat en
Server - Seujp !
'/.'irubw! Ferns Get sral '
Smart Devices Gene'al
' Visual &&zif. beneral
< *1" ME" rmims
Visual C-t General
* SQL^runs
Ready
Рис. 7.10. Результаты поиска в форуме сообщества
ШШШШШШШШу
Rle Edit View Tools Window Help
^jBack £) '* ij>J ^ A* U How Del » .^Srjrch -J,Index ^»Content* J3HeJp Favorites ^
Щ
Ц
Re- How do I crn_05? - MSDN Forums
URL http:'/forums mkroscft.com/MSDN/Sho/i(Portaspx'PcstI[>=38116i5iteID=l
Ready
UJ
*****
##&&"&
How da I «tang* th* d*tiuK вгодгыютипд Unguag*?
J* Was this post helpful ?i*dj£l
How do I charto» oefaul language in Visual Studio 200S'
When Visual Studio starts * display Information ebcut C*+ but I л oukJ »t to change
thntoC*
Answer Re How do I change th& default
language in Visual Studio 2O0'i? Вду
]£i Was this post helpful ? *■».! ,#g|
Use the Import and Export Setting Wizard
1 Choose Toots -> import and Export Settings
2 Select Reset AH Settings and dick Neat
3 Select whether you would JAeto save ins current settings and cferk Next
* Select the settings you went to use and cbcfc Finish
Qi«W« |
Рис. 7.11. Ответы форума сообщества
220
Часть II. Подробности о IDE
В этом примере результаты показывают, что кто-то уже задавал подобный вопрос. Зеленая
галочка возле вопроса указывает, что эта статья является ответом на вопрос. Когда вы
задаете вопрос и получаете удовлетворительный ответ, то можете пометить его как "ответ".
Это значительно облегчает поиск реальных ответов на ваши вопросы, поскольку не
приходится перерывать большое количество откликов, не содержащих ответа на вопрос. Конечно,
если вы хотите увидеть все обсуждение полностью (и все соответствующие отклики), то
можете сделать это при помощи выделения элемента в списке. На рис. 7.11 показан пример
обсуждения. Обратите внимание, что ответ четко выделен. Вы можете также использовать
кнопку Alert Me для получения уведомлений о том, что в обсуждении появился новый пост
(подробнее об этом несколько позже).
Начинаем новую тему обсуждения
Иногда можно и не найти ответа на заданный вопрос. В этих случаях вы можете
опубликовать вопрос на соответствующем форуме сообщества. Например, если вы не можете найти
ответ в результатах поиска, то можете использовать ссылки на правой стороне страницы
(см. рис. 7.10) для перехода в соответствующий форум.
Если вам не удалось найти ответ на вопрос по изменению языка по умолчанию в
интегрированной среде, то вам нужно перейти в общий форум Visual Studio General Forum. Нажатие
этой ссылки приведет вас на главную страницу этого форума. Здесь вы можете нажать
кнопку New Thread (в левом верхнем углу на рис. 7.11) для публикации вопроса к
сообществу. Вы должны иметь учетную запись Windows Live. Ваш новый вопрос/тема обсуждения
будет добавлен в соответствующий форум и помечен как не имеющий ответа. Обычно в
каждом форуме есть группа людей, которые читают эти вопросы без ответов и стараются
помочь.
Перемещение по форумам и темам
Форумы MSDN Community Forums организованы в множество категорий. Эти категории
включают Web-разработку, .NET, Smart Devices и, конечно, Visual Studio. На рис. 7.12
показана начальная страница форумов Community Forums.
Каждая категория форумов подразделяется на реальные форумы. Вы щелкаете категорию
форумов для перемещения к списку форумов данной категории. В категории Visual Studio
вы можете найти форумы, которые представляют для вас особенный интерес. На рис. 7.13
показана главная страница форумов Visual Studio. Здесь вы можете найти форумы по
настройке и инсталляции, по MSBuild, по отладчику, по конструктору классов Class Designer и
многим другим темам интегрированной среды.
Выбор форума приведет вас на главную страницу этого форума. Здесь вы можете найти
такую информацию, как анонсы, FAQ, пять самых часто просматриваемых ответов и, конечно,
реальные темы, которые были опубликованы на форуме. Например, на рис. 7.14 показаны
некоторые из тем, имеющихся в форуме Visual Studio Source Control and SourceSafe Forum.
Вы, возможно, заметили множество значков возле каждой темы на рис. 7.14. Эти значки
помогают вам перемещаться по темам. При этом вы быстро заметите, что не все темы
являются вопросами и не все вопросы имеют ответы.
Значки возле каждой темы помогают вам определить содержимое данной темы. Например,
галочка поверх пиктограммы документа означает, что данный пост является ответом на во-
Глава 7. .NET-сообщество: использование и создание разделяемого кода
221
прос. Значки популярных тем помечены солнышком. Есть много разных значков, с
которыми вы наверняка захотите познакомиться.
цуы^^иншмимм
File Edit View Tools Window Help
^Back t .J} *& A* ^ How Do I ' <4.S«fch I J, Index «$ Contents jft Help Favorites J$
*J MSDN Forums *& tt
^^Du'Pg^Wekome^back GГ)Нсгп. Qsoarch gMy Thntadi 3Ecit »foflle ©Меглоог S_'*t U Tap Ar.iw*'i *^»=ac
III II I ||—ШИ—^—■ KlMiffiWlHnTltiff'r.f
You are currently signed in Edit My Camnunities Prcfi e
[S*«n;h ]
*, Feedback for forum* end MSDN websites
Ш
Where Is the Farum Рог...»
A forum to get advice on where the best place is to ask a r«> window* v»ra prob.
у I question about certain develcpment topics NO by
TECHNICAL QUESTIONS WILL BE ANSWERED IN THIS Today, 5s31 PM utc
FORUM
Announcements
Get a heads up on forum site updates, scheduled
maintenance, and site usage guidelines..
J Suggestions for Forums website
What can we do to make the site better for you'
0
Forums SP3 i« Live
by
04 Sep 2007 4i53 PM UTC
Rot "Ну Microsoft .
by
Yovtarday, 3:32 PM UTC
шшшшшшшшшт
5rD15 U,C96
904 3,351
Ready
Рис. 7.12. Начальная страница форумов Community Forums
щшшшт^ш^т^^
File Edrt
k$Back
View Tools Window Help
1 Л & A* & How Do J - 4 Search (J, Index ^ Contents 21 H*)PFav°r,tw J
SI
о
II!
i
MSDN Forums &mth)
URL httpv'/forurm microsoft com/MSDN/def»ult^spx?ForumGroupID=6&5iteID=l
MSDN Forums » Visual Studio
,-—. Visual Studio Setup and Installation
'' A Discus* and ask questions about the install and setup of
US=J Visual Studio 2005.
Visual Studio Extensibility
(71 Discuss VSX {Visual Studio Extensibility) including the
b£J Visual Studio SDK, extending V5 using DSL Tools, add*
ins, and macros.
0
I li
L4
Visual Studio Debugger
Questions and discussions about debugging applications
with the Visual Studio debugger.
Visual Studio MSBuild
Discuss the Microsoft build engine aka MSBuild. Topics
including* usage of MSBuild, build customization, and
MSBuild extensibility via tasks, loggers and hosting.
Visual Studio Source Control and SourceSafe
Discussion topics on integration of Source Control into
Visual Studio and the SourceSafe product.
Visual Studio Class Designer
Come discuss new techniques fcr code visualization,
refactoring, and class design using the new Class
Desianex tool*
V.5. .NET doMn'r work...
by
Today, 4rDS РИ UTC
R*i PE Verifier errori. .
by
Today, 4i 16 PM UTC
R«> Sktoood Loading Sy .
by
Today, 2 10 PM UTC
Ro< Can i btidd .MET 2 ..
by
Today, «tie AM UTC
Rei Problem with Sourc...
by
Today, «:44 AM UTC
R«l Some of my Classes...
by
2G Sep 200.7 9 23 AM UTC
+J MSDN Forum? J. - I
Rudy
( S«r*h J
IIEjS
Рис. 7.13. Начальная страница форумов Visual Studio Forums
222
Часть II. Подробности о IDE
I Fiit Fort View Tools vVmaew Hdp
I ^Batk v* z\ %fa Л* ^-'HowDoI * ^Searth Jbindat ^Contenh T}HelpF»voritt$
1Ф
In
\L
\z>
is
JU
jo
1йГ
л «
-13.
\Ш
Visual Studio So_afe • MSDN Forums Jjeartb j
URL- rrttp //forums microsoft.com/MSDN/ShcrwFDrum aspx7ForumlD=50&SitelD=l
^■ЯШ^НШИИШ^^НВ
Topics
SourceSafe 2005 GDK CTP is available!
-,• b>
' ,.-='< 3eij MS^T 01
Aug 20Q7. 5@6
*>M UTC
Problem with SourceSafe Add-in! Help
, Needed!!
Oil ь>
Yest«rda>,
i~ 12 г 19 PM UTC
About UndoCheckout method?
? Li j by
Hi Y«*berday,
3 59 AM UTC
SCC VSParkage registry keys
* 1_, bv
,-*\ 1A Sep 2D07.
J 12 41 AM UTC
1 ijpt я labeled Hie but get all empty foldprs
Ц 12 ,n tne Project
—' Sep 2GD7. В 36
Щ AM UTC
J Using common source files through more
1 projects
I r-*=l bv
ШШШшШШШШШш1Ш1Ш&
by
«fe -
ID Sep 2007 5t20 PM a
UTC
by
+2 3
Today, 8:44 AH UTC
Today, 6ЮЗ AM UTC г
by
■ С 4
Today, 4:2в AN UTC
Today, 12D0 AM UTC °
by
.> 4>; ч
;Ш1ш!
823
111
98
218
170
jj *J MSDN Forums
• R<* visual sourer
safe iOOS
Yes, it's passible If
/au have ,ust a
m ach i пе/de \'elc oer
accessing those 'lies
you dor г пегс a dec
* Re Local file
version using О ..
No, ycj cannct cbtain
Iccal version -umbers
using tVS5 autorratii—■i
interface You are
correct, th
• Re. "The process
can nut a.
The NT bactaip scrvire
can backup f 'es ever
лЬеп the/ a'e in jse
Only pydusrve lcc>Oi
should be ah
• R<*. Autnmatiraly
check, out on .
The ma т reascirt л^
this happens 5 th^r i
the jource centre
database there is
alroady a rile * ;b
• Re: hi
Thank vob
iiiii"»"ViiYiiiVii»ff^W *»
m
^ j
~* i
' if
•1
1.1
Рис. 7.14. Темы форума
На рис. 7.15 показаны значки и расшифровка их значения.
Whatd
IS3S
т
S*a
о-
В51!-
ыё
ы
=1
5
ы
У
s
ш
£Ь
о the Thread icons mean?
Unanswered question thread
Popular unanswered question thread
Locked unanswered question thread
Pinned unanswered question
Pinned, popular unanswered question
Answered question thread
Popular answered question thread
Locked answered question thread
Pinned answered question
Pinned, popular answered question
Thread contains code sample
Resolved customer bug
Resolved customer bug with a workaround
Resolved product suggestion
*l
5J
■^l
*i
*i
a
Ш
jj»
Id
m
m
Ь
й
Comment thread
Popular comment thread
Pinned comment thread
Pinned, popular comment thread
Locked comment thread
Announcement post
Question post
Answered question post
Answer post
Comment post
Customer bug
Customer bug with в workaround
Product suggestion
Рис. 7.15. Легенда иконок тем обсуждения
Глава 7. .NET-сообщество: использование и создание разделяемого кода
223
Управление вашим обсуждением и уведомление о теме
Обычно при создании нового обсуждения или публикации нового вопроса вы хотите
получать уведомления тогда, когда кто-то откликается на ваш пост или отвечает на ваш вопрос.
Кроме того, если вы находите особенно интересную тему, то можете запросить уведомления
в случае появления в теме новых постов. Форумы MSDN Community Forums дают вам
возможность получать уведомления по электронной почте, через программы мгновенных
сообщений или на мобильные устройства. Эти возможности позволяют сообществу
разработчиков оставаться на связи с его активными членами (а не вынуждать их постоянно
подключаться и смотреть, что изменилось).
На рис. 7.16 показаны некоторые из опций, имеющихся у вас для управления
уведомлениями форума. Вы можете добраться до этих опций при помощи нажатия кнопки My Threads в
панели инструментов верхнего уровня и последующего выбора My Subscriptions. В нижней
части этого экрана имеется кнопка для изменения настроек Alert settings. Обратите
внимание, что там имеются основные опции и нестандартные опции доставки. Последние
(показаны) позволяют посылать уведомления в зависимости от состояния вашего менеджера
мгновенных сообщений MSN Messenger. Если он подключен, то вы можете получать мгновенные
сообщения; если нет — то уведомление будет отправлено вам на электронную почту или на
телефон.
File Edit View Took Window HrJp
QBack Л ' J\ ^k A* & How Do! - <4.Se«rch Q) Index $*Content* ~Г] Help Favorites j"
Window* Live Alerts [5
AterfcK
ытш
шшшшшщшш^шшшвшш&шшшшзш
*J MSDN Porurm A, -
URL http://i»frts Irve conv'AlerU/SelectSeftjngs Kp*?cpid=49735&custcm=l
Bus c. De *>e'<r Custom Delivery
Se'=ct oie or mere delivery Iccat or«, and fiefi с >c«w Finish
When I am signed in to Messenger, send my alerts to
v* & M*»5W4J<?"(r«»quifed) mi*e-*nell8msi> <"om
wiA ik- tr \Virulow, I j.r K^vse nj-sr
•/] л Mye mail inbox: mike-sr»ell$msp ccm
^ My mobile device
Set up en MiM Mobile account
Wlien I <in» signed nut of Hovsfnger or my sUilus is Aw<iy, send my
alerts to
~j\ • My e-maii inbox mil»e-snell£.msn ccm
(ф My mobile device
bet up in -VS4 Mobili account
V.srnirg; You a'-e subject tc trie seaa'ate MSN Mobile tsrrrs c, jse Alsc vcjr
sen. ce provide' rray charge you re text mei sages Refer to ,-nur se-л се р1ат
of ronlart у ju> 3^1 vice ofovHc' to- more intjHm^t or
Ready
Рис. 7.16. Настройки уведомлений форума Microsoft Forum
Опции обратной связи с клиентом
Большинство разработчиков, которые нам встречались, любят работать с самым
"навороченным" программным обеспечением и всегда ищут пути его улучшения. Это особенно
224
Часть II. Подробности о IDE
справедливо в отношении используемых ими инструментов, самый крупный из которых —
это Visual Studio. Пункт Customer Feedback Options в меню Help даст вам возможность
разрешить фирме Microsoft собирать данные и распознавать тенденции использования
Visual Studio. На рис. 7.17 показано это диалоговое окно. Вы можете видеть, что это
анонимный сбор данных.
Microsoft wilt
• Collect anonymous information about your software and hardware configurations.
• Collect anonymous information on how you use our software and services to identify trends
and usage patterns.
Microsoft will not
• Collect your name, address, or any other personally identifiable information. The information
collected ts anonymous.
• Collect your source code crany ether potentially sensitive information.
• Ask you to take surveys, nor will you be contacted by a safes representative.
■ Prompt you wrth additional messages that might interrupt your work.
t"> i
You can stop participating in the program at any time Just go to the Help menu, select Customer
Feedback Options, then select No, I would not like to participate
Participation will not degrade the performance of your software
» Yes, 1 am willing to participate anonymously in the Customer bperience imprownent Program
(Recommended)
No, I would not like to participate.
Рис. 7.17. Программа предложений
по улучшению Customer Experience Improvement Program
Сообщить об ошибке или сделать предложение
Иногда в голову приходит некая идея, которая могла бы стать ценным дополнением для
данного программного обеспечения, либо вы находите в нем дефект (или ошибку). При
помощи пункта Report a Bug в меню Help вы можете опубликовать ваше предложение или
зарегистрировать найденные вами ошибки.
Процесс сообщения об ошибке и внесения предложений аналогичен началу нового
обсуждения в форумах MSDN. То есть начать необходимо с поиска аналогичного предложения
или ошибки. Это поможет избежать создания дублирующих предложений.
Если вы находите тему, аналогичную той, которую вы хотели опубликовать, то можете
изменить рейтинг темы, подтвердить ее актуальность или опубликовать
комментарий/обходной путь решения. Рейтинг позволяет фирме Microsoft устанавливать приоритеты
тем по их важности. На приоритет темы влияет как количество людей, выставляющих
рейтинг, так и сам рейтинг. Вы можете также добавить комментарии к решению или ошибке.
Добавление в тему комментариев позволяет вам сообщить аналогичные наблюдения, либо
дать пояснения по ошибке или предложению.
Глава 7. .NET-сообщество: использование и создание разделяемого кода
225
фирма Microsoft активно наблюдает за этими списками. Фактически большинство тем
помечены комментариями фирмы Microsoft и закрыты, либо решены в новых сборках и
пакетах обновлений. Кроме того, если вы находите ошибку, для которой вы знаете обходной
путь решения, то можете прикрепить к теме этот свой путь решения. Так .NET-сообщество
помогает само себе.
Наконец, вы можете помочь команде разработчиков Visual Studio своей работой над
конкретной темой. Обычно для этого нужно воспроизвести проблему в соответствии с
описанием человека, который ее зарегистрировал. Затем вы помечаете ее как Сап или Can't
Validate (подтверждается/не подтверждается). Это сообщает команде разработчиков Visual
Studio о том, что данная проблема имеется не у одного человека. На рис. 7.18 показана
сводка информации Fedback в верхней части страницы. В этой таблице имеются ссылки на
обсужденные в этом разделе функциональные возможности.
Feedback
include vVcb Dep'-Q^ffl^r.t Projects in release a* Visual Stud о 20VB
*.' VT Л W J-T
Not Rated
Overall by 45 users
Type Suggestion
Status Active
Opened By
Opened B/15/20O7
22/0
(yes/no)
йдайдгйй
1
workaround
You are currently not
watching this issue
acid tc watch s
ID
293511
Public
| Description
j Comments
Access Restriction
Blocking Issue No
Submission Language English
I think Web Deployment Projects are important enough to include with the release of Vis
Studio 2008 rather than being an add-on.
See the attached BMP file.
Ready
Рис. 7.18. Таблица Feedback
Поиск
Опция Search в меню Help обеспечивает вам поиск в системе помощи MSDN. Конечно,
этог поиск работает по вашим локальным файлам помощи. Однако он также захватывает
сайты MSDN Online и Codezone Community (см. разд. "Сообщество Codezone" далее в этой
главе) для того, чтобы вы получали больше результатов поиска.
Выбор команды Search из меню Help открывает экран MSDN Search. На рис. 7.19 показан
пример. Ваш поиск управляется несколькими параметрами. Самый важный — тип контента.
Он позволяет вам сузить ваш поиск до элементов управления, шаблонов, образцов и т. д. Вы
можете также настроить язык разработки (для которого вы ведете поиск) и технологию.
226
Часть II. Подробности о IDE
Язык разработки указывает, что вы ищете контент, который предназначен для конкретного
языка (С#, VB, HTML, C++ и т. д.).
| File Edit Vie* Took Window Help
&«J ' *»* V Ы; HowDol ' *4 Search jJbIndex -^Contents ^ Hdp Favorites -^ **^MSDNForums ^ _ |
» Language C*
- Technotogy All
▼ Content Type All
Searched for.
■ЖЬк- Currently there «re no search result* to display.
ЩУР Create в help search by entenng a term in the Search box above
the Search button
and pressing < L«*i Mdp
torlctor»* Согпть nity
Questions
Ready
Рис. 7.19. Экран поиска MSDN Search
DevUty-NE* т:1>«»д %Ы "Ctnfer SJMfiisrt faiitta *<я Vl»wi &ts>c 2SQ!T. P<*ye
2
This « a short and very basic tutcriaf about using the very powerful yet «asy*
to-us*FR££ "Cod* Snippet Editor for Vttg*l B*5»t2u05* dowidoad fcHit fe.
«v*if«bie *t MSORMicrpsof \ torn, 8/ tontphsim-g ShisfcjtOriBlyovwfH learn ihe
have steps invoked in creating custom viippets snd using them front *iih*n
Vi% jat SUidx»'* Code Window...
v ',< '< i Source 3?* >* let
DevCity NE'l - 11 wig the "Cude Snppct Fdttc-r for Visual flask ?0Ob '. Р«чде
4
This h л short and very basic tutorial about using the very powerful ) *♦ easy-
to-use FP-EE "Cede Snippe* Editor 'or Visual Basic 20D5" download that is
available ai MSDN MicrosoflcoTi B/ contpls+mg this fui:erial you will learn *he
b:sic steps involved m crea ing curton" :nippets zna using tner- 'remy<i*hin
Visual Studio s Cede vYindow
,< ': * \ >< Source 1ЧЧч.1*у 'i f
tAstm<Mt*K
«V* )
1-20 of 100 * **
<<>,,► S« pr"F« .
Cc<« Sr pp ~ Fcid ars
lr 'ericstirj C>?c г Cr opt* ~t(.
i C«le*c»ie Cr
DevCn,\ '
LWii"; V
On<tk>»w ,
F' wpoeli
Pe :olcr
be 4W, 1c
L»c«tf Help Г
тгтлИу
Jsircj»
Jsii j»
J'и jt
У i
rSJVKJff Г
jscV31
>
У\Ъ
ne Cd. '
>.S',m<j
irdcgv
>mpprt
\U6b*
Ready
Рис. 7.20. Поиск в сообществе (Community Search) в действии
Глава 7. .NET-сообщество: использование и создание разделяемого кода
227
Конечно, вы можете выбрать сразу несколько опций. Параметр "технология" позволяет вам
сузить ваш поиск до указанного набора технологий, таких как ASP.NET, SQL Server и
Windows Forms. Имеется большое количество технологий, по которым вы можете производить
поиск.
Когда вы выполняете поиск, то его результаты группируются по их происхождению. Это
локальные файлы системы помощи, MSDN Online, сообщество Codezone и форумы
(вопросы). На рис. 7.20 показаны результаты конкретного поиска. Мы рассмотрим использование
этих плодов деятельности сообщества в последующих разделах.
Управление опциями пбиска
Вы можете управлять поиском (до некоторой степени) через диалоговое окно Options. Вы
можете получить доступ к этим настройкам изнутри документации MSDN (выбрав Tools |
Options). Затем выберите пункт Online в узле Help. На рис. 7.21 показан пример. Вы
можете перейти к этому набору настроек и изнутри Visual Studio (выберите Tools | Options, а
затем — узел Help в разделе Environment).
Эти опции системы помощи позволяют вам настроить порядок использования локальной и
онлайновой помощи. Кроме того, вы можете выбрать провайдеров системы помощи, при
этом можно включить/выключить отдельные сообщества Codezone.
Qptior
Environment
Fonts and Colors
Help
General
Onltn*
International Settings
Keyboard
Web Browser
When leading Help content
<0 Try online first, then local
Try local first, then online
V Try local only, not online
Search these providers:
[ /] MSDN Online
/] Codrzcne Community
J\ Questions
•I Local Help
IS
1Ы
Read the prrvtcy statement*
Codezone Community
jV 4GuysFromRolla com
V C* Comer com
У Codeuuru com
[У DevCity net
У Developer Fusion (UK)
Become an ASP Allance columnist
and ihare your knowledge «with the
developer community
Рис. 7.21. Диалог опций поиска
Совет
Если в вашей локальной сети имеется прокси-сервер, то у вас могут быть проблемы с
поиском. Система помощи может не пройти аутентификацию прокси. К счастью, поиск
в форумах сообщества дал ответ на этот вопрос.
Возможное решение состоит в том, чтобы изменить файл конфигурации приложения
системы помощи, находящийся по адресу Program Files\Common Files\Microsoft
Shared\Help 8\dexplore.exe.config. Вы можете изменить этот файл одним из двух
способов.
228
Часть //. Подробности о IDE
Если ваш компьютер — это стационарный настольный компьютер, то вы добавляете в
узел <system.net> следующий элемент:
<defaultProxy enabled="true" useDefaultCredentials="true">
<proxy bypassonlocal="True" proxyaddress="http://yourproxy"/>
</defaultProxy>
Если вы используете ноутбук и у вас есть скрипт, который управляет использованием
прокси, то нужно добавить следующий элемент:
<defaultProxy enabled="true" useDefaultCredentials="true">
<proxy autoDetect="true" usesystemdefault="true"
scriptLocation="file://c:/yourfile"/>
</defaultProxy>
Сообщество Codezone
Сообщество Codezone — это ссылка на список фирмы Microsoft, в котором перечислены
независимые .NET-ресурсы. Эти ресурсы включают сайты .NET-сообщества, отдельных
специалистов, групп пользователей и т. п. Наличие всех этих сайтов помогает расширить
доступ к сообществу (не ограничиваясь ресурсами одной только фирмы Microsoft). Эти
сообщества обычно публикуют статьи, блоги, фрагменты кодов, независимые форумы и т. д.
Решение о членстве в сообществе Codezone (http://www.codezone.com) принимается
командами Visual Studio и .NET. Такая политика членства помогает обеспечивать качество этих
сайтов. Контент членов сообщества Codezone индексирован, и по нему можно производить
поиск при помощи функции Search (так, как это было описано ранее).
Примечание
Для того чтобы получить ссылки на множество сайтов сообщества Visual Studio, зайдите
в центр MSDN Community Center (http://msdn2.microsoft.com/en-us/community/). Здесь
(помимо сайтов Codezone) вы сможете получить доступ и к другим блогам, каналу
Channel 9, группам новостей, Web-кастам и т. д.
Нахождение и применение
совместно используемого контента
Всем нам встречались такие задачи, когда совершенно ясно, что с этими проблемами кто-то
уже сталкивался, а сроки очень сжатые. В этих случаях часто очень разумным решением
является поиск в Интернете — нет ли в сообществе подходящего контента, который можно
использовать. По крайней мере, вы можете найти частичное решение, которое сможет
ускорить вашу разработку и улучшить ваше понимание данной конкретной проблемы.
Visual Studio обеспечивает механизм для публикации, поиска и применения совместно
используемого контента. В последующих разделах мы рассмотрим поиск и использование
этого контента. Затем мы продемонстрируем, как вы можете принимать активное участие в
данном сообществе.
Глава 7. .NET-сообщество: использование и создание разделяемого кода 229
Изучение типов совместно используемого контента
Visual Studio предоставляет несколько возможностей совместного использования кода.
Например, вы можете скачать шаблон проекта, в котором определен блок наблюдения, найти
фрагмент кода с методом доступа к базе данных, либо написать дополнительный модуль
или макрос, которым вы захотите поделиться с сообществом. Visual Studio позволяет
разработчикам писать такие (и не только такие) типы расширений. В табл. 7.2 описаны многие
типы контента Visual Studio 2008, которыми можно делиться с сообществом.
Таблица 7.2. Типы совместно используемого контента
Контент
Шаблон проекта
(Project Template)
Стартовый набор
(Starter Kit)
Шаблон элемента
(Item Template)
Фрагмент кода
(Code Snippet)
Образец (Sample)
Элемент управления
(Control)
Дополнительные
модули и макросы
(Add-lns и Macros)
Описание
Шаблоны проектов — это наборы файлов, которые определяют новый
проект. Когда вы создаете при помощи Visual Studio новый проект, то
вас просят выбрать шаблон проекта. Visual Studio позволяет вам
создавать и использовать ваши собственные шаблоны проектов
Стартовые наборы похожи на шаблоны проектов, но обычно содержат
дополнительную документацию и пошаговые инструкции
Шаблоны элементов — это файлы, которые вы хотите многократно
использовать в разных проектах. Когда вы в Visual Studio добавляете в
ваш проект новый элемент, то выбираете и добавляете шаблон
элемента При добавлении в проект шаблоны элементов определяют
контент и структуру новых элементов. Visual Studio позволяет вам
создавать и использовать нестандартные шаблоны элементов
Фрагменты кода — это куски кода, которые вы можете добавлять в
функцию IntelliSense в Visual Studio Вы можете создавать собственные
фрагменты кода и делиться ими с сообществом Для скачивания
доступно множество полезных фрагментов кода. Мы описываем
создание фрагмента кода в главе 8
Для скачивания и инсталляции доступно большое количество
образцовых приложений MSDN. Обычно это файлы в формате ZIP, которые
могут быть на разных языках (чаще всего — на С# или VB) Кроме того,
образцы имеются и при инсталляции Visual Studio
Элементы управления могут быть как пользовательскими, так и
нестандартными (написанными для NET) Они могут быть бесплатными
и содержать исходный код, а могут быть выполнены и на коммерческой
основе. При помощи Visual Studio вы можете писать собственные
элементы управления, а также делиться ими
Дополнительные элементы и макросы — это обычно расширения и
улучшения среды разработки. Visual Studio поддерживает создание и
совместное использование этих элементов Мы очень подробно
описываем макросы в главе 12, дополнительные модули см. в главе 13
Поиск нужного контента
Для использования существующих где-то знаний нужно прежде всего их отыскать. Вы уже
видели функцию поиска, которая встроена в систему помощи Visual Studio. Стоит
подчеркнуть, что одна из опций поиска там — это тип контента (Content Type). Она позволяет вам
230
Часть II Подробности о IDE
фильтровать результаты поиска по тому, что вам нужно. Например, если вы ищете только
элемент управления или фрагмент кода, то можете ограничить поиск именно этими типами
контента На рис 7 22 показан выпадающий список типов контента
.... I. 1ли.а1.ЫлА1->. .Ил.
22. Поиск типа контента
юнтента
)умент Visual Studio Content Installer. Ei
Рис. 7.22. Поиск типа контента
Инсталляция и хранение
совместно используемого контента
Visual Studio 2008 предоставляет инструмент Visual Studio Content Installer Его роль состоит
в том, чтобы дать возможность потребителям контента легко инсталлировать этот контент, а
также помогать создателям контента упаковывать их контент (подробнее об этом несколько
позже). Этот инсталлятор запускается при выполнении vsi-файла (типа Visual Studio
Installer) Content Installer— это мастер, который проводит вас по инсталляции совместно
используемого контента. Диалоговые окна мастера несколько отличаются в зависимости от
типа инсталлируемого контента Например, на рис /23 показана инсталляция фрагмента
кода. Visual Studio 2008 использует тип контента для того, чтобы определить, куда именно
сохранять ваш контент (макрос, надстройка, фрагмент и т. д.).
Контент, который не является макросом, надстройкой или фрагментом, инсталлируется в
один из соответствующих каталогов Visual Studio. Имеются каталоги для проектов,
шаблонов проектов и шаблонов элементов На рис. 7.24 показано диалоговое окно Options,
которое можно использовать для управления этими путями Обратите внимание, что если у вас
имеется множество разнообразных шаблонов проектов и элементов, то вы можете
настроить эти пути на разделяемый сетевой ресурс.
Глава 7. .NET-сообщество. использование и создание разделяемого кода
231
^h
Select content to install
Which content items do you want to install'
\£ VS2QQ8 Unleashed Flowerbox Snippet
Vie* f 'g-s ir Wmcc_4siyptc:ref_
Publisher information
Publishei (Unknown)
In'orrranon URL c- * , -.z
ii_ji.
1С
Finish | Cancel
Рис. 7.23. Инсталлятор Visual Studio Content Installer
Environment
Projects and Solutions
General
Build and Run
VB Defaults
VC-* Directories
VC- + Project Settings
Source Control
Te*t Editor
Database Tools
Debuggrng
Device Tools
HTML Designer
Office Tools
Test Tools
Text Tern plating
Windovvs Forms Designer
Workflow Designer
Visual Studtc projects location
С \User5\m:nell\Documents^Vrsual Studio 2003\Prcjects
Visual Studtc user project templates location'
С ^sers'MTvsnelKDccumenlsWisjal Studio 2008^Templates\ProjectTemplate;
Visual Studio user item templates location:
C.NUsers^msneJIXDccumentsWisual Studio 2008\Templates\ltemTemplates
>• Always show Error List rf build finishes wtth errors
i Track Active Item in Solution Explorer
/ Show advanced build configurations
Jj Always show soluhon
2 Save new projects when created
I <*] Warn u:er when the project location is not trusted
] Show Output window when build starts
•/] Prompt for symbolic renaming when renaming files
П
Рис. 7.24. Настройка мест хранения шаблонов проектов и элементов
Мы изучим этот инструмент более подробно в следующем разделе, где будем обсуждать
создание и упаковку вашего собственного контента.
Совет
Фирма Microsoft создала сайт нового сообщества для проектов с открытым кодом.
Этот сайт называется CodePlex (www.codeplex.com). Он заменяет нерекомендуемый
теперь gotdotnet.com. Здесь вы можете найти множество проектов и образцов кода.
Вы можете также начать новый проект с открытым кодом или принять участие в суще-
232
Часть II. Подробности о IDE
ствующем. Один из таких интересных проектов — это проект Power Toys for Visual
Studio Packet Installer. Он предлагает инструмент инсталляции и управления для
множества пакетов улучшений с открытым исходным кодом для Visual Studio.
Участие в сообществе
Вне зависимости от того, насколько хороша Visual Studio, разработчики придумывают
замечательные дополнения и расширения ее функциональных возможностей. Эти расширения
могут быть как просто специфичными для конкретного проекта, так и пригодными для всех
пользователей Visual Studio. Конечно, разработчики любят писать код. Поэтому
неудивительно, что некоторые из них заходят так далеко, что пишут собственные расширения
(надстройки, фрагменты кода, макросы и т. д.). Такие подвиги проходят удачно тогда, когда вы
делаете это для себя. Проблемы начинаются тогда, когда вы хотите поделиться своим
экономящим время произведением с остальными членами команды. Обычно все заканчивается
тем, что вы пишете страничку инструкций по инсталляции и персонально помогаете
каждому разработчику при инсталляции вашего "средства экономии времени".
Visual Studio 2008 предлагает решение в виде упаковывающего механизма, который
позволяет разработчикам публиковать, обмениваться и инсталлировать контент для Visual Studio.
Несколько раньше мы рассмотрели использование контента сообщества. Теперь мы
покажем, как вы можете упаковать ваши собственные произведения и поделиться ими с членами
вашей команды или друзьями, либо через Web-сайты сообщества.
Создание совместно используемых элементов
(шаблонов проектов и элементов)
В других главах мы покажем, как создавать фрагменты кодов, макросы и дополнительные
модули. Мы еще не описывали создание шаблонов проектов и элементов. Эти элементы
очень полезны для больших команд разработчиков, которым необходимо соблюдать
стандарты и создавать правила. Вместо того чтобы посвящать этим двум элементам отдельную
главу, мы опишем их здесь как случай создания контента совместного использования.
Создание шаблона проекта
Шаблоны проектов— это то, что видно в диалоговом окне New Project в Visual Studio.
Проекты сгруппированы по типу проекта (С#, VB, Windows, Office и т. д.). Кроме того, сами
шаблоны разделены на инсталлированные вместе с Visual Studio и My Templates. К
последним относятся инсталлированные вами нестандартные шаблоны. На рис. 7.25 показано
диалоговое окно New Project в действии. Вы выбираете тип проекта или группу, а затем сам
шаблон.
Вы можете создать шаблон проекта вручную или использовать мастер Visual Studio Export
Template Wizard. Он просто собирает вместе нужные XML-файлы и сворачивает ваш проект
в архив формата ZIP. Для создания шаблона проекта вы делаете следующее:
1. Создаете проект в Visual Studio (или начинаете с существующего проекта).
2. Определяете, где в вашем шаблоне должны присутствовать параметры (если они нужны).
Глава 7. .NET-сообщество: использование и создание разделяемого кода
233
3. Выбираете опцию Export Template из меню File.
4. Не обязательно: редактируете XML-файл с расширением vstemplate.
шшш»
Project typ*s.
Visual С*
Window
Web
Office
Smart Device
Database
Test
WCF
Workflow
Other Languages
Other Project Types
Test Projects
Templates:
Vi:ual 5tudic instilled templates
,3 Windows Forms Application
C^WPF Application
..^Console Application
blwindows Service
CWPF User Control Library
jP Repc rts Appli cati on
Ms' Templates
- jj Search Online Templates.,
.NET Framework 3-5
Pcias: Library
^WPF Browser A ppficati on
33 Empty Project
k-WPF Custom Control Library
s23 »7indcws Forms Control Library
[|cp)
Windows Presentation Foundation user control library (NET Framework 33)
Name*
Location.
Solution
Solution Name:
WpfControHibraryl
С 4lsers\msnelt\Dctuments\Visual Studio 200fi\Projects
Create new Solution ▼
WpfControlLibraryl
▼ {£ Create directory for solution
П Add to Source Control
Рис. 7.25. Диалоговое окно New Project
Теперь давайте рассмотрим каждый из этих шагов.
Шаг 1. Создание вашего проекта
Большая часть создаваемых вами шаблонов будет начинаться с существующего шаблона
Visual Studio (или пустого проекта). Обычно разработчики обращаются к шаблонам для
реализации стандартов и практик, и также при создании правил для команд разработчиков.
Поэтому самой сложной частью создания шаблона проекта является определение самого
шаблона в смысле того контента, который должен в него войти. Например, предположим, что
ваша команда разработчиков использует определенный набор библиотек, ресурсов или
элементов управления. Вы можете определить шаблон проекта, в котором все эти ресурсы
будут встроены (или на них будут указывать ссылки).
Шаг 2. Определение параметров проекта
Параметры проекта определяют элементы, которые настраиваются по умолчанию в тот
момент, когда Visual Studio создает новый проект на основе данного шаблона.
Например, когда вы создаете новый проект, то пространство имен файлов кода настраивается на
пространство имен проекта. Это — параметр проекта. Visual Studio использует для этой
цели несколько зарезервированных параметров шаблона. В табл. 7.3 дан обзор этих
параметров.
234
Часть II. Подробности о IDE
Таблица 7.3. Зарезервированные параметры шаблона
Контент
clrversion
GUID[1—10]
itemname
machinename
projectname
registeredorganization
rootnamespace
safeitemname
safeprojectname
time
userdomain
username
year
Описание
Версия общеязыковой исполняющей среды (Common Language Runtime,
CLR)
Уникальный идентификатор проекта Вы можете настроить до 10
идентификаторов проекта при помощи GUID1, GUID2 и т д
Название элемента, которое пользователь вводит в диалоговом окне
New Item, например, MyNewClass cs
Имя компьютера пользователя
Название данного проекта, которое пользователь вводит в диалоговом
окне Add New Project, например, MySmartClient
Значение ключа реестра для имени организации, указанное при
инсталляции Windows
Пространство имен, которое будет установлено в качестве корневого
для текущего проекта
То же, что и itemname, но все небезопасные символы и пробелы
удалены
То же, что и projectname, но все небезопасные символы и пробелы
удалены
Текущее время на компьютере пользователя
Домен, в котором зарегистрировался пользователь
Имя активного пользователя
Текущий год (как он выставлен на компьютере пользователя)
Мастер Export Template Wizard помогает вам работать с этими параметрами. После того
как вы вручную задали их в вашем коде, мастер Export Template Wizard определит эти
настройки.
Предположим, что у вас есть шаблон проекта с названием SmartClient. Когда
пользователь выбирает этот шаблон для создания проекта, то вы хотите, чтобы этот шаблон вел
себя как другой шаблон в диалоговом окне. Например, вы хотите, чтобы пространство
имен проекта было определено с таким же именем, которое пользователь выбрал в
качестве названия проекта.
Для реализации параметров шаблона вы определяете положение параметра в коде. В
примере с пространством имен вы должны использовать зарезервированный параметр шаблона
safeprojectname на месте реального названия пространства имен, определенного в кодовых
файлах проекта. Это указывает Visual Studio, что при создании нового проекта название
пространства имен должно быть настроено на безопасное название проекта (определенное
пользователем). Следующий пример показывает, как определить код:
namespace $safeprojectname$ {
class Framework {
Глава 7. .NET-сообщество: использование и создание разделяемого кода 235
Примечание
При наличии этих параметров ваш код собираться не будет. Поэтому лучше всего
отладить ваш код перед настройкой параметров.
Теперь, когда вы задали ваши параметры, мастер Export Template Wizard определит их и
поместит в XML-файл с расширением vstemplate. Мы рассмотрим это в шаге 3.
Определение нестандартных параметров
Кроме вышеупомянутых параметров Visual Studio вы можете определить собственные
нестандартные параметры для передачи в ваши шаблоны. Этот процесс аналогичен
использованию зарезервированных параметров шаблона. Сначала определите параметры в вашем
коде при помощи синтаксиса $parameter$, как показано здесь:
string myCustomValue = "$CustomParameterl$";
Затем отредактируйте XML-файл с расширением vstemplate для того, чтобы включить в него
узел <CustomParameters>, в котором вы и определяете ваши замены. Мы подробнее
рассмотрим этот XML в следующем разделе; однако нестандартный параметр определяется в
файле с расширением vstemplate следующим образом:
<TemplateContent>
<CustomParameters>
<CustomParameter Name="$CustomParameterl$" Value="Some Custom Value"/>
</CustomParameters>
</TemplateContent>
Visual Studio заменит содержимое нестандартного параметра тогда, когда пользователь
создаст новый экземпляр шаблона проекта. В предыдущем примере значение переменной
myCustomValue будет установлено в Some Custom Value.
Примечание
Мастер Export Template Wizard не распознает нестандартных параметров. Вам
придется вручную редактировать XML-файл с расширением vstemplate для того, чтобы
включить в него узел CustomParameters.
Шаг 3. Экспортируем ваш шаблон
Теперь, когда вы определили ваш шаблон и приняли решение относительно параметров
шаблона, следующий шаг— запустить мастер Export Template Wizard. Этот мастер
используется как для шаблонов проектов, так и для шаблонов элементов. Вы можете получить к
нему доступ из меню File.
На рис. 7.26 показан первый шаг мастера. Здесь вас просят выбрать тип шаблона (проекта
или элемента). Затем вы должны выбрать проект из текущего (открытого) решения Visual
Studio. Этот проект будет служить в качестве основы для вашего шаблона.
Следующий шаг мастера Export Template Wizard позволяет вам определить несколько
дополнительных параметров для вашего шаблона. Вы можете указать значок для шаблона,
9 3ак 3716
236
Часть II. Подробности о IDE
название и описание (которые будут видны в диалоговом окне New Project), а также
выбрать местоположение, куда будет помещен ваш шаблон. На рис. 7.27 показан пример этогб
диалогового окна.
ШШШШШттт
Choose Tentpbte Type
ТЫ» wizard will allow you to esport a project or project item from the current solution to a template which future
project* can then be based upon.
Which type of template would you like to create?
e> Project template
A project template will allow a user to create a new project based on your exported project A user will be able to
utilize your template from the New Project dialog be* for client project; and from the New Website dialog box for
websites.
Item template
An item tern plate wilt allow a user to add your item to one of their existing project. Your template wilt be available
to the use/ from the Add New hem dialog box.
From which project would you Tike to create a template'
Рис. 7.26. Мастер экспорта Export Template Wizard
Template description-
Create a Smart Client Based on Corporate Standards
Output location;
CMhersXmsnelADocumentsWrsual Studio 2008\My Exported Templates\SmertCli«nt Template ap
' Automatically import the template into Visual Studio
;</ Display an explorer window on the output files folder
Рис. 7.27. Опции экспорта шаблона
Глава 7. .NET-сообщество: использование и создание разделяемого кода 237
Обратите внимание, что в показанном на рис. 7.27 диалоговом окне флажок Automatically
import the template into Visual Studio не отмечен. Так сделано по двум причинам. Во-
первых, вы будете редактировать генерируемый мастером vstemplate-файл, и во-вторых, вы
будете упаковывать шаблон для инсталляции (мы рассмотрим эту тему в следующем
разделе). По умолчанию шаблон создается в каталоге ..ADocumentsWisual Studio 2008\My
Exported TemplatesV Файл создается в формате ZIP (как и все шаблоны Visual Studio).
Шаг 4 (необязательный).
Редактирование XML-файла с расширением vstemplate
Четвертый (необязательный) шаг этого процесса— редактирование XML-файла с
расширением vstemplate. Мастер Export Template Wizard генерирует для вас vstemplate-файл по
умолчанию. Вы можете открыть zip-файл, отредактировать XML, опять сжать файл в zip-
архив и поместить его в каталог шаблона или в пакет для инсталляции. В листинге 7.1
показан образец vstemplate-файла.
] Листинг 7,1. Образец vstemplate-файла
<VSTemplate Version=.0.0м
xmlns="http://schemas1. microsoft.com/developer/vstemplate/2005"
Type="Project">
<TemplateData>
<Name>Smart Client</Name>
<Description>Corporate standard smart client template</Description>
<Proj ectType>CSharp</Proj ectType>
<Proj ectSubType>
</ProjectSubType>
<SortOrder>1000</SortOrder>
<CreateNewFolder>true</CreateNewFolder>
<DefaultName>Smart Client</DefaultName>
<ProvideDefaultName>true</ProvideDefaultName>
<LocationField>Enabled</LocationField>
<EnableLocationBrowseButton>true</EnableLocationBrowseButton>
<Icon> Templatelcon.ico</Icon>
</TemplateData>
<TemplateContent>
<Project TargetFileName="Smart Client.csproj"
File="Smart Client.csproj" ReplaceParameters="true">
<ProjectItem ReplaceParameters="true"
TargetFileName="Framework.cs">Framework.cs</ProjectItem>
</Project>
</TemplateContent>
</VSTemplate>
238
Часть II. Подробности о IDE
Обратите внимание, что мастер добавил в узел Project Item атрибут ReplaceParameters
и установил его значение в true. Это значение указывает Visual Studio, что она при
создании проекта должна заменить все параметры в целевом файле. В нашем примере целевым
файлом, содержащим параметры ($safeprojectname$), является Framework.cs.
Совет
Фактически вы можете создать шаблоны, которые содержат несколько проектов. Для
этого вы по-прежнему создаете vstemplate-файл для каждого проекта в решении.
Затем вы создаете корневой vstemplate-файл, который описывает "многопроектный"
шаблон. Данные этого XML-файла используются в диалоговом окне New Project
Файл содержит также указатели на vstemplate-файлы отдельных проектов.
Инсталляция шаблона
И наконец— все, что осталось сделать — это упаковать шаблон в vsi-файл (см. следующий
раздел) для того, чтобы его можно было совместно использовать. Затем вы можете
инсталлировать его. На рис. 7.28 показан пример только что установленного шаблона (в разделе
My Templates). Обратите также внимание и на то, что элемент должен быть инсталлирован
для приложений Windows на языке С#. Это делается при помощи vsi-файла. Мы опишем эту
тему в следующем разделе.
Наконец, когда проект создан, Visual Studio вставляет безопасное имя файла для
пространства имен проекта. Вспомните, что это был зарезервированный параметр (который вы на-
ртроили). В файл Framework.cs вставлен следующий код:
namespace My_New_Smart_Client_App {
class Framework {
New Project
Project types*
Visual C»
Windows
Web
Office
Smart Device
Database
Test
WCF
Wortrflo*'
Other Languages
Other Project Types
Test Projects
Templates:
Visual 5 i-dic inslallfci templates
<j3 Windows Forms Application
jgASP NET Web Application
ZL WPF Application
-3 Console Application
•JJWindcvw Forms Control Library
M» Templates
JpSmartClient Template
Client T
Corporate standard smart client template
Name SmartClient Template!
Location. CMJsers^msnelbDocumenls'A'isual Studio 200S\Projects
Solution- [Create new Solution ▼
Solution Namr, SmartClient Template!
.NET Framework 33
i**3Clas£ Library
„4 ASP NFT Wf b Service Application
!^WPF Browse/ Application
^ WCF Service Application
.^Search Online Templates
J\ Create directory for sclutio
„ Add to Source Control
Рис. 7.28. Инсталлированный шаблон в диалоговом окне New Project
Глава 7. .NET-сообщество: использование и создание разделяемого кода
239
Создание шаблонов элементов
Шаблоны элементов представляют собой различные элементы или файлы, которые вы
можете добавлять в проекты Visual Studio. Выбор опции Add New Item открывает диалоговое
окно, которое позволяет вам выбрать различные элементы Visual Studio (например, файлы
классов). Вы можете также создать ваши собственные, нестандартные элементы.
Нестандартные элементы могут быть хорошим средством экономии времени (например, они могут
создавать заглушку для класса или полностью реализованный специфический тип класса).
На рис. 7.29 показано диалоговое окно Add New Item с нестандартным элементом
DataFramework в разделе My Templates.
Хорошая новость состоит в том, что вы создаете шаблоны элементов так же, как и шаблоны
проектов. Вы начинаете с существующего элемента, редактируете его, а затем используете
мастер Export Template Wizard для создания шаблона элемента из элемента. На первом шаге
работы мастера вы выбираете шаблон элемента (рис. 7.26). Затем выбираете файлы вашего
проекта, которые вы хотите использовать для создания шаблона элемента. Обратите
внимание, что вы можете также определить такой же набор параметров для шаблонов элементов,
как и для шаблонов проектов.
1 Categories
1 Viiual С* Йетл*
1 Code
Data
J General
1 Web
| Windows Fcrms
I WPF
1 Corporate data f ramev»ork standard
1 Name: DataFrameworkl cs
Bliiii tiitmmimtim i wiiiiliiiii
Templates
£] Installer Class
*$} .(Script File
\ j Local Database
.alMDJ Parent Form
>2i Repcrt Wizard
\ j Service-based Database
АЦ Style Sheet
Ц User Control
3J) WCF Service
П Windows Form
4$] Windows Service
Jj XML Schema
My Templates
~.Д DatAFramework
w
:j interface
JC\UNQ to SQL Classes
>3local Database Cache
j Repcrt
_id Resources File
.J Settings File
^j Te>t File
3-User Central (WPFJ
^JdWeh Configuration Tile
&}Winde*s Script Host
Jj XML File
jr'xSLTFile
^ Search Online Templates
; Add
■™i
* 1
-1
Cen«l 1 i
f
Рис. 7.29. Нестандартный шаблон элемента в диалоговом окне Add New Item
Упаковка вашего произведения
Как уже упоминалось, Visual Studio 2008 предоставляет инструмент с названием Visual
Studio Content Installer. Роль этого инструмента— помочь разработчикам инсталлировать
контент, который предназначен для интегрированной среды Visual Studio. Этот контент имеет
вид файлов контента Visual Studio (с расширением vsi). После того как вы упакуете ваше
произведение в один из таких файлов, данный инструмент сможет легко инсталлировать
контент в интегрированную среду. Хорошая новость состоит в том, что создание таких
файлов — процесс относительно несложный.
240
Часть II. Подробности о IDE
Конечно, первый шаг — это определение и отладка вашего произведения (дополнительную
информацию по расширению Visual Studio см. в главах 11—75). Такие произведения, как
шаблоны проектов и элементов, надстройки, макросы и фрагменты кода — все они могут
быть упакованы в виде vsi-файлов. Когда вы будете готовы поделиться своим
произведением, вам потребуется выполнить следующие шаги (мы подробно рассмотрим их позже):
1. Создать файл VSContent, который содержит XML, описывающий ваш контент.
2. Собрать файл (или файлы), которые определяют ваше творение.
3. Сжать эти файлы в zip-архив.
4. Изменить расширение файла zip на расширение vsi.
5. Не обязательно: подписать ваш vsi-файл.
Этот процесс не зависит от типа контента. Вы выполняете одни и те же шаги для макросов,
надстроек и фрагментов кода. Инструмент инсталляции получает информацию
относительно контента из установок XML-файла VSContent. Давайте теперь исследуем данный файл
подробно.
Элементы файла VSContent
Файл VSContent — это XML-структура, которая содержит все необходимые элементы для
инсталлятора Visual Studio Content Installer. Ваш контент определяется узлом (или
элементом) Content. Этот элемент предназначен для определения элемента контента, которым вы
хотите поделиться (такого как файл макроса или элемент управления, определенный в dll-
файле). В листинге 7.2 представлена структура файла VSContent. Это не реальный пример и
не официальный XSD. Скорее он служит для представления элементов и отношений между
ними.
I Листинг 7,2. Структура файл» VfContent
<VSContent xmlns="http://schemas.microsoft.com/developer/vscontent/2008">
<Content>
<FileName></FileName>
<DisplayName></DisplayName>
<Description></Description>
<FileContentType></FileContentType>
<ContentVersionx/ContentVersion>
<Attributes>
<Attribute name=,,M value="'7>
</Attributes>
</Content>
</VSContent>
Совет
Настоящий XSD, определяющий структуру файла VSContent, слишком длинный для
того, чтобы приводить его здесь. Однако если вы захотите изучить XSD-файл, кото-
Глава 7. .NET-сообщество: использование и создание разделяемого кода 241
рый определяет структуру XML для файла VSContent, то можете это сделать. Файл
находится по адресу C:\Program FilesWIicrosoft Visual Studio 8\Xml\Schemas\1033\ и
называется vscontent.xsd.
Вы можете указать много типов контента и соответствующих им файлов в одном vsi-файле.
Это можно сделать путем создания нескольких экземпляров элемента Content (по одному
на каждый элемент, которым вы хотите поделиться). Например, в одном vsi-файле может
содержаться узел Content, который инсталлирует фрагмент кода и другой узел Content,
который указывает на vsmacro-файл, содержащий макрос.
Каждый элемент листинга 7.2 подробно описан в табл. 7.4. В следующем разделе мы
проработаем реальный пример создания и использования файла VSContent.
Таблица 7.4. Элементы файла VSContent
Элемент
FileName
DisplayName
Description
FileContentType
ContentVersion
Attributes
Attribute
Описание
Этот элемент представляет имя файла, содержащего элемент, который
должен быть инсталлирован как контент Элемент Content может
содержать несколько элементов FileName (в зависимости от ситуации)
Например, вы можете определить в файле VSContent инсталляцию
надстройки Эта надстройка может содержать как Addin-файл, так и dll-файл
Это название вашего контента. Инсталлятор Visual Studio Content
Installer отображает это имя при инсталляции пользователем вашего
произведения
Этот элемент используется в качестве текста подсказки ToolTip для
вашего контента внутри инсталлятора Visual Studio Content Installer
Представляет собой тип контента, определенного данным узлом
Content Это значение является перечислением, поэтому оно должно
иметь одно из следующих значений Addin, Macro Project, Code
Snippet, VSTemplate, Toolbox Control
Этот элемент представляет собой номер версии вашего контента На
данный момент единственным допустимым значением является 1 0
Любое другое значение приведет к ошибке
Этот элемент используется для группировки элементов Attribute
Вы можете использовать атрибуты для дальнейшего определения
фрагментов кода и содержимого VSTemplate. Эти настройки обсуждаются в
следующем разделе
Использование атрибутов
для определения VSTemplates и фрагментов кода
Элемент Attribute в файле VSContent предоставляет инсталлятору Visual Studio Content
Installer дополнительную информацию по следующим типам контента: шаблоны проектов,
шаблоны элементов и фрагменты кода. Узел Attributes не используется для типов
контента Addin, Macro Pro]ect и Toolbox Control.
Элемент Attribute состоит из пары "имя/значение". Вы настраиваете имя и значение
элемента при помощи XML-атрибутов в следующем формате:
242
Часть II. Подробности о IDE
<Attribute name=,,H value=""/>
Оба атрибута (name и value) определяются при помощи перечислимых значений. Эти
перечислимые значения определяют все возможные комбинации настроек, которые вы можете
задать для фрагментов кода и шаблонов.
Для фрагментов кода только значение lang применимо для атрибута name. Настройка
атрибута lang для фрагментов кода позволяет вам указать язык разработки, для которого
предназначен фрагмент. Возможные значения атрибута value (когда он определен вместе с
lang) включают: csharp, j sharp, vb и xml. Например, если ваш фрагмент кода
предназначен для работы с Visual Basic, то вы будете определять атрибут так, как показано здесь:
<Attribute name="lang" value="vb"/>
При определении контента типа VSTemplate вы можете использовать для атрибута name
следующие перечислимые элементы:
□ TemplateType — определяет тип шаблона, который представляет собой ваш контент.
Его значение — Project для шаблонов проектов или Item для шаблонов элементов;
П ProjectType — определяет тип проекта, содержащегося в вашем шаблоне. Возможные
перечислимые элементы для атрибута value: Visual Basic, Visual C#, Visual J# и
Visual Web Developer;
□ ProjectSubType— определяет подкатегорию, в которую ваш шаблон помещается в
диалоговом окне New Project. Возможные варианты: windows, Office, Smart Device,
Database, Starter Kits И Test.
Вспомните шаблон проекта SmartClient, который вы создали раньше. В листинге 7.3
представлен файл VSContent, используемый для определения инсталляции SmartClient. Обратите
внимание на три определения атрибутов. Их комбинация дает конфигурацию, которая
показана на рис. 7.28 (диалоговое окно New Project).
| Листинг 7Л, Файл VSContent дня примера SmartCItent
<VSContent xmlns="http://schemas.microsoft.com/developer/vscontent/2008">
<Content>
<FileName>Smart Client.zip</FileName>
<DisplayName>Smart Client</DisplayName>
<Description>Install a smart client project template</Description>
<FileContentType>VSTemplate</FileContentType>
<ContentVersion>l.0</ContentVersion>
<Attributes>
<Attribute name="TemplateType" value="Pro]ect"/>
<Attribute name="ProjectType" value="Visual C#'7>
<Attribute naine="ProjectSubType" value="Windows"/>
</Attributes>
</Content>
</VSContent>
Глава 7. NET-сообщество: использование и создание разделяемого кода
243
Пример: упаковка макроса
Как и во многих других случаях, лучшим способом понять упаковку контента в Visual Studio
является проработка реального примера. В данном случае мы возьмем несколько макросов
(определенных в главе 12) и упакуем их для того, чтобы поделиться ими с сообществом
разработчиков.
Шаг 1: создание файла VSContent
После того как вы отладили и оттестировали ваше произведение, первым шагом по его
упаковке будет определение файла VSContent. Для этого примера мы создали файл макросов,
который содержит несколько макросов из предыдущих глав (в том числе макрос
insertTemplateFlowerbox, который помещает структуру комментариев над операторами
Sub и Function языка Visual Basic; макрос ResizelDE и проч.). Имя файла макросов —
VS2008 Unleashed.vsmacros.
1Ы4аЙиШП
hie Edrt View Debug XML Tools Test Window Help
i£l Ъ ^ J A> ' 3 x* ^ A' i? S* - 1 {~3 ♦
«- VS2006uideashed.v*contenf
< NJf
~ X
^1
>l
<?x.tJ. v^:siov =. 0" •i'iccoix ^»"aif-5l,'>
i <\7Z:on'er,t *m_ 'jc"http' //sctienaa ricrcacft. cciK/tievelocgi/v'3Ccrtent:/2CCS',>
^F_leN^«e>V5200S_Uileaahed. V3racrcs</F^l^M<iw«!>
*Ti3playNu;r.e>V32CQ5 Urleashed Sample Macrcs</rispld.iU5ff?> ; о
-'D'iscr-pt ij, >Saicple macros tram the bock, 'Visual Studio 20C2 Unleashed' c/C'jj":^ ч ™
J Addin
-f
^j Code Snippet
J VST em plate
_J Toolbox Control
Jj I^^smI^!?^*^^ ipenotesthe contentas a Macro Prciect j
Ready
Рис. 7.30. Определение файла VSContent
внутри интегрированной среды
Простой способ определения файла VSContent состоит в открытии интегрированной
среды Visual Studio, выборе в меню File | New | File. В появившемся диалоговом окне
выберите XML File. Помните, файл VSContent— это просто XML-файл со специальным
расширением имени файла (VSContent). Таким способом вы можете создавать и
редактировать ваш файл VSContent непосредственно в Visual Studio. Вам придется
изменить расширение имени файла с xml на VSContent. Однако применение Visual Studio no-
244
Часть II. Подробности о IDE
зволяет вам использовать преимущества встроенного редактора XML, который имеет
поддержку технологии IntelliSense.
Первый шаг определения содержимого этого файла— это настройка пространства имен
XML на правильную схему. Это делается при помощи добавления в файл следующего
корневого узла:
<VSContent xmlns="http://schenias.microsoft.com/developer/vscontent/2005">
После этого Visual Studio распознает структуру XML и даст вам указания по определению
дополнительных элементов. На рис. 7.30 показан пример создания файла VSContent внутри
интегрированной среды разработки. Обратите внимание, что для этого примера вы указали
в элементе FileName файл макроса. Вы должны также настроить FileContentType на
перечислимое значение Macro Project. Это обеспечит инсталляцию примера в
соответствующее местоположение для макросов.
Шаг 2: собрать файлы,
которые определяют ваше произведение
Следующий шаг — поместить все ваши файлы в единый каталог, где они смогут легко
"найти" друг друга. Вам будет необходимо включить в ваш пакет все файлы, которые
упоминаются в файле VSContent (vsmacros, dll, addin), а также и сам файл VSContent. Некоторые
файлы и проекты, возможно, придется поискать. В данном проекте создаваемый в качестве
нового макропроекта vsmacros-файл хранится в каталоге VSMacros80. Этот каталог
находится в ..ADocumentsWisual Studio2008\Projects\.
В этом примере вы создаете каталог VS2008 Unleashed Macros. В него вы помещаете файл
макроса VS2008_Unleashed.vsmacros и VSContent-файл с именем VS2008_Unleashed.vscontent.
Совет
Если вы создаете макропроект и хотите включить его в vsi-файл, то вам сначала
необходимо будет найти его! По умолчанию Visual Studio хранит пользовательские
макропроекты в каталоге ..ADocumentsWisual Studio 2008\Projects\VSMacros80\.
Шаг 3: сжатие файлов в архив (zip)
Процесс сжатия файлов знаком каждому разработчику. Вы можете использовать либо
встроенную в Windows способность сжимать файлы, либо программу сжатия. В этом
примере мы будем использовать средства Windows. Вы выделяете файлы с расширением
vsmacros и VSContent, щелкаете по ним правой кнопкой, мыши и выбираете в контекстном
меню команду Send To | Compressed (Zipped) Folder.
Шаг 4: переименование zip-файла в vsi-файл
В результате шага 3 был создан файл VS2008unleashed.zip. Теперь все готово для
следующего (самого легкого) шага. Щелкните по zip-файлу правой кнопкой мыши и выберите из
контекстного меню пункт Rename. Удалите расширение имени файла zip и замените его на
vsi. Вот и все. Если вы работаете на компьютере с инсталлированной Visual Studio, то новый
Глава 7. .NET-сообщество: использование и создание разделяемого кода
245
файл получит значок vsi (который используется как для vsi-файлов, так и для файлов
VSContent). На рис. 7.31 показан пример таких файлов и их значков.
щщЩшмШ^\М
1 W Эсюткои
Mictosolt P?2'.1 ce - Cfic
1 5 \K Prcpcssb зга Sal« {
1 Matrix Pro^C't Plannir g
1 _*j 4e-*ef.?l) Changed
1 ^ £»MOLV elements
1 \ Visual SlLd с Г'ООЗ
1 , Public
1 ^ Searches
1 Folderi v
1 Л-у Tremng Kits *
1 i Unleashed and MS Exam
1 i Visual Studio 2008
1 ,» 972702
VmtftiSiud
Name
;
I
I
I
1 >> 972707 |
1 ■, LP Chapters ~~
1 ,: V52QQ8 Unleashed Mac
1 "S W> м»1»мЬ^
1 | 3 items
&2ОД ► VS2008 Uokisded Macros
1**1 ^50Г^
Date modified Type Siie Tags
п
%/*
'
d'sK
==1Й
■ИР; "^
wt
VS2D08unteaih*d.vseonterrt
m. ^Шяю»*, „, 1
*"!
V
!
,,,,,,_ |
/
-wv^ww^.^..,,^, -w.
VS2008unleashedvsi
^1йСзз£ЭуЫ%Ы1
Pi
pe^fj^fwtfft^ a < * к Я
/j^
1
i
|
Рис. 7.31. Упакованные файлы
Инсталляция контента
Все, что остается сделать, — это раздать vsi-файл всем тем, для кого он предназначен.
Конечно, было бы весьма предусмотрительно сначала выполнить несколько тестовых
инсталляций. Давайте посмотрим на инсталлятор Visual Studio Content Installer в действии.
Сначала на рис. 7.31 обратите внимание на то, что как vsi-файл, так и файл VSContent
являются файлами инсталлятора Visual Studio Content Installer (VSContentInstaller.exe). Они
имеют один и тот же значок. Причина состоит в том, что для инсталляции контента можно
использовать оба файла.
Однако между ними имеются некоторые отличия. Файл vsi — полностью самодостаточный.
Ему не требуются для инсталляции дополнительные файлы, в то время как файл VSContent
должен находиться в каталоге, который содержит также все соответствующие файлы
контента. Кроме того, когда вы запускаете файл VSContent, вас не предупреждают об
отсутствии подписи (если она отсутствует). Поэтому создается впечатление, что имеется ошибка
или что эти файлы больше подходят для внутренних инсталляций. Наоборот, файл vsi
предупреждает вас (при помощи диалогового окна) в том случае, когда контент не подписан
издателем. Все это (с учетом того, что имеется единственный файл, который к тому же
сжат) делает vsi-файл идеальным для крупных распределенных инсталляций.
246
Часть II. Подробности о IDE
Давайте изучим процесс инсталляции для vsi-файла. Сначала вы два раза щелкаете по файлу
для запуска инсталлятора Visual Studio Content Installer. На рис. 7.32 показан пример, загру-1
женный в инсталлятор.
Which content items do you want to install?
i И 1/S2008 Unleashed Sample Macros
V swiibs m vVrrfows, ix'j. лег...
Publisher information
Publisher (Unknown)
fmiih Cancel
Рис. 7.32. Инсталлятор Visual Studio Content Installer
Select content to install
Which content items do you want to install?
jd VS2008 Unleashed Sample Macros
No Signature fauna;
®
The content file you are trying so install hei nol been signeo and might
contain harmful cod; Areyoo иге you -Abriz to install this content?
To vievv the files that vmII be installed on your compjter click No and then click Vie**
files in Windows Ь plorer
Pubjl
PublilneF^^^^^W^owr^
Inforrr*aon URL: if ■. »>\ *
Рис. 7.33. Предупреждение об отсутствии подписи
Глава 7. NET-сообщество: использование и создание разделяемого кода
247
На этом экране вы можете выбрать в Windows Explorer опцию View Files для изучения тех
файлов, которые будут инсталлированы при помощи vsi. Обратите также внимание на то,
что раздел Publisher information пуст. Причина в том, что пакет не подписан. Когда вы
нажмете кнопку Next, то инсталлятор выдаст вам предупреждение относительно отсутствия
подписи. На рис. 7.33 показано это предупреждение. Еще раз напомним, что это
предупреждение не отображается в том случае, когда вы инсталлируете из файла VSContent. Пока
нажмите кнопку Yes и двигайтесь дальше. Мы еще обсудим подписывание вашей работы.
Подписывание вашей работы
Для того чтобы подписать ваши файлы при помощи технологии Authenticode, вы должны
получить действующий сертификат издателя программного обеспечения (spc) от
сертифицирующей организации (СА). Конечно, это требует наличия зарегистрированной фирмы и
заполнения заявки. Visual Studio имеет несколько тестовых инструментов для того, чтобы
помочь разработчикам понять сам процесс (до того, как начать работать с
сертифицирующей организацией). В число этих инструментов входят:
□ инструмент преобразования из zip- в ехе-файл (MakeZipExe.exe);
□ инструмент для создания сертификата (MakeCert.exe);
□ инструмент для тестирования сертификата издателя программного обеспечения
(Cert2spc.exe);
□ инструмент для подписи (SignTool.exe).
штттттттшттшшттт
Рис. 7.34. Завершение инсталляции
248
Часть II. Подробности о IDE
Идея такова: вы используете инструмент MakeZipExe.exe для преобразования вашего zip-
файла в ехе-файл (поскольку подписывание кода требует ехе- или dll-файла). Затем вы
используете SignTool.exe для подписывания полученного ехе-файла. Потом вы преобразуете
этот файл в vsi-файл для публикации.
Если у вас нет действующего сертификата от сертифицирующей организации, то вы можете
создать тестовый сертификат (который не должен использоваться для публикаций) при
помощи инструмента MakeCert.exe. Затем вы должны преобразовать этот сертификат в
сертификат издателя программного обеспечения (spc) при помощи Cert2spc.exe.
Затем инсталлятор готовит вас к завершению инсталляции. На рис. 7.34 показан пример.
Когда вы нажмете кнопку Finish, то инсталлятор запишет файлы в соответствующие
каталоги (в зависимости от типа контента). Если данный файл уже существует, то инсталлятор
спросит у вас, хотите ли вы его перезаписать или оставить как есть.
Когда вы нажмете кнопку Finish, то инсталлятор завершит свою работу и сообщит об этом.
На рис. 7.35 показана успешная инсталляция.
Рис. 7.35. Успешная инсталляция
Публикация вашего произведения
Вы можете опубликовать ваши vsi-файлы для ваших товарищей по работе, друзей, команды
разработчиков или прочих разработчиков. Вы можете также выложить их на совместно
используемый сетевой ресурс, послать по электронной почте, а также выложить на такой сайт,
как CodePlex (www.codeplex.com), или аналогичные сайты сообщества разработчиков.
Глава 7. .NET-сообщество: использование и создание разделяемого кода 249
Резюме
Данная глава представила множество опций, имеющихся в Visual Studio 2008 для
поддержки сообщества разработчиков. Разработчики чувствуют себя частью большого сообщества,
работающего с .NET. Фирма Microsoft попыталась встроить сообщество разработчиков в
саму .NET. Вы видите это по стартовой странице Visual Studio, по опциям меню Help, a
также по способности вести поиск по сообществу из системы помощи MSDN.
Не забудьте, что для того чтобы быть частью сообщества разработчиков, необходимо время
от времени делать и свой вклад. Visual Studio предоставляет для этого все необходимые
инструменты. Вы можете создать шаблоны проектов и элементов, фрагменты кодов, макросы,
надстройки и элементы управления и поделиться ими. После создания этих элементов Visual
Studio предоставляет вам инсталлятор Visual Studio Content Installer, при помощи которого
вы можете упаковать контент для его распространения. Теперь, когда вы в следующий раз
напишете отличный макрос или фрагмент (который сберегает массу времени), то вы уже
будете знать, как его упаковать и поделиться им с другими.
ЧАСТЬ III
Программирование
и работа с кодом
Глава 8
Работа со средствами
повышения производительности
Visual Studio
В главе 6 мы обсудили основные возможности визуальных конструкторов и редакторов
Visual Studio 2008. В этой главе мы приникнем глубже в их возможности, а также и в
возможности других инструментов Visual Studio. Для этого мы изучим множество средств
повышения производительности, имеющихся в интегрированной среде разработки. Многие из
этих средств повышения производительности встроены в текстовые редакторы. Другие
имеют более общий характер. Но все они преследуют одну общую цель: помочь вам
(разработчикам) писать код быстро и правильно.
Если вы помните из главы 6, то в нашем описании редакторов мы использовали очень
простой пример кода: это было консольное приложение, которое выводило на консоль текст
"Hello, World!" На рис. 8.1 вы видите, как выглядит этот код в окне редактора кода.
Если вы следили за нашим изложением и набрали код приложения "Hello, World!" в Visual
Studio, то заметили, что средства повышения производительности редактора кода уже
начали работать. Во-первых, при наборе кода внутри файла шаблона редактор кода делал
отступы (перемещая курсор в соответствующее положение) для того, чтобы вы могли написать
код с красивыми отступами.
Во-вторых, когда вы вводите первую строку кода, Visual Studio реагирует на каждую
нажимаемую вами клавишу, интерпретируя то, что вы собираетесь написать, и предлагая помощь
в разных формах (рис. 8.2). Вам даются подсказки по дописыванию кода, предоставляется
информация для выбора членов, а также по параметрам, необходимым для завершения
вызова данного метода. Эти функциональные возможности называются технологией
IntelliSense, и мы в Этой главе будем подробно исследовать ее формы и функции.
По мере вашего ввода кода интегрированная среда проверяет его при помощи компилятора.
Если имеются ошибки компиляции, то они динамически отображаются для вас в окне вывода.
Итак, даже для этой единственной простой строки кода Visual Studio усердно трудится над
повышением производительности вашего кодирования. При этом она:
□ делает интеллектуальные отступы кода;
□ предлагает синтаксис для кода;
254
Часть III. Программирование и работа с кодом
П отображает описания членов для того, чтобы помочь вам выбрать верный синтаксис при
кодировании;
□ проверяет наличие парных скобок;
□ помечает ошибки кода (при помощи постоянной фоновой компиляции текущей версии
исходного кода).
Эти функциональные возможности тонко помогают вам и учат вас в процессе написания
кода (и ускоряют при этом само кодирование).
Рго9«го.о
$ -'с ,с»
Н \isins
озтц
~зтд
i °(cq -зт ^ ▼ fiV \? vst< -с}|4 г г>
5узгел,
Systerrr. .Collections. Gsner ic;
Syateir .Text;
[ j пглггзра-те sielloWcrld
<
1-J
1а«ч *
ataric ^cid Hairi (string [] arga \
\
for (iac i - 0; i <- 5; H-+)
{
Г .-.^-.WriteLme J^Kellc, Worxd' tri HO J", l) ;
'е.; t . > WriteLine ("Anvoie iiscerar.c - ");
"
™i
* i
«•
Рис. 8.1. "Hello, World'" в редакторе кода
Programmes*
^HdlcWcrld
П
-
-}
Program ▼
static Tcid Mair(string£] arga)
fo
}
Г AГС
~- in
чK indextr
'\i IndexOotOfRangeExceptJon
Л+ In^uffictentMcmory Exception
>У Intl6
>lnt32
U*Int64
~3 interface
["*= intc
^MainfstrmgL) ergs)
'
~
struct System Inl32
Represents a 32-bit signed integer
Рис. 8.2. Технология IntelliSense в действии
Глава 8. Работа со средствами повышения производительности Visual Studio 255
Основные средства помощи в текстовом редакторе
Пользовательский интерфейс текстового редактора имеет несколько визуальных
конструкций, которые помогают вам решать стандартные проблемы, встречающиеся при написании
кода. Эти базовые средства помощи определяют, что изменилось в коде и какие проблемы
компиляции в нем имеются. Кроме того, синтаксические элементы каждого языка визуально
выделяются при помощи цветного текста.
Отслеживание изменений
Когда вы редактируете файл исходного кода, то чрезвычайно полезно понимать, какие
строки кода уже зафиксированы (т. е. сохранены на диск), а какие — еще нет. Такую
возможность дает функция отслеживания изменений: желтая вертикальная полоса в поле выделения
текстового редактора будет отмечать те строки, которые были изменены, но еще не были
сохранены. Если содержимое было изменено, а затем сохранено, то оно будет помечено
зеленой вертикальной полосой в поле выделения.
При помощи наблюдения за желтой и зеленой полосами вы можете быстро отличить:
□ код, который не изменялся с момента загрузки файла (полос нет);
□ код, который изменялся и был сохранен после загрузки файла (зеленая полоса);
□ код, который изменялся, но не был сохранен после загрузки файла (желтая полоса).
Отслеживание изменений работает только тогда, когда открыто окно редактора. Иначе
говоря, отслеживание изменений актуально только для текущей сессии, редактирования доку-»
мента; если вы закроете и опять откроете окно, то полосы отслеживания исчезнут
(поскольку вы начали новую рабочую сессию для данного документа).
На рис. 8.3 показана часть файла кода, где видны полосы отслеживания изменений.
Ргодггтдз'
4$
HelloWortd Program » „*Mdinistring[] argsj
,_ using System;
1 using System.Collections.Generic;
I usua System. Text: ;
П namespace rfellcWorld
[
4 '
class trcrprri'-
: static void Main(stringС] лтдз)
i
for <mt 1-0; i <= 5; i+*}
{
*' > WriteLine ('"idle, World' ny *<c;
}
u.-.s^if WnteLme ("Arycre .iscsnina '") ;
1
}
_ _ „ » ; ~ . >. . ............. m _
", il;
»l
Ц
* '
S|
lJ
Рис. 8.З. Отслеживание изменений
256
Часть III. Программирование и работа с кодом
Индикаторы проблем кодирования
Компилятор Visual Studio работает вместе с окном редактора кода и отмечает проблемы в
исходном коде. Компилятор может даже работать в фоновом режиме, что позволяет окну
редактора помечать проблемы по мере набора вами кода (не нужно дожидаться компиляции
проекта).
Проблемы в коде помечаются при помощи цветных волнистых линий, которыми
подчеркивается проблемное место кода. Эти волнистые линии представляют собой тот же самый
механизм, который используется в Microsoft Word для отметки мест, в которых имеются
проблемы с правописанием и грамматикой. Цвет волнистой линии указывает конкретный класс
проблемы. В табл. 8.1 показано соответствие этих цветов и вызвавших их проблем.
Таблица 8.1. Цвета индикаторов имеющихся в коде проблем
Цвет
Красный
Синий
Фиолетовый
Проблема
Синтаксическая ошибка; код не скомпилируется (из-за синтаксических
требований и правил языка)
Семантическая ошибка; результат того, что компилятор не может принять
решение по типу или конструкции кода в текущем контексте. Например, синим
помечается название типа, которое не существует в скомпилированном контексте
текущего проекта Обычно это означает опечатку (например, неправильно
написанное имя класса)
Предупреждение; фиолетовая волнистая черта обозначает код, который дал
предупреждение компилятора
I Бк £dit View gefactor Erqject fiuild Bebuo, Data Ieol* 7ejt yfrndow ЫФ
' . & ' 'JJ » U* У & *> 4* U *) • ** " P~ » j ► Debug * Moted Platforms
[>j~ Program о
J.% HelloWortd Program ▼ ^Main(stringL] argi)
Cc~.i<c;t'.HrxteLlne("Hellc/ ftorld' cry #(Э:«, i) ;
[The name 'Consolec' doe» not exist tn the current contert|
! T
-Л |
Error List " ' ~~~,„, „ ~ „, ,,,,~
Description File
Q 1 The name Ccnsolee' does not exist in the current Program.cs
context
. «TV ?
Line
19
Column
13
Project
HellcWcrld
Ready
U19 Col 53 Ch53
Рис. 8.4. Индикаторы проблем кодирования
Глава 8 Работа со средствами повышения производительности Visual Studio 257
Наведение курсора мыши на индикатор проблемы приводит к показу фактического
сообщения об ошибке или предупреждения компилятора (рис. 8.4).
Активные гиперссылки
Текстовые редакторы поддерживают гиперссылки в документах; щелчок по такой ссылке
запускает браузер по указанному адресу. Отличным применением для этой функции
является встраивание URL для документации или прочей полезной справочной информации
внутри комментариев кода.
Синтаксическое расцвечивание
Текстовый редактор может делать синтаксический разбор и расцвечивать различные
конструкции кода для того, чтобы их было легче распознать по виду. Например, в окне редактора
кода все комментарии по умолчанию имеют зеленый цвет. Идентификаторы — черные,
ключевые слова — синие, строки — красные и т. д.
Число уникальных элементов, которые текстовый редактор может различить и расцветить,
фактически огромно: окно текстового редактора распознает более 100 различных
элементов. И вы можете каждый элемент настроить и изменить его цвет (при помощи раздела
Fonts and Colors в узле Environments диалогового окна Options). Вам нравится работать с
более крупными шрифтами? Вам нравится более высокий контраст? Может быть, вы хотите
втиснуть еще больше кода в экранное пространство? Это только несколько причин, по
которым вы можете пожелать изменить настройки по умолчанию, имеющиеся в этом диалогов
вом окне.
На рис. 8.5 показана страница шрифтов и цветов диалогового окна Options, которая
позволяет вам указать цвета переднего и заднего планов для кода, HTML, CSS или других
элементов. Выберите элемент в списке Display items и измените цвет его синтаксической
раскраски при помощи раскрывающихся списков Item foreground и Item background.
т*:
Options
Environment
General
Add-in/Маски Security
AutoRecover
Documents
Hnd and Replace
Fonts end1 Colon
Help
Import and Export Settings
International Settings
Keyboard
Startup
Talk List
Web Browser
Projects and Solutions
Source Control
Text Editor
Database Tools
ДеЬмяяюг „.
Show settings for
{[TextEdrtof"
font (bold type indicates fixed-width fonts).
Courier New
display item*
Call Return
Call Return New Context
Code Snippet Dependent Fieid
Code Snippet Field
Collapsible Text
Compiler Error
Coverage Net Touched Area
Coverage Partially Touched Area
Coverage Touched Aiea
CSS Comment
CSS Keyword
hem foreground.
■ Default
Item background
□ Default
! ] field
Sample.
У»е Defaults
Sire.
10
Custom
Рис. 8.5. Настройка шрифтов и цветов
258
Часть III. Программирование и работа с кодом
Примечание
Показанное на рис. 8 5 диалоговое окно фактически позволяет вам управлять гораздо
большим, чем синтаксическая раскраска текстового редактора; вы можете изменить
цветовые схемы, используемые во всех окнах внутри Visual Studio. Выделенный вами
в раскрывающемся списке Show settings for элемент будет определять то, какую
часть интегрированной среды вы настраиваете, и будет менять список элементов
Display items.
Вы всегда можете использовать кнопку Use Defaults в правом верхнем углу
диалогового окна для того, чтобы восстановить схемы расцвечивания по умолчанию.
Структурирование и навигация
Некоторые документы (такие как файлы исходных кодов и файлы разметки) имеют в своей
организации и синтаксисе естественные элементы отношений "родитель-потомок".
Например, XML-узлы могут содержать другие узлы. Аналогичным образом и функции (а также и
прочие конструкции языков программирования — такие как циклы и блоки try/catch)
работают как контейнеры для других строк кода. Структурирование — это концепция
визуального представления этих отношений "родитель-потомок".
Структурирование кода
Структурирование кода используется в редакторе кода; оно позволяет вам сворачивать или
разворачивать области кода по границам вышеупомянутых контейнеров. В поле выделения
рисуются линии группировки и квадратики для сворачивания/разворачивания. Эти
квадратики можно щелкать, что дает возможность отобразить или скрыть строки кода (в
соответствии с логическим группированием).
Совет
И Visual Basic, и С# имеют способ создания именованных областей кода вручную (при
помощи специального ключевого слова region). Используйте #region/#endregion
(#Region и #End Region в Visual Basic) для создания своих искусственных
контейнеров кода, которые будут распознаваться средствами структурирования кода
Поскольку каждый region имеет имя, то это очень удобное средство для организации и
разделения логических областей в вашем коде. Например, сгенерированный для вас
визуальным конструктором Windows Forms Designer код автоматически вставляется в
область "Windows Forms Designer generated code".
Одним из быстрых способов реализации области region является Surround With* в
редакторе выделите тот код, который должен оказаться в новой области, затем
щелкните его правой кнопкой мыши и выберите в контекстном меню опцию Surround With,
а затем #region (или #Region для VB).
Структурирование кода можно лучше всего понять при помощи простого примера. Во-
первых, обратитесь к рис. 8.1. Это исходный код консольного приложения. Он содержит
процедуру Main, объявление класса, объявление пространства имен и несколько операторов
using. Структурные группировки кода (которые вы видите в поле выделения) визуально
обозначают области кода, которые можно сворачивать (скрывать из вида).
Глава 8 Работа со средствами повышения производительности Visual Studio 259
Поскольку объявление класса является логическим контейнером, то поле выделения для
этой строки кода содержит квадратик сворачивания (квадратик со знаком минуса). От
квадратика сворачивания до конца контейнера рисуется линия (в данном случае, поскольку мы
имеем дело с С#, объявление класса ограничено фигурной скобкой). Если вы щелкнете по
квадратику сворачивания для объявления класса, то Visual Studio скроет весь код, который
содержится в этом объявлении.
На рис. 8.6 показано, как выглядит окно редактора кода, когда этот код скрыт из вида.
Обратите внимание на то, что квадратик сворачивания изменился на знак "плюс" (а это
означает, что вы можете щелкнуть по нему для того, чтобы вновь показать скрытый в настоящее
время код) и на то, что первая строка кода для объявления класса изменилась (в ее конце
появился квадратик с многоточием).
Pro9ram.cs
| ,J^JHelloVVorid Program
, jsir? S/sten;
f I ^3ir.g Systen.Calleccicnj.Generic:
LusIt; Systeic Text;
j .. isnespsce HeLlrfrforld
Рис. 8.6. Свернутая область
Редактор HTML также поддерживает подобное структурирование. HTML-элементы можно
сворачивать или разворачивать для скрытия или показа содержащихся в них элементов.
Использование меню Outlining
В меню Edit | Outlining имеется несколько команд структурирования кода (рис. 8.7):
□ Toggle Outlining Expansion — в зависимости от текущего положения курсора в окне
редактора, скрывает или показывает данную область;
□ Toggle All Outlining — скрывает или показывает все области в редакторе;
□ Stop Outlining— выключает автоматическое структурирование кода (все скрытые
области будут развернуты). Эта команда доступна только в том случае, когда
автоматическое структурирование включено;
□ Stop Hiding Current— удаляет структурирование текущей выделенной области. Эта
команда доступна только в том случае, когда автоматическое структурирование
выключено;
260
Часть III. Программирование и работа с кодом
Collapse to Definitions — скрывает все области процедур. Эта команда полезна для
того, чтобы выделить самую суть типа (сведя его до одной строки кода на каждый из его
членов);
Start Automatic Outlining — включает функцию структурирования кода. Эта команда
доступна только в том случае, если структурирование выключено.
<•> ContosoCommonFramework - Microsoft Visual Studio
1 File
\X'
EdrtJ View Rrfactor Project Build Debug Data Tools Test Window Help
*? Undo Ctrl+Z
, .-dct-;^G:biUcticr
£ Cut Ctrl+X
-A Copy Ctrl* С
j Cj.dfc<. ol-cj'rt Г 13 C'lf*.•»«$+/'
i
'
!
1
X Delete Del
j Select All CtrkA
Find and Replace ►
Go To... CtrfvG
Insert File As Text.,.
Advanced ►
If!
^ - x J, ! ► Debug » Muted Platforms
4 *1 d> ^ *
1С.
Toggle Outlining Expansion Ctrl*M, M
Toggle All Outlining Ctrb- M, I
. Stop Outlining CtrkM,P
Collapse to Definitions Ctrl* M, 0
t .
Ready U24 Coll Ch
l - ь.-Жш.мшшш :..,
1^Ш'
• 3
!
j
e|
j
I
I
1 INS
N
из
3 j
| 3. J
г 1
1 И> Я
1 $1
I
0 li
~ li
\\ I
Ш
'[s j|
J
Рис. 8.7. Меню Edit | Outlining
Структурирование кода— это механизм для вашего удобства: при помощи сокрытия
ненужных на данный момент областей кода вы сокращаете видимую часть кода и повышаете
его читабельность. Вы можете выбрать для просмотра определенные области (в
зависимости от текущей задачи).
Совет
Если вы поместите указатель мыши на квадратик с многоточием для скрытой области
кода, то ее содержимое будет показано вам в окне вроде подсказки ToolTip; для этого
не нужно разворачивать данную область кода.
Навигация по HTML
Проблема с большими или сложными Web-страницами состоит в том, что навигация по
HTML может быть очень сложной (с учетом наличия множества уровней и слоев вложения
тегов). Представьте себе страницу, содержащую таблицу, которая находится в таблице,
содержащейся в другой таблице. Когда вы редактируете HTML (в визуальном конструкторе
Глава 8. Работа со средствами повышения производительности Visual Studio 261
или редакторе), как вы можете точно определить, где вы находитесь? Иначе говоря: как вы
можете сказать, где находится текущий фокус в иерархии разметки?
Использование навигатора тегов Tag Navigator
На вопрос из предыдущего раздела может ответить навигатор тегов Visual Studio. Навигатор
выглядит как набор кнопок в нижней части редактора Web-страниц (справа от вкладок
визуального конструктора/редактора). В виде кнопок показана цепочка тегов, которая ведет от
тега с текущим фокусом до самого внешнего тега. Если эта цепочка слишком длинна для
того, чтобы поместиться в границах окна редактора, то она усекается со стороны
родительских тегов; дополнительная кнопка позволяет вам отобразить следующие теги со стороны
родителей.
На рис. 8.8 показан пример, который мы рассматривали в главе 6: страница регистрации на
HTML. Пока вы редактируете кнопку ОК на странице регистрации, навигатор тегов
показывает весь путь до родительского замыкающего тега <html>.
¥iew Webjite fiuifd gebug F&rmat ТдЫе look Te£ Window Help
' L? У J3P ' * ^«HM"***"**3'-*' ► Debu9 * Mrned Piriforms
;«* Ж '= % ' XHTML IGTramition, - ф - . StyleAppiicrtmrv Manuel »
(None) ~ ^
CBent Objects & Events
«'iX-HYPE я'-wl И,11Л<- "-//W3C//BT.D XHTML 1.0 Iransiticnal/'EN» "htttt»: //www. wJ.oa-
l-jrttml x»T»,4-"'atup://wrfw.rf3.QrQ/1395/xtebiBl»> «
] <i±ead ">,!мг-"server»>
<Zitie>I.ogin Page</ti-le>
<link rxp'^maf.csa" rf»l-"acyleaheecB cjy^exc/css" />
0<body>
ft <£схтг i-i-"foxeI" ru"-ai="aeiver">
1 " " " ~ iii ~ " 1 ►
|ID:I
ltp.6utton4Buttonll
Login
i g
#1
1 Design n Split j 3 Source ] Д|<htnt> [ <body> [[^r"^fcf™l>]|<div> [[ <a;p'a4itton*Suitonl> [Г
Ready
Рис. 8.8. Навигатор тегов
Каждая кнопка тега, показанная в навигаторе, может использоваться для прямого выделения
(как включающего, так и исключающего) содержимого этого тега. По нажатию кнопки тега
появится выпадающий список, в котором будут присутствовать опции выбора самого тега
или его содержимого. Первая приведет к выделению самого тега вместе со всем его
содержимым. Вторая исключит начало и конец тега, но выделит все его содержимое.
Навигатор — отличный механизм для быстрого перемещения вверх и вниз по дереву тегов
больших HTML-документов.
262
Часть III. Программирование и работа с кодом
Использование окна структуры документа
Окно структуры документа отображает древовидное представление HTML-элементов на
странице. Это иерархическое представление является также отличным средством навигации,
поскольку оно позволяет вам охватить одним взглядом структуру всей вашей Web-страницы
и моментально перейти к любому элементу страницы.
Для использования окна структуры документа Document Outline выберите в меню View |
Other Windows | Document Outline. На рис. 8.9 показан образец окна структуры: элементы
заголовка, страницы и тела страницы (в дополнение к элементам скрипта и кода).
Щелчок по элементу приведет к переходу на этот элемент в окне визуального конструктора
(причем сам элемент будет выделен) и, конечно, вы можете разворачивать или сворачивать
узлы дерева по мере необходимости.
Document Outline
_J Defaultaspx
-aJ <%@ Page%>
.!_>] <!D0CTVPE>
R ^ <HTML>
I- Щ\ <HEAD>
^ <TTTLE>
^ <lmk>
b Щ <BODY>
'г %! forml
'- &. <DN>
^JUbeil
J ^J TextBoxl
lij<br>
5J L*bel2
£J TextBox2
jj<br>
53ШШШ
ПГ1 i
ш
f
Рис. 8.9. Окно структуры документа
Смарт-теги и смарт-задачи
Смарт-теги (smart tags) и смарт-задачи (smart tasks)— эти термины можно использовать
взаимозаменяемо— это функциональные возможности, доступные через меню или
IntelliSense. Они предназначены для автоматизации задач кодирования и стандартной
настройки элементов управления внутри интегрированной среды. Смарт-теги используются
как в визуальных конструкторах, так и в редакторах. В последующих разделах мы изучим
несколько способов, которыми смарт-теги могут облегчить вашу жизнь. И начнем мы с
визуального конструктора HTML.
Визуальный конструктор HTML
При размещении элементов управления на панели визуального конструктора HTML
появляется выпадающий список стандартных задач. Эти задачи (называемые смарт-задачами) по-
Глава 8. Работа со средствами повышения производительности Visual Studio 263
зволяют вам "настроить приборы" элемента управления для того, чтобы быстро
сконфигурировать его под текущую задачу.
Этот список стандартных задач мы используем для быстрой настройки свойств элемента
управления, а также для всех стандартных операций, которые с ним можно производить.
Например, когда вы добавляете на Web-страницу элемент управления Grid View, то
появляется список стандартных задач, который позволяет вам быстро включить для данного
элемента сортировку, разбиение на страницы или редактирование. Когда вы добавляете на
Web-страницу элемент управления Text Box, то появляется список стандартных задач,
который позволяет вам быстро связать с ним элемент управления для его проверки.
Визуальный конструктор Windows Forms также может содержать смарт-теги.
Визуальный конструктор Windows Forms
В визуальном конструкторе Windows Forms функциональность смарт-тегов аналогична;
однако они имеют несколько иную форму. Элемент управления формы, который
поддерживает такую функциональность, отображает глиф смарт-тега (обычно в правой верхней части
элемента управления). Этот глиф при щелчке открывает небольшой выпадающий список
задач. На рис. 8.10 имеется моментальный снимок экрана со смарт-тегом для элемента
управления "вкладка".
',/» ContoiGCamnranFrBrnevrarSi - Microsoft Visual Studio
file £dit iiew Project guild Bebug 0&U Format
V FormLvb [Design}
j-t
i
1
Q
Q
i l
Ж lens Srn>AddreMj
к '
1 *
ToolSlTipl L- StirtusStnpl
Rudy
; ' '«
loots Test JjVindow Help
V Debug » Mwed Platforms
51 К fc o: fed UL Ъ 4i
-~^
\6
iCat\tr<*T*tks
•J Tab
- 3
L
' ' о \
n
Рис. 8.10. Смарт-тег для TabControl
Редактор кода
Смарт-теги могут также появляться и внутри кода. Один из примеров— интерфейсы.
Обычно реализация интерфейса требует большого количества кода. Вам нужно создать все
264
Часть III. Программирование и работа с кодом
члены интерфейса. В данном случае смарт-теги позволяют вам автоматически создавать эти
члены при помощи двух различных режимов наименования:
□ явное наименование — члены имеют имя производного интерфейса;
□ неявное наименование — имена членов не ссылаются на имя производного интерфейса.
□ На рис. 8.11 показан такой смарт-тег в действии.
Erie fcd'rt y\ew Website fiuild Qebug format Та.Ые Ioolf Test Window {Help
J3 • .J - Jr U tiP # ->-* '& ** ' r " P ' -4 ► Debug - Mixed Ptatforms
^J <-: i~L _ ^ XHTML 1 0 Transrtmn, ~ $ „ Style Application' Manual -
§ ; $ HeJIoWorld.Program *• 4*Мз i'Vipq 1 w^.4
о i l- Unas System.
I | jaiu; Syaceus.Collectiana. Generic;
I ' Jiinj Syates.Text;
| l_ nciiaespac; HelloWorid.
I f [interface HelloVrforldJContosoCcnsalej
f: wlea»
* а
{
St-dtlC VOld
{
far (iaci
Implement interface IContosoCoruole
Explicitly implement interface 'JConKraoCoreofc'
.-.WrxteLinerHellc, World' try *{j}", i| ;
~nrc^".WriT:eLj.!ie ("Anyeie 2 1агеп1с7?и) ;
Ready-
РИС. 8.11. Смарт-тег реализации интерфейса
Технология IntelliSense
- (None) - '*
<а
IntelliSense — это название целой коллекции различных вспомогательных средств для
написания кода, которые работают в окне текстового редактора. Их цель— помочь вам
(разработчику) быстро написать синтаксически корректную строку кода. Кроме того, они
стараются предоставить вам как можно больше информации, чтобы помочь вам написать такой
код, который является правильным в данном контексте, т. е. такой код, который имеет
смысл с учетом окружающих его строк кода.
При наборе кода в текстовом редакторе IntelliSense "за кулисами" составляет список
фрагментов кода, которые соответствуют уже введенным вами символам, и выделяет тот,
который имеет максимальный смысл в данном контексте. После этого (если дана такая команда)
она автоматически вставляет этот фрагмент. При этом вы экономите время на поиске типов
и членов в справочной документации, а также и на наборе самого вставляемого кода.
Глава 8. Работа со средствами повышения производительности Visual Studio 265
В этом разделе мы потратим много времени на обсуждение IntelliSense в контексте
редактирования кода, но вам следует знать, что эта технология работает также и с другими типами
документов, такими как XML-документы, HTML-документы и XSLT-файлы.
Совет
С точки зрения IntelliSense прикрепление схемы к XML-документу — полезное дело.
Схема используется для улучшения возможностей функции List Members (см.
разд. "List Members" далее в этой главе).
Существует множество отдельных аспектов IntelliSense, которые работают совместно во
время написания вами кода. Вы можете включить все эти функциональные возможности
IntelliSense из меню Edit | IntelliSense или при помощи нажатия комбинации клавиш
<С1г1>+<Пробел>. Многие из них можно найти также и в контекстном меню редактора (при
помощи щелчка правой кнопкой мыши в окне редактора). Давайте же рассмотрим их все по
очереди.
Complete Word
Complete Word (Завершить слово) — это основное ядро технологии IntelliSense. После того
как вы ввели достаточно символов, чтобы IntelliSense распознала, что вы хотите написать,
она делает попытку угадать целиком то слово, которое вы вводите. Результат выдается вам в
виде списка возможных вариантов (называемого списком завершения) и может быть
вставлен в редактор кода одним нажатием клавиши (вместо того, чтобы вручную вводить все
символы данного слова).
|£ СорЫ^0№тоЫ^т«а«
fvggy-MtiWt
/ШШЕШ:
ш^шшЕшшттт
| file£drt View Website fiuild fiebug Fo.rmat Tible look Tejt Window Help
1 £J „ j:ft?,!l s XHTML1.0 Transition. - ; «$ _ , Style Appi
V i Programxs* |
1
• Maed Platforms - ! 3
eatjorc Manuel ' *1
$J HellcWorld Program ▼ ^Main(sLring[] ergs)
,-j uains System;
1 uaiig Syaten Collections.Generic;
Ljaing System.Text,
iпале space FelloWorld.
(
<
I atacic void Main(string[] arga)
<
for (int i - C; 1 <- 5; i++)
V 1
}
1
I Ready \
Conl
Л class *1
pi CLSCompliantAttribute
rtj Comparero (
j|j Compansono
Mj CcnscleCancelEventArgs ^ i
Ы ConsoleCancelEventHandlw
*P ConscleCoicr
be" ConsoleKey j
| $* Console
Xeylnfo - Г
if-,-,,■■,,-, , ■ ■,,„,-„, ,„ -,-,■„ ,,,,■ ■■
Col 2D CK20
iP^^WP."
> Щ
(None) » '1 hi
'x m
' . f I
I'M
' < I
~ и
' Ц
•s 1
► "'ill
Рис. 8.12. Технология IntelliSense* список Complete Word
266
Часть III. Программирование и работа с кодом
На рис. 8.12 показан данный процесс: в зависимости от контекста кода и от введенных в
окне редактора символов, выдается список возможных значений слова. Одно из этих слов
выделяется как наиболее вероятный кандидат; вы можете также выбрать любой элемент
списка (при помощи клавиш-стрелок или мыши). Нажатие клавиши <ТаЬ> автоматически
вставляет слово'в редактор.
Примечание
Complete Word учитывает различные ситуации реального контекста кода. Например,
если вы набираете тип исключения в блоке try/catch, то IntelliSense показывает в
списке завершения только типы исключений. Аналогично и при вводе атрибута в
списке завершения будут показаны только атрибуты; при реализации интерфейса будут
показаны только интерфейсы и т д. Функция IntelliSense действует для всех типов
контента: помимо кода на С# и Visual Basic она работает и для других файлов, таких
как HTML-теги, атрибуты таблиц стилей, config-файлы, скрипты HTML (и это еще не
все). В Visual Basic есть такая функциональная возможность, которая отсутствует в
С# в нем имеется список завершения со вкладками, в котором в одной вкладке
содержатся наиболее часто используемые синтаксические фрагменты, а в другой — все
возможные слова.
Вы можете вручную вызвать Complete Word в любое время (при помощи нажатия
комбинаций клавиш <Сгт1>+<Пробел> или <Alt>+<—►>).
Совет
Если при отображенном списке завершения нажать клавишу <Ctrl>, то список станет
немного прозрачным. Это полезно в том случае, когда при выборе из списка вам
нужно видеть какие-то строки кода (которые могут быть закрыты списком).
Quick Info
Функция Quick Info отображает полное объявление для любой кодовой конструкции, а
также и справочную информацию. Вы вызываете ее при помощи наведения указателя мыши на
идентификатор; выпадающее окно показывает информацию, имеющуюся по данному
идентификатору.
На рис. 8.13 показана Quick Info для функции Console.ReadLine. Здесь представлены
синтаксис объявления данного члена, краткое описание члена, а также и список его классов
исключений. Описание, которое показано в окне Quick Info, работает также и для того кода,
который вы пишете: если у вас есть в коде комментарий, связанный с данным членом, то
IntelliSense анализирует этот комментарий и использует его для показа описательной
информации.
List Members
Функция List Members работает аналогично функции Complete Word; для любого типа или
пространства имен она отображает прокручиваемый список всех полей или специфичных
для данного типа функций.
Глава д. Работа со средствами повышения производительности Visual Studio 267
**?> ContosoCcHTirnanFra'neworlc - Microsoft Visuet Studio
File Edit View Refectcr Project Build Debug Data Tools Te*t Window hjetp
.£ ' _J " .J «d «df £ ~J „ ; ^ ' - **J - * Debug ^ Mued Platforms
-]^^^ ?= S= ^ 1 UP^^^^iS);
У Clsx5i.cs*' Prograin.cs*
о ^^HetbVVorld.Program » ;^MatnEtnng[] argil
Q J ~3i!iQ System;
i :л13 7 SysteTr.ColiecTiinra .Generic;
u3in; Sysreib.Text;
^лпд- Cor-oso.Fx.CoireoTi,
* ~| гая-espace HellDWorld
*
:] s.atic -void Main (atiLr.g {J ar?a)
for (in; i - 0; i <= 5; i-*—)
1 <
i
1
5
)
ReadLii-.eO .
stnng Console ReadUneQ
Reads the next line af characters from the standard input stream
Exception?
System JDJOExceptian
System .OutOfMemc ryExcepttc n
SvSteinAigumentOutOfRangeLxcepUcn
1
|j Ready Lr06 Col 17 СЫ7
[ t~> Vi& УМш)"
- з ;
-x U
■3
—1 3- I
* ' *B
Л^|
s i
- ° i
ri 1
л Р
1 f
*
* 1
\ 1
INS |
Рис. 8.13. Технология IntelliSense функция Quick Info
Для того чтобы увидеть функцию List Members в действии, сделайте в открытом окне ре»-
дактора кода следующее:
1. Введите имя класса (нажатие комбинации клавиш <Си*1>+<Пробел> выдаст вам окно
IntelliSense со списком возможных имен классов).
2. Введите точку; для IntelliSense это будет означать, что вы закончили ввод имени типа, и
теперь вам нужны члены этого типа.
3. Теперь вам будет показан список возможных членов. Вы можете вручную прокрутить
этот список и выбрать нужный член, либо (если вы хорошо знаете член, который хотите
вписать) вы можете просто продолжить ввод до тех пор, пока IntelliSense не получит
достаточного количества символов для того, чтобы выделить нужный вам член.
4. Используйте Complete Word (при помощи нажатия клавиши <ТаЬ>) для автоматической
вставки члена в ваш код (это сократит объем набираемого текста).
Эта функция работает совместно с Quick Info: когда вы выделяете член в списке, то для
него отображается информация Quick Info.
Примечание
Технология IntelliSense поддерживает список наиболее часто
используемых/выбираемых в функциях List Members и Complete Word членов. Этот список используется
для того, чтобы не показывать вам те члены данного типа, которые вы редко
используете.
ЮЗак 3716
268
Часть III. Программирование и работа с кодом
Parameter Info
Функция Parameter Info (в полном соответствии со своим названием) предназначена для
интерактивного представления информации по параметрам, необходимым для вызова функ-1
ции. Эта функциональная возможность особенно полезна для выполнения вызовов функций,
которые имеют длинный список параметров и/или длинный список перегрузки.
Функция Parameter Info срабатывает тогда, когда вы вводите открывающую скобку после1
названия функции. Для того чтобы увидеть, как это работает, сделайте следующее:
i
1. Введите имя функции.
2. Введите открывающую скобку.
3. Выпадающее окно покажет вам сигнатуру функции. Если есть несколько сигнатур
(например, несколько перегруженных версий этой функции), то вы можете прокрутить их в
списке. Выберите нужную сигнатуру.
4. Начните вводить реальные параметры, которые вы хотите передать в функцию.
По мере ввода выпадающее окно информации по параметрам будет продолжать
помогать вам со списком параметров (выделять жирным шрифтом текущий параметр, с
которым вы работаете). По мере того, как выделяется следующий параметр, появляется и
определение для него.
На рис. 8.14 вводится второй параметр функции SetWindowPosition объекта Console.
W> ContaioCommonFrBmeworic - Microsoft Visual Studio #
file £dft ytew £efactor £roject guild Qebug Djt« loots Trjt Vtfndow £jelp
<jp " _J " U У £0 & 4J ,w I *) * r< ' £1 - -V i ► Debug * Mixed Piriforms
Progr*mxs*>
■$$ Hello World.Progrem
»• a<* Main(string[] «f gs)
H'-sing S уз teir»;
sing Systrm.
srng Sysceas.Text;
(]паязеврасе HelloMarld
I using Sys tens. Collections. Genenc;
L-usi
с1аза rx.„^ij:i : !'.._:._..' \j
{
зсаПс void Mair (string П ergs)
for (ire l - Э; i <- 5; !+-►)
■• .WriteIiie{"H»ilc, V»orii« cry n:", i) ;
~. SetWifidowFosition (
void Console SetWindowPositicn (bit left, int top)
The column position of the upper left corner af the console winderj
JjEy^^Q^
M
*3
Ready
Lnl8
Col 39
Рис. 8.14. Технология IntelliSense функция Parameter Info
Глава 8. Работа со средствами повышения производительности Visual Studio 269
Organize Usings
Функция Organize Usings имеется только для С#. Она инкапсулирует две разные функции:
Remove Unused Usings и Sort Usings. Она имеет также и третью команду — Remove and
Sort, которая сочетает первые две. Все три команды находятся в меню Organize Usings
контекстного меню редактора и в главном меню Edit | IntelliSense.
Функция Remove Unused Usings— отличное средство для ликвидации излишеств вашего
кода. Она анализирует код и определяет, какие операторы Using необходимы для
компиляции кода; после этого она удаляет все прочие операторы Using. Команда Sort такая же
простая: она просто переупорядочивает ваши операторы Using таким образом, чтобы они
находились в алфавитном порядке (по имени пространств имен).
Фрагменты кода и шаблоны кода
Фрагменты кода— это предварительно заготовленные строки кода, которые можно
вставлять в текстовом редакторе. Каждый фрагмент кода имеет имя, называемое его атасом.
Фрагменты кода используются для автоматизации того, что иначе было бы рутинным
повторным набором одного и того же текста. Вы можете создать собственные фрагменты кода
или использовать библиотеку стандартных кодовых элементов, поставляющуюся вместе с
Visual Studio.
Использование вставки фрагментов кода
Вы вставляете фрагменты кода при помощи щелчка правой кнопкой мыши в точке вставки в
открытом окне текстового редактора и последующего выбора Insert Snippet из
контекстного меню. При этом открывается выпадающее окно Code Snippet Inserter, которое работает
во многом аналогично функции Complete Word технологии IntelliSense. Каждый элемент в
Inserter представляет собой алиас фрагмента кода. Выбор алиаса приводит к вставке
фрагмента кода в активный документ.
Каждый фрагмент категоризирован для того, чтобы облегчить поиск нужного вам
фрагмента кода. Например, для вставки фрагмента кода с конструктором в класс С# вам нужно
щелкнуть правой кнопкой мыши внутри определения класса, выбрать в списке категорий
Visual C#, а затем выбрать ctor. На рис. 8.15 это показано в действии; обратите внимание,
что при выборе категории фрагмента в окне текстового редактора отображается указатель
места заполнения (для того чтобы создать "след из хлебных крошек" (bread-crumb trail)).
После того как фрагмент конструктора вставлен в текстовый редактор, вам все-таки
придется написать код внутри самого конструктора; но обычно фрагменты избавляют вас от
необходимости утомительного и не слишком интеллектуального кодирования.
На рис. 8.16 показан этот же процесс в окне с кодом на Visual Basic. Процесс идентичен за
исключением того, что Visual Basic использует больше категорий.
Совет
Можно быстро отобразить Code Snippet Inserter, если ввести вопросительный знак, а
затем нажать клавишу <ТаЬ>. Но это работает только в документах с кодом Visual
Basic.
270
Часть III. Программирование и работа с кодом
<S> Conto:oCommonFf3mework- Microsoft V'isu»! Studio
ГЁП 1мм£%!Ш(|
File £dit yiew E*f*cl°r Rroject guild fiebug DaU Joels Tes.t Window Fjtlp
^ ' J * J У |^ & -^ ч *? • * 4^] ' •. ► Debug ^ Mixed Platforms
3 *i* 'L a» s^ ^ ' * 1 О W <4 * -4 jrl ^ ч! ;
V. OikUs'
S jj ijiContcsc FxCommoaEmployeeBase »
rr j
Js' * vii';tj S^steir;
^'ifn-spcf " Contcso Гх.Сопзггг
I'
^ public ciuas ^^ _ '
i ' (
I Invert Snippet- учил '.
Reedy
f J) «if
Lj *region
LJ) attribute ~
кзЗ checked
Ц class
|«J СЛ
Ы do
jJl else
\Ji enum -
Code snippet for constructor
Shortcut rtcr
Рис. 8.15. Фрагмент кода с конструктором ctor в С#
ElU^saJ
<У> ContoscCommonFramewcrk - Microsoft Visual Studio.
File Edit Vie* Ref actor Project Build JJebug Data loots Test Window Help
Jl'J'^jy^^-O *0 • ~ «J » > Debug - Mf«ed Platforms
Z & ^ ** « £ z k2 f J >з 14 ^ .4 *i & ^ .
cv ForaiLvb* FVmit^blDcagn^t
' ' | t? Form! •* V MakeSceThru
?^ i Г Public Class Ferial
F-iblic S-jfc MakeSeeThr^O
Invert Si
1 End Class
r«ppet jV.p^o»t
o^rrs Apptigg'.icy, > Forms
LJ Clipboard
.J Controls and Components
|^i Drawing
„J Fonts
j ^J Sound
Lnl8
Рис. 8.16. Фрагменты кода в Visual Basic
Visual Basic ведет себя также несколько иначе (чем С#) и после вставки фрагмента в окно
кода. На рис. 8.17 показан результат поиска в категориях и выбора фрагмента Create
Transparent Windows Form. Обратите внимание, что код фрагмента вставлен в код Visual Basic, но
функция вставки (по крайней мере, в данном случае) оказалась не настолько
интеллектуальной, чтобы догадаться об имени формы, которую вы хотите сделать прозрачной.
Глава 8. Работа со средствами повышения производительности Visual Studio 271
1*Л ConlosoCommonFramevvork - Microsoft Visual Studio
1.1~ Ш isd&aai
File Edit #ew Fjffacter Prcject guild Debug Data look Tejt tf/indov> bjeJp
-Л ' _J ' ui ,d A0 £ -J « ! "^ * ^" ; * Debu9 ' M«eJ Platforms
-C* ""& ^j A* i^ SF ^ 12; < ) >^ ^4 ^ 4 >j.^Q ;
►*• FormLvb" Formi.vb^Des^nf |
P^iblxc CId3^ Forau
P^blir 3~b МакеЗееТягЩ)
-ЕгП -1*5»
Opacity - 3.83
Ready
Lni8 Col 39 Ch39
Рис. 8.17. Фрагмент кода для прозрачности формы
В коде фрагмента имя формы заполнено значением по умолчанию (которое уже выделено).
Вы просто начинаете набирать нужное вам имя формы, и оно заменяет имя по умолчанию.
Значение прозрачности — это также величина по умолчанию, которую вы можете быстро
исправить прямо здесь.
Совет
Фрагменты могут иметь один или более указателей места заполнения- вам придется
их изменить. Вы можете перебрать все значения указателя места заполнения при
помощи клавиши <ТаЬ>. Когда указатель места заполнения выделен (синим), то вы
можете начинать ввод для того, чтобы заменить этот синтаксический элемент чем-либо
таким, что имеет смысл в данном контексте кода.
Окружение кода фрагментами
Документы С# и XML имеют еще один тип фрагментов кода, который стоит упомянуть: это
фрагменты типа Surround With. Фрагменты Surround With по своей сути такие же
фрагменты, но они отличаются тем, как они вставляются в ваш код.
При помощи фрагмента типа Surround With вы можете заключить выделенный в текстовом
редакторе блок документа в обрамляющий его текст. Например, предположим, что у вас
есть несколько разных объявлений класса, которые вы хотите вложить в пространство имен.
При использовании фрагмента Surround With это простой двухшаговый процесс: выделите
определение класса и запустите Code Snippet Inserter. Но теперь в контекстном меню вместо
Insert Snippet вы должны выбрать Surround With. Вставка сработает точно так же, но на
этот раз фрагмент (в данном случае это фрагмент пространства имен) будет применен ина-
272
Часть III. Программирование и работа с кодом
че. Сравните текст до и после (рис. 8.18 и рис. 8.19). Мы инкапсулировали определение
класса в новом пространстве имен, которое находится в еще одном пространстве имен —
и все это всего лишь несколькими щелчками мыши.
^ ContoioCornmonFrenwwork- Microsoft Visual Studb
i £вЗ Ы£ЗшйГ
Eile £rfrt ¥»** Bef«tor Project fimJd Qtbug DjU Tools Tejt Window fcjetp
J3 * -J * J) У ut ! S> 44 It I " ^ * £J" ► Debug - Mixed Platforms
-!J>
▼ * MUkeSeeTbru
f 1 нашезрасе Contoso.Fx . Integration.
{
П public -lass i4;.- -чеКпп *t : IMeasageSinJc
j public с-1ачз Кк >ij I i' • V > .j -)i»} J f *{_^_[
f;l public class %ч^г» t""nk»~(
)
Ready
Lnl8 Col 39
Рис. 8.18. До вставки фрагмента Surround With
'"{^ММ
«•) Conto»ComrnonFr«mework - Microsoft Vtju»! Studio. .^
File £drt View fiefartor firoject fiuild Qebug Oft» Iools Tejt Window Jjelp
>JP ' (J ' ij У £? # 'Ч4 *i *) • "* • £l - Л ► Debug - Mixed Piriforms
r™£*Vftm^ffldi^J
Ready
Lnl8 Col 39
~ *Л4|
:^
ijForml * * MakeSccThru
Ыusing !__._!
U палеspace Contoao.Fx.Integration.
{
[t] nameapnc»» |CQ»toqp. ГХ, IfttagC»CiOft.gpeClaXl»eo1
l'j public class I'™* "ijf»! /f-'''- ' IHeaaageSinJq |
g public class Lt r-jsiir^ur : .'l^rsoq^Rapj *,j
public class 'lat^'T.' 'i( . j
}
* _ и{
,.
JJ
ij
gj
S
-
Рис. 8.19. После вставки фрагмента при помощи Surround With
Глава 8. Работа со средствами повышения производительности Visual Studio 273
Создание собственных фрагментов кода
Поскольку фрагменты кода хранятся в XML-файлах, то вы очень легко можете создать
собственные фрагменты кода. Главное— это понять XML-схему, которая определяет
фрагмент, а самый лучший способ сделать это — изучить XML-исходники некоторых
фрагментов кода, поставляемых вместе с интегрированной средой разработки.
Фрагменты кода хранятся по языкам в инсталляционном каталоге Visual Studio. Например,
фрагменты кода для Visual Basic можно найти (по умолчанию) в каталогах C:\Program
Files\Microsoft Visual Studio 9.0\Vb\Snippets. Несмотря на то, что файлы фрагментов кода —
это XML, они имеют расширение snippet.
XML-формат фрагмента кода
В листинге 8.1 приведен фрагмент кода конструктора для языка С#.
у ктора дня языка С#
<?xml version=.0" encoding="utf-8" ?>
<CodeSnippets xmlns=
"http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format=.0.0">
<Header>
<Title>ctor</Title>
<Shortcut>ctor</Shortcut>
<Description>Code snippet for constructor</Description>
<Author>Microsoft Corporation</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal Editable="false">
<ID>classname</ID>
<ToolTip>Class name</ToolTip>
<Function>ClassName()</Function>
<Default>ClassNamePlaceholder</Default>
</Literal>
</Declarations>
<Code Language="csharp"><![CDATA[public $classname$ ()
{
$end$
274
Часть III. Программирование и работа с кодом
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
Основная структура этого объявления фрагмента кода описана в табл. 8.2. Более полная
справочная информация по схеме имеется в системе помощи Visual Studio MSDN; она
находится в Integrated Development Environment for Visual Studio | Reference | XML Schema
References | Code Snippets Schema Reference.
Таблица 8.2. Описания узлов XML-файла фрагмента кода
Узел XML
<CodeSnippets>
<CodeSnippet>
<Header>
<Title>
<Shortcut>
<Description>
<Author>
<SnippetTypes>
<SnippetType>
<Snippet>
<Declarations>
<Literal>
Описание
Родительский элемент для всей информации по фрагменту кода
Он ссылается на конкретное пространство имен XML, используемое для
определения фрагментов кода в Visual Studio 2008
Корневой элемент для фрагмента кода Этот тег настраивает
информацию о версии формата фрагмента (для начальной версии Visual Studio
2008 должен быть установлен в 1 0 0) Несмотря на то, что внутри
родительского элемента <CodeSnippets> может быть несколько элементов
CodeSnippet, в файле принято размещать только один фрагмент кода
Элемент контейнера метаданных для данных, которые описывают
фрагмент кода
Название фрагмента кода
Обычно совпадает с названием Это текст, который будет отображаться в
выпадающих окнах при вставке фрагмента кода
Описание фрагмента кода
Автор фрагмента кода
Родительский элемент для элементов, описывающих тип фрагмента
Тип фрагмента. Expansion, Refactoring или Surrounds With Вы не
можете создавать собственные фрагменты типа Refactoring Это
свойство фактически используется для того, чтобы сообщить Visual Studio
о том, где данный фрагмент может быть вставлен в окне редактора
фрагменты Expansion вставляются в текущей позиции курсора, а
фрагменты Surrounds With вставляются до и после кодового блока, который
определяется текущим положением курсора или выделением
Корневой элемент для кода фрагмента
Корневой элемент для литералов и объектов, используемых фрагментом
Строка, значение которой может быть присвоено интерактивно как часть
процесса расширения фрагмента кода Атрибут Editable этого тега
указывает, является литерал статическим или редактируемым Фрагмент ctor
является примером без редактируемого литерала, сравните его с
виденным вами ранее примером фрагмента прозрачности — это пример
фрагмента с редактируемым литералом, который позволяет вам настроить
название формы при вставке фрагмента
Глава 8. Работа со средствами повышения производительности Visual Studio 275
Таблица 8.2 (окончание)
Узел XML
<ID>
<ToolTip>
<Function>
<Default>
<Code>
Описание
Уникальный идентификатор ID для литерала
Подсказка ToolTip, которая будет показываться тогда, когда курсор
наводится на литерал
Имя функции (табл 8 3), которая будет вызываться тогда, когда литерал
получит фокус Функции имеются только во фрагментах кода языка С#
Строковый литерал по умолчанию, который будет вставляться в редактор
Элемент, который содержит реальный код для вставки
Чтобы написать фрагмент кода, необходимо понять, как работают литералы и подстановка
переменных. Предположим, что вам нужен фрагмент кода на языке С#, который пишет в
коде простой комментарий о том, что данный класс был проверен и утвержден при
экспертной оценке программы. Иначе говоря, вам нужно нечто подобное:
// Code review of ContextToken.
// Reviewer: Lars Powers
// Date: 1/1/2006
// Approval: Approved
В этом фрагменте вам нужно обрабатывать четыре литерала как переменные (они могут
изменяться каждый раз, когда фрагмент используется): имя класса, имя проверяющего, дата
и отметка об утверждении. Вы можете настроить их при помощи области объявлений
примерно так:
<Declarations>
<Literal Editable="False">
<ID>classname</ID>
<ToolTip>Class name/type being reviewed</ToolTip>
<Function>ClassName()</Function>
<Default>ClassNameGoesHere</Default>
</Literal>
<Literal Editable="True">
<ID>reviewer</ID>
<ToolTip>Replace with the reviewer's name</ToolTip>
<Default>ReviewerName</Default>
</Literal>
<Literal Editable="True">
<ID>currdate</ID>
<ToolTip>Replace with the review date</ToolTip>
<Default>ReviewDate</Default>
</Literal>
<Literal Editable="True">
276
Часть III. Программирование и работа с кодом
<ID>approval</ID>
<ToolTip>Replace with Approved or Rejected</ToolTip>
<Default>Approved</Default>
</Literal>
</Declarations>
Обратите внимание, что вы фактически вызываете функцию для заполнения имени класса
во фрагменте. Функции есть только в языке С# (подмножество имеется также и в языке J#);
они описаны в табл. 8.3. В остальных литералах подразумевается, что разработчик введет
правильное значение вместо указателя места заполнения.
Таблица 8.3. Функции фрагментов кода
Функция
GenerateSwitchCases
(enumliteral)
ClassName()
SimpleTypeName
(typename)
CallBase(parameter)
Описание
Создает синтаксис для оператора переключения, в котором
имеется оператор case для каждого значения, определенного в
перечислении enumliteral (в языках C#/J#)
Вставляет имя класса, содержащего фрагмент кода
(в языках C#/J#)
Принимает имя типа (на которое ссылается typename) и
возвращает самое короткое возможное имя (с учетом операторов using
текущего блока кода). Пример.
SimpleTypeName (System. Exception) вернет Exception в
том случае, если имеется оператор using System (язык С#)
Полезна при заглушивании членов, которые реализуют или
возвращают базовый тип. когда вы указываете в качестве параметра
get, set или method, то будет создан вызов этого метода или
способа доступа к свойству базового класса (язык С#)
Вам следует также дать некоторую базовую информацию для заголовка фрагмента кода:
<Header>
<Title>review</Title>
<Shortcut>review</Shortcut>
<Description>Code review comment</Description>
<Author>L. Powers</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
Теперь фрагмент кода синтаксически завершен. Несмотря на то, что этот фрагмент пишет в
редакторе комментарии, такой же процесс и структура используются и для вставки в
редактор кода. Если вы хотите написать фрагмент кодатипа Surrounds With, то вам нужно
изменить значение <SnippetType> на Surrounds With.
Теперь вам нужно сообщить Visual Studio о своем фрагменте кода.
Глава 8. Работа со средствами повышения производительности Visual Studio 277
Добавление фрагмента кода в Visual Studio
Вы можете использовать для создания XML-документа (и сохранения его) собственный
XML-редактор Visual Studio (большое преимущество такого метода состоит в том, что вы
можете использовать технологию IntelliSense (срабатывающую по схеме XML-фрагмента)
для помощи с именами и связями элементов.
Code Snippets Manager
Language.
location*
OUhersMpowvers REDMOMD\DocumenU\Visual Studio 2008\Code SnippetsWiiua! C*\My Code Snippets
d CA My Code Snippets
a) review
-* LJ NetrXil»
> LJ Office Development
> CJ Ref adoring
.> C3 Visual C*
LJ Workflow
A**~
Remove
jmport.. 11 Search Or&ne...
Рис. 8.20. Менеджер управления Code Snippets Manager
■t.b
*уЛ ContosoCommonFramework - Microsoft Visual Studio
I £tJe Edit tfew gefactor Eroject Build fiebug Dita Iools Tejt ^Vindaw Uetp
i\* IntegratJofucj*
Cantoso FxJntegration Contovo Fxintegration Specialize! ▼ V >, * >г jet ^opt'i
«isxng Зуэсеп;
usin; System.Collections.Generic;
»iai.ng System.Tsxz:
\
Плат'еграсе Contoso.Fx.Integza-icn
fj larr-eap&ce Contoso.Гх . Integiauion.Specialized
i
/ wLO. lapieirent. Jjtccrd cor.srrj-tor
jfly pufcljc с1аэз Ч j<.q 't'spj <*"
// Peviene
?асв: &evi|Replace wHh the reviewer's namel
P'lb'.ic HessageMapperi)|_
Ready
Lnl7 Col 13 Cr>13
-4 *
Рис. 8.21. Результат нестандартного фрагмента кода
278
Часть III. Программирование и работа с кодом
Инсталлятор Visual Studio создает каталог по умолчанию для размещения ваших
собственных фрагментов кода, который находится в вашем каталоге Documents: £/vMDocuments\
Visual Studio 2008\Code SnippetsYVisual C#\My Code Snippets. Если вы поместите ваш XML-
шаблон сюда, то Visual Studio автоматически начнет использовать ваш фрагмент кода.
Диспетчер фрагментов кода Code Snippets Manager, который запускается из меню Tools,
является центральным диалоговым окном управления для просмотра и удаления имеющихся
фрагментов кода, а также добавления новых (рис. 8.20). Вы видите, что наш фрагмент кода
review виден в каталоге My Code Snippets.
Вы можете также подключить и другие каталоги (кроме стандартных). Чтобы сделать это,
щелкните по кнопке Add для ввода дополнительных каталогов для использования в Visual
Studio при отображении списка фрагментов.
На рис. 8.21 показан результат нестандартного фрагмента кода.
Совет
Фрагменты можно просматривать и совместно использовать в сети (обсуждение
сообщества см. в главе 7) Отличным способом углубления ваших знаний относительно структуры
фрагментов кода и функций является изучение файлов фрагментов кода, содержащихся в
Visual Studio, а также и тех, которые созданы сообществом разработчиков.
Фрагменты в панели инструментов
Несмотря на то, что эта возможность технически не является частью технологии
фрагментов кода Visual Studio, вы можете поместить фрагменты кода в панель инструментов.
Сначала надо выделить текст в редакторе, а затем перетащить его на панель инструментов.
Потом вы сможете использовать этот фрагмент в любое время (при помощи перетаскивания
его из панели инструментов в открытое окно редактора).
Парность скобок
Языки программирования используют самые разные скобки и ограничители для разделения
аргументов функций, математических действий/порядка операций и блоков кода. Может
быть очень сложно визуально определить, не пропустили ли вы парный ограничитель, т. е.
не получилось ли у вас открывающих ограничителей больше, чем закрывающих —
особенно при высокой степени вложенности кода.
Парность скобок проверяется по визуальным элементам, которые используются
редактором кода для выделения парных ограничителей. Каждый раз, когда в редакторе вы вводите
закрывающий ограничитель, соответствующий открывающий ограничитель и закрывающий
ограничитель подсвечиваются (на непродолжительное время). На рис. 8.22 функция
парности скобок позволяет показать парные ограничители для внутреннего цикла for.
Совет
Вы можете включить функцию контроля парности скобок, если поместите курсор
непосредственно слева от открывающей скобки или справа от закрывающей скобки
Если вы просматриваете процедуру, напичканную скобками, то сможете таким образом
быстро выделить парные скобки.
Глава 8. Работа со средствами повышения производительности Visual Studio 279
^ CQntog>CfrmmonrraiT*wo^ «^
£lle Edrt \#ew £efactor Project guild gfbug Data Tools Тф Window £jtfp
Л •& ^ A» i|E SP l I 'I П *K4 »i -4 *J i> Q 5
V Program.cs
jo | .>$*»dminCcnsole.Program ■» »^Ма1пE1плд[] argsj
J fcr (ire i - Э; i <- 10000; i-ч-)
> j i£ (avntchS-ilder}
•селе - 3uilder Саг с at: (rest) ;
*
else
if lawitchStrmgi
<
reat ш ScrinjConcat(гезс);
}
else
<
rest ■» NativeConcat (test) ;
i
}
>l
*[Ready Ln42 Col 22 Ch 22
jiZje' й°1 |}8м|3здвд ;
^ J» d
- X
_J
A\
,-
I'M
3? 1
*-4
Г
INS "j
Рис. 8.22. Парность скобок
Несмотря на то, что эта функция называется контролем парности скобок, она фактически
работает со следующими ограничителями:
□ круглыми скобками ();
*□ квадратными и угловыми скобками — [],<>;
□ кавычками "";
□ фигурными скобками {}.
В языке С# контроль парности скобок работает также и со следующими парами ключевых
слов (которые по существу действуют как ограничители):
П #region, #endregion;
□ #if, #else, #endif;
П case, break;
□ default, break;
П for, break, continue;
□ if, else;
П while, break, continue.
Настройка технологии IntelliSense
Некоторые возможности IntelliSense можно настроить (отдельно по языкам) в диалоговом
окне Options в Visual Studio. Если вы откроете диалоговое окно Options (в меню Tools), a
280
Часть III. Программирование и работа с кодом
затем перейдете к узлу Text Editor, то найдете настройки IntelliSense бестолково
разбросанными по страницам General и IntelliSense. I
На рис. 8.23 показано диалоговое окно Options для Visual С#.
Options 'JLIlaw
Text Edrtar *
General
File Extension
Ail Languages
Basic
C*
General
Tabs
Advanced
Formatting 2
IntelliSense
CSS
HTML
I PL/SQL
4 Plain Text
SQLScnpt
Я T-SQL
' T-SQL7
J 1 T-SOL80
1
Completion Lists
[/ Jhow completion list «Лег a character i? typed
j Place keywords in campleticn lists.
Plate £<н1й snippets, in completion lists
Selection In Completion List - — -~—
i Co mmrtted by typing the following characters-.
i Ш0,:,--"'%&|А^=<>?®*"\
1 [/ Committed by pressing the space fear J
| Г" &dd new Fine on commrt with enter at end of fully typed word |
I IntelliSense Member Selection 1
| 1^ IK^I^f^sepre^^ectsr^rt.recently used members I
i
! И
[ OK J [ Cencd | :
t |i
Рис. 8.23. Опции IntelliSense
i
Области Completion Lists данного диалогового окна относятся к любым функциям
IntelliSense, которые облегчают автоматическое дописывание кода (таким как List Members
и Complete Word). В табл. 8.4 перечислены опции этого диалогового окна.
Таблица 8.4. Опции IntelliSense
Опция
Show completion list
after a character is typed
Place keywords in
completion lists
Place code snippets in
completion lists
Committed by typing the
following characters
Committed by pressing
the space bar
Результат
Эта опция приводит к тому, что функция Complete Word будет
автоматически запускаться после того, как в окне редактора будет
введен один символ
Если установлен этот флажок, то ключевые слова языка будут
отображаться в списке завершения Например, для языка С# это
приведет к включению в список завершения таких ключевых слов, как
class или string
Этот флажок приведет к помещению в списки завершения алиасов
фрагментов кода
Этот флажок содержит все символы, которые приведут к
выполнению функции дописывания IntelliSense. Иначе говоря, ввод любого
из этих символов при открытом списке завершения приведет к
тому, что IntelliSense вставит в окно редактора текущий выделенный
элемент списка
Этот флажок добавит символ пробела в список тех символов,
которые запускают вставку IntelliSense
Глава 8. Работа со средствами повышения производительности Visual Studio 281
Таблица 8.4 (окончание)
Опция
Add new line on commit
with enter at end of fully
typed word
IntelliSense pre-selects
most recently used
members
Результат
Этот флажок приведет к тому, что курсор будет переходить на
следующую строку в том случае, когда вы полностью ввели слово в
списке IntelliSense Это полезно в тех случаях, когда за полностью
введенными ключевыми словами никакой код обычно в той же
строке не вводится
Если этот флажок установлен, то IntelliSense будет поддерживать и
учитывать исторический список наиболее часто используемых
членов заданного типа. Этот список служит для выделения членов в
списке завершения
Список задач
Список задач Task List — это по существу встроенный "список дел"; в нем содержится все
то, что по той или иной причине требует внимания и за чем нужно следить. Окно Task List
отображает этот список и позволяет вам взаимодействовать с ним. Для того чтобы показать
это окно, выберите меню View | Task List. На рис. 8.24 показано окно Task List,
отображающее несколько пользовательских задач. Задачи бывают одной из трех категорий: задачи
комментариев, задачи ярлыков и пользовательские задачи (причем отображать можно
только одну категорию одновременно).
Раскрывающийся список в верхней части окна Task List позволяет вам выбрать текущую
категорию. Каждая категория имеет несколько отличающиеся от других категорий столбцы,
но во всех них имеется столбец Priority и столбец Description. Например, пользовательские
задачи и задачи ярлыков имеют флажок, который используется для отслеживания
завершения задачи; задачи ярлыков и комментариев отображают имя файла и номер строки; и т. д.
Вы можете отсортировать задачи по любому из показанных в списке столбцов. Щелчок правой
кнопкой мыши по заголовку столбца дает вам контекстное меню, которое позволяет вам
управлять сортировкой, а также и тем, какие столбцы (из списка поддерживаемых) нужно отображать.
Task List - 3 tasks
Ui«rT«k5
1 Ц, Description
t -f Updat» mf grifaon ЛР1 dp«uwunUtian
JZZ Hag. necessjry?
фш $&m tttrntotimtcx t$ tmmmtmnmmmf-1
Рис. 8.24. Окно Task List
IЗадачи комментариев
Задачи комментариев создаются внутри вашего кода. Создание в коде комментария со
специальным литералом/маркером приведет к тому, что Visual Studio добавит этот коммента-
282
Часть III. Программирование и работа с кодом
рий в список задач комментариев. В Visual Studio определены три таких маркера: hack,
todo и undone. Для того чтобы увидеть эти задачи в вашем окне задач, убедитесь в том, что
вы выбрали вариант Comments в раскрывающемся списке в верхней части окна Task List.
Например, следующий код на языке С# приведет к четырем различным задачам
комментариев в списке задач:
namespace Contoso.Fx.Integration.Specialized
{
// TODO: реализовать второй конструктор
public class MessageMapper : IMessageSink
{
publie Mes sageMapper()
I
}
}
// TODO: проверить реализацию интерфейса IMap
public class MessageBus : MessageMapper
{
public MessageBus()
{
// UNDONE: MessageBus ctor
}
}
// HACK: переписать TokenStruct
public class ContextToken
{
public ContextToken()
{
}
public ContextToken(string guid)
{
}
}
}
Двойной щелчок по задаче комментария перенесет вас прямо к соответствующей строке
комментария в окне редактора.
Нестандартные маркеры комментариев
При необходимости вы можете добавить ваш собственный набор маркеров, которые будут
распознаваться как задачи комментариев. В диалоговом окне Options выберите страницу
Глава 8. Работа со средствами повышения производительности Visual Studio 283
Task List в разделе Environment; это диалоговое окно даст вам опции для добавления,
редактирования и удаления из списка маркеров комментариев, распознаваемых списком задач.
На рис. 8.25 в стандартный список был добавлен маркер review. Обратите внимание, что
вы можете также установить приоритет каждому маркеру и подстроить их поведение при
отображении (при помощи флажков Task List options, которые управляют тем, следует ли
подтверждать удаление задач, а также настраивают отображение в списке задач имен
файлов или полных путей к ним).
Options
Emircnment
General
Add-in/Macros Security
AutoRecover
Documents
Find and Replace
Fonts and Colors
Help
import and Expert Settings
International Settings
Keyboard
Startup
Task List
Web Browser
Projects and Solutions
Source Control
Teat Editor
A Database Tools
il Debuoaina
1
*esk List options
/, Confirm deletion of tasks
1 Hide full file paths
Tokens
*
-
Token list*
HACK
TODO
UNDONE
- UmesolvedMergeConnict
Лез f Djjlete
_ „.
j [ Qiange
j £riority
!
j
i Name:
REVIEW
i
!
j
j
( OK
l и ffljyybffiffl :
Cancel ] 1
Рис. 8.25. Добавление нестандартного маркера для задачи комментария
Задачи ярлыков
Задачи ярлыков— это фактически ссылки на строки кода. Вы добавляете их при помощи
меню Bookmarks; для этого нужно поместить курсор на строку в редакторе, а затем выбрать
в меню Edit | Bookmarks | Add Task List Shortcut. Содержимое этой строки кода будет
отображаться в качестве описания задачи.
Двойной щелчок по такой задаче перенесет вас напрямую на эту строку кода в окне
редактора.
Пользовательские задачи
Пользовательские задачи вводятся непосредственно в окне задач. Кнопка Create User Task
имеется в окне Task List радом с раскрывающимся списком категорий (см. рис. 8.24); эта
кнопка добавляет в список новый элемент. Для добавления имени задачи вы можете ввести
его непосредственно в столбец описания.
В отличие от задач комментария и ярлыков пользовательские задачи не связаны с
определенной строкой кода.
284
Часть III. Программирование и работа с кодом
Примечание
Модель автоматизации Visual Studio дает вам полный контроль над списками задач.
Используя такие объекты автоматизации, как TaskList или TaskListEvents, вы
можете, например, программным путем добавлять или удалять задачи из списка,
реагировать на добавление, редактирование и даже выделение задачи; а также управлять
связью между задачей и редактором.
Резюме
Visual Studio 2008 имеет потрясающее количество функций, предназначенных для
повышения вашей производительности. В данной главе описывались многие аспекты технологии
IntelliSense (от дописывания операторов и до новой технологии фрагментов кода); при этом
вы научились работать с различными функциями IntelliSense для того, чтобы не только
писать код быстрее, но и повысить его качество.
Мы рассказали, как перемещаться по сложным файлам кода и просматривать их.
Мы также представили вам фрагменты кода и обсудили различные типы фрагментов кода и
их полезность.
Наконец, мы рассказали, как полностью использовать потенциал окна Task List, как
организовать и отслеживать различные элементы списка задач, присущие каждому программному
проекту.
С точки зрения производительности Visual Studio 2008 — это нечто большее, чем сумма
всех ее составляющих частей: при совместном их использовании каждая из этих
функциональных возможностей облегчает жизнь разработчика, независимо от его опыта, навыков
или используемого им языка.
Глава 9
Рефакторинг кода
Понимаете вы это или нет, но если вы такой же, как и остальные разработчики, то вы всегда
делаете рефакторинг кода. Каждый раз, когда вы изменяете свой код для Того, чтобы
избежать дублирования, или переименовываете что-то для повышения ясности, вы фактически
производите рефакторинг. Рефакторинг— это просто название обычной задачи
разработчика. Строгое определение данного термина таково: это "изменение, которое делается во
внутренней структуре программного обеспечения для того, чтобы облегчить его понимание
и сделать более простой его модификацию (без изменения его видимого поведения)". То
есть рефакторинг не добавляет приложению новых функциональных возможностей. Вместо
этого он упрощает сопровождение ваших кодов.
Термин "рефакторинг" привлекает к себе большое внимание. Написано много хороших кни'г
о преимуществах рефакторинга кода в процессе создания вашего приложения. Это как раз
тот этап, когда вы особенно тесно взаимодействуете с кодом и поэтому можете быстро
делать такие благотворные для его последующего сопровождения изменения. Многие из этих
книг посвящены теме экстремального программирования. Рефакторинг стал одним из
ключевых принципов экстремального программирования. В экстремальном программировании
ваш код разрастается функция за функцией (для того чтобы пройти серию определенных
тестов). Это может привести к созданию кода, который замечательно работает, но не
выглядит созданным как единое целое. Для того чтобы справиться с этой проблемой, будет очень
разумно почаще возвращаться к вашему коду и улучшать его общее качество (удалять
дублирования, создавать общие интерфейсы, переименовывать идентификаторы, логически
группировать элементы и т. д.).
Для того чтобы помочь вам с рефакторингом, в редакторах кода появилась новая группа
функциональных возможностей. Эти функции основаны на реальных потребностях.
Никакой разработчик не захочет насажать ошибок в стабильно работающий код только для того,
чтобы облегчить его сопровождение — и особенно в условиях недостатка времени.
Попробуйте представить себе, как вы объясните вашему начальнику или клиенту, что
значительное увеличение ошибок в коде является следствием масштабных изменений, которые вы
внесли в код для того, чтобы облегчить его читабельность и сопровождение в будущем. Нам
следует быть благодарными за то, что редактор С# в Visual Studio 2008 предоставляет целый
набор надежных инструментов для рефакторинга. Эти инструменты позволяют вам
выполнять изменения в коде без опасения создать больше проблем, чем вы стараетесь решить.
286
Часть III. Программирование и работа с кодом
РЕФАКТОРИНГ ДЛЯ РАЗРАБОТЧИКА НА VB
В этой главе мы сосредоточимся на инструментах рефакторинга, встроенных в Visual
Studio 2008. Эти инструменты (за исключением Rename) относятся только к редактору
кода языка С#. К счастью, работающие на Visual Basic разработчики также имеют
возможность рефакторинга. Сторонняя организация DevExpress (http://www.devexpress.com)
заключила соглашение с фирмой Microsoft и теперь для всех разработчиков на VB.NET
(имеющих Visual Studio 2008) поставляется версия их программного продукта. Мы не
будем описывать в нашей книге этот инструмент, но пользователи обнаружат много сходства
между этими двумя продуктами
РЕФАКТОРИНГ ДЛЯ РАЗРАБОТЧИКОВ БАЗ ДАННЫХ
В Visual Studio имеется несколько встроенных функций для рефакторинга элементов
баз данных. Мы описываем их в главе 29.
Основы рефакторинга в Visual Studio
Инструменты рефакторинга в Visual Studio обеспечивают выполнение всех обещанных
преимуществ рефакторинга: увеличение степени многократного использования кода, меньшее
количество его переписываний, уменьшение дублирований и улучшенная читабельность.
Эти инструменты вселяют уверенность в тех изменениях, которые сделаны в вашем коде.
Они достигают этого при помощи использования движка рефакторинга, основанного на
компиляторе С# (а не при помощи простого поиска и замены строк). Движок и компилятор
работают совместно (охватывая весь код и имеющиеся в нем ссылки) для того, чтобы
отыскать все возможные изменения, которые необходимо выполнить как часть данной
операции рефакторинга. Движок ищет даже в комментариях и пытается обновить их новыми
именами типов. Кроме того, вы можете просмотреть изменения вашего кода перед их
внесением. Это повышает ваш уровень уверенности в тех изменениях, которые эти
инструменты делают в вашем коде.
В табл. 9.1 дан общий обзор многих операций рефакторинга, которые можно выполнить в
редакторе С#. Мы подробно опишем каждую из них в последующих разделах. Однако
сначала мы опишем некоторые общие элементы процесса рефакторинга. Эти элементы
включают запуск инструментов рефакторинга внутри Visual Studio и просмотр изменений
рефакторинга по мере их выполнения.
Таблица 9.1. Инструменты рефакторинга внутри редактора языка С# в Visual Studio 2008
Инструмент
Rename
Extract Method
Promote Local to
Parameter
Reorder Parameters
Описание
Переименовывает поля, свойства, пространства имен, методы, типы и
локальные переменные
Создает новый метод при помощи существующего кода внутри
существующего метода
Переносит внутренний локальный член (переменную) метода в
параметры метода
Меняет порядок параметров для данного метода и обновляет все места
вызовов
Глава 9. Рефакторинг кода
287
Таблица 9.1 (окончание)
Инструмент
Remove
Parameters
Encapsulate Field
Extract Interface
Описание
Удаляет параметр из метода и обновляет места вызовов
Быстро создает свойство из существующего поля
Создает интерфейс из существующего класса или структуры
Запуск инструментов рефакторинга
Инструменты рефакторинга доступны везде, где вы работаете в Visual Studio с кодом языка
С#. Вы можете запустить их несколькими способами. Например, если вы работаете внутри
редактора кода, то можете вызвать инструмент Rename при помощи смарт-тега. Вы можете
также выделить код и щелкнуть его правой кнопкой мыши для того, чтобы получить опции
рефакторинга; эти же опции доступны и в меню Refactor. Наконец, вы можете делать
рефакторинг непосредственно из конструктора классов Class Designer (при редактировании и
изменении различных элементов класса).
Использование меню Refactor (а также контекстного меню)
Самым частым местом запуска команд рефакторинга является меню рефакторинга. Этот
пункт меню появляется в интегрированной среде тогда, когда у вас есть отрытое активное
окно с кодом на языке С#.
ШШШШРШШШ^^
| File ЫЛ
I Jb.J-
J Z Ъ ^
fe
View [ Rrfeaot j Project Build Debug Data
J <« & Rename
K> | v< Extract Methods
Prodi»ct.cs* ' -vf Encapsulate Field
^n • n ~i Extract Interface...
$ BusineusDorr
4 s- 1$ Promote Local Vanable to Parameter
^s-iry 5 «.^ Remove Parameters
asinyr S ^ Reorder Parameters
| Cj 'Mr^eapdce Зиз1ьедзРпгг.дд,г. <
1 fj public с1лза ir i,- (
I C
1
1 П
1 * '
1 R<
fldy
public int. Id {
gev. { retjir id; }
sat { _id - value; >
stnnc _creatcr;
public string Creator {
gez { return creator, >
set { _creator - value; ;
m
List ^ Code beimftion Wtr\H<s**
Toots Test Window
Ctrl*
Ctrl
n
KM
►R.E
Ctrl+FU
CtrUR, P
Ctrl+R,V
CtrkR,0
Help
■тт^шш^^^^^^^ш
\ - Mi*ed Platforms - j$ 'Ik
mml
-
Ln7
~ X
*
ColZ
k>lt.+»c i bf. .48' - 'oofjlicn '«_ ж a x j
^3 Solution Contend' £5 prcierts) I
Л /lAdminlfl и;
H 33 businfisDomain |
j& Properties |
11 ^J References |
'^3 Product cs §
+] >CV-\Conloso\ 1
■>i ;3 Servicer §
f+i <£] ServicesVB |
1
^Solution Explorer j> Macro L^plcrer |
Ch23 INS [
Рис. 9.1. Меню Refactor в действии
288
Часть III. Программирование и работа с кодом
На рис. 9.1 показано это меню. Обратите внимание, что та часть кода, которую вы хотите
подвергнуть рефакторингу, выделена в интегрированной среде. В данном случае мы хотим
переименовать класс Product, поскольку мы поняли, что все наши продукты — это книги.
Поэтому мы переименуем класс Product в Book.
Это же самое меню доступно при помощи щелчка правой кнопкой в редакторе. Вы
выделяете слово или блок кода (либо просто устанавливаете курсор), а затем нажимаете правую
кнопку мыши. Верхняя опция этого меню— Refactor. Это пункт меню разворачивается в
полное меню Refactor (рис. 9.2).
1 File Ed* View Refactor Project
ButM [>ebug Data Tools Test Window Help
1:^3'a-j&M ШUL&$L*iliz&^^L***
1*1
I
• Mured Platforms » (j
I*>_*: «t*ii 3jy»' *J* «АДУ'•
HuatiKj System;
u*i.ng 3ysce».Collecti
иягпд SyotenuLlnq;
<»ual.ng Syscen.TeJit;
l'-j плмееэрасе BaelneisOon
у public class г-»*'.
mt _id?
fj public int. Ic
1 gei. { ret
I > " "
ecrlng _CTe*t
1 j p public эtrans
1 get. { re<
1 ] SBC { _CI
1 '
| Re
•i , . .....
11$ ^r,<cr ^rt ^2Cocfet>eTiRtt49n WtV
ady
ona.Generic;
lAiA {
t3«'b I. . .
Refactot ^ ► > ay
Л
#
*
44
Organize Using* » I jRy
С/eate Unit Tests., jjj
Insert Snippet ! j»a
Surround With-. 1 $
<>o To Definition a£
Find АП References j
Breakpoint ►
Run To Cursor
Cut
Copy
Paste
Outlining, ►
a
и
П
1 i
J
Rename...
'itafodeii E*pJor<»
b* S<fttiw» *t... ▼"' W if P
llfiriJUliBA. II
| u3 Solution Corrtow E projects) [J
lj ft ^AdminUI I
i; b j$ BuunessDomain 1
j1 ф J Properties 1
!l if» *i References 1
1 ^ Product.cs 1
t® # CV-\Co»rtoso\ 1
Extract Method... [^
Encapsulate field..
Extract Interface...
Promote Local Variable to Paramettr
Remove Parameters..
Reorder Parameters...
^m} r
Ln7 Col L
ili
1
' \ttSolution Explorer ^Mitto Evplcrer |
I Ch22
INS |
Рис. 9.2. Меню Refactor появляется по щелчку правой кнопки мыши
Рефакторинг в окне кода при помощи смарт-тегов
Смарт-теги первоначально появились в Microsoft Office. Как обсуждалось в главе 8, цель
смарт-тега проста — понять, что именно вводит пользователь, и предложить ему
дополнительную "умную" функциональность. Например, когда вы вводите текст в редакторе Word,
то он пытается понять, что именно вы ввели. Затем редактор предоставляет вам
дополнительную функциональность и возможность управлять опциями форматирования (в
зависимости от полученной информации).
Редактор кода языка С# предоставляет аналогичную функцию смарт-тегов. Редактор
обнаруживает ваш ввод и понимает, что вы сделали изменение кода, эквивалентное
рефакторингу. В этих случаях редактор создает смарт-тег, который может использоваться для запуска
инструмента рефакторинга. Это позволяет вам оставаться в редакторе кода, но по-прежнему
пользоваться возможностями увеличения производительности и уменьшения количества
ошибок, которые предоставляет инструмент рефакторинга.
Глава 9. Рефакторинг кода
289
Например, предположим, что у вас есть свойство с именем id. Вы хотите переименовать этот
элемент в Identifier. Вы открываете файл класса и устанавливаете ваш курсор возле имени
свойства. Затем вы вводите новое имя свойства. Редактор кода С# обнаруживает ваше
изменение и подчеркивает последний символ нового имени. На рис. 9.3 показан такой пример.
Обратите внимание на маленький прямоугольник под буквой г в слове identifier.
Т
public mt; Identifier {
Рис. 9.3. Переименование свойства вызывает появление смарт-тега для рефакторинга
Маленький прямоугольник под местом внесенного изменения — это визуальная подсказка о
том, что редактор кода С# считает, что он может помочь вам. Вы можете поместить курсор
рядом с прямоугольником для того, чтобы отобразить встроенное меню, в котором указано,
как именно редактор может помочь. На рис. 9.4 показано использование смарт-тега
предыдущего примера.
Совет
Вы можете активизировать смарт-тег и без помощи мыши. Для этого нажмите
комбинацию клавиш <Shift>+<Alt>+<F10>.
В
File Edit View ftefaetor Project Build Debug D*ti Tool» Tert Window Help
*4 BusineaDomain.Product
» !?tf Identifier
[jualrg Syaten;
j t lisle? System. Collections. Gecmc;
j ' using Svacen.Li.nq;
I using System.Text;
I ''
j f-i aoaespace BualnesaDooMln {
j Pj public cless I?"\1./ {
I II
inr _id;
public int; Identify
set I _id ™ va4
}
string creator;
»b* Rename Id' lo 'Identifier
*f Renerne with preview...
public strxno; Creator (
get { return _creator; >
set { creator — value; }
•I >
L& Error List Г^ Codeforfmaion Window
ItemW Saved
L»
■w X ■S&ruHc'liepfrMff VnlattBM ( . »
^ Solution Contotc E projects)
rti S3 Admin Ul
-j 3 BirsinenDomain
i»; ^S Pioperties
>♦! ~ai References
<^ Product cs
Ш J> CV \Contoso\
a) 3 Ser.tces
А «Э ServiceaVB
^Salubon Explorer ^Млсгэ bnlerer1
Рис. 9.4. Запуск рефакторинга через смарт-тег
Использование конструктора классов Class Designer для рефакторинга
Visual Studio 2008 предоставляет для работы с классами визуальный конструктор. Этот
конструктор классов позволяет вам просматривать содержимое ваших классов и связи между
290
Часть III. Программирование и работа с кодом
ними. Его можно также использовать в качестве средства повышения производительности:
вы можете создавать новые классы и модифицировать существующие классы
непосредственно внутри этого визуального конструктора.
Наличие визуального конструктора классов
Обратите внимание, что конструктор классов имеется только в профессиональной
версии Visual Studio. Однако мы описываем его в главе 27. Это позволяет нам
описать все инструменты моделирования Visual Studio в одной главе.
Визуальный конструктор классов Visual Studio предоставляет вам инструменты рефакторин-
га при работе с классами С#. Этим обеспечивается использование рефакторинга при
выполнении модификаций кода при помощи этого визуального конструктора. Предположим, что
вы хотите переименовать свойство внутри визуального конструктора и хотите, чтобы были
автоматически обновлены также и ссылки на данное свойство. Вы можете сделать это при
помощи щелчка правой кнопкой мыши по свойству внутри визуального конструктора
классов и последующего выбора опции Rename в меню Refactor. На рис. 9.5 показан рефакто-
ринг непосредственно внутри визуального конструктора классов.
Cantos© * Mkrc;
s-Шм
File Edit View Refactor Project Build Debug CU» Diagram Date Tools Test Window Help
J3'-JTiJ*J4#A-ti , *J - « ' .- • 'f Debug - Mued Platforms * J>
ill. .11 ♦ ♦ ajajjan -4 4** ' J*;
* Fields
" Properties
*** Creator, string
DMcictiori siring
i
f Name stnn
_5 FsfererceW
jj„> Err- It',» J|Oj«ir
Item's; Saved
_^ Cjstorref
Customer
Refactor ►
\ Show as Ajsociation
} Show as Collection A\seciatton
| Hide
S* Adjust Shapes Width
* Cut
-J Copy
Xi Delete Cede
- \ View Code
_3< Cla« Details
O' Properties
* Fielcs
" Properties
"Г* td in
Extract interface.
Rename
Reorder Parameters
Remove Paranurte rs
t rj\ng
IUst'~*
IColle-ctiorvT»
1Ег>ыг1*гзЬ'е<т>
TLlSt
ICollertJon
lEnure'abk
Рис. 9.5. Активизация рефакторинга непосредственно
внутри конструктора классов Visual Studio
Предварительный просмотр изменений
По мере того, как вы знакомитесь с инструментами рефакторинга, можете решиться
доверить им делать свое дело без особого присмотра с вашей стороны. Однако если вы не
отличаетесь от других разработчиков, то никто (и ничто) не может трогать ваш код без вашего
Глава 9 Рефакторинг кода
291
согласия. К счастью для нас, инструменты рефакторинга имеют опцию предварительного
просмотра. Эта опция позволяет вам следить за изменениями (выполняемыми
инструментами) и либо принимать, либо отвергать предлагаемые изменения.
Диалоговое окно Preview Changes активизируется как опция (флажок выбора) для данной
операции рефакторинга (или в случае смарт-тега— через второй пункт меню смарт-тега).
На рис. 9.6 показан пример выбора опции Preview reference changes для операции
рефакторинга Rename.
Identification]
Location.
BusinenDomdin Product
■/ Preview reference changes
Г~ Search ir» comment!
[ " Search in strings
Рис. 9.6. Активизация опции Preview reference changes
для операции рефакторинга
Rename 'Id to Identification'*
'->■ J'OsL Products cs
[7^rf(pJd'=null){
Preview Code Changes
irt id;
public lsit |ldjKntaficflttta,cij i
gert { return _id. }
set { _id - value. }
string creator;
Apply
Рис. 9.7. Предварительный поосмотр изменений операции Rename
После того как активизируется операция рефакторинга с включенной опцией Preview
Changes, Visual Studio предоставляет вам диалоговое окно Preview Changes. В верхней
части этого окна перечислены все изменения, которые собирается выполнить данная операция
рефакторинга. Этот список представлен в виде дерева, причем место изменения
представлено в виде внешней ветви. Листья этой ветви — это все те файлы, где произойдут изменения.
Под именами файлов вложены реальные местоположения в коде, где будут сделаны
изменения. Вы используете этот список для выбора тех изменений, которые хотите просмотреть.
292 Часть III. Программирование и работа с кодом
На рис. 9.7 показан пример изменений, необходимых в нашем простом примере изменения
свойства Id объекта Product.
При щелчке по каждому элементу дерева Preview Changes в разделе Preview Code Changes
диалогового окна отображается соответствующий код. Это позволяет разработчикам быстро
просмотреть места изменений. Для того чтобы предотвратить внесение данного изменения,
вы можете просто снять флажок в дереве. Конечно, вы можете предотвратить изменения и
целиком во всем файле (для этого надо убрать флажок на более высоком уровне
иерархии — на уровне файлов). Когда вы закончите просмотр и будете удовлетворены
предлагаемыми изменениями, просто щелкните по кнопке Apply для сохранения изменений в коде.
Переименование
Переименование элементов кода — это самая часто встречающаяся операция рефакторинга.
Наряду с тем, что Rename является частью редактора С#, аналогичная функция переимено^
вания существует как в редакторе VB, так и в инструменте Team Systems Database Developer
Tool. Здесь мы описываем только инструменты рефакторинга для языка С#. Однако
последние два инструмента работают аналогично.
В обычном сеансе рефакторинга переименование часто составляет основной объем работы.
Однако большинство переименований происходит снаружи окна рефакторинга.
Разработчики обычно не дожидаются того момента, когда код заработает, исключительно для того,
чтобы сказать себе: "отлично, а теперь я вернусь назад и переименую эти 10 элементов для
большей ясности". Иногда случается именно так, но чаще всего по мере создания вашего
приложения вы согласованно переименовываете элементы для исправления ошибок или для
того, чтобы сделать все яснее и читабельнее. Конечно, по мере разрастания кода
переименование классов, методов, полей и т. п. (без внесения в код новых ошибок) становится все
более трудным делом.
Поэтому очень важно иметь возможность переименования элементов с уверенностью в том,
что вы не внесете в ваш код новых ошибок. При помощи редактора С# вы можете
переименовывать все элементы кода (включая пространства имен, классы, поля, свойства, методы и
переменные). Компилятор помогает обеспечить отсутствие повреждений вашего кода и то,
что все ссылки из исходного кода будут найдены. Фактически операция Rename может
даже делать поиск в комментариях вашего кода и соответствующим образом обновлять их.
Доступ к операции Rename
Вы можете делать операцию Rename из многих мест интегрированной среды. В
предыдущем разделе мы рассмотрели доступ к Rename через меню Refactor, щелчок правой
кнопкой мыши, смарт-тег и визуальный конструктор классов. Вы можете также получить доступ
к Rename из Object Browser, Solution Explorer и Class View. Кроме того, если вы
используете диалоговое окно Properties для изменения имени элемента управления, который вы
поместили на форму, то "за кулисами" активизируется операция Rename и сам элемент
соответствующим образом переименовывается.
Из браузера Object Browser вы можете получить доступ к операции Rename только через
меню Refactor. Конечно, вы должны при этом просматривать типы вашего решения. Вы
Глава 9. Рефакторинг кода
293
просто выбираете элемент, который вы хотите переименовать, а затем щелкаете по меню
Refactor. На рис. 9.8 показан пример браузера Object Browser и операции Rename (верхняя
часть снимка экрана).
F8e Edit Vtew [fafaktfJl Project BmW Debug Data Toots Test Window Help
*$ * Ъ&'..в2..Ш ** Rwme CtfkM L>1 ..i.Ai ► Debug - Mbed Platform*
' 'ЯЛ ..
Object Browner
й&Шмй Ш6АШюлт\ Ш
\
Browse: All Components
■liiiiWTO-raLaaii
«Search»
D 3 AdmrnUT
lu О AdmmUI
iT) {) AdmtnULProperttes
В ^ BusmcuDomjin
l-i 0 BusinessDomain
CD Oft Customer
A **% Order
W ^ Product
ffl <} Services
-Э СЛ. AContosoV
!♦} vCJ Microsoft JJuild.Conver«cn.v3.5
(tl^O WicrosofUJuild.Engine
ft -J Microsoft Butld.Fremcworfc
© -CJ Microsoft Build.Lruirue*.v?3
W v^3 Mkraeoft.SefvtceModef.Channels.Mail
S -j Microsoft&ervKeModel Channels Mail.brchi
1*1 -J3 Microsoft VisuelBetk
it) ^ MtcrosoftYnuilCSTLCLR
Ш -J rmcorlib
*f Creator
vif Description
j?r4ame
jf ReferenceNbr
4> .creator
ф description
Jt _name
$ .referenceNbr
I public Inj Id {set get)
I Member of fttt*!.OJMU0?iim*lD.Eroil.W«t
M-"**ffi, '<
yffftH?
; *Щ
Щ
3 km* l*uQCqo«0«fc*<re« Window
Ready
Рис. 9.8. Доступ к операции Rename из Object Browser
Вы можете переименовать в Solution Explorer имена файлов, которые соответствуют
классам. Например, если вы выберете файл Customer, щелкнете по нему правой кнопкой мыши и
выберете пункт Rename, то Visual Studio переименует этот файл. Кроме того, она выполнит
поиск (в коде этого файла) любого класса с таким же именем, как и файл. Так что если у вас
есть класс Customer и файл Customer.cs, то операция Rename переименует как файл, так и
класс (а также все ссылки на этот класс). Обратите внимание, что хотя отмена (Undo)
операции Rename и откатит изменения в коде, однако имя файла она обратно не восстановит.
И наконец, вы можете переименовывать из Class View. Это может быть полезно в том
случае, когда вы смотрите на ваш код с точки зрения пространств имен и объектов (а не просто
файлов). Для этого вы должны щелкнуть правой кнопкой мыши по объекту, который хотите
переименовать, и выбрать опцию Rename. На рис. 9.9 показан пример переименования
свойства id объекта Product изнутри Class View. Обратите внимание, что переименование
класса изнутри Class View не влияет на имя файла, который содержит данный класс. Это не
противоречит остальным вариантам переименования (исключение — переименование в
Solution Explorer).
Совет
Вы можете получить доступ к операции Rename при помощи командных клавиш.
Предыдущие версии Visual Studio ввели концепцию аккордов. Они подобны традиционным
клавиатурным командам, но вы нажимаете (играете) их последовательно. Например,
для активирования операции Rename без использования мыши поместите курсор на то,
294
Часть III. Программирование и работа с кодом
что вы хотите переименовать. Затем нажмите последовательность <Ctrl>+<R>, <Ctrl>+<R>.
Нажатие этой комбинации приведет к появлению диалогового окна Refact ring | Rename
для того элемента кода, который находится под вашим курсором.
щ^шшштт
Л File Edit Viev» Refactor
Ч*
К
I
1 ■■
I j
i *
I i
J Rt
• wMw))fc
ady
Project Build
W
'i
V Л
"s, "
'
Debug Data Tools Test Window Help
i' Щ ЩшвьШж "^ ^v
, li^* * ::,-
* V
I. 'Search*
> || +J £$ Customer
? J
1 -^Й
2 ^. i
I I» ^ Order
1 f+1 *$ Product
1 i {) Services
| 'Y Creator
1 ^f Description
s, .. Ц "^ f< _£ Go To Definition
Ш *|Ц ^ jMI ^М-Л Browse Defmruon
-& 7& m иШ *?" Find АН References
• £ •* - ^ Hi ^ -
5* ~Л ^
I ,,f ., jt/ Rename .>
1 ~! Um Show Public Members
1 v j Show Protected Members
I ( pj Show Private Members
I [-Л Show Other Members
1 Show Inherited Members
. jj j Sort Alphabetically
* i *\
1 ' bd Scrt By Membcr тур*
1 ~^5сМ Sort By Member Access
Group By Member Type
шшя^шжттшщтшш^^штШтнштшшшшшшшшшшшшш
"- „ $ Xj
* ^ 1
i» 1
Ежр.ог» I
Рис. 9.9. Доступ к Rename из Class View
Работа с диалоговым окном Rename
Диалоговое окно Rename (см. рис. 9.6) позволяет вам указать несколько опций при
активировании данной операции. На рис. 9.6 показан пример диалогового окна. Два текстовых
поля на форме позволяют вам определить само переименование. В разделе New name вы
указываете новое название переименовываемого элемента. Текстовое поле Location указывает
пространство имен переименовываемого элемента. Конечно, поиск будет произведен во
всех указанных местах.
Диалоговое окно Rename также предоставляет разработчику несколько опций для
выполнения переименования. Три флажка выбора под текстовым полем Location позволяют вам
настроить опции так, как описано в табл. 9.2.
Таблица 9.2. Опции диалогового окна Rename
Опция
Описание
Preview
reference changes
Эта опция позволяет вам указать, хотите ли вы просматривать изменения
перед тем, как они будут применены к вашему коду Эта возможность может
быть особенно полезна в том случае, когда вы делаете переименование в
первый раз, либо хотите переименовать элементы внутри строк или
комментариев
Глава 9. Рефакторинг кода
295
Таблица 9.2 (окончание)
Опция
Search in
comments
Search in
strings
Описание
Переименование в строках и комментариях не использует компилятор
Вместо этого используется сопоставление строк (см. рис 9 10 для примера).
В этом случае предварительный просмотр изменения перед его
применением может быть особенно полезен Например, возможно, вы хотите
переименовать тип, но не аналогичный текст внутри метки
Эта опция позволяет вам указать, должна ли операция Rename делать
поиск внутри ваших комментариев В комментариях часто делаются ссылки на
типы и поэтому их необходимо синхронизировать с изменениями
На рис 9.10 показано диалоговое окно Preview Changes - Rename с
раскрытыми каталогами Strings и Comments Обратите внимание, что
сопоставление строк чувствительно к регистру Поэтому при написании
комментариев со ссылками на типы следует быть внимательными
Эта опция позволяет вам указать, будет ли операция Rename делать поиск
внутри строк литералов Строковые литералы включают константы, имена
элементов управления, имена форм и т д Эта возможность особенно
полезна в том случае, когда имеется тесная связь между вашим кодом и
элементами вашего пользовательского интерфейса Этот инструмент также
чувствителен к регистру
Renem* 'Order to 'Booking'
- ^IfeJ? Comments
- J ^ NewOrder cs
?v •IhJf Strings
. v *J NewOrder Designers
\4 l\ this buttonl Tert = "NewOrder',
Preview Code Changes
! &vti>iiz partial class .-•£ ^r'.er • Form {
С public NewOrder() {
InitiaiizeCompsrient ():
private void butT:cr.l_Clicjc(cfc5ect sender, „- ;z.
/create a ".ew |j:ofel*i«j| rcr cr.e ??.s:t«j s-srctrer
BuameaaDDEfiin.jSookir^ order ш lew 2iisa.ne3 33cma.ia fc
Apph/ j Cancel
Рис. 9.10. Диалоговое окно Preview Changes - Rename
Извлечение метода
Когда разработчик возвращается к своему коду (возможно, для регулярного анализа кода
или после особенно длительного периода безотрывной его разработки), он часто
обнаруживает методы, которые слишком длинны или крупномодульны, содержат дублированный код
или просто плохо организованы. Обычно после этого нужно пробежаться по коду и создать
296
Часть III. Программирование и работа с кодом
для решения этих проблем мелкомодульные методы, которые дадут более читабельный,
пригодный для многократного использования и более легкий для сопровождения код.
Проблема, конечно, состоит в том, что это требует времени и часто привносит в код
ошибки. Редактор кода С# в Visual Studio 2008 предоставляет инструмент рефакторинга Extract
Method (извлечение метода) для быстрой и безошибочной работы по организации вашего
кода. При помощи этого инструмента вы можете создать новый метод с использованием
существующего кода.
Доступ к операции Extract Method
Для доступа к операции рефакторинга Extract Method вы должны сначала выделить блок
кода. Затем вы можете использовать меню Refactor и выбрать пункт меню Extract Method.
Вы можете также вызвать Extract Method из контекстного меню (при помощи щелчка
правой кнопкой мыши).
Совет
Для вызова операции извлечения метода с клавиатуры сначала выделите блок кода,
а затем сыграйте аккорд <Ctrl>+<R>, <Ctrl>+<M>.
Извлечение методов
При помощи операции извлечения метода вы можете создать (или извлечь) новый метод из
группы строк кода, единственной строки или выражения внутри данной строки кода. В
каждом случае метод создается немедленно по образцу того метода, код которого извлекается.
Извлеченный код заменяется вызовом нового метода.
В листинге 9.1 показан пример типичного слишком длинного метода. Для удобства ссылок
мы добавили номера строк. Когда вы анализируете код, то такие методы встречаются часто
и именно их вам и следует искать. Этот метод создан как статический вызов, который
возвращает объект object данного клиента (по идентификационному номеру клиента и
идентификационному номеру заказа). Однако заказ, строки заказа и подробности о клиенте —
все это поступается из разных запросов к базам данных и сохраняется в специфичных
объектах. Затем эти объекты сохраняются в заказе как свойства.
| Листинг 9,1 Длинный статический *^^^^ • ^ALm^
01 public static Order GetCustomerOrder(int customerld, int orderld) {
02
03 DataAccess.DAL dal = new DataAccess.DAL();
04 Order order = new Order();
05
06 // Получить подробности заказа
07 System.Data.DataTable dtOrder = dal.GetData("customerOrder", orderld);
08
09 // Проверить заказ по клиенту
Глава 9. Рефакторинг кода
297
10 if (customerld != (int)dtOrder.Rows[0]["customer_id"]) {
11 throw new ApplicationException("Invalid order for the given customer.");
12 }
13 order.Id = (string)dtOrder.Rows[0]["id"];
14
15 // Получить позиции заказа
16 List<OrderItem> items = new List<OrderItem> ();
17 System.Data.DataTable dtltems = dal.GetData("orderIterns", orderld);
18 foreach (System.Data.DataRow r in dtltems.Rows) {
19 Orderltem item = new OrderItem((int)r["product_id"], orderld);
20 item.Name = (string)r["name"];
21 item. Description = (string)r["description"];
22 item.Quantity = (int)r["quantity"];
23 item.UnitPrice = (double)r["unit_price"];
2 4 iterns. Add (item) ;
25 }
26 order.Items = items;
27
28 // Получить подробности по клиенту
29 System.Data.DataTable dtCustomer = dal.GetData("customer", customerld);
30 Customer cust = new Customer(customerld);
31 cust.Name = (string)dtCustomer.Rows[0]["name"];
32 order.Customer = cust;
33
34 return order; '
35 }
Возможности по извлечению метода внутри данного метода весьма многочисленны. Вы
можете извлечь вызов для инициализации объекта Order, вызов для получения позиций
заказа, а также вызов для получения подробностей по клиенту. Это приведет к улучшению
организации кода (и таким образом он станет более читабельным), появлению больших
возможностей для его многократного использования, а также к упрощению его
обслуживания. Давайте же рассмотрим выполнение этих извлечений.
Сначала вы извлекаете код, который настраивает заказ. Для того чтобы правильно выделить
код для извлечения, необходимо иметь некоторый опыт работы с этим инструментом.
В данном случае извлеките строки 3—13. Это извлечет код, начиная с настройки
DataAccess и до инициализации заказа. Однако это несколько сбивает с толку операцию
Extract Method, поскольку вы в первых двух операциях настраиваете и объект DataAccess,
и объект Order. Операция Extract Method понимает, что позже в вашем ме,тоде вам будут
нужны оба этих объекта. Поэтому она создаст оба объекта как выходные параметры метода.
Вам же нужен метод, который вернет экземпляр объекта Order и настроит свой
собственный объект DataAccess. Вы можете добиться этого следующим образом:
1. Выделите строки 4—13 (от создания заказа и до инициализации).
298
Часть III. Программирование и работа с кодом
2. Выберите операцию рефакторинга Extract Method (при помощи меню, щелчка правой
кнопкой мыши или клавиатурного аккорда).
3. Visual Studio выдаст диалоговое окно Extract Method (рис. 9.11). Это диалоговое окно
предоставит новое имя метода (по умолчанию — NewMethod) и сигнатуру метода. Если
сигнатура метода выглядит некорректно, то вы можете отменить операцию и уточнить
выделенный блок кода. В данном случае метод статический; он возвращает объект
Order и принимает объекты customerld, orderld и DataAccess. Последний в
сигнатуре нашей функции нам не нужен, но с этим мы скоро разберемся.
1 %
!1
-Mic
Edit View R
S, Чп А* Ж
■£J Strvtces Orders
Q class]
rtract Method
Ne«v method name
Preview method signature
prr.atc static Order NewMethod(int customerld. mt orderld, DataAccess DALdai)
Cancel [
ПзсеЛсседз.^
£zder crde=
- dal - r.sv Da-саАссезз.-" - П ;
new ureter |J ?
/t^ffz crd«r Seta*Is
Зувсет.&агл ;£$*•: at able 3tOrder * dstt+Secd&xfilCouatoiRerDrjJex'*; orderld^
//validate crdez &злаялс csu-stossez
a £ * ens с ежех 13 5 - I xxt j cSrOreiez. Stew» | Q И "cast: aser^id*" 1 j *
сйгс^г ъе» ApplaffitiCJi£«cej;fciu»t^Xrkvalid crdter Scsz tii* ezven силсеявег**''};
с rc3&r. X 3 ~ (ssfcrдй.^J cttOr der * itova £8 } {"ad* J *
,
l^fll'lK
Ready
"*'
' С .' .-■
~- +> lterr.3 =» nev< \
icier.;
Рис. 9.11. Извлечение кода из существующего метода в новый метод
4. Переименуйте метод во что-нибудь имеющее смысл. В данном случае переименуйте его
вInitCustomerOrder.
5. Нажмите кнопку ОК для того, чтобы метод был извлечен.
6. Будет создан новый метод, а старый метод заменится следующим вызовом:
Order order = InitCustomerOrder(customerld, orderld, dal);
Примечание
Извлеченные методы создаются по умолчанию как закрытые (private).
У нас по-прежнему есть одна проблема с извлеченным методом: он принимает экземпляр
DataAccess вместо того, чтобы создать собственный экземпляр. К счастью, вы можете
использовать еще одну операцию рефакторинга для того, чтобы решить эту проблему. В
данном случае надо использовать операцию Remove Parameters (см. далее в этой же главе).
Важно отметить, что удаление параметра приводит к его удалению как из сигнатуры метода,
Глава 9. Рефакторинг кода
299
так и из вызова метода. Однако оно не вставляет в новый метод вызов для создания объекта
DataAccess (и не удаляет его из старого метода).*Вы должны сделать это вручную.
Теперь давайте извлечем вызов для получения позиций заказа. Начнем с выделения строк
16—25 (см. листинг 9.1). Обратите внимание, что мы не хотим выделять вызов для
настройки свойств заказа (строка 26); мы просто хотим вернуть объект, который представляет все
строки данного заказа. На рис. 9.12 показано выделение кода и извлечение метода. В
данном случае назовите новый метод Getorderitems. После извлечения метода он заменяется
следующим вызовом нового метода:
List<OrderItem> items = GetOrderltems(orderld, dal);
ггеа. Зезсг ip-e icsr. * {sz-rtn ?J r [* deacziprlczs"} i
; села; ?<skl < ir«a<) ?
5
terns " items;
Ln 26 Col 1
Рис. 9.12. Извлечение кода в метод для возвращения позиций заказа
Опять у нас проблема с передачей объекта DataAccess в новый метод. Эту проблему нужно
решить так "же, как вы делали это раньше.
Наконец, давайте рассмотрим извлечение той части метода, которая получает подробности
по клиенту. Теперь эта процедура должна быть достаточно простой. Вы выделяете строки
кода (строки 29—31) и выбираете операцию Extract Method. Вы называете новый метод
GetCustomer и работаете с извлеченным параметром DataAccess.
Новый (и гораздо более короткий) метод выглядит наподобие листинга 9.2. Кроме того, у
вас теперь имеются три новых метода, которые вы сможете повторно использовать в
будущем (и, возможно, сделать открытыми). Эти новые методы можно увидеть в листинге 9.3.
Листинг 3*2» Статический метод после извлечений
..virtivi^iii-Aiji**;.-
public static Order GetCustomerOrder(int customerld, int orderld)
Order order = InitCustomerOrder(customerld, orderld);
ИЗак 3716
300
Часть ///. Программирование и работа с кодом
// Получить позиции заказа
List<OrderItem> items = GetOrderltems(orderld);
order.Items = items;
// Получить подробности по клиенту
Customer cust = GetCustomer(customerld);
order.Customer = cust;
return order;
}
| Листинг 9.З. Извлечения
u„,„..,^;i.^„^„,CT„^,,,^„.CTMVwM.„i:;TO,;;wi.^„.w.„»Hl»:.,^,;;r,^;,,rt,:iw^ b..vW«iw...„.,v^..<*W. ►;;..
private static Customer NewMethod(int customerld) {
DataAccess.DAL dal = new DataAccess.DAL();
System.Data.DataTable dtCustomer = dal.GetData("customer", customerld);
Customer cust = new Customer(customerld);
cust.Name = (string)dtCustomer.Rows[0]["name"];
return cust;
}
private static List<OrderItem> GetOrderltems(int orderld) {
List<OrderItem> items = new List<OrderItem>();
DataAccess.DAL dal = new DataAccess.DAL();
System.Data.DataTable dtltems = dal.GetData("orderltems", orderld);
foreach (System.Data.DataRow r in dtltems.Rows) {
Orderltem item = new OrderItem((int)r["product_id"], orderld);
item.Name = (string) r ["name"];
item.Description' = (string)r["description"];
item.Quantity = (int)r["quantity"];
item.UnitPrice = (double)r["unitjprice"];
items. Add (item) ;
}
return items;
}
private static Order InitCustomerOrder(int customerld, int orderld) {
Order order = new Order();
// Получить подробности заказа
DataAccess.DAL dal = new DataAccess.DAL();
System.Data.DataTable dtOrder = dal.GetData("customerOrder", orderld);
Глава 9. Рефакторинг кода
301
II Проверить заказ по клиенту
if (customerld != (int)dtOrder.Rows[0]["customer_id"]) {
throw new ApplicationException("Invalid order for the given customer.");
}
order.Id = (string)dtOrder.Rows[0]["id"];
return order;
Примечание
Операция Extract Method не позволяет вам выбрать место для извлекаемого метода.
Очень часто вы будете обнаруживать фрагменты кода, которые действительно нужно
извлечь в метод другого класса. Для этого вам придется сначала извлечь метод, а
затем перенести его вручную.
Извлечение единственной строки кода
Иногда вам может понадобиться извлечь в качестве метода единственную строку кода (или
часть ее). Например, у вас может иметься вычисление, которое выполняется как часть
строки кода, но носит достаточно общий характер для того, чтобы быть оформленным в
качестве отдельного метода. Либо вам может понадобиться извлечь присваивание объекта (для
того, чтобы добавить в него дополнительную логику). В любом случае редактор кода С#
поддерживает такой тип извлечения.
<i/* ConteK> Microsoft Vi ы<ф Studio
1сз £! U
File Edit View Refactor Project Build Debug Data Tools Test Window Help
«У1
ЯН
New method name:
GetftemTotaJ
Preview method «gneture.
private static double GttitemTotBt(Orderitem item)
public double CaleulateOrdexTctaiprcW- order) {
double total;
ioreach {Огйег^сяг item in. order.Itеяд) i
total - cecal + 1м«{Ыв&&Р WWPl»''
)
return coral;
\J&&w.№.
Ready
« >;;;,мк таа»; iw^- х
Ln67
Col 59
Рис. 9.13. Извлечение части строки кода
302
Часть III. Программирование и работа с кодом
Рассмотрим пример. Предположим, что у вас есть следующая строка кода, в которой
вычисляется сумма по заказу (в цикле по позициям заказа):
total = total + item.Quantity * item. UnitPrice;
Вам нужно извлечь ту часть присваивания, которая вычисляет сумму по позиции заказа
(количество х цена позиции). Для этого вы просто выделяете часть кода и вызываете
операцию рефакторинга Extract Method. На рис. 9.13 показана эта операция.
Обратите внимание, что по умолчанию новый метод захочет получить экземпляр
Orderitem. Однако вы, возможно, предпочтете передать вместо него количество и цену
позиции. Это изменение вам придется сделать вручную. Вы можете сделать это при помощи
создания переменных в новом методе и выполнения операции рефакторинга Promote Local
to Parameter (описывается далее в этой главе). Если же количество и цена позиции были
присвоены переменным до извлечения, то вы получите новый метод, который принимает
эти параметры (а не экземпляр Orderitem). Это продемонстрировано на рис. 9.14.
Операция рефакторинга заменяет часть строки кода следующим:
total = total + GetltemTotal(qty, unitPrice);
и добавляет такой новый метод:
private static double GetltemTotal(int qty, double unitPrice) {
return qty * unitPrice;
File Edrt View Pefactor Project Build Debug Date Tools Test Windcw Hetp
д .^ к, ^„^,^,„3^
i^© a
£щ
New method name:
GetttemTataj
Preview method signature
private static double G«tlttmTot*l(int qty. double unitPrice)
public doucle CalcuiateOrderTor.al ( : -• : order)
double total;
Тптга.'-ъ ("' г • *-.« item 1*1 crder.Itema) {
int qci - itcm.Cuar.city;
rlcufcle unitPrice ■ it err .UnitPrice:
tctal - total -r tyry * usilt Price;
}
return total;
pj crrcr lutt
Ready
Cot 44
Ы
k
Рис. 9.14. Извлечение части строки кода
Глава 9. Рефакторинг кода
303
Генерируем заглушку метода
Visual Studio может автоматически сгенерировать для вас заглушку метода. Строго говоря,
это не операция рефакторинга, но это может дать такое же увеличение производительности
вашего труда. Это может быть применимо в следующих обстоятельствах: предположим, что
вы пишете код, который вызывает метод одного из ваших объектов. Однако этот метод не
существует. Вы все равно можете написать код вызова несуществующего метода. Visual
Studio поймет, что этот метод не существует, и, предоставит вам смарт-тег (рис. 9.15) для
создания этого метода.
Щелчок по смарт-тегу приведет к тому, что Visual Studio извлечет вызов метода в новый
сгенерированный метод целевой сборки и класса. На рис. 9.16 показан новый метод.
Обратите внимание, что Visual Studio даже создала вполне читабельное имя для параметра
метода. Это имя основано на имени переменной внутри вызывающего метода.
vv< Сотою - Microsoft Visual Studm.
File Edit View Refactor Project Buitd Debug Deta Toots. Test Window Help
:1чЛ,ь* &fe - ~ _} , ,--, jut* z
Customer"** P(offea Ctfctamerts* P*<tefoma l вАЬа 1.ОгФш,&*\ Шк>>&\ ЫтОШмi
.£ Services Customers
▼ **GetCustomerOrder(ir»t crderld^
11 asincj System;
lairg 5'» stem. Collections. Generic ;
a-Jintr System Lmq;
чя!гд Systew.Text;
•• ■■iti^fj Sysceir Data.
[j "id"s>3f,i' e Services {
D class < -> — <
О public static < % • GetCistomerCrder(int crderld) {
DataAccess dal « new DataAccess. _ *• ();
. zt-<i dt - dal.GetOrder(arderld) ;|
♦^ Generate method stub for 'GetOrder' in 'DalaAcces.5.0AL'
Ready
&\
Рис. 9.15. Генерирование заглушки для несуществующего метода
i ^DataAcceis DAL ▼ bfoi, ,it,it
H using System;
l<aing System.Collections Generic;
aai^g Sузtera. Lmq;
4*.i.ng System.Text.
I -using System.Data;
[J каилзрасе DataAccess i
. p public cld33 A. i
P public v » v>r.« GetOrderfrnt crderld) <
throw new <'*• ; ^ > "•• " >"i v >«*<' ••{);
}
' 4 '" ■■ . ^
^ crcii k.»
-
JJ
*
s
I
Рис. 9.16. Сгенерированная заглушка метода
304
Часть III. Программирование и работа с кодом
Извлечение интерфейса
Когда классы содержат один и тот же набор параметров, может быть очень полезным
определить общий контракт для всех классов. Разумеется, это делается при помощи интерфейса.
Основные преимущества использования интерфейсов состоят в том, что ваш код становится
более читабельным, его легче обслуживать, и работает он одинаково для похожих членов.
Однако разработчики часто не понимают общности своих классов до тех пор, пока их код не
написан. Это иногда делает создание интерфейсов весьма болезненной операцией.
Редактор С# в Visual Studio 2008 предоставляет операцию рефакторинга Extract Interface
(извлечение интерфейса) для облегчения этого процесса. Она позволяет вам взять
существующий класс или структуру и автоматически сгенерировать соответствующий интерфейс,
который будет затем реализован существующим классом.
Доступ к операции Extract Interface
Для доступа к операции рефакторинга Extract Interface вы должны сначала поместить ваш
курсор в класс, структуру или другой интерфейс, который содержит те члены, которые вы
хотите извлечь. Затем вы можете использовать меню Refactor и выбрать позицию меню
Extract Interface. Вы можете также вызвать Extract Interface из контекстного меню (при
помощи щелчка правой кнопкой мыши) или из визуального конструктора классов.
Совет
Для вызова операции извлечения интерфейса с клавиатуры сначала поместите
курсор в класс, структуру или интерфейс, который содержит те члены, которые вы хотите
извлечь. Затем сыграйте аккорд <Ctrl>+<R>, <Ctrl>+<l>.
Извлечение интерфейсов
Для того чтобы лучше понять операцию извлечения интерфейса, давайте рассмотрим
пример. Предположим, что вы анализируете свой код и замечаете, что некоторые ваши объекты
имеют аналогичные свойства и методы. Предположим, что объекты Customer, Vendor,
Manufacturer, SalesAgent и Product содержат свойства Id, Name и Description, a
также методы Load, Save и Delete. В этом случае вам следует рассмотреть возможность
извлечения этой общности в стандартный интерфейс, который будет реализовываться
каждым из ваших объектов. Посмотрим, как в этом отношении нам может помочь операция
рефакторинга Extract Interface.
Сначала вы помещаете курсор на целевой класс, члены которого вы хотите извлечь. Для
нашего примера выберите класс Customer. Вызов операции Extract Interface выдаст
одноименное диалоговое окно. На рис. 9.17 показано это диалоговое окно для данного примера.
Обратите внимание, что сначала вы определяете имя для интерфейса. По умолчанию
инструмент рефакторинга называет интерфейс именем класса после буквы I (от англ.
interface)— в нашем случае это будет iCustomer. Конечно, мы хотим использовать
собственный интерфейс, поэтому мы изменим название на iDomainObject.
Глава 9. Рефакторинг кода
305
New interface name:
lDomatnObjedj
Generated name
BusinessDomairUDomairvObject
New file name:
IDomainObjecLcs
Select public members to form interface
i; |!3* Address
jVl ^DeleteO
21 ^Description
[Vj^Id
iVj $toad(int]
'./]!^Name
^^pPostalCode
■X ^Saved
[ Select AN |
[ Defect AU ]
[ OK ] I Cancel |
Рис. 9.17. Извлечение интерфейса
Диалоговое окно Extract Interface показывает также сгенерированное имя и новое название
файла для интерфейса. Сгенерированное имя — это просто полностью квалифицированное
имя интерфейса. Оно будет использоваться классом для реализации интерфейса. Текстовое
поле New File Name показывает имя файла С# для интерфейса.. Все извлеченные
интерфейсы приводят к созданию нового файла. Инструмент рефакторинга старается поддерживать
соответствие имени интерфейса и имени файла.
Последнее, что необходимо сделать, — это выбрать те члены объекта, которые вы хотите
опубликовать как интерфейс. Конечно, в этом списке отображаются только открытые
члены. Для данного примера выберите следующие открытые члены: Id, Name, Description,
Load, Save И Delete.
Нажатие кнопки OK приведет к генерированию интерфейса. Единственное изменение,
которое происходит в классе Customer — это то, что теперь он реализует новый интерфейс,
как показано в следующей строке кода:
public class Customer : BusinessDomain.IDomainObject
Затем интерфейс извлекается в новый файл. В листинге 9.4 показан извлеченный интерфейс.
using System;
namespace BusinessDomain {
interface IDomainObject {
void Delete();
string Description { get; set; }
int Id { get; set; }
void Load(int id);
306
Часть III. Программирование и работа с кодом
string Name
void Save() ;
get; set;
}
Следующий шаг нашего примера — это реализация нового интерфейса во всех объектах.
Это придется делать без помощи рефакторинга. Однако Visual Studio предоставляет смарт-
тег для реализации интерфейса. На рис. 9.18 показан смарт-тег, который получен в
результате ввода iDomainObject после объявления класса Vendor.
В данном случае у вас есть два варианта: реализовать интерфейс или явно реализовать
интерфейс. Первый вариант проверяет текущий класс в поиске применимых реализаций.
Второй вариант генерирует код, который явно вызывает элементы интерфейса. Он помещает
весь этот код в область для данного интерфейса. Эта возможность может быть очень
полезна в том случае, когда вы делаете заглушку для нового класса, основанного на интерфейсе.
Следующие строки кода дают пример явного объявления членов интерфейса:
void IDomainObject.Load(int id) {
throw new NotlmplementedExceptionO;
}
<ч?> Contoso - Microsoft V&u*
^^<lgj£««li
File Edrt View Rrfactor Project ButU Debug Data Tools Test Window Help
Л % <Ц a* st «pc - *l i _j > . .» *j j> ; _
Productcs* S>pm*iftQjbjBfct^ ▼ *
'"SBuiinessDcmairt Product
- #. 1
asi.'ig System.Collections.Generic;
-jsirc Syscenj.Linq;
usiTig System Text;
П pufclxc cldas F; *
sDontaii { [tnterface Bmmes.gDornain IDomainObject|
\A*
public int Id {
get { refjrTi _id;
set { id - vftl^e;
Implement mterfece 'IDomainOb^ecl'
Exp^citly implement interface IDomainObject'
string _creaxar;
public string Greater {
get { recim _creacar; }
set } creator - value; '
string _name;
Ш
%
Jr, ffW list
R«d>
Рис. 9.18. Реализация интерфейса
Параметры рефакторинга
Иногда вам необходимо изменить сигнатуры ваших методов (удалить элемент, добавить
локальную переменную в качестве параметра или изменить порядок существующих пара-
Глава 9. Рефакторинг кода
307
метров). Эти изменения требуют также и корректировки всех вызовов данного метода.
Выполнение такой корректировки вручную может привести к внесению в код новых ошибок.
Предположим, что вы хотите поменять местами два параметра одного типа (например, типа
int). Если вы забудете изменить вызов метода, то возможно это и будет работать, но
работать оно будет неправильно. Найти такие ошибки бывает непросто. Поэтому Visual Studio
предоставляет операции рефакторинга для удаления и переупорядочивания параметров, а
также для превращения локальной переменной в параметр.
Удаление параметров
Операция рефакторинга Remove Parameters (Удаление параметров) позволяет вам выбрать
один или более параметров данного метода, конструктора или делегата и удалить их из
метода. Она делает также обновление всех вызовов данного метода и удаляет значение,
передаваемое параметру.
Операция Remove Parameters вызывается при помощи размещения курсора внутри
сигнатуры метода и последующего выбора в меню Refactor пункта Remove Parameters. Вы
можете также добраться до этой операции через контекстное меню (щелчок правой кнопкой
мыши). Кроме того, эта операция доступна также в визуальном конструкторе классов и в
окне Class Details.
Совет
Для вызова с клавиатуры операции удаления параметров сначала поместите курсор в
метод, содержащий параметры, которые вы хотите удалить. Затем сыграйте аккорд
<Ctrl>+<R>, <Ctrl>+<V>.
Рассмотрим пример. Предположим, что у вас есть метод со следующей сигнатурой:
public static Order GetCustomerOrder(int customerld, int orderld)
Modrfiff Type Parameter
Preview method signature,
public static Order GeiCustornerOrder(int orderld)
У] Preview reference changes
j OK "| Cancel ]
I Removing « pi rameter whose call site puses an argument which modifies the state of the
£ « \ program can cause unexpected runtjme behavior.
Рис. 9.19. Диалоговое окно Remove Parameters
Этот метод возвращает объект Order по идентификационным номерам клиента и заказа.
Допустим, вы определили, что для получения объекта достаточно идентификатора заказа.
308
Часть HI. Программирование и работа с кодом
В этом случае вы вызываете операцию рефакторинга Remove Parameters и получаете
диалоговое окно Remove Parameters (рис. 9.19). Наверху окна перечислены параметры метода.
Для удаления одного из них надо его выбрать и нажать кнопку Remove. Удаляемый элемент
после этого помечается зачеркиванием. Если вы передумаете, то вы можете использовать
кнопку Restore для отмены удаления отдельных параметров.
Когда вы готовы выполнить удаление, то можете либо просмотреть изменения, либо
применить их без проверки. Опция предварительного просмотра работает так же, как и остальные
предварительные просмотры. Она просто показывает вам все изменения в виде дерева и
позволяет вам увидеть подробности изменения. Вы можете также отменить конкретные
изменения. Когда вы закончите просмотр, примените итоговый набор изменений к вашему
коду.
Предупреждение
Часто встречается объявление локальной переменной внутри метода и передача этой
локальной переменной в качестве вызова другого метода. Если вы используете
операцию рефакторинга для удаления параметра вызываемого вами метода, то
локальная переменная в вашем вызывающем методе все равно останется. Будьте
внимательны— нужно ли вам это? Если нет, то вам придется удалить локальную
переменную вручную.
Превращение локальной переменной в параметр
Очень часто разработчику приходится брать переменную из метода и делать ее параметром
метода. Например, вы можете найти внутри метода значение и присвоить это значение
локальной переменной. Вместо того чтобы делать поиск внутри метода, вы могли бы передать
это значение в метод (вы могли бы использовать операцию рефакторинга "извлечение
метода" для того, чтобы выделить присваивание значения в новый метод).
Такая трансформация локальной переменной в параметр может быть выполнена
автоматически при помощи операции рефакторинга Promote Local Variable to Parameter. Она
позволяет выбрать локальный член данного метода и ввести его в состав параметров данного
метода. Инструмент рефакторинга обновляет также и все вызовы метода.
Вы вызываете операцию рефакторинга при помощи установки вашего курсора на ту строку
кода, которая объявляет переменную. Затем вы выбираете в меню Refactor пункт меню
Promote Local Variable to Parameter. Вы можете также получить доступ к этой операции
через контекстное меню (щелчок правой кнопкой мыши).
Совет
Для вызова с клавиатуры операции рефакторинга Promote Local Variable to
Parameter сначала установите ваш курсор на ту строку кода, которая содержит объявление
переменной. Затем сыграйте клавиатурный аккорд <Ctrl>+<R>, <Ctrl>+<P>.
Примечание
Вы можете превращать в параметры локальные переменные только там, где они
инициализируются. Иначе операция выдаст ошибку, поскольку она не знает, как обновить
вызовы метода. Фактически если объявление и инициализация находятся в разных
строках кода, то вы не можете использовать данную операцию рефакторинга. Этот
Глава 9. Рефакторинг кода
309
метод рефакторинга лучше всего работает тогда, когда объявление и инициализация
(присваивание) делаются в одной строке.
Давайте проработаем пример. Предположим, что у вас есть метод, который принимает
идентификатор заказа и возвращает объект Order, как в следующей сигнатуре метода:
public static Order GetCustomerOrder(int orderld)
При просмотре этого метода вы замечаете, что там имеется присваивание переменной,
которое получает идентификатор клиента следующим образом:
int customerld = GetCustomerld(orderld);
Предположим, вы установили, что поиск идентификатора клиента по идентификатору заказа
очень неэффективен по двум причинам. Во-первых, вы должны знать идентификатор
клиента еще до вызова метода. Во-вторых, вы хотите искать заказ внутри этого метода. Когда вы
ищете идентификатор клиента в заказе, то ищете заказ два раза. Поэтому вы
идентифицируете это присваивание переменной как хороший вариант для продвижения в сигнатуру
метода. Для этого вы должны сначала щелкнуть правой кнопкой мыши по той строке кода, в
которой выполняется присваивание, а затем выбрать в контекстном меню Refactor пункт
Promote Local Variable to Parameter.
В данном случае предварительного просмотра изменений нет. Вместо этого Visual Studio
делает рефакторинг. Присваивание из метода удаляется. Сигнатура метода изменяется
следующим образом:
public static Order GetCustomerOrder(int orderld, int customerld)
Кроме того, вызовы этого метода также обновляются. В данном случае вызов
GetCustomerOrder будет теперь содержать код, который ранее выполнял присваивание
переменной — GetCustomerld (orderld). Вот пример:
Order newOrder = Customer.GetCustomerOrder(odrId, GetCustomerld(orderld));
Здесь есть один недостаток — код данного примера определил переменную идентификатора
заказа с именем odrid (см. предыдущую строку кода). Рефакторинг использовал код
присваивания переменной, в котором идентификатор заказа был orderld. Это приведет к
ошибке компиляции, которую вам придется исправлять вручную, поскольку у вас теперь
есть переменная orderld, которую вы не объявляли. Конечно, этого не случится с
константами или в тех случаях, когда для обозначения одних и тех же вещей вы используете в
разных методах согласованные имена.
Некоторые советы по превращению
Константы ведут себя как самый лучший тип локальных переменных для превращения в
параметры. Причина в том, что нет проблемы с обновлением вызывающих клиентов. Если у
вас есть локальная переменная с присвоенным ей постоянным значением, то вы можете
обновить вызовы этим фиксированным значением.
Однако когда вы превращаете переменную, которая содержит вызов объекта в
присваивании, то получите предупреждение, показанное на рис. 9.20. Превращение переменной,
присваивание которой является результатом вызова другого метода, требует того, чтобы
вызовы (которые необходимо обновить в результате продвижения) также имели возможность
вызвать объект, который делает присваивание.
310
Часть HI. Программирование и работа с кодом
Предположим, что у вас есть объявление переменной и присваивание:
int Customerld = GetCustomerFromOrder(orderld) ;
Если вы превращаете Customerld в параметр, то вызовы метода должны будут иметь
ссылку на объект, который содержит GetCustomerFromOrder. Если они ее не имеют, то вы
получите ошибку компилятора (и соответствующее предупреждение). Является ли это
проблемой — зависит от того, как вы организовали свой код и ссылки.
The initial value 'GetCustomerId(ord«lrf)' may not be legal at call sitei
Continue апулву?
Рис. 9.20. Предупреждение при продвижении
Когда вы превращаете в параметры локальную переменную, то параметр добавляется в
конец сигнатуры функции. Возможно, вы хотите именно этого. Однако возможно, что вы
хотели бы упорядочить все по-другому (для повышения читабельности и улучшения
сопровождения кода). Для этого вам необходимо использовать совместно операцию рефакторинга
Reorder Parameters и превращение в параметры.
Перестановка параметров
Обычно вы перемещаете параметры метода для повышения читабельности и облегчения
сопровождения кода. Возможно, вы захотите разместить более важные параметры первыми
в сигнатуре метода, либо вы пожелаете поддерживать порядок параметров аналогичным для
всех схожих методов или перегрузок. Операция рефакторинга Reorder Parameters
позволяет вам изменить порядок параметров метода, конструктора или делегата. Она также
обновляет все вызовы метода и переставляет передаваемые в вызове параметры.
Вы вызываете операцию перестановки параметров при помощи установки курсора внутри
сигнатуры метода (содержащего параметры, которые вы хотите переставить), а затем в
меню Refactor выбираете пункт Reorder Parameters. Вы можете также получить доступ к
этой операции через контекстное меню (щелчок правой кнопкой мыши). Кроме того, эта
операция доступна и в визуальном конструкторе классов.
Совет
Для вызова с клавиатуры операции перестановки параметров сначала установите
курсор внутри сигнатуры метода, содержащего параметры, которые вы хотите
переупорядочить. Затем сыграйте клавиатурный аккорд <Ctrl>+<R>, <Ctrl>+<0>.
Рассмотрим пример. Предположим, что вы только что выполнили пример Promote Local
Variable, в котором в параметр метода был превращен локальный идентификатор клиента.
Вот сигнатура метода:
private static Order InitCustomerOrder(int orderld, int customerld)
Глава 9. Рефакторинг кода
311
Этот метод называется initCustomerOrder. Предположим, что поскольку параметр
customer идет в имени метода первым, то вы хотите сделать его первым параметром
метода. Для этого вы устанавливаете курсор на метод и вызываете операцию рефакторинга
Reorder Parameters. При этом вы получаете диалоговое окно Reorder Parameters.
Это диалоговое окно позволяет вам модифицировать порядок параметров данного метода.
В верхней части перечислены все параметры метода. Справа от этого списка имеются две
кнопки. Кнопка со стрелкой вверх перемещает выделенный параметр вверх по списку.
Кнопка со стрелкой вниз — наоборот. Используйте эти кнопки для того, чтобы получить тот
порядок параметров, который вам нужен. На рис. 9.21 показан данный пример в диалоговом
окне Reorder Parameters.
I Reorder Parameter* ^j||||H
Parameters:
Modi Ту- Parameter
II int customcrld
J int orderld
Preview» method stgnalure:
pubhc static Ordef 6dCu$torner0fdef(rntcustomertd, mt ordedd)
V Preview reference changes
j OK J | Cancel J
Рис. 9.21. Диалоговое окно Reorder Parameters
Обратите внимание, что при изменении порядка параметров под списком параметров
выводится итоговая сигнатура метода. Вы можете также предварительно просмотреть все
изменения, которые будут сделаны в вызовах метода. Нажатие кнопки ОК применит все
изменения к методу и его вызовам.
Инкапсуляции поля
Довольно часто приходится из закрытого поля вашего объекта создавать свойство. Эти поля
могли быть созданы как закрытые потому, что они использовались только внутренним для
объекта образом. Либо разработчик мог просто определить открытое поле (вместо того,
чтобы инкапсулировать его как свойство). В любом случае, если вам нужно изготовить
фактическое свойство из поля, то вы можете сделать это при помощи операции рефакторинга
Encapsulate Field (Инкапсуляция поля).
Доступ к операции Encapsulate Field
Операция инкапсуляции поля позволяет вам быстро сгенерировать свойство из поля.
Конечно же, свойства позволяют вам защитить поле от прямого доступа и узнавать о модифика-
312
Часть III. Программирование и работа с кодом
ции и доступе к данному полю. Для инкапсуляции поля вы просто устанавливаете курсор на
это поле, а потом выбираете из меню Refactor пункт Encapsulate Field. Вы можете также
сделать это и через контекстное меню (при помощи правой кнопки мыши) или в визуальном
конструкторе классов.
Совет
Для того чтобы вызвать операцию инкапсуляции поля с клавиатуры, сначала
установите курсор на то поле, которое вы хотите инкапсулировать. Затем сыграйте
клавиатурный аккорд <Ctrl>+<R>, <Ctrl>+<F>.
Диалоговое окно Encapsulate Field
Диалоговое окно Encapsulate Field (рис. 9.22) позволяет вам настроить несколько опций
для этой операции рефакторинга. Во-первых, оно представляет то поле, которое вы хотите
подвергнуть рефакторингу, в текстовом поле Field name. Затем, оно позволяет вам задать
имя для нового свойства. Хорошая новость состоит в том, что инструмент рефакторинга
попытается корректно назвать ваше свойство. Например, если у вас есть закрытое поле с
именем _rating, то инструмент выберет по умолчанию Rating в качестве имени свойства.
£roperty name J
•ШШЦ I
Update references.- 1
a External II (
LJ Preview reference changes I
. [_ Search \j\ comments И
F~ Search m strings I
[ OK [ | Cancel | I
Рис. 9.22. Диалоговое окно Encapsulate Field
Дополнительная опция этого диалогового окна — это выбор ссылок, которые вы хотели бы
обновить. Здесь имеются в виду существующие ссылки на данное поле. Предположим, что у
вас есть открытое поле. Это поле может вызываться как внутри объекта, который его
определяет, так и другими (внешними) объектами. Возможно, вы захотите принудительно
обеспечить использование нового свойства внешними объектами. Для этого нужно использовать
настройку External. В данном случае объект, который содержит данное поле, будет по-
прежнему ссылаться на локальное закрытое поле (а не на свойство). Установка опции
Update Reference в значение АН приведет к тому, что и внешние, и внутренние вызовы будут
использовать свойство.
При применении инкапсуляции инструмент рефакторинга изменяет ваше внутреннее поле
на закрытое (если оно еще не закрыто), а затем генерирует свойство. Свойство содержит
Глава 9. Рефакторинг кода
313
методы доступа get и set для поля. Если поле было объявлено как "только для чтения", то
инкапсуляция генерирует только метод доступа get.
Давайте посмотрим код. Предположим, что у вас есть следующее объявление поля:
private int _rating;
Вы хотите инкапсулировать это закрытое поле в открытое свойство. На рис. 9.22 показаны
опции инкапсуляции. При этом генерируется такой код:
private int _rating;
public int Rating {
get { return _rating; }
set { _rating = value; }
}
Кроме того, если вы выберете в диалоговом окне Encapsulate Field значение All для опции
обновления ссылок, то ваши внутренние вызовы данного поля (оно было закрытым) будут
обновлены для того,- чтобы внутри использовалось свойство.
Резюме
Данная глава показала, что инструменты рефакторинга (встроенные в редактор С# для
Visual Studio 2008) могут значительно увеличить производительность и снизить количество
нежелательных побочных эффектов (ошибок) при выполнении изменений в вашем коде,
предназначенных для улучшения его сопровождения, повторного использования и
читабельности. Инструменты рефакторинга используют компилятор (а не текстовый поиск). Это
повышает доверие к инструментам рефакторинга и их надежность.
Доступ к этим инструментам можно получить при помощи клавиатуры, меню Refactor,
контекстного меню, визуального конструктора классов, а также и в других местах. Работа
операции рефакторинга зависит от контексга выделенного фрагмента кода.
Инструменты рефакторинга позволяют вам изменить ваш код разными способами. Вы
можете легко переименовывать элементы вашего кода. Вы можете взять существующие строки
вашего кода и извлечь их в новые методы. Ваши объекты могут быть использованы как
основа для определения новых интерфейсов. Сигнатуры методов можно модифицировать при
помощи таких операций рефакторинга, как Remove, Promote Local Variable и Reorder.
Наконец, вы можете взять существующие поля и быстро инкапсулировать их в свойства.
Глава 10
Отладка кода
В наши дни программисты могут проводить за отладкой кода столько же времени, сколько
они тратят на его разработку. Так получается отчасти из-за того, что сегодняшние
приложения имеют распределенный и очень взаимозависимый характер. Эти приложения созданы с
использованием существующих функциональных возможностей, инфраструктур, библиотек
и т. д. Кроме того, они часто ведут обмен с другими приложениями, сервисами,
компонентами, базами данных и даже системами обмена данных. Поэтому разработчикам требуется
все больше помощи от отладчиков (для увеличения производительности труда). Отладчик
Visual Studio 2008 отвечает этим потребностям, предлагая отличные сценарии отладки. Вот
некоторые основные факты:
О управление точками останова и отслеживания;
* □ визуализаторы и DataTips отладчика;
□ функции Edit and Continue для разработчиков на С# и VB;
□ отладка по принципу "только мой код";
□ помощник Exception Assistant;
□ поддержка отладки на стадии проектирования;
□ отладка скриптов на стороне клиента;
□ поддержка отладки приложений WCF;
□ поддержка отладки LINQ;
□ удаленная отладка.
В этой главе мы опишем все эти функциональные возможности, и не только их. Конечно,
если вы только начинаете работать с .NET, то этот список выглядит для вас незнакомым.
Отладчик Visual Studio развивался, начиная с первой версии .NET, которая предоставила
унифицированный отладчик с возможностью отладки на нескольких языках. В этой главе
мы начнем с описания основ отладки приложения. Затем мы обсудим отладчик Visual Studio
2008 подробно.
Глава 10. Отладка кода
315
Основы отладки
Для разработчика самое обычное дело — это создать экран или форму и начать писать код,
который их окружает. Кроме того, разработчик может опираться на Framework или
некоторые компоновочные блоки, которые предоставляют дополнительные функциональные
возможности. Приложение может также вести обмен с уровнем сервисов и очень часто —
с базой данных. Даже самые обычные приложения имеют очень много "движущихся частей".
Эти движущиеся части делают задачу отыскания и ликвидации ошибок в коде все более
сложной. Инструменты, которые помогают вам выслеживать и удалять ошибки из вашего
кода, должны не только поспевать за всей этой сложностью, но также и уменьшать
трудоемкость процесса отладки. В следующих разделах мы опишем, как разработчик использует
встроенные в Visual Studio 2008 инструменты для отладки типичного сценария разработки.
Сценарий
Мы должны определить сценарий приложения, который будем использовать как для того,
чтобы представить вам основы отладки, так и для того, чтобы он служил базой для
демонстрации многих функциональных возможностей инструментов отладки в этой главе. В этом
сценарии представьте себе, что вы пишете Web-страницу, которая позволяет клиентам
просматривать и редактировать свои профили. Эта страница даст новые функциональные
возможности уже существующему большому приложению. Вот некоторые условия этого
сценария приложения:
□ профили клиентов хранятся в базе данных SQL 2005;
□ библиотека доступа к данным абстрагирует весь доступ к базе данных;
□ имеется Web-сервис, который предоставляет информацию по профилям клиентов.
Ваша задача — написать страницу, использующую Web-сервис для предоставления
информации о профиле клиента. Эта страница должна показывать информацию по профилю
клиента и позволять пользователю редактировать эти данные. Вам понадобится также
записывать изменения в профиле клиента назад в базу данных (при помощи библиотеки доступа к
данным). Приложение, которое вы будете отлаживать в этом сценарии, написано на языке
С#. Однако инструменты отладки Visual Studio можно с одинаковым успехом использовать
как для С#, так и для VB. То есть все, что мы обсуждаем здесь, применимо к обоим языкам
(если специально не указано обратное).
Множество фаз отладки
Почти каждый раз, когда разработчик открывает интегрированную среду разработки, он
каким-либо образом отлаживает свой код. Граница между написанием кода и его отладкой
все больше и больше размывается. Например, редактор кода помогает устранять ошибки
вашего кода прямо в процессе его написания. Он выделяет элементы с ошибками и
позволяет вам исправлять их. То есть вы одновременно пишете и отлаживаете.
Кроме того, компилятор работает как еще один инструмент отладки. Когда вы в первый раз
нажимаете кнопку Run, то компилятор проверяет ваш код и выдает вам список ошибок для
их устранения. Это отладка.
316 Часть HI. Программирование и работа с кодом
Шаги (или фазы) процесса отладки включают в себя:
□ кодирование — редактор помогает вам, указывая на проблемы и предлагая возможные
пути их решения;
□ компиляцию — компилятор проверяет ваш код и сообщает об ошибках перед тем, как
двигаться дальше;
□ самопроверку— вы запускаете приложение в режиме отладки и проходите по шагам
его код и экраны (для проверки функциональности);
□ модульное тестирование— вы пишете и прогоняете модульные тесты для проверки
вашего приложения;
□ анализ кода — вы запускаете анализатор Static Code Analyzer для проверки
соответствия вашего приложения стандартам проекта;
□ экспертиза кода — ваш код проверяется вашим сослуживцем или архитектором
программного обеспечения и имеющиеся проблемы регистрируются;
□ реакция на ошибку — когда в коде зарегистрирована ошибка, вы должны воссоздать ее
и отладить конкретный сценарий.
В этой главе мы сконцентрируемся на двух из этих фаз: самопроверка и реакция на ошибку.
Это те две фазы, на которых разработчик получит максимальную отдачу от инструментов
отладки, встроенных в Visual Studio. Поэтому мы предположим, что код уже написан и
компилируется. Давайте начнем с самопроверки кода.
Примечание
Экспертиза кода — это еще один очень важный инструмент отладки вашего
приложения. Она помогает обеспечить соответствие стандартам и гарантировать выполнение
вами рефакторинга таких вещей, как дублированный код. Здесь может помочь
анализатор Static Code Analyzer в Visual Studio. Этот инструмент описывается в главе 26.
Отладка приложения (самопроверка)
В данном сценарии вы только что начали писать Web-страницу для редактирования
профиля клиента. Предположим, что вы сделали компоновку страницы, подключились к Web-
сервису информации о профилях и написали код для сохранения профиля пользователя в
базе данных. Теперь вам нужно начать самопроверку вашей работы (для того чтобы
убедиться в том, что все работает так, как вы ожидаете).
Первый шаг — запуск вашего приложения в режиме отладки. Это позволит вам входить в
ваш код при возникновении ошибки. При разработке это обычно и есть ваш режим работы
по умолчанию. Сначала вы запускаете режим отладки при помощи нажатия кнопки Run
(зеленая стрелка в панели инструментов Standard или Debug). На рис. 10.1 показано
приложение, которое готово к первому выполнению в режиме отладки. Обратите внимание на
курсор, который наведен на кнопку Start Debugging.
Включение отладки на Web-сайте
Наш пример — это Web-приложение. Поэтому оно требует настройки отладки на серверной
стороне, ошибки и информация о которой будут выводиться удаленному клиенту. Конечно,
Глава 10. Отладка кода
317
в большинстве случаев разработчики пишут код и отлаживают его на одном и том же
компьютере для разработки. Однако иногда вам может понадобиться отладить процесс на
тестовом сервере.
шзшшшшшт
File Edit
ТооШсяГ
View Project Buttd Debug Format ТаЫе Tools Test Window Help
■ЗУ*.* 1 AJ^^JLl-
<- 4 X , E<BtCurtomerPfo»c-Mp).
'^x
It Pointer
A label
'*M| TextBox
© Button
Q>) LinkButton
fj) ImageButton
„A. HunorE bk_ „
Sewer Екр1»«г
i*, '^3 Database Diagra -
£ _U Tables
i- 23 customer j
Hid jB
*Ц name i
1 3 email i
• 3J addressl~
| D address2
2 chy
31 state
Ц zip
4| Server Explo . Eg] Ьт Sfeure«
.% jki Debug
jStart0cbugghg(F5j[r-«n masterj
Contoso
Ji j d
Й^шИВ^о
«Wftte^lfol > J
«~. 3
1 1
klJ *"> 1
piip^v # I
Ц^. ^frttfM^--l§l
|Сплг?псР1агеНо1й>гМ8 г (artom^PsKSsL
JEdit Customer Prclii
JNam* |
1 email |
lAddreu |
1 [Lab*l3j (
Icily |
folate [
ljP [
IPhon* [
1 Contact via e-mail Г [CheckBox
IContact vfo phorw Г [CheckBox
1 „ r 1 f ' '
'1 Style Application: Manual
Sotimor» f»ptarff - csoiUL » u
Ы£21 Ш!3 Ш
j|J Program c*
№ ^3 BusineKDcnuirv
H ^J Сотою
T JM Properties
* ^ References
+, ~j App_Data
a) ~^ App_Themes
* /_j DefaurLasp*
V Iji] EdrtCustomerProfite
^SoL.[jfPf
yM
Menace Styles ■* 9 >
"^NewCtyle . | Options ~
Aj, Attach Sty* S4«L.
CSS styles:
>>)bedy
i J Design | a Split a Source ' |<| ««pcContentfCantei ► j ^Manage Styl (AjTsS^rapr-rtT
3,ErrccLirt
Ready
Рис. 10.1. Запуск отладчика
В любом случае вам нужно включить отладку при помощи настройки в конфигурационном
файле (web.config) вашего приложения. Visual Studio спросит вас о включении отладки при
первом же нажатии на кнопку Run. Этот запрос показан на рис. 10.2. Нажатие кнопки ОК
добавит к приложению конфигурационный файл и начнет сеанс отладки.
#' Modify the Web corrfig f ile to enable debugging
J^ Debugging should be disabled in the Web.conHg file before deploying the Web
wte to a production environment
у Run without debugging, (Equivalent to CtrkFS)
Рис. 10.2. Включение отладки в Visual Studio
Примечание
Важно не забыть выключить отладку в конфигурационном файле перед тем, как
развертывать ваше приложение в производственных условиях. Включенная отладка в произ-
318
Часть III. Программирование и работа с кодом
водственных условиях представляет собой угрозу безопасности. При включенной
отладке ASP.NET записывает подробности ваших ошибок в Web-страницу. Эти подробности
содержат ценную для потенциальных хакеров информацию о структуре вашего
приложения. В некоторых случаях в описании ошибки могут содержаться данные учетной
записи пользователя, использовавшиеся для доступа к защищенным ресурсам.
Для выключения режима отладки вы должны отредактировать конфигурационный файл.
Точнее, вы редактируете элемент Compilation в узле system.web. Вы устанавливаете
debug в значение false. Вот пример XML с включенным режимом отладки:
<system,web>
^compilation debug="true"/>
</system.web>
Старт в режиме отладки
Самый типичный сценарий начала сессии отладки— это нажатие кнопки Run на панели
инструментов. Это работает со всеми типами приложений (включая приложения Windows и
ASP.NET). Это действие дает указание для Visual Studio откомпилировать приложение и
вывести начальную форму или страницу.
File Edrt View Project Build
Jb Л" J Л S А Ал
ЬЫЬш -г л X
,_ „Standard " _ * f~
^ Pointer ^ i
A Label |
•*i TextBox
|4b) Button ]
Q[) LmkButton .
(j) ImageButton
Л Huw«.rf mk
Server btpterer *• 4 X
53 % *И1_
t*j JJ Dttabase Dtagn *
i-, Л Tables _
£ 33 customer !
? id I.
^3 name
j] email
'3 addressl
3 address2
31 city
U state
Л iip
I Gebugj Format Tool* Test Window Help
* Window*
V Start Debugging
> Start Without Debugging
J^ Attach to Process
Exceptions...
*3 Step Into
Qi Step Over
futgleC'eaka-mt
New Breakpoint
- Celek;* &■
[Labels]
City
Stat*
Zip
Phon*
Contact via •mail Г [CheckEox: .
Contact via phone Г [CheckBox
•$i Server Explo
[,£ Ere r List
Ready
I OK I I Cancel
Oa<a bcarces i ~* Design 3 Split il Source и I <asp.Ccntsnt*Contei ►
I! • - U -^ Ло
JjJ Program cs * 11
+} yji BusinesiDomdin
H ^]J Contoso
а Л Properties
{. ^ References
♦ ^3 App_Data
♦, ^A App_Themes
■» _] Defaultaspi
4 i fir ►
C?TJ So I Uti ^ihofg . Jv('^^>
Manage Stvles
A^.New We.., (
Aj, Attach Sty eSTifit.
LbSrtytes: __
Э bod/
» a
<? .tide
» 4 К
Optow -
^ Manage Styl fa| CSS =>, cprti"
Рис. 10.3. Запуск приложения без отладки
Приложения можно запустить и без отладки (включая приложения Windows и ASP.NET).
Эта возможность полезна в том случае, когда вы хотите прикрепиться к уже
выполняющемуся процессу или просто хотите пройти по приложению и увидеть его так, как видит
пользователь (без выхода в интегрированную среду разработки). Для того чтобы запустить ваше
Глава 10. Отладка кода
319
приложение без прикрепления к отладчику Visual Studio, необходимо в меню Debug
выбрать пункт Start Without Debugging. На рис. 10.3 показан именно такой пример.
Вы можете также начать проходить код построчно. Такой способ полезен тогда, когда вы
хотите увидеть выполнение всего вашего кода (а не только ошибок). Вы можете
использовать этот вариант тогда, когда ваше приложение ведет себя неожиданно. Прохождение
построчно даст вам точное понимание того, что происходит с вашим кодом.
Для прохождения по коду Web-формы обычно сначала надо открыть главный исходный
код. Затем следует щелкнуть правой кнопкой мыши и выбрать в контекстном меню пункт
Run to Cursor. На рис. 10.4 показан пример. Эта команда говорит Visual Studio о том, что
нужно выполнить приложение до данной точки. В этот момент интегрированная среда
откроется в режиме отладки и там вы сможете пройти каждую строку кода по отдельности
(или продолжить его выполнение, и т. д.).
>jr> Contoso - Microsoft Viiual Studio
File Edit View Redactor Website Build Debug Data Tools Test Anarrie
Jj * -1 ' <J? *l k# * *J ^ -<*#-'► Debug - Muted P
Л *& ^ к» iW XW Z
< App.Code/Curtomcn.a \ &&&щ^ , OAJUs!
a j ^Customers ▼ 4Get(intidf
new Dit*Acc««i " -
»«vjrnI>*LfiT»bLi i
Ready
'h
u
ol„
Ji
«a
A
-J
View Designer
Refect or ►
Orgentre Ustrvgs ►
Create Unit Teste.
Insert Snippet-
Surround With
Go Tc Definition
Find All Refaences
Breakpoint ►
Run To Cursor .
Cut Uf
Copy
Outlining ►
'»ddi««»l"l.TaStringi
у 'J TcStx_ngv ;
Udt Raw» CO] "ceitKt.
3) [~d«*crtpt*3n,,l TcS-
il1' 1 TcScrxcg');
»"! TcStrin?;};
)Г"х p-J TaStrirqt);
tt*' ] .TDStrinaO ;
e {
i
ring О ;
,
-
J
ь
Soiuisn Dpiofet,. ▼ 3 X у
^3 Solution Ccnleso (' ' »
i J3 Adm.nUi о
♦, J3 BusinrisDomdin <
- Jfr С \ * Business^! *
-J App.Code
^У Ciistcmei
* roomainS
4] Orders cs
4J Products
E' ~J App_Dat3
* J ccntoio г
(• ^B.n
ЗЙ Customers as
^) Orders asrm
*fl Products.asir
_J web conftg
2 ^ Contoso
( _^ Properties
i+ J References
ti _4 Service Pefen
_] App_Data
Рис. 10.4. После выбора пункта Run to Cursor вы можете начать отладку
Останов на ошибке
Не все, что вы обнаруживаете в режиме отладки, является ошибкой, которая приведет к
прерыванию кода. Часто проблемы возникают просто потому, что вы проверяете поведение
приложения. Например, элемент управления может находиться не на месте, порядок
вкладок неправильный и т. д. Для проверки таких вещей вам по-прежнему приходится
полагаться на свои глаза. Инструменты отладки Visual Studio помогают вам работать с остановами
вашего кода.
При возникновении в вашем коде необработанных исключительных состояний отладчик по
умолчанию прервет выполнение и перейдет в интегрированную среду, где ошибочный код
будет выделен. Ключевыми в этом предложении являются слова "необработанные исключе-
320
Часть III. Программирование и работа с кодом
ния". Они обозначают те места вашего кода, где у вас нет блоков try/catch для обработки
исключения. Обычно это хорошая настройка по умолчанию для работы. Однако часто
бывает нужно видеть и обработанные исключения тоже.
К счастью, можно настроить те ошибки, которые приводят к останову работы в
интегрированной среде. Например, вы можете обработать определенное исключение в вашем коде и
не желать, чтобы вас выбрасывало в интегрированную среду каждый раз, когда оно
происходит. Вместо этого вы хотите получать уведомления о действительно исключительных
состояниях. Диалоговое окно Exceptions позволяет вам управлять набором тех исключений,
которые вас интересуют. Доступ к этому диалоговому окну можно получить через меню
Debug | Exceptions (или по нажатию комбинации клавиш<Си*1>+<0>, а затем <Е> в языке
С# или <Ctrl>+<Alt>+<E> в языке VB). На рис. 10.5 показано это диалоговое окно.
В диалоговом окне Exceptions исключения для облегчения доступа сведены в категории по
пространствам имен (есть также и функция поиска Find). Главный интерес здесь
представляют два столбца флажков: один для Thrown (Сгенерированные), а другой для User-
unhandled (Пользовательские необработанные). Обратите внимание, что по умолчанию
установка для всех исключений .NET Framework— это User-unhandled. Это означает, что
отладчик должен прервать выполнение только тогда, когда данное исключение
сгенерировано, но не обработано вашим кодом.
Добавление флажка Thrown даст указание отладчику прерывать выполнение даже в том
случае, когда у вас есть код для обработки данного исключения. Отладчик отреагирует
остановом на строке исключения (до вызова вашего обработчика). Если вы хотите использо-
( вать эту опцию, то следует обдумать ее использование на уровне категорий. Например, вы
можете включить Thrown для всей категории Common Language Runtime Exceptions.
Более тонкая настройка конечно также возможна. Однако частое изменение этих настроек
приводит к путанице, т. к. отладчик прерывается в разных местах (в зависимости от
сгенерированного исключения).
Break «vhen an exception is.
Name
t C+* Deceptions
Common Language Runtime Exceptions
'+) J Script Exceptions
H System
SystemAccusVralatiDnException
System.AppDornainlln1cadedException
SystemArgumentException
System ArgumenLNuttE«ceptton
Syitem-ArgumentOutOfRangeEaceptiort
SystemArLthmeticException
SyitrmwArrayTyprMumatchExteption
System,EtedIrn*geFormatEitecptK>n
•wrtrtwn ГлпппИ lr»ln»rtunnfWn;wnFw*t»hnn
Ihrown
.
—
i I
—
* i
vJ
)
_J
Zl
n
1
LJwunKandled *
N
[£
t:
к
\i
L
\L
11
w:
K.
k
»
r>
Рис. 10.5. Определение мест прерываний Visual Studio
Отладка ошибки
Первый шаг отладки вашего приложения — это нажатие кнопки Run. После этого ваше
приложение запускается в режиме отладки. Как это часто бывает, приложение нашегЬ при-
Глава 10. Отладка кода
321
мера (которое мы обсуждали в нашем сценарии) порождает исключение в момент запуска.
Отладчик реагирует выходом в код и показывает строку с ошибкой. На рис. 10.6 показан
обычный вид редактора при останове на ошибке.
Есть несколько пунктов, которые хотелось бы отметить по стандартной отладочной сессии,
показанной на рис. 10.6. Во-первых, Visual Studio выделила строку, на которой была
сгенерирована ошибка. Вы можете ясно видеть это по стрелке и выделенному тексту.
Затем, обратите внимание на окно в правой верхней части изображения. Это помощник
Exception Assistant. Он предоставляет подробности по исключению и предлагает советы по
поиску ошибки и устранению проблемы. Из этого окна вы можете получить доступ к
нескольким действиям, и в том числе к поиску в интерактивной системе помощи
дополнительной информации по данному исключению.
В нижней части экрана находится еще несколько дополнительных полезных окон. Слева
окно Locals— оно автоматически показывает значения, присвоенные всем локальным
переменным в коде, где было сгенерировано исключение. Это дает вам легкий доступ к
ключевой информации, которая может пригодиться. Обратите внимание, что ниже этого окна
находится неактивная вкладка Watch 1. Это окно контрольных значений; оно отслеживает
настроенные вами сценарии наблюдения (подробнее об этом несколько позднее).
Окно в правой нижней части экрана — это стек вызовов (Call Stack). Оно показывает
порядок, в котором различные компоненты приложения были вызваны. Вы можете посмотреть
на стек вызовов, чтобы понять, как вы здесь оказались. Вы можете также использовать его
для перехода к любому коду, упомянутому в стеке. Наконец, неактивная вкладка рядом дает
вам доступ к окну Immediate Window (Интерпретация), которое позволяет вам вводить
команды кода и получать результаты в редакторе (подробнее об этом далее).
File Edit View Project Bu8d Debug Tools Test Window Help
► iJffli>*J(JI*|He*^3-J
^$ Contoso.EditCustomerProfile
[^ are Toici LoadCuarcmer (lnt id) (
ServictRefетепсе.;*m,;"""" >j "A
TexcBoxAddxessl.Text - c.Addressl;
TextBoxAddress2.Ts.xt: - c.Addresa2;
TexcBoxCif/.Ttxc - с City;
TextBoxEsuil.Text - c.Euil;
ТехсВахЫ еле.Text - с Наше;
TextBoxPhone.Text - с.Phone;
;li FwH&ccptianMnKunbandledbyusertode
System Web.Servtces,Protccols&»pExcept>on; Sever w» unsbfe to process
request. — > S^emJMfRef erencetxcepHon. Object reference not $rt to an
instance cf an object
etCustomers.Get(Int32 id) in c\Users\msneil\Docurnents\tfsuBl Stud» 2008
\WebS4es\BufTne55Service»\App_Code\Customers.«lfne31
♦ * End of inner exception stack trace—
Troubleshooting tips:
Get qenrral help for «rrpticrw
^«irch for more Help Onfiw .
Actions:
V\tv» IMaiL.
Enable edrting
< Copy exception detail to the с lipboard
locris
1 Name
Value
ItJ <* {exception CSyttem WekServJcesAnhxek Soap&n System.E
bi ф \ht {A'P «iUnAtor**T>rrr*» *sp*,> ContosoJ
<» id 1 frit
W $ custServfcej {ContDao.SerHceR«feence,ajstDmers5«Contoso«
ф с mi Contoeo!
_ * * X [CaKStack
тур* ~*\ I**™
ж Д X
Lane "
Щ Locals ppW&'Kl]
Ready
Ц> Contoso DUlContoto EditCustDmerProfiie LoadCurtomerOnt id - Ct
ContosoCUICorttDso.EdrtOstomerPro№.Pao«_L(^№Klsend СД
lb**"* Cooe]
U^Call Stack l^jlmmedtete A'inidcW |
Ln26 Col 13 ChlJ
Рис. 10.6. Прерывание выполнения в отладчике
322
Часть III. Программирование и работа с кодом
Отладка различных процессов
После изучения вашей ошибки вы видите, что она порождается в процессе Web-сервиса.
Код, вызываемый Web-сервисом, выполняется в отдельном процессе (а не в процессе
запущенного приложения, которым является Web-интерфейс пользователя). Когда вы
отлаживаете приложение, то отлаживаете выполняющийся процесс, такой как исполняемый файл
(exe). Visual Studio по умолчанию считает запущенный процесс приложения первичным
отлаживаемым процессом.
Для отладки кода, который выполняется в другом процессе (таком как процесс Web-
сервиса) вы должны иметь исходный код и прикрепиться к выполняемому процессу (т. е.
работать с отладочной сборкой). Если весь код данного приложения находится в одном
решении, то Visual Studio автоматически прикрепится к каждому процессу. В нашем примере
имеется и процесс Web-интерфейса пользователя, и процесс Web-сервиса. Поэтому в
данном случае вам не придется вручную прикрепляться к другому процессу. Это новая
функциональная возможность Visual Studio 2008.
Однако отладчик не будет автоматически возвращаться в интегрированную среду на
ошибках, возникающих вне первичного процесса. Но он будет выполнять точки останова,
которые вы настроили в коде, выполняющемся в других процессах. Если ошибка происходит в
отдельном процессе (и в этом процессе нет соответствующих точек останова), то отладчик
выйдет в интегрированную среду внутри процесса, который вызвал тот процесс, где
произошла ошибка. Поэтому в нашем примере на рис. 10.6 вы видите, что ошибка находится в
коде библиотеки, которую вызывает Web-сервис. Web-сервис находится в отдельном про-
4 цессе Web-сервера, а не в стартовом приложении (Web-интерфейсе пользователя). Для
отладки этой ошибки вам нужно будет настроить точку останова в Web-сервисе или по
соседству с кодом, на который сделана ссылка.
Transport.
Transport Inf ormahcn
The default transport let: you select processes on thts computer or a remote computer running the Microsoft Visual Studio Remote Debugging
Monitor (MSVSMON EXE).
1 Attach to Automat*
В Available Processes
1 Process ID
I taskeng exe 2036
i TscHelp exe 2264
& vsmsvr.exe 2556
N JH^.^bfШШ1И1 1 Ml 1,11 НИЦ
Managed code
Title
!!■' II ill III 1 1 'lllllll II Illlllllll llllllllllllllll ПИЦЦ ЩЦ 1 p ШПИНИ
1 vvinssnotrfyeve 1540
1 WINWORD EXE 977
Ц WLLoginProxy.ete 2956
II vvmdcae 1760
I ZuneLaunchereve 1476
и ~j Show processes from itl users
I
972710 doc [Compatibility Mode] - Microsoft -
~ Sho* pi ocesses in ell
Type
*86
«86
Managed, xS6
x&6
x86
»86
x86
«86
sessions
User Name
CELDOMAJ№MSnell
CQ DOMAJNNMSnell
CELDOMAJN\M5neJI
CJD< VAI'-^bu-
CELDOMAIN\MSnell
CO DOMAJN\MSnell
CELDOMMWMSneU
CELDOMAIN\M5nell
СИ DOMAlNNMSnell
;^
•
Select., ] |
Session * |
1
1
1
I
1
1
1
1
1
1
Refresh J 1
Cancel | 1
Рис. 10.7. Прикрепление отладчика к выполняющемуся процессу
Глава 10. Отладка кода
323
Примечание
Не забудьте включить отладку Web-приложения при помощи конфигурационного
файла (web.config). Это справедливо также и для приложений Web-сервисов.
Подробности см. на рис. 10.2.
Иногда вам будет нужно вручную прикрепиться к уже выполняющемуся процессу. Вам может
понадобиться прикрепить интегрированную среду к работающему Web-серверу, или у вас
может быть сервисное приложение, к которому вы хотите привязаться отладчиком. При любом
сценарии Visual Studio позволяет вам прикрепиться к процессу и начать сеанс отладки. Для
прикрепления к выполняющемуся процессу (вроде Web-сервера) в меню Debug выберите
пункт Attach to Process. После этого вы получаете диалоговое окно, показанное на рис. 10.7.
На рис. 10.7 обратите внимание на то, что все прикрепленные в данный момент процессы
выделены серым. Это визуальный индикатор того, что вы уже прикреплены к данному
процессу. Для подключения отладчика Visual Studio к процессу вы просто выделяете процесс и
нажимаете кнопку Attach. Теперь вы отлаживаете оба процесса и можете настроить точку
останова в связанном коде, где как раз, возможно, и происходит ошибка.
Настройка точки останова
Для того чтобы отладчик прерывал выполнение вашего кода на определенной строке, вы
настраиваете на этой строке точку останова. Вы делаете это при помощи щелчка по полю
индикаторов данной строки. Либо вы можете щелкнуть правой кнопкой мыши по строке и
выбрать пункт Insert Breakpoint в контекстном меню Breakpoint. В нашем примере ошибка
может идти из кода, который получает данные клиента из базы данных.
* Cento» (Debuet
Mfc- li'iK-Kv '■*'• v^iirrtvr -
пы^ёшоУ!
Filf Edit View Project Buttd Debug Tools Test Window Hdp
J • ~ - -2 «J tf . tk \ **- - £N -' * 'y*n i »|[M.<t<t?qr.^, :| m \
» j d v Я1 Ц1 «i H« -> 3 - * ****<*$: *' U > * * 4d &
j *tS DaUAccess DAL ▼ * ReturnDataTable(SqlStatements statement DbParametr dbp) ▼
'ccarr da.Tablea[CJ; —\
j у public ardCic T >
dbpLlst.Add(dbp);
Rtturr.DataTabLe (~ i" *
ataterrert,
i_»» *<«.- йд - ReturnOataset (statement, dbpLzac);
ictjrn da.?abies{0];
Locate.
'Name __
№ v texcepbon
Ы if the
* id
M it custServKB
**9 К Rail Stack
Value
Type
<"* v-stp» »' eb хчч срч 9' лх-а i. • System.E
{ASP, edtajstomer profte_aspx} Contoso.1
JName
1
rt
{Contoso.ServicEReferencE Custn Contoso,,
пЛ Contuse'
* Conto» oatContoso E(*tCu5tDmerPrDfte.LoadCiJctomer{fit id = С *
Conloso DU.'Corloso.EdrtCustDmerProRe Page_Load(objecl send C4
£P Locals [jQptochT'
Ready
| ^ Call Stack jjrjbnmetitete Window |
Рис. 10.8. Настройка точки останова
324
Часть III. Программирование и работа с кодом
Поэтому вам нужно перейти к проекту DataAccess, открыть файл DAL.cs и настроить точку
останова (рис. 10.8).
Продолжение отладки
Если в сеансе отладки вы ушли с выполняющегося кода, то найти дорогу назад часто бывает
очень трудно. Выполнявшаяся строка потерялась в одном из многих открытых окон с
кодом. К счастью, для того чтобы вернуться назад, вы можете использовать кнопку Show Next
Statement (значок с желтой стрелкой) в панели инструментов Debug. Это вернет вас на ту
строку, которая выполнялась в момент останова отладчика.
В нашем примере повторно выполните вызов Web-сервиса для того, чтобы вы могли
попасть на вашу точку останова и пройти по коду по шагам. Для этого вы должны переместить
текущую точку выполнения в коде. Вы можете сделать это при помощи щелчка правой
кнопкой мыши по строке, в которой должно начаться выполнение, и последующего выбора
в контекстном меню пункта Set Next Statement. На рис. 10.9 показан этот пункт меню.
Теперь, когда вы переместили точку выполнения, вы готовы продолжать отладку. Можете
сделать это путем повторного нажатия на кнопку Run. Это означает, что вы покончили с
остановом и хотите продолжить выполнение.
private vsid LcadCustaraer(int id) I
3
la
Lee ah
M V ^exception
D <* «his
«Hd
W 4 custServKES
* с
^Loctli^Watghii
View Designer
Create Unit Tests.,,
Go To Definition
Find Alf References
Breakpoint
Add Watth
QtiKkWatch...
Show Next Statement
Run To Cursor
Set Next Statement
Go To Disassembly
Cut
Copy
Outlining
custServicea - nerf ServiceReference.'
c.Addxessl;
c.Ad3reas2;
Icy;
puil.
Щ
Ready
a x fMfeKftf
ТУР!„ '
L' System E
Contoso I
Ы
\p Contow'
COntDSO^
^ * X
1 Lane *
J Nam* __ _
[ЬЛк~а Соое}
^ Contoso DLLIContoso.EditCuitDmefProfBe LoadCustomer(int id - . C4
ContDso.[XLiConto».EdtCuatomvPro(V.PageJ.oad(ab]ectsend CP
^ Call Stack n^Xit 'ШШ]'
Col 13
Рис. 10.9. Опция Set Next Statement
Пошаговое прохождение для поиска ошибки
В нашем примере отладчик прервет выполнение сразу, как только он натолкнется на точку
останова в процессе Web-сервиса. Это позволит вам пойти по коду пошагово. Для того что-
Глава 10. Отладка кода
325
бы пойти по коду построчно, вы можете нажать кнопку Step Into на панели инструментов
Debug (или нажать функциональную клавишу <F11>). Это приведет к выполнению кода по
одной строке, что позволит вам видеть одновременно и ход выполнения приложения, и
состояние приложения по мере выполнения кода. Если сделать так в нашем примере, то вы
увидите ошибку. Похоже, что экземпляр объекта DataSet не был настроен до попытки
заполнить его данными.,
В большинстве случаев вы можете внести исправление во время сеанса отладки и
продолжать пошагово проходить код (или продолжить его выполнение). К несчастью, в данном
примере вы не сможете сделать исправление во время отладки. Вы не сможете вызвать Edit
and Continue, когда отладчик прикреплен к другому процессу (независимо от того, было
прикрепление автоматическим или ручным). На рис. 10.10 показано сообщение, которое вы
получите, если попытаетесь это сделать.
EdJUndContbue ' ' Uli.
Changes ere not allowed when the debugger has been attached to en already running
process or the code being debugged was optimized at build or run time.
1 <* .
-5LI'
Рис. 10.10. Ошибка Edit and Continue
для прикрепленного процесса
File Edit View Project Build Debug Data Tool* Test Window Help
JD- bid • 73 fy $ | h <Л 4 **»**•*'- "'<* ► Debug - MncedPlatforms
: ► i i й ' - **i Ji "% | Hex > • ra „ 9 _aJ ti ь . A* :
...ШШм^^
^JDataAccessDAL ▼ * ReturnDataMt{SqlStatement* statement, Ust<DbPar*met/">
public static i4c?4 *, RetuznDfttaaetf^'ilSi»
atatemenc
string aql —• BataAcceaa.'^L.GetSqlStatement(abatement);
uaing {^'i^c^-rzf-Ki^r, can - 7ie*r 5<i\Zcr,-zf-rxxcz (DbCnnS trine/)) {
Sq2rcw»e;-.'i and - new Scfraa^r'ifsql, спя)?
GBsd.CansmandType = *сжаг li <p->.Te.Kt;
New- | X P №\ €3 Z* Columns-
Name
^ЕГЮГЗД
Condition Hit Count
(no condition), break always
Ready
Рис. 10.11. Окно Breakpoints
326
Часть III Программирование и работа с кодом
Поэтому вместо Edit and Continue вы можете сделать закладку на той строке, где хотите
произвести изменения (при помощи панели инструментов Text Editor). Затем вы нажимаете
кнопку Stop на панели инструментов Debug для остановки сеанса отладки. Теперь можно
сделать изменения в коде.
Для того чтобы продолжить самопроверку, вам необходимо повторно запустить процесс
отладки. Однако перед этим вы, возможно, захотите снять установленную точку останова.
Для этого выберите пункт Breakpoints в панели инструментов Debug. Это выдаст вам окно
Breakpoints (рис. 10.11). В этом окне вы можете увидеть все точки останова в приложении.
Здесь вы можете выделить и удалить точку останова (при помощи нажатия кнопки Delete в
панели Breakpoints). Наконец, вы нажимаете кнопку Run для продолжения сеанса отладки
(самопроверки).
Выводы по основам отладки
В нашем сценарии мы проследили многочисленные фазы отладки простой ошибки. Этот
пример должен был представить вам основы выполнения отладки в Visual Studio 2008. Если
вы знакомы с предыдущими версиями интегрированных сред разработки, то, вероятно, вы
заметили много общего. Изучение нашего сценария продемонстрировало множество
инструментов, используемых внутри среды отладки, в том числе: меню и панель инструментов
Debug, окно Breakpoints, окно контрольных значений и т. д. Теперь, когда вы владеете
основами, в следующем разделе мы будем изучать эти элементы отладки более подробно.
Отладчик Visual Studio
Отладчик, встроенный в Visual Studio, является одним из самых больших и сложных
инструментов интегрированной среды разработки. Учитывая такую обширную
функциональность, мы не сможем описать все возможные сценарии, которые могут вам встретиться.
Однако мы надеемся описать в данном разделе самые часто используемые функциональные
возможности. Мы продолжим работать со сценарием профиля клиента (из нашего
предыдущего примера).
Меню и панель инструментов Debug
Меню Debug и соответствующая панель инструментов предоставляют доступ к запуску
сеансов отладки, пошаговому прохождению кода, управлению точками останова, а также и ко
многим функциональным возможностям отладки в Visual Studio. Имеются два состояния
меню отладки: состояние покоя (неактивное) и режим отладки. На рис. 10.12 показано меню
в состоянии покоя.
В состоянии покоя меню Debug предоставляет возможности для запуска сеанса отладки,
прикрепления к выполняющемуся процессу и для доступа к некоторым из отладочных окон.
В табл. 10.1 перечислены все функциональные возможности, имеющиеся в меню Debug в
состоянии покоя.
Глава 10. Отладка кода
327
**> Contojo • MicrosoU VHgal Sftjll^^
J File Edit View Refactor Website Build Dctwg Tools Test Window
Li! ' _J ' -J A & A -J £ / - * Windows _
1 ► 1 .**lClv-H«#^^i Start Debugging
Г
1з
App_Code/Curtomers^3 i > Start Without Debugging
u»~ _ . -1 Attach to Process
.5 Customers ' m
„--,., — ~~ Exceptions
П rufclic -? zttr Get fine r
I ' *»J Step Into
1^
1°
и
Toggle Breakpoint
-»»'--.-«г с - new r„ New Breakpetnt
„ .. . ,. ^ Delete All Breakpoints СЫ
c.Addre3s2 - dt.Row <" K
1 с City - dc.RovsfO] .J Disable At! Breakpoints
у
1 *
1 T
1Ы
li
Help
^ШЯД^Т"* 1^Ш,й^аЫ
1
► i H£ ! Breakpoints Ctrl* D, В
F5 | ~
CtrkFS \
\ Output
П1 Immediate Ctrl* D, I
„
Ctri + D'E L-J
Fll |*
F10 1
F9
> [
♦ Srult+F9
1 cCcntftceViaEibail -"" (ВШ1ТЙ1Г^а,С?8Т^ГТ"^С^^8^Тч*1ТГл^Ша
;
'
Б!
: c.CcntaceViaPhcie - (nocl)dt Rcv/я JO] {"coitsc- via рг-л
description - dt.4cws[0] ['descripcicn"] .ToStringO ,
c.Saail = dt.Rows[0] ["eiuail"] .ToStrircO ;
c.Hause = dt.Rowaf.0] ["яыге"} .XoStringrO ;
c.PcataiCGde - dt.^cvsfQ] ["zip"] .ToStrmgO
1 estate - dc.Rcw3[0] {"лслт.г"^ .ToScrln^O ;
В retj:r c;
В }
1 I" * ' ^ —1
4 ' ^ < "' . <
\Jj) Eitc? List dj Bitakpainfc; 13 Ouipjt %3br mediates W nd<w
В Reedy - In 27
Ь^интщмиитиюии—им mi мни ттамтпиг дипппн—м——м—ич
Col 9
; -»:^&у '■* ® *
;[
ж # X j
^3 Solution 'Contoso' E projects) -» ]
Ж 3 AdminUl §
П -3 BusmassDcmain 1
i-j ij> C\ vBusinessService^ . 1
-.. -J' App_Code 1
1 ^ Customers ci 1
* IDomainStrvicc cs e { 1
^ 0rders.es 1
$ Products cs §
i ~j App.DatJ 1
ч ^ Bin J
^ Customers.aimx ' |
£| Orderc.asmx I
^ Pre ducts asm* I
_J» web cenfig |
H -3 Contoso 1
+ ^t Prepenses I
x 2di References 1
+ ^ Service References |
Ann Hut» " 1
i^ScluU... *ff<-cprr r_T$ ^ ta^- |
Ch9 INS J
Рис. 10.12. Меню Debug в состоянии покоя
Таблица 10.1. Элементы меню Debug в состоянии покоя
Элемент меню
Windows |
Breakpoints
Windows |
Output
Windows |
Immediate
Start Debugging
Start Without
Debugging
Attach
to Process
Exceptions
Описание
Открывает в интегрированной среде окно Breakpoints, которое дает доступ
ко всем точкам останова данного решения
Показывает в интегрированной среде окно Output. Окно Output — это
бегущий журнал множества сообщений, выдаваемых интегрированной средой,
компилятором и отладчиком. Поэтому эта информация относится не только
к сеансу отладки
Открывает в интегрированной среде окно Immediate, которое позволяет
вам выполнять команды. Например, при конструировании приложения вы
можете вызывать ваши методы непосредственно из окна Immediate. При
этом приложение запустится и войдет в сеанс отладки
Запускает ваше приложение а режиме отладки
Запускает ваше приложение без подключения отладчика к
выполняющемуся процессу. В этом режиме разработчик видит то, что увидит пользователь
(вместо того, чтобы выходить в интегрированную среду при ошибках и в
точках останова)
Позволяет вам прикрепить отладчик (и ваш код) к выполняющемуся
процессу (исполняемому файлу). Например, если вы запустили приложение
без отладки, то можете потом прикрепиться к этому выполняющемуся
процессу и начать отладку
Открывает диалоговое окно Exceptions, которое позволяет вам выбрать
способ останова отладчика для каждого исключительного состояния
328
Часть III. Программирование и работа с кодом
Таблица 10.1 (окончание,
Элемент меню
Step Into
Step Over
Toggle
Breakpoint
New
Breakpoint |
Break at
Function
New
Breakpoint |
New Data
Breakpoint
Delete
All Breakpoints
Disable All
Breakpoints
Описание
Запускает приложение в режиме отладки. Для большинства проектов выбор
команды Step Into означает вызов отладчика на первой выполняемой
строке приложения Таким образом, вы можете войти в приложение с первой
строки
Когда вы не находитесь в сеансе отладки, то команда Step Over просто
запускает приложение точно так же, как это сделала бы кнопка Run
Включает или выключает точку останова на текущей (активной) строке кода
текстового редактора. Эта опция неактивна, если в интегрированной среде
нет активного кодового окна
Активирует диалоговое окно New Breakpoint, позволяющее вам указать имя
функции, для которой необходимо создать точку останова. Это может быть
полезно тогда, когда вы знаете имя функции, но не хотите рыться в коде
для того, чтобы ее найти
Эта опция имеется только для приложений C++. Она позволяет вам
определить точку останова, которая выходит в интегрированную среду тогда,
когда изменяется значение по определенному адресу в памяти
Удаляет все точки останова из вашего решения
Деактивирует (без удаления) все точки останова вашего решения
^тгаяжя
I • 1» jjj - ^ J J A -^i s
а, ► « м ш * «a Qi *1 < v
■ | ' App_Code/Customersxs |
1 "^Customers
[
1 U public 'ч ?-<■»«»* Gel
jjv£> |DacaTable dr »
i [ new B*taAc«
I' ;.»i?' fs с - cw
|j c.Addressl - dt
ij c.Addreaa2 » di
|! c.City - dC.Rov
jj. r; f*nnfmrrVimFrtu
I Lczais
1 Name Value
I ffl <4 this {Customers)
I V id 1
I Ю V dl nul
I '4 С nul
feq Locate |£|А'а«К1!
1 Ready
J5|bj«jt] Took Test Window HeJp
►
iii
J
13
J
,-i
1
p
о
Windows
Continue
«best П
Stop Debugging
Detach All
Terminate АП
Restart
Attach to Process...
Exceptions».
Step Into
Strp Over
Step Out
QuickWatch*.
Toggle Breakpoint
New Breakpoint
Delete All Breakpoints
Disable All Breakpoints,
frit
System.O
> 3
F5 j В
Ctr*A»»*8«eaif i
Shift* F5 | Щ
'53
Ctr1*Sruit*F5
CtrhD.E
a
FH ]Ш
FIO
Shift* Ш
Ctrl*D. Q
i
F9
Ctrl* Shift* F9
'j h w* cv
43
а
Breakpoints Ctr1*D, В
Output
Watch >
Autos Ctrl* D, A
Locals CM*D,l
Immediate CW+DJ
CalFStack Ctrl*D,C
Threads Ctrl*D, T
Modules Ctrt*D, M
Processes CM-rD, p
Memory ►
Disassembly Ctrl* Ah* D
Registers СггЦ-D, R
i
^ lJqs.dlliCurtomera GetCnt d -1) Lme 25
'1
j ~uirK#y .ewCxTtf/ 'i'.fyw
Contn».DalConto».Edtuistorr«rProflleloadCuctome
Contoso Dli1Conto«3.Eo/tCuslomerProfite.PegeJLoadCo
[ф Call Stack jpftfrrrt&le VVfodcw J
Ln27 СЫ9 Ch9
ШШШ
I ^, Ц
!" - 1
" x Г
'1
•Hi
a II
iBi
* л
j Lang * 1
CJf 1
rQntld- C* 1
bjeetsendC* ^1
INS |
Рис. 10.13. Меню Debug во время сеанса отладки
Глава 10. Отладка кода
329
Когда отладчик включен и вы работаете в сеансе отладки, то состояние меню Debug
изменяется. Теперь в нем есть несколько дополнительных опций (помимо тех, которые имеются
в состоянии покоя). Эти опции включают: функции перемещения по коду, перезапуск сеанса
и доступ к дополнительным окнам отладки. На рис. 10.13 показано меню Debug во время
сеанса отладки.
Давайте рассмотрим опции меню Debug во время отладки. В табл. 10.2 представлено
множество элементов меню Debug в состоянии отладки. При чтении таблицы вы можете
обращаться к предыдущим иллюстрациям.
Таблица 10.2. Элементы меню Debug для активного сеанса отладки
Элемент меню
Windows |
Breakpoints
Windows | Output
Windows | Watch
Windows | Autos
Windows | Locals
Windows | Immediate
Windows | Call Stack
Windows | Threads
Windows | Modules
Windows | Processes
Windows | Memory
Windows |
Disassembly
Windows | Registers
Описание
Позволяет вам открыть окно Breakpoints во время сеанса отладки
Открывает окно Output во время активного сеанса отладки для того,
чтобы можно было читать выходные сообщения, выдаваемые
компилятором и отладчиком
Открывает одно из нескольких окон контрольных значений
интегрированной среды. Окна контрольных значений представляют элементы и
выражения, за которыми вы наблюдаете в течение сеанса отладки
Открывает окно Autos. Это окно показывает переменные (и их
значения) в текущей и предыдущей строках кода
Открывает в интегрированной среде окно Locals, которое показывает
переменные в локальной области действия (функции)
Открывает окно Immediate, в котором вы можете выполнить команду
Открывает список функций, которые имеются в стеке. Также указывает
текущий кадр стека (функцию). Выделенный элемент — это то, что
определяет содержимое окон Locals, Autos и окон контрольных значений
Показывает в интегрированной среде окно Threads. Здесь вы можете
просматривать потоки отлаживаемого приложения и управлять ими
Показывает в интегрированной среде окно Modules. Это окно дает
список dll- и ехе-файлов, используемых вашим приложением
Показывает в интегрированной среде окно Processes Это окно дает
список процессов, к которым прикреплен сеанс отладки
Открывает окно Memory для просмотра используемой вашим
приложением памяти. Это работает только при включенной (в диалоговом окне
Options) отладке на уровне адресов
Открывает окно Disassembly. Это окно показывает ассемблерный код,
соответствующий командам компилятора. Это работает только при
включенной (в диалоговом окне Options) отладке на уровне адресов
Открывает окно Registers, чтобы вы могли видеть изменения значений
регистров при прохождении по вашему коду. Это работает только при
включенной (в диалоговом окне Options) отладке на уровне адресов
330
Часть III. Программирование и работа с кодом
Таблица 10.2 (продолжение)
Элемент меню
Continue
Break All
Stop Debugging
Detach All
Terminate All
Restart
Attach to Process
Exceptions
Step Into
Step Over
Step Out
QuickWatch
Toggle Breakpoint
New Breakpoint
Delete All
Breakpoints
Описание
Продолжает выполнение приложения после выхода в интегрированную
среду разработки Приложение продолжает выполняться с активной
строки кода (с точки останова, со строки с ошибкой либо со строки,
которая была настроена при помощи команды Set Next Statement)
Позволяет вам прервать приложение вручную (без использования точки
останова) во время сеанса отладки Приложение прервется на
следующей исполняемой строке Эта возможность полезна в том случае,
когда нужно получить доступ к отладочной информации (такой как окна
контрольных значений) Ее можно также использовать для получения
доступа к сеансу отладки (когда ваше приложение кажется зависшим)
Останавливает сеанс отладки Прерывает также и отлаживаемый
процесс (при условии, что он был запущен в Visual Studio)
Открепляет отладчик от выполняющегося процесса Это позволяет
вашему приложению продолжать выполнение после того, как отладчик
свою работу закончил
Останавливает отладку и прекращает все процессы, к которым вы
прикреплены
Останавливает сеанс отладки и перезапускает его Аналогично
последовательному нажатию кнопок Stop Debugging и Start Debugging
Позволяет вам прикрепить активный сеанс отладки к одному (или
более) дополнительному процессу (такому как работающий Web-сервер
или сервис Windows)
Активирует диалог Exceptions, который позволяет вам управлять
выходом в IDE по конкретным типам исключительных состояний NET
Framework и других библиотек
Приводит к продвижению отладчика на одну строку Если вы выберете
вход по Step Into в функцию, то отладчик сделает это пошагово по
строкам
Работает точно так же, как Step Into, но с одной важной разницей, если
вы выберете пропуск функции по Step Over, то строка вызова функции
будет выполнена (и функция тоже), и отладчик установит следующую
строку за вызовом функции в качестве следующей отлаживаемой строки
Указывает отладчику выполнить текущую функцию, а затем выйти
назад в отладчик (после выполнения функции) Эта возможность полезна
тогда, когда вы входите в функцию, а затем хотите, чтобы эта функция
просто выполнилась и вернула вас в отладчик после ее завершения
Активирует окно QuickWatch (когда отладчик в состоянии останова).
Это окно показывает одну переменную (или выражение), за которой вы
наблюдаете, и ее значение
Включает и выключает активную точку останова
Активирует диалоговое окно New Breakpoint (подробности см в
табл. 101)
Удаляет все точки останова в вашем решении
Глава 10. Отладка кода
331
Таблица 10.2 (окончание)
Элемент меню
Disable All
Breakpoints
Enable All
Breakpoints
Описание
Деактивирует все точки останова в решении без их удаления Вы
можете также деактивировать отдельные точки останова Эта
возможность очень полезна тогда, когда вы хотите сохранить точки останова
для последующего использования, но не хотите в данный момент
использовать эту конкретную точку останова
Активирует все точки останова, которые были деактивированы при
помощи Disable All Breakpoints
Панель инструментов Debug
Панель инструментов Debug дает быстрый доступ к некоторым ключевым элементам меню
Debug. Здесь вы можете управлять вашим сеансом отладки. Например, вы можете начать
или продолжить сеанс отладки, остановить выполняющийся сеанс, выполнить пошаговый
проход кода и т. д.
На рис. 10.14 показана панель инструментов Debug во время активного сеанса отладки.
В режиме конструирования кнопка Continue будет иметь надпись Start Debugging и
некоторые из этих элементов будут деактивированы.
Примечание
На рис. 10.14 в правой части окна Breakpoints значок с выноской Debug Windows —
это выпадающее меню. Оно дает доступ ко многим отладочным окнам, которые
доступны разработчикам. Смотрите на рис. 10.13 те меню, доступ к которым вы можете
получить через этот элемент панели инструментов.
Restart Step Out
Break All Step Into Show Threads
Continue
Stop Debugging—J Show Next
Statement
Debug Windows
Show Hexadecimal Values
Step Over
Рис. 10.14. Панель инструментов Debug
Опции отладки
Вы можете управлять множеством опций отладки Visual Studio в диалоговом окне Options.
Узел Debugging в дереве опций дает доступ к этим переключателям отладочных опций. На
рис. 10.15 показаны общие настройки отладки в диалоге Options (Tools | Options).
12 3ак 3716
332
Часть HI. Программирование и работа с кодом
Список общих настроек дает доступ к включению и выключению многих опций отладки.
Эти опции включают следующее:
□ включение и выключение фильтров точек останова;
□ включение и выключение окна предупреждающего сообщения (при очистке всех точек
останова);
□ включение или выключение помощника Exception Assistant;
□ включение или выключение отладки по принципу "только мой код";
□ требование, чтобы исходный код строго соответствовал тому, что отлаживается (либо
не предъявлять такое требование)
и многое другое.
Мы опишем функциональные возможности этих опций в данной главе.
General 11
У Ask before deleting all break points * I
У Break ell processes when one process breaks ' I
j ^J Break when exceptmns cress AppDomam or managed/native boundaries ^ II
■J] Enable address le\ el debugging J
( She* disassembly if source is not available j, Ш
Л, Enable breakpoint firtejs Ш
J Enable the exception assistant Щ
^ Unwind the call stack on unhandled e*ceptjons Щ
jl Enable Just M/Code (Managed only) j ||
She* ail members fcrnDn userobje:t; in variables vvindcAS (Visual Ba @
•f Warn if nc user code on launch |j
£ Enable property evaluation and ether impficit function calls Ц
•f, Call string conversion function on objects in variables windows (С* апс Ц
' "* Enable source server support §
\-> :u._ > i li.u . » r» -j t'J-- ^ J_ I
* " ~ \y — j r I
OK . [__ Caned j
Рис. 10.15. Диалоговое окно Options
Диалоговое окно опций дает доступ и к более специфическим настройкам отладки.
Например, вы можете управлять работой Edit and Continue (можете также отключить эту
функцию). Там есть настройки типа кода (Managed, Native, Script), для которого включена
оперативная отладка. У вас есть также опция использования дополнительных символьных
файлов отладки (с расширениями pdb и dbg). Эти файлы могут быть полезны в том случае,
когда у вас нет исходных кодов библиотеки (которую вам нужно отладить), такой как
библиотека Windows или некий компонент сторонней организации.
Это множество опций помогает вам настроить вашу среду отладки. Однако в этой главе при
отладке кода мы подразумеваем, что отладчик имеет все настройки по умолчанию.
Вход в код, выход из кода и пропуск кода
Вероятно, самой обычной отладочной операцией для разработчика является пошаговый
проход по строкам кода и изучение данных, выдаваемых приложением и отладчиком. По-
Й' ' Environment
., Projects and Solutions
1 Source Control
Text Editor
Database Tools
I л Debugging
l| Genr/al
I Edit and Continue
II Juit-In-Time
I Natrve
|| Symbols
|| Device Took
1 HTML Designer
I Office Tocb
I Test Tools
I Tot Templatmg
I V.mdows Forms Designer
j| Workflow Designer
Глава 10. Отладка кода
333
шаговое прохождение именно в этом и заключается: изучение строки, выполнение строки,
изучение результатов (а затем повторение этого процесса снова и снова). Поскольку это
основной тип отладочных действий, то эффективность пошаговых операций в Visual Studio
очень важна для максимально эффективного использования вашего времени в течение
сеанса отладки. Здесь мы опишем каждый из пошаговых режимов и дадим соответствующие
примеры.
Начало сеанса отладки (вход в код)
Команда Step Into доступна в меню Debug и на панели инструментов (вы можете также
нажать клавишу <F11>). С данной командой связаны два типа поведения. Первый — это когда
вы вызываете данную команду для приложения, которое в данный момент не выполняется в
режиме отладки. В этом случае приложение будет откомпилировано и запушено, и в окне
отладки вы получите первую строку для пошагового прохождения кода. Это (по существу)
вход в код вашего приложения. На рис. 10.16 показано приложение Windows Forms в
режиме отладки (в результате вызова Step Into).
ШШтШжж)млштжтт
" ЬезН^
File Edit View Project Build Debug Dit* Tools Test Window Help
JjAdminULProgram * ^MeinQ
nninespace AdminOI {
у static claaa "zz^zi* {
Й <'<«.-» i r~
J J l:;e r^i'i er-txy ptii.l Ici ir.s dpti-ica ._j'i.
VU acatic void Main() |(
Afp_i^ar.ic-:.ErableYisualStyies (] ;
Агрл :<•-!'• гг .SecCeiapatibleTeKtRecderlngDefault (fnlae) ?
At }•*'<** " .Ксл (new *'*. {)).
)
13
H
Locals
Name
- * x. Breakpoints , $ x
ТУР* *||n«W' Xjj^gS £3 /! Columns'
' Name Condition Hit Count
№>'-& Customers.cs, line 27 character 9 (no condition) break always]
=3 Loc»ls i^Wrtchl
Ready
23Breakpointsf^CallStatfr Qlrnw t»"teWidt-w■
Lnl2 Col 28 Ch28
Рис. 10.16. Использование Step Into для запуска приложения
Примечание
Для Web-приложений Step Into и Step Over работают несколько иначе. В случае Web-
сайта ваше приложение просто выполняется в режиме отладки. Отладчик не делает
останова на первой строке кода вашего приложения. Для этого вам нужно будет
настроить точку останова или выбрать опцию Run to Cursor (см. следующий раздел).
334
Часть III. Программирование и работа с кодом
Вызов команды Step Over (меню Debug, панель инструментов или клавиша <F10>) в тот
момент, когда ваше приложение находится в состоянии покоя, приведет к тому же самому,
что и вызов Step Into. To есть ваше приложение (если это не Web-сайт) будет
откомпилировано и запущено в сеансе отладки на первую строку кода.
Одной из более удобных (и часто упускаемых) функциональных возможностей набора
инструментов отладки является функция Run to Cursor (Выполнить до курсора). Она работает в
полном соответствии со своим названием. Вы устанавливаете курсор на некий код и
вызываете эту команду. Приложение компилируется и выполняется до тех пор, пока не доходит
до той строки, где находится курсор. В этой точке отладчик прерывает приложение и выдает
вам эту строку кода для пошагового прохождения. Эта возможность особенно удобна,
поскольку именно так работают многие разработчики. Они смотрят на конкретную строку
(или строки) кода и хотят ее отладить. Они не хотят начинать с первой строки и не хотят
заниматься точками останова. Поэтому функция Run to Cursor является эффективным
средством привести отладчик на ту страницу, где вы сейчас находитесь. На рис. 10.17
показана эта функция, вызванная из контекстного меню.
File Edit View Refactor Project Build Debug Data Tools Test Window Help
j3' J' J J J * -J Л - - 4»"J ' ► Debug - Mited Platforms
► • < J ** ^ _ Hex > 3 - - J\ Vj ^. a* & i£ — 2: -J
j~ tdltCurtomerProf tle-*ipx a
^Contoso.tditCuitomerPtofile ▼ .^LoadCustonierijnt id)
prrvt» ;cid LoadZTuatcTrer [irz id) <
ServiceRef ereice .. * - • cus:5ervice3 =
i- = c-s^Servicea .3et (id) ;
3
_1
SsrvivTeaefersncs.
5?rvice?elf'"'"'vC''
71 ViewDeitgnrr
TextBoxAd Ref4Ctor
Text3cxAtf
ТехсЗсхС* Organs Using*
ТехсЗсхЕп: ;J Create Unit Tests
ТехсЗзхЫа
ТехсЗсхРи
lextBcxSt ^.
Texc3cxZi _^ GoToDef.niUcn
Checjc3oxi:
Find All Referent к
♦^ Insert Snippet.
Surround With
CneclcBoxF
Breakpoint
*J Run To Cursor
Л Cut
-J Copy
ь
Ready I Outlining
is з 1;
:3 = 2.
lazeYiabtail,
iaceViaPa-re,
Рис. 10.17. Вызов команды Run to Cursor
Команда Run to Cursor работает даже в том случае, когда пользователь должен
активизировать некий фрагмент кода перед тем, как код дойдет до положения курсора. Таким
образом, фактически это— невидимая временная точка останова. Рассмотрим пример, в
котором пользователю выдается Web-страница по умолчанию. Здесь он может выбрать
редактирование своего профиля. Если вы настроите команду Run to Cursor на строке
внутри экрана редактирования профиля, то отладчик будет по-прежнему выполнять приложение
и ждать, пока пользователь (тестер или разработчик) выполнит данную строку кода.
Глава 10. Отладка кода
335
Вы можете также начать ваш сеанс отладки с выбора опции Start Debugging (Начало
отладки)— зеленая стрелка "воспроизведение"— в меню Debug или панели инструментов (или
нажатие клавиши <F5>). При этом начнется сеанс отладки, но выход в код не произойдет
(если только не случится исключение или не попадется точка останова). Эта операция
обычно используется теми разработчиками, кто тестирует свой код и не хочет его проходить
пошагово; либо теми, кто использует большое количество точек останова.
Если ваше приложение выполняется, и вы хотите войти в режим останова, то вы можете
сделать это в любое время при помощи команды Break All (Прервать все) из меню Debug
или панели инструментов, либо при помощи комбинации клавиш <Ctrl>+<Alt>+<Break>.
Функция Break All представлена на панели инструментов значком с символом паузы.
Нажатие этой кнопки останавливает ваше приложение на следующей выполняющейся строке и
позволяет вам получить информацию из отладчика. Команда Break All особенно полезна в
том случае, когда вам нужно прервать длительный процесс либо цикл, который "подвесил"
ваше приложение.
Прохождение по коду
Во время сеанса отладки у вас есть три основных варианта продвижения по вашему коду.
Вы можете войти в строку или функцию, пропустить данную функцию или выйти из
функции. Давайте рассмотрим каждый из них.
File Edit View Website Build Debug Tools Test Window Help
А|ю Code/CiBtOT*TM*^- 1
{Step Into (Ш)р~ " — - - —
$ Customer* » ^Getfjntid)
А Ш
public J^sc-r*r Get (mt id) {
DacaTable uz - DataJIcceas.DAL.RerumDataTmbleJSqIScacenienca.GetCuacoreerr
лек DacaAccesa.DbParaiBet:r{Mid", id)) ;
Саг*"--.' с = new c^t-7-r[id);
c.Addresal - dt.RevsCO] ["addr-asl"} .ToStrinaO i
c.Addreas2 « dt.Ro.wa[0]["address?"].ToStringH);
с City - dt.BcwaJQ] ['city»] .ToStrinaO ;
c.ConcaceViaZmaii « (bocl)dc.Rowa [С} f "cen^act^vt А_?аахГ] ;
c.ContaceViaPhane — (bocl)dr .Rova {0] ["Ci-r^ftct^via^hon""};
r, T>*4t;rlrvrt*n->. ~_ rtr, Rfw^mi СМ*,чгт >t.^Tt"'„ Tn^rr\nnj \ r
locals:
; Name
'ffl 0 this
M"d
Ш 4> dt
* с
i Value
(Customers)
nul
nui
w Д К rgfeakpomt»
Type
New-
tome
> i**
Condition Hit Count
Syetem.O
BusnessC
Reedy
j^JBreakpoint* ^'c^Ua<ifjQfafrt^d^feV»too>frW'[
Рис. 10.18. Вход (Step Into) в строку кода
Команда Step Into (Вход) — <Fl l> для С# и <F8> для VB — позволяет вам продвигаться по
вашему коду по одной строке. Вызов этой команды выполнит текущую строку кода и
поместит ваш курсор на следующую выполняемую строку. Важное различие между Step Into
336
Часть III. Программирование и работа с кодом
и другими похожими командами состоит в том, как Step Into обрабатывает строки кода, в
которых содержатся вызовы методов. Если вы находитесь на строке кода, которая вызывает
другой метод вашего решения, то вызов Step Into перенесет вас на первую строку этого
метода (при условии, что у вас загружены соответствующие отладочные символы).
В качестве примера рассмотрим рис. 10.18. Он показывает пример Web-сервиса, который
делает вызов метода ReturnDataTable библиотеки доступа к данным. В данном случае оба
этих проекта загружены в решение; таким образом, вы имеете доступ к их отладочным
символам. Поэтому вызов Step Into приведет к входу в первую строку ReturnDataTable.
На рис. 10.19 показан вход в этот метод. Обратите внимание, что теперь вы готовы
проходить пошагово по коду метода. Конечно, когда вы достигнете конца этого метода, то
отладчик вернет вас на следующую строку вызвавшей функции (строка 30 в Web-сервисе,
показанном на рис. 10.18).
File Edit View Project Build Debug Tcol* Test Window Help
¥ J J s> *5 ."„J *3 Hex ♦ < JJ - -
'JDataAccess DAL ▼ V RrturnDataTable(Sql5tatements statement, DbParametr dbpj ▼
-J
p-blic !Tiat:c -'Л.--.Г ReturnDataTable (. q*
< * -> dbplxst = »:ew
dbpLiзс.Add Idbp);
-~ ^ - da = ^ecurnrJataaeHat-aLeitent, dbplxat) ;
ratv^rr da. Tables [3] ;
p-iLIic siatic voia ExeCiJte£uery (i^-tcc- e-'2 statement} {
siattrce'-.c, ir'-j..-'*. dbp) {
Lccai
Name
V statement
>+; у dbp
I' v cbpLtst
l* v ds
J] Locals ^Watcbi
Readv
Value
GetCu'tomer
{DataAccess DbParametr}
nul
nul
^r a x
Type -
DataAcce
DataAcre
Svstem С
SvBtem D
heakpoirti
| New- >
^IBreakpcir
Ln69
i i Columns*
Condition Hit Count
^Breakpoints! ^ Call Stack £Iт1т»еа ste Window
Col 90 Cb90
Рис. 10.19. Результат входа (Step Into) в функцию
Команда Step Over (Пропуск)— <F10> для С# и <Shift>+<F8> для VB— позволяет вам'
сохранять фокус в текущей процедуре (не заходя в вызываемые ею методы). То есть вызов
Step Over приведет к выполнению строки за строкой, но не заведет вас в вызовы функций,
конструкторы или вызовы свойств.
Для примера рассмотрим рис. 10.18. Здесь отладчик находится на вызове ReturnDataTable.
Если вы вызовете команду Step Over, то функция ReturnDataTable выполнится без
вашего захода в нее. Вместо этого следующей выполняемой строкой для пошагового
прохождения станет следующая за вызовом ReturnDataTable строка (строка 30). Конечно, любое
исключение в пропущенной функции приведет к прерыванию работы отладчика и выходу в
код (как обычно).
Глава 10. Отладка кода
337
Команда Step Out (Выход), вызываемая нажатием комбинации клавиш <Shift>+<Fl l> для
С# и <Ctrl>+<Shift>+<F8> для VB — это еще один полезный инструмент. Он позволяет вам
дать указание отладчику закончить выполнение текущего метода (который вы отлаживаете)
и вернуться в режим останова сразу после его завершения. Это очень удобно тогда, когда вы
завязли в длинном методе, который стоило бы пропустить. Кроме того, вы можете войти в
данную функцию для отладки только ее части, а затем выйти из нее.
Для примера опять обратимся к рис. 10.19. Вспомним, что вы зашли в этот метод из кода на
рис. 10.18. Предположим, что вы начали прохождение кода и прошли несколько строк.
После того, как вы убедились в том, что подключение к базе данных выполнено, вы хотите
завершить выполнение функции и вернуться к выполнению отладки в вызвавшей функции
(строка 30 на рис. 10.18). Для этого вы просто выполняете Step Out.
Продолжение выполнения
Когда вы находитесь в сеансе отладки, то команда Start Debugging (или Run) изменяется на
Continue. Команда Continue доступна тогда, когда вы приостановили выполнение на строке
кода в отладчике. Она дает вам возможность продолжить выполнение приложения без
пошагового прохождения по строкам. Предположим, что вы прошли по строкам, кода, которые
хотели увидеть, а теперь вы хотите продолжить проверку вашего приложения с точки
зрения пользователя. При помощи Continue вы даете указание приложению и отладчику
продолжать выполнение до тех пор, пока не произойдет исключение или не сработает точка
останова.
Ш[^*ш
ГОеЬ^аЬШДЭД
1 Hie Edit View Websrte Buttd
Ш
1; ► * a $ *i qi *i 11\ ►
ШиЛ^ App_Codg/CurtoiiM»w 1
И i$ Customers
II :w
1 J*
I Л>
II
|L>
1 J~
I "^
1 *"j
I * }-
II J.
m
1 »«M«rcu, 1*
1 public ч^ч'-опл
; a
new Di -•
1
i
Customer \ t^
c.Address^ L-*
с City - (j £j
с Contact^
c.ConteceH
II . _ J?* 1 -ixPrjnr^jpj
|ia<ais
| Ntme V«lue
t*
■ IJ * thta {Customer?)
| U* i
| 3 $ dt f,*fc«>
1 v с пЛ
|^3~LocilS|3^tfhf|
| tody
4£J Data Tools T«
Windows
Continue
Break A.
Stop Debugging
DetKhAtt
Terminate All
Restart
Attach to Process
Exceptions,*,
Step Into
Step Over
Step Out
QtudrtVttcrw
Toggle Breakpoint
Mew Breakpoint
Customer
nt
•4 ▼ System,D
BlanessC
rt Window Hep
►
CtrifAi-E'safc
Shift* FS
fc
Ctri+Shift*F5
CtrkD,E
Fll
F10
Shift* FU
Ctrt*D,Q
F9
CM* ^1*^9
<&dP «tfoi m - ' rJ£
,_—= ^ ^ •
*^^£ШШ1'
1
" Ж
le l>> <--«'слс*яитсг . GetCustaicer, j|
g();
gt);
ct via_phccew3;
ajmran ;
!
Name Condition
i
.~£ Breakpoints |^СаЙ Stack ^ЬптНЫ* ЛлоУ» '
In» Col9 Cr>9
11
11
ill
1
19
* 11
^™ ™. j
Hit Count jl
II
»* 1
Рис. 10.20. Открепление от процесса
338
Часть III. Программирование и работа с кодом
Окончание сеанса отладки
Вы можете закончить сеанс отладки несколькими способами. Один из самых часто
используемых методов — это прекратить выполнение приложения. Это можно сделать при
помощи закрывания окна браузера с Web-приложением или путем нажатия кнопки Close (или х)
окна приложения Windows. При завершении приложения произойдет также и завершение
сеанса отладки.
Имеется также пара способов и в окне Debug. Команда Terminate All завершает все
процессы, к которым прикреплен отладчик, и завершает сеанс отладки. Есть также опция Detach
All. На рис. 10.20 показаны обе эти опции в меню. Detach All просто открепляет отладчик
от всех выполняющихся процессов без их завершения. Эта возможность полезна тогда,
когда вы временно прикрепились к выполняющемуся процессу, отладили его и хотите
оставить его работающим.
Указание мест выхода в код
Вы управляете отладчиком при помощи точек останова и точек отслеживания. С их
помощью вы можете указать отладчику, где вам нужно выйти в код или получить информацию о
вашем приложении. Точки останова позволяют вам указать, когда отладчик должен
остановиться на определенной строке кода. Точки отслеживания были введены в Visual Studio
2005. Это такой тип точки останова, который позволяет вам выполнить определенное
действие тогда, когда достигнута указанная вами строка кода. Обычно при этом происходит
вывод данных о вашем приложении в окно вывода. Освоение вами использования точек
останова уменьшит количество времени, затрачиваемого на исправление проблем вашего кода.
Настройка точки останова
Самый часто используемый способ настройки точки останова: сначала надо найти строку
кода, на которой вы хотите остановить отладчик, затем вы щелкаете по этой строке в поле
индикаторов редактора кода. При этом в поле индикаторов появляется красный кружок, и
строка кода выделяется красным цветом. Конечно, это цвет по умолчанию; вы можете
изменить вид точек останова в диалоговом окне Options в узле Environment | Fonts and Colors.
Есть еще несколько дополнительных способов настройки точек останова. Например, вы
можете щелкнуть по строке кода правой кнопкой мыши и выбрать пункт New Breakpoint в
контекстном меню Breakpoint. Вы можете также выбрать команду New Breakpoint в меню
Debug (или нажать <Ctrl>+<D>, <N> в С# или <Ctrl>+<B> в VB). Этот вариант активирует
диалоговое окно New Breakpoint, в котором вы можете настроить точку останова функции.
Настройка точки останова функции
Точка останова функции — это точка останова, которая настраивается в диалоговом окне
New Breakpoint. Она называется точкой останова функции потому, что обычно
устанавливается на начало функции (хотя это и не обязательно). В диалоговом окне New Breakpoint
вы можете вручную настроить: функцию, на которой вы хотите прервать выполнение;
строку кода в функции, или даже символ в строке.
Глава 10. Отладка кода
339
Если при вызове этого диалогового окна ваш курсор находится на функции или на вызове
функции, то имя функции будет автоматически внесено в диалоговое окно. Вы можете
также ввести название функции в этом окне. На рис. 10.21 показано диалоговое окно .New
Breakpoint в действии. Обратите внимание, что вы можете вручную настроить строку и
даже символ строки (где необходимо поместить точку останова).
Примечание
Если вы укажете в диалоговом окне New Breakpoint перегруженную функцию, то вы
должны указать реальную функцию, на которой хотите прервать выполнение. Вы
делаете это при помощи указания правильных типов параметров для данной перегрузки.
Например, LoadCustomer принимает идентификатор клиента как int. Если у вас
также есть перегрузка, которая ищет клиента по имени (типа string), то вам нужно
указать эту перегрузку в поле Function как LoadCustomer (string).
<J* Сол*о:о - Microsoft Vicual SUdio
File Edit View Refactor Project Build Debug Data Took Test Window Help
Jb-J*~jy«# S, ^Л Л* ' f" » £3 » ' i> Debug * Mixed Piriform*
► i i . ^3 Ql I Hex ♦ Л' ;
,'• EdrtCiis1omerProfrte-aspx.es pAUJ; 1 AppmC&(^Curton>«<",« j
I ^Contcso.EditCt*- "" '^*>>&s&s^*^^
New Bxiakpoint
щуп
Breefc execution лЬеп the program reaches this location in a function
function'
У Use IntelliSense to verify the function name
Preappoints
i New X j**
Ndmt Condition Hit Count
У1К& Customers.cb, line 27 character 9 (no condition) break always
j/\^ DALcs, line 81 character 13 (no condition) break, always
^Frrrr^st _JOurpit ^Breakpoints ^faimerfiatrWindr*]
tea£3d
Ln 22 Col 29 Ch 29
Рис. 10.21. Диалоговое окно New Breakpoint
Точки останова в Visual Studio
Visual Studio 2008 имеет для точек останова несколько значков. Эти значки позволяют вам
легко распознать тип точки останова, связанной с данной строкой кода. Например,
сплошной кружок — это обычная точка останова, а кружок с пустотой внутри представляет собой
деактивированную точку останова. В табл. Ю.З показаны некоторые основные значки,
связанные с точками останова, и дано их описание.
340
Часть III. Программирование и работа с кодом
Таблица 10.3. Значки точек останова
Значок
S]
|>г
]
ш
|n>
[о
Е2
ш
J
Описание
Обозначает стандартную активную точку останова. Когда отладчик встречает эту
строку кода, он останавливает приложение и выходит в режим отладки
Обозначает стандартную точку отслеживания Когда отладчик встречает эту строку
кода, он выполнит действие, которое связано с данной точкой отслеживания
Символ "плюс" внутри значка точки останова обозначает улучшенную точку останова
(которая содержит условие, счетчик числа прохождений или фильтр)
Символ "плюс" внутри значка точки отслеживания обозначает улучшенную точку
отслеживания (которая содержит условие, счетчик числа прохождений или фильтр)
Пустой значок точки останова обозначает деактивированную точку останова Данная
точка останова по-прежнему связана с этой строкой кода. Однако отладчик не будет
распознавать деактивированную точку до тех пор, пока она не будет активирована.
Пустыми значками могут обозначаться такие типы значков останова, как точки
отслеживания, расширенные элементы или даже ошибки и предупреждения точек
останова Во всех случаях пустой значок сообщает, что данный элемент деактивирован
Представляет собой предупреждение точки останова, которое обозначает, что точка
останова не может быть установлена вследствие каких-то временных условий. Это
может быть результатом того, что не включена отладка для Web-сайта или не
загружены отладочные символы. Эти значки выставляются интегрированной средой Visual
Studio
Представляет собой предупреждение точки отслеживания (см предыдущее описание)
Окно точек останова Breakpoints
Окно Breakpoints в Visual Studio дает удобный способ организации и управления множеством
условий, по которым вы хотите выйти в отладчик. Вы получаете доступ к этому окну через
меню Debug или панель инструментов (или при помощи нажатия <Ctrl>+<D>, <B> в С# или
<Ctrl>+<Alt>+<B> в VB). На рис. 10.22 показано окно Breakpoints внутри Visual Studio.
Панель инструментов окна Breakpoints
Окно Breakpoints имеет собственную панель инструментов, которая позволяет вам
управлять точками прерываний в окне. Команды, которые имеются в панели инструментов,
описаны подробно в табл. 10.4.
Таблица 10.4. Панель инструментов Breakpoints
Элемент
iKew'i
I
] Break dt Function,..
j Iks 2^'^^lfzrir
fx"
Ort+D,N I
Описание
Активирует новое окно Breakpoints, позволяя вам настроить точку
останова на функции
Позволяет вам удалить выделенную в списке точку останова
Глава 10. Отладка кода
341
Таблица 10.4 (окончание)
Элемент
Р
рз
ш
щ
Columns-]
■7] .....
v ] Ccmdrticn
• j HJt Count
• | Fitter
When Hit
* [< Language
Ftmcbon
File
Address
Data
Process
Описание
Удаляет все точки останова в окне
Переключает все точки останова в активированное или деактиви-
рованное состояние Если хотя бы одна точка останова в списке
активирована, то первое нажатие этого значка деактивирует ее (и
все остальные активированные точки) Нажатие на него во второй
раз (или когда все точки останова неактивны) приведет к
активации всех точек останова
Позволяет вам перейти к исходному коду, связанному с
выделенной точкой останова
Позволяет вам перейти к информации дизассемблера, связанной с
выделенной точкой останова
Позволяет вам выбрать, какие столбцы вы хотите видеть в окне
Breakpoints Каждый столбец выдает информацию о точках
останова Например, вы можете видеть информацию о названии
файла, функции, фильтре, процессе и т д
i
Ь:3ш^
£ile £dit ¥iew Webjrte fiuild Qebug Iools Test «Window Help
J3 * _J " _y yj *# <~'Ч"'-'~Ч? Dtrbug - Miied Platforms
► i *3 Ql ~ H« * 3 - -
V IB
13
Columns"
Breakpoints
Nes^ X JJ» IS +2
Name
iV\> DALcs line 74 character 13
' 0» Customers cs, line 27 character 9
f/°^ Customers cs, line 30 character 9
uL^ DataAccesi.DAL RetumDataTable(DataAc (nc condition)
Condition
лпеп statement '= null iitme
[no condruon)
(r»o condition!
(no condition;
Hit Count
break sittayi
when hit count n equal to 2
break alv»a>s
break: always
break alvvavs
Filter Lang
incnei (_*
menf, C*
(ncne) C*
(пене) C*
(none) C*
I Jj>frr3r .. it J3 Cjtp<Jt ^Breakpoints |£31mm«c ate Airdcv>
Ready
Рис. 10.22. Окно Breakpoints
342
Часть III. Программирование и работа с кодом
Управление каждой отдельной точкой останова
Окно Breakpoints также дает вам доступ к каждой отдельной точке останова. Оно служит
стартовой точкой для настройки многих опций, связанных с точками останова. Например,
вы можете деактивировать отдельную точку останова при помощи снятия галочки около
точки останова в списке точек останова. Кроме того, вы можете настроить множество
свойств и условий, связанных с точкой останова. На рис. 10.23 показаны деактивированная
точка отслеживания и контекстное меню, связанное с точкой останова.
тш
New*
Name
' >< \Р Щ *Э tt Column»."
7<>DALcs,line74chara
li& Customers a, line 27 S3 Go To Source Code
V^ Customers cs, line
V© DataAccm DALReti
j Location .
p/ i. Condition».
! fcfit Count..,
s filler
I WhenHtt„.
Condition Hit Count
' * *ement Ь null' к true break always
ion)
ion)
ion)
ion)
TTx
Piker Language
(none! C*
when hit count is equal to 2 (none) C*
break always
break always
break always
(ncne) C#
(none) C*
(hone) C*
Jjfrrofii^OOiitput 3 Breakpoints [ffi^mmifrdiateWindow |
Рис. 10.23. Управление отдельной точкой останова
Обратите внимание, что из этого контекстного меню вы можете удалить точку останова, а
также перейти к соответствующему ей исходному коду. Однако более важно то, что здесь
есть доступ к настройке условий и фильтров, связанных с данной точкой останова. Далее мы
опишем использование всех этих опций.
Прерывание на основе условий
Часто одной установки простой точки останова недостаточно (либо она неэффективна).
Например, если вы ищете выполнение в вашем коде определенного условия (которое,
возможно, вызывает исключительное состояние), то вам лучше делать останов по этому условию.
Это сэкономит время на постоянные входы в функции, при которых вы только изучаете
несколько элементов данных и видите, что ваше условие не выполнено.
Имеется пять типов условий, которые вы можете добавить к точке останова: Location,
Condition, Hit Count, Filter и When Hit. Вы добавляете условие к точке останова в окне
Breakpoints. Выберите точку останова и нажмите правую кнопку мыши. Это действие активирует
контекстное меню для данной точки останова. Пример показан на рис. 10.24. Вы видите^ что
перечислены все условия для данной точки останова.
Настройка условия точки останова
Условие точки останова позволяет вам выйти в отладчик (или выполнить некое действие в
случае точки отслеживания) тогда, когда некоторое условие будет либо выполнено, либо
изменится. Часто вы знаете, что отлаживаемая вами ошибка происходит только при
совершенно конкретных условиях. Условия точек останова— это отличное средство для поиска
перемежающихся ошибок.
Глава 10. Отладка кода
343
File Edit View Project Build Debug Data Tools Tesi Window Help
J'J'JJi A . « , - . ч ' j* Debug * Mixed Platforms
i> i ^i Qi ; He '# !5 - e
• L$
У
New* )K *d Й =£3 ■" Cc
Name
,•>%> DAL cs line74 charact
X Delete
nient!= null «true
J <& DataAccess DAL Relurr ^J Go To Source Code
{V 1<J Customer; cs, line 27 с -<л -1? - , <леп\
Location..
Condition
Hit Count
Filter
When Hit
k
Hit Count
breakaways
Filler Language
(nonei Cs
*hen hit count is equal tc 2 fnone'i C*
break always fncnri L*
break always (none; C*
j Jj, Еггзг v '•> JJ С jtpur JJ Breakpoints jammed ate *Virdc><>
Read/
Jl
Рис. 10.24. Доступ к условным функциям точек останова
Для настройки условия выделите точку останова, для которой вы хотите добавить условие.
Затем выберите пункт Condition из контекстного меню (через щелчок правой кнопкой
мыши). Это активирует диалоговое окно Breakpoint Condition (рис. 10.25). Обратите
внимание, что при настройке условия у вас есть доступ к технологии IntelliSense (вы можете
вызвать IntelliSense либо щелчком по точке, либо нажатием комбинации клавиш <Ctrl>+
+<Пробел>).
When the breakpoint location is reached, the expression is evaluated and the breakpoint
rs hit only if the expression is true or has changed
[J C.ondrhon.
dbP>
V GetHashCcde
V GetType
V Name
ToStrinc
object DbParametr Value
alup'
Рис. 10.25. Настройка условия точки останова
При настройке условия у вас есть два варианта: Is true и Has changed. Вариант Is true
позволяет вам настроить логическое условие, при выполнении которого произойдет выход из
отладчика на соответствующую строку кода.
Например, вернемся к нашему приложению. Предположим, что вас ставят в известность об
ошибке, которая происходит только с конкретным клиентом. Вы можете зайти в служебный
класс Customer и настроить точку останова внутри функции Get. Затем вы можете
добавить id=l2 34 в условие Is true для точки останова (где id — параметр метода). В результа-
344
Часть III. Программирование и работа с кодок
те этого отладчику будет дано указание останавливаться на этой строке кода только тогда,
когда будет выполнено данное условие. На рис. 10.26 показано это условие в диалоговом
окне. Там же имеются и две опции для условий.
.d = 1234]
* Мгие
Н« changed
|~" OK ] [ Oncet
Рис. 10.26. Диалоговое окно Breakpoint Condition
Опция Has changed говорит отладчику, что выходить из кода нужно только при изменении
значения выражения. Первый проход по вашему коду устанавливает первое значение
выражения. Если после этого данное значение изменяется, то отладчик делает прерывание в
данной строке. Эта возможность может быть полезной тогда, когда у вас есть поля или свойства
с начальными значениями и вы хотите отследить изменения этих значений. Кроме того,
опция Has changed может быть полезна в циклах и операторах if. . .then, когда вас
интересует только одно — изменил ли ваш код данное конкретное значение.
Совет
Информация о точках останова между сеансами отладки сохраняется. То есть когда в
конце рабочего дня вы закрываете Visual Studio, то по вашему возращению все точки
останова окажутся на своих местах. Это окупает время, потраченное на настройку
сложных режимов отладки. Они могут оставаться в вашем приложении и включаться
(выключаться) по мере необходимости.
Прерывание по местоположению
Вы можете отредактировать точку останова так, чтобы прерывание происходило в
определенном месте файла. Большинство точек останова работает именно так. То есть они знают
файл, номер строки и символ, на котором должен произойти останов.
| Break execution when the program reaches th» location In я f tie.
' Filer \UierArnsnell\Documenti\Visuri Studio 2M8\Projects\CorUcio\Dat*AcceK*DAL.«
l| Lme. 71
l| Character; 13
I 1 ^ Allow the source code to be different from the origin»! version
Рис. 10.27. Диалоговое окно File Breakpoint
Глава 10. Отладка кода 345
Однако бывают случаи, когда вам может понадобиться изменить эту информацию.
Предположим, что ваш код несколько отличается от выполняющейся сборки. Возможно, вам
придется отредактировать свои точки останова (для того чтобы срабатывание происходило на
другой строке кода).
На рис. 10.27 показан пример окна File Breakpoint, открытого через пункт Location
контекстного меню точки останова. Вы можете также использовать эту функциональную
возможность для быстрой установки точки останова в конкретной строке (без поиска в вашем
исходном коде).
Настройка фильтра точки останова
Фильтры точек останова позволяют вам указать конкретный компьютер, процесс или поток,
в котором должен произойти останов. Например, если ваша ошибка происходит только на
определенном компьютере или в определенном процессе, то вы можете отлаживать именно
это условие (при помощи фильтра). Фильтры наиболее полезны в сложных сценариях
отладки, когда ваше приложение имеет ярко выраженный распределенный характер.
Для использования этой функциональной возможности вы можете задать компьютер по
имени, а процесс — по имени или идентификатору. Вы можете также указать комбинации
при помощи операций & (и), | | (или) и ! (не). Это позволяет вам добраться до конкретного
потока конкретного процесса на конкретном компьютере. На рис. 10.28 показано
диалоговое окно, в котором вы настраиваете фильтры точек останова. На этом рисунке точка
останова настраивается таким образом, чтобы прервать выполнение тогда, когда
выполняющийся процесс — это Web-сервер команды разработчиков (WebDev.WebServer.EXE).
Breakpoint Fitter ^^"^^^^^^^ШШдааШШй^Ж^ЩйяШяШШ^пг",^^Г.°'-,
It шёЗшП
| Vou can restnct the breakpoint to only bring set in certain processes and thread* ||
| Enter en expression to describe where the break point should be set, or clear the i
expression to have the breakpoint set in all processes end threads [
Enter one or more of the following clauses You can combine clause
1 || (OR),»(NOT), and parentheses.
1 Machined me = "machine'
I Prccessld = 123
I PrccessWame - "process"
I Tbreadld = 123
I ThreadName = 'thread"
1 Rlter
1 ProcessName= WebDrv A'ebServer.EXE'
d«T/l[
UMngfe(AND), 1
Cancel I
Рис. 10.28. Диалоговое окно Breakpoint Filter
Использование с точкой останова
счетчика количества попаданий
Используя команду Hit Count, вы сообщаете отладчику, что хотите прервать выполнение
тогда, когда данная строка кода выполнится определенное количество раз. Обычно можно
найти более удобное условие останова, чем Hit Count. Однако эта функция полезна в тех
346
Часть III. Программирование и работа с кодом
случаях, когда вы не можете указать реальное условие, но знаете, что когда вы проходите
через функцию определенное количество раз, то начинаются проблемы. Кроме того, опция
Hit Count может быть более полезной в сценариях с точками отслеживания, когда вы
выдаете данные о том, что происходит в вашем коде. Возможно, вам будет удобно выдавать
эти данные только время от времени.
На рис. 10.29 показано диалоговое окно Breakpoint Hit Count. Обратите внимание, что этот
моментальный снимок экрана был сделан во время активного сеанса отладки. Вы можете
добавить любые из этих условий к точкам останова во время активного сеанса отладки.
Кроме того, обратите внимание, что текущий счетчик количества попаданий установлен в
единицу. У вас есть возможность нажать кнопку Reset, вернуть счетчик обратно в ноль и
продолжить отладку с этой точки.
' "-""" *™™ ^чгт, ■■■:■■ -mm '" »'ЩН%Г <fff^
*J* Catrtoto (Debugging) - MfcrafefЩй4,$«**Р
ТезЛЗ Ш
:^УттШГ'^^А
File Edit View Website Build Debug Data Tools Test Window Help
► j Л Л ♦ *Л Ql *l x Hex % 3 - 9
App^Cpde/Curtomer».a. Dotgcmutyj
^4 Customers
■» ^Getfintid)
public 'Vs:-t: Getji^t id) {
-J
[РаьаГаЫе dc — Data-ftccejs.DAL.ReturnDfltaTable (SqlScatemenua.GetCaacoreer, |
new ОасаАосезд. PbPaianecr ("id", xd)} ;|
A breakpoint ii bit when the breakpoint location № reached and the condition is
satisfied The hit count is the number of times the breakpoint has been hit
When the breakpoint is hit:
[breakwhen the hrt count«equal t<
Current hit count 1
• =1
Hit Count
pull' is true break always (i
when hit court!
break always (|
break always (
^Breakpoints ^Ca« Stack iQImmeA ate Win dew!
Ln27 Colli
«.„MUlfe*.
Рис. 10.29. Настройка количества прохождений точки останова
Это диалоговое окно предоставляет вам несколько опций для настройки количества
попаданий. В раскрывающемся списке When the breakpoint is hit имеются следующие варианты:
□ break always (прерывать всегда)— по умолчанию, не использует счетчик количества
попаданий;
□ break when the hit count is equal to — прерывать тогда, когда значение счетчика равно *
указанному числу;
□ break when the hit count is a multiple of— прерывать тогда, когда значение счетчика
кратно указанному числу;
□ break when the hit count is greater than or equal to — прерывать тогда, когда значение
счетчика больше или равно указанному числу.
Глава 10. Отладка кода
347
Совет
Вы можете совместно использовать все условия для точек останова (которые мы
обсудили) в одной точке останова. Например, вы можете добавить к данной точке
останова условие и фильтр. Это позволит вам создавать при помощи точек останова еще
более конкретные сценарии отладки вашего приложения.
Точки отслеживания (опция When Hit)
Точки отслеживания позволяют вам выдать данные в окно Output или выполнить макрос
для Visual Studio в том случае, когда встретилась определенная точка останова. После этого
вы можете выйти в отладчик (как и в случае с обычной точкой останова), обработать другое
условие или просто продолжить выполнение приложения. Эта возможность может быть
очень полезной тогда, когда вы хотите поддерживать журналирование всего того, что
происходит в вашем приложении при отладке. Затем вы можете просмотреть этот журнал,
чтобы получить ценную информацию о конкретных условиях и порядке выполнения (когда
происходит исключение).
Вы можете настроить точки отслеживания явным образом (при помощи щелчка правой
кнопкой мыши по строке кода и последующего выбора пункта Insert Tracepoint в меню
Breakpoint). Кроме того, выбор команды When Hit из контекстного меню (см. рис. 10.24)
точки останова в окне Breakpoints активирует диалоговое окно точки отслеживания When
Breakpoint Is Hit (рис. 10.30).
Имеющиеся в диалоговом окне When Breakpoint Is Hit опции включают выдачу сообщения
в окно вывода, выполнение макроса и продолжение выполнения. Вы можете выбрать любую
комбинацию этих опций. Первая (выдача сообщения) позволяет вам выдать данные о вашей
функции. Есть несколько ключевых слов (которые вы можете использовать для выдачи
данных), таких как $function— для имени функции и $caller— для имени вызывающей
функции. Список ключевых слов показан в поясняющем тексте диалогового окна на
рис. 10.28. Вы можете также вывести значения ваших переменных. Вы можете сделать это
при помощи заключения имен переменных в фигурные скобки.
Function SFUNCFION.Thread- S71DSTNAME,Id {id}
You can include the value of a variable or other expression in the message by placing it
in curly braces, such as 'The value of < is {*}r To insert a curly brace, us« "\T To insert a
backslash, use v\\"
The following special keywords will be replaced wrth their current values:
SADDPESS - Current instruction, SCALIER - Previous Functor» Name,
SCALLSTACK - Call Stacb SFUNCTTON - Current Function Name,
SPID - Process Id, JPNAME - Process Name
STID - Thread Id, ST NAME - Thread Name
Ц Run a macro:
M Continue execution
Рис. 10.30. Настройка точки отслеживания
348
Часть HI. Программирование и работа с кодом
Флажок Continue execution позволяет вам указать, действительно ли это настоящая точка
отслеживания или это точка останова, которая содержит отслеживающее действие. Если вы
выбираете продолжение выполнения, то получаете только отслеживающее действие
(сообщение и/или макрос). Если же вы даете указание, что продолжать не нужно, то получаете
отслеживающее действие плюс остановку отладчика на данной строке кода (точно так же,
как и на обычной точке останова). При этом по существу применяется действие When Hit к
обычной точке останова.
Наконец, когда вы отметите флажок Run a macro, то диалоговое окно даст вам для выбора
список всех загруженных в вашу среду макросов.
Вы можете также сочетать действия отслеживания с условиями. При этом действие
происходит только в том случае, когда выполняется условие точки останова.
Для примера мы настроили точку останова внутри Web-сервиса Customers .Get () (см.
рис. 10.30). Эта точка отслеживания выводит сообщение в окно вывода тогда, когда строка
кода выполняется, а затем просто продолжает выполнение приложения. Вот сообщение,
которое мы собираемся выводить:
Function: $FUNCTION, Thread: $TID $TNAME, Id: {id}
Это сообщение выведет имя функции, идентификатор потока и его имя (если оно есть), а
также значение переменной id. На рис. 10.31 показан вывод при двух проходах через точку
отслеживания (в окно Output).
I Oulput , J3 JI
||j Show output from' Debug ■» ( Ji ^ *\ \ "% - ^3
I ГилсъХст. Cuetae»ri-5*t Unt) , Thread ЭхИВО Worker Thread, Id- 1 *1
IE Junction. CuiCOMii.Sitllat), Thread- 0x1430 Worker Thread, Id- 1 J
E The thread OxlOee h*« exited with cede 0 @x0)
У
ШЬ w«4*" r-,-b-flrt-rfU... ,.,.„,„ r, ■,■■■■„„ ■, -iv ,-„■ -l|
Рис. 10.31. Результаты точки отслеживания
Просмотр данных в отладчике
После того как отладчик вывел вас в режим останова, следующим делом необходимо
отфильтровать выдаваемые вашим приложением данные. Нахождение нужных данных
поможет вам быстро обнаружить ошибки и быстро их исправить. Visual Studio старается дать вам
данные там, где они вам нужны. Например, DataTips показывает вам значения переменных
прямо в редакторе кода. Есть еще много аналогичных примеров того, как Visual Studio
показывает вам отладочные данные тогда и там, где они вам нужны. В следующих разделах
мы опишем эти случаи (и не только их).
Наблюдение за переменными
Обычным делом в сеансе отладки является наблюдение за значениями типов вашего
приложения. Для этого существует много окон. Два самых очевидных — это окна Locals и Autos.
Глава 10. Отладка кода
349
Окно Locals
Окно Locals показывает все переменные и их значения для текущей области видимости от1
ладчика. Это дает вам представление обо всем, что имеется в текущем выполняющемся
методе. Переменные в этом окне автоматически настраиваются отладчиком. Они
организованы в список по имени в алфавитном порядке. Кроме того, иерархия также показана.
Например, если данная переменная имеет отношение к объектному типу, то члены этого
объекта перечислены внутри переменной (в виде древовидной структуры).
На рис. 10.32 показан пример окна Locals. В нем вы можете видеть приложение нашего
примера, которое приостановлено внутри метода Customer.Get сервиса. Обратите
внимание, что переменная клиента (с) развернута для того, чтобы показать различные свойства и
поля, связанные с данным объектом. По мере установки значений результаты
демонстрируются в столбце Value.
Совет
Вы можете редактировать значение в окнах Locals и Autos. Для этого щелкните по
переменной правой кнопкой мыши и выберите из контекстного меню пункт Edit Value.
Затем вы можете изменить значение переменной непосредственно внутри окна
(аналогично изменению значений переменных при помощи окна Immediate).
ЛвШ&
frcrra*l,rrfcili
File Edit View Website Build Debug Tods Test Window Help
J.: -d • J Я # i л Ал ^ьг-;-. ► учц
*$ Customers *• * Gelfint idl
c.Addreaa2 - dt .RevsfO* {"aAlrTs2"J .To5rrin<j() ;
c.Cif/ - dc.Hcwa[0)["city"J.TcStrmg(),
c.ContaceViaEaaii - (bi3ol)dt.Яо*гз{21 ;,rc«ftct_',i,i_r'«if.)l''!:
с. CancaceVIaPhoDe » (bool) dt. Rova [ С J f"ccntact._via_phDie" ];
с Description « dr RowsfO] *"dj»!,criFr icn"] TaStrmg (t;
c.Email = dt.Rows[0K',e»aiI .To5tri.ng () ;
1Л
tome
?«""♦ the
Ю V dt
1 Vilu«
{Customers}
<ТаЫе)
*1621 Some Street*
- $ _addre«2
i>.dtv
jf jruntaceViabnai
£ _coniaceViePhone
«» _jeau%iUixi
- J> jd 1
- - ~ *& ЛЯИ* JU.,-,J,J....,.U„..L r*^.,
3 Output^ Locals ИШсгИ J3fctokpwrto ^CaK 5fcdJO?<ftmtdJ»teVwWuT>TJ
Ready
true
febe
nul
ni
Type
Customer]
nt ; i
4, •» System D'»\
i - stmg j ;
i - stmg ~
-i » jtmg
bod
bod
Рис. 10.32. Окно Locals
Окно Autos
Очень часто просмотр всех локальных переменных дает слишком много информации,
чтобы в ней можно было разобраться. Так может происходить тогда, когда в области ви-
350
Часть III. Программирование и работа с кодом
димости данного процесса или функции находится слишком много всего. Для того чтобы
,увидеть значения, связанные с той строкой кода, на которую вы смотрите, вы можете
использовать окно Autos. Это окно показывает значения всех переменных и выражений,
имеющихся в текущей выполняющейся строке кода или в предыдущей строке кода. Это
позволяет вам действительно сосредоточиться только на значениях, которые вы в данный
момент отлаживаете.
На рис. 10.33 показано окно Autos для той же самой строки кода, которая показана на
рис. 10.32. Обратите внимание на разницу. Также обратите внимание, что Visual Studio даже
добавила в список наблюдения специфические выражения, которые отличаются от кода.
Например, в окне Autos показан вызов dt.Rows [0] ["contactvia email" ].
f* Contoso (Debugging) - M»crowftyjua>Sbdfe'
File Edit \/iew Website Build Debug Tools
l> J J v 93 („З *л Ho -* 13 - t
DwmembVI Щ^иЛгтоеРхоШ^е^а f'' App_Code/Cu*tom«r5.c* J)AL«Д
\£ Customer, » VGet(intid)
с ft.ddresa2 - dc .Revs [0] {"n'Ult '^:n J .ToStriioO ;
c.CiL,- - dc.RrwaJQJ {nc byn] TcStziroO,
с ContaceViaSaail - (bu^l)dt.Rowa{0}£"< .. c«t,_v.
cConiacsViaFhoae ш (bad) dv.Rawa{C] twccnt»ct_v:
с Description « dt .Rows [0] ["''"л ilj r •> a*. " j ToStr:
c.Email =• dt. Row5[0} ["ttiudxi"] .To5tri.ng (J ;
Aut^i
Nil me
V (t«oI}dt Ro/wlO]rconiact_via_phonel
li) <* с
j*f с Ccntacev'iaEmail
j*f с ContaceVlaPhone
l+> V dt
Ш 23* dt RoVvS
l+f ;*f dt Rows[Q!
'jf dt Rosss{u}['cQntact_vTa_efnay"{
_2f> dt Ro-/«[Q](vCDritart_vM_phoneT
Value
false
{BuanessDomajn Customer}
false
{Table}
{System Data DataRc-vsCoHscuon}
{System Data DeteRo*}
true
false
[Customers}
3 Dutoirt £J Autos «^Locsb ^VtiiKfr lffi&ii»tyw>xtilj!>iZi S*aek QrrnmedteteWr>u*v,
Ready Ln 27 Col
Type
boo!
busri«sC
boo!
boo1
4, ^ SfSUanD
System D
System D
object f>
object [a
Customer
Рис. 10.33. Окно Autos
Окна Watch
Окна контрольных значений в Visual Studio позволяют вам настраивать собственный список
переменных и выражений, за которыми вы хотите наблюдать. Именно здесь вы определяете
те элементы, которые вас интересуют. Окна Watch выглядят и ведут себя точно так же, как
и окна Locals и Autos. Кроме того, те элементы, которые вы размещаете в окнах Watch,
сохраняются между сеансами отладки.
Вы получаете доступ к окнам Watch из меню или панели инструментов Debug. Четыре окна
Watch имеют имена Watch 1, Watch 2, Watch 3 и Watch 4. Четыре окна Watch позволяют
вам настроить четыре списка элементов, за которыми вы хотите наблюдать. Эта
возможность может быть особенно полезна в том случае, когда каждый список относится к
отдельной области видимости вашего приложения.
Глава 10. Отладка кода
351
Переменную или выражение в окно Watch вы добавляете либо из редактора кода, либо из
окна QuickWatch. Если вы находитесь в редакторе кода, то выделяете переменную (или
выражение), щелкаете по ней правой кнопкой мыши и выбираете пункт Add Watch. При
этом выделенная переменная (или выражение) будет помещена в окно Watch. Вы можете
также перетащить выделенный элемент в окно Watch.
Окно QuickWatch
Окно QuickWatch (Быстрая проверка) очень похоже на остальные окна Watch. Однако оно
позволяет вам сосредоточиться на единственной переменной или выражении. После
введения DataTips в версии 2005 года окно QuickWatch стало использоваться реже. В окне
QuickWatch вы можете писать выражения и добавлять их в окно Watch. При написании
вашего выражения вы имеете доступ к технологии IntelliSense. На рис. 10.34 показано окно
QuickWatch.
Добавленный в окно QuickWatch элемент будет вычислен при нажатии кнопки Reevaluate.
Нажатие кнопки Add Watch отправит переменную в окно Watch 1.
Рис. 10.34. Окно QuickWatch
DataTips
DataTips (всплывающие подсказки данных) позволяют вам выделить переменную или
выражение в вашем редакторе кода и получить информацию наблюдения прямо в редакторе.
Эта функция хорошо соответствует методу работы разработчика. Например, если вы
смотрите на строку кода, то можете выделить что-то в этой строке для вычисления. Вы могли бы
сделать это и при помощи создания QuickWatch. Однако вы можете также просто навести
курсор на некий элемент, и его данные развернутся в DataTip.
На рис. 10.35 показан пример. Здесь курсор расположен над переменной, которая имеет тип
Customer. Щелчок по знаку "плюс" для разворачивания этой переменной разворачивает
352
Часть III. Программирование и работа с кодом
множество членов этого объекта. Вы можете прокрутить этот список при помощи стрелки в
нижней части окна. Вы можете также щелкнуть правой кнопкой мыши по любому члену
списка и отредактировать его значение, скопировать его или добавить в окно наблюдения.
Значок увеличительного стекла рядом с элементами списка позволяет вам выбрать для
данного элемента определенное средство отображения (об этом чуть позже).
Вы можете также выбрать выражение и вычислить его как DataTip. Например, если вы
выделите следующую часть строки 34 на рис. 10.35: (bool)dt.Rows[0]["contact_via_email"],
то DataTip покажет эту переменную и ее значение — true.
Совет
Список DataTips может часто мешать просмотру кода. Иногда вам нужно видеть и
список DataTips, и тот код, который находится под ним. В этом случае нажатие и
удерживание клавиши <Ctrl> сделает перечень DataTips прозрачным в течение всего
того времени, пока вы будете удерживать эту клавишу в нажатом состоянии.
<«ft Сйейозо {Debugging) - ШкгъжЬШыЖ Stadia
Help
File Edit View Webwte Buttd Debug Tods Test Window
%Cuitomere » *Get(intid)
new DacaAccesa.tL^drartt-r (nxdM, id) I;
JuS'.-.'-er с - new C-j?» crsr (id) ;
c.Addxesal - dt .Rows [0] ["addressl"] .ToStnng ();
c.Addrejis2 - dt .Rows [0 j {"address^"] .ToString () ;
c.City ■ dc.Rcwa[0} fcity"! .ToScxiayp;
^TcantaceVibEeail ■ <bool)dt„Rows{0 j["acntact vlaemail"
0»
# _addreul
" " _ad*ess2
c.H * jitf
& _contaceWa&r»i
# _a>ntBcevtaPhone
# _deeatnton
.-* Jen*
J>_phone
;/ jxetalCode
$ _btite
;*pAddre»l
3|Ad*ee2
4- 621 Some Street"
Etton"] .TaStrmaO;
ipgO;
fate
null
nul
1
nJ
mJ
rU
rxJ
A- 621 Some5<
'\ " 'Redmond*
Copy
Copy Expression
Copy Value
EditVaM к
Add Watch L^
Make Object ID
Hexadecimal Display
т»ъ^*.*ш*. ^>»~~^
Mue
>*"»*•« Су*ас.г\8£"е!< i-жз
Type
|jgWatch2gjfaiffJ4j
Ready
Ln34 Col 9 Ch9 INS
Рис. 10.35. DataTips
Визуализация данных
Когда вы смотрите на значения переменных, то на самом деле вы хотите добраться до
данных объекта. Иногда эти данные заслоняются самой объектной моделью. Предположим, что
вы ищете данные, содержащиеся в объекте DataSet. Для того чтобы их найти, вам придется
глубоко закопаться в окно наблюдения или список DataTip. Вам придется изучить
внутренности объектной модели для того, чтобы добраться до базовых данных, содержащихся в
объекте. Если вы когда-нибудь тратили на это много времени, то знаете, как это раздражает.
Глава 10. Отладка кода
353
Visual Studio предлагает быстрый и простой способ доступа к данным внутри объекта. Она
делает это при помощи инструмента под названием визуализатор. Визуализаторы предна*
значены для представления данных объекта определенным осмысленным образом. >
По умолчанию с Visual Studio поставляется несколько визуализаторов, в том числе:
□ HTML — показывает диалоговое окно в виде браузера, где HTML интерпретирован так,
как его будет видеть пользователь;
□ XML — показывает XML в структурированном формате;
□ Text — показывает строковое значение в легком для чтения формате;
□ DataSet — показывает содержимое объектов DataSet, DataView и DataTable.
В Visual Studio имеется также определенная инфраструктура для написания и инсталляции
визуализаторов. Вы можете написать собственный визуализатор и подключить его к
отладчику. Вы можете также скачать дополнительные визуализаторы и инсталлировать их.
Возможности визуализаторов широки — настолько же, насколько широки возможности
структурирования и просмотра данных. Возможны визуализаторы в виде дерева, которые
отображают иерархические данные, или визуализаторы изображений, которые показывают
изображения.
Вы вызываете визуализатор в одном из тех мест, где можно просматривать значения
данных. Сюда входят окна контрольных значений и списки DataTips. Визуализаторы
представлены значком увеличительного стекла. Вернитесь к рис. 10.35 для того, чтобы увидеть
пример запуска визуализатора при помощи такого значка. Вместо того, чтобы копаться в
иерархии объекта (чтобы добраться до его данных), вы можете вызвать визуализатор
DataSet прямо из DataTip. На рис. 10.36 показан визуализатор в действии для объекту
DataSet пользователя (в нашем примере приложения).
Рис. 10.36. Визуализатор DataSet
Функция Edit and Continue
Функция Edit and Continue позволяет вам изменять код во время отладки без прекращения
вашего сеанса отладки. Вы можете модифицировать строку кода или даже исправить ошиб-
354
Часть III. Программирование и работа с кодом
ку и продолжать работать. Разработчики на Visual Basic, которые работали на версиях еще
до .NET, должны помнить этот мощный инструмент. Его отсутствие в .NET сделало его
самой ожидаемой функцией. Хорошая новость состоит в том, что Edit and Continue была
добавлена в версии 2005 года как в Visual Basic, так и в С#. В версии 2008 эта функция была
также добавлена и в Visual C++.
Вызвать Edit and Continue несложно. Вы просто делаете изменение в коде во время сеанса
отладки, а затем продолжаете двигаться по своему коду при помощи команды Step или
Continue.
Эта функция по умолчанию включена. Если она выключена, то вы можете ее включить в
диалоговом окне Options, вызываемом одноименной командой из меню Tools.
Не все изменения кода подходят для Edit and Continue. Ее следует использовать только для
незначительных исправлений. Любые серьезные добавления в коде в режиме отладки делать
не следует. Если ваше изменение находится в теле метода, то оно с большой вероятностью
подойдет под требования Edit and Continue. Большая же часть изменений вне тела методов
потребует перезапуска отладчика. Некоторые стандартные изменения, которые не подходят
для функции Edit and Continue, включают в себя:
□ изменение кода текущего (активного) оператора;
□ изменение кода любых вызовов стека, которые ведут к текущему (активному)
оператору;
□ добавление новых типов, методов, полей, событий или свойств;
О изменение сигнатуры метода.
Более полный список ищите в MSDN по словам "Edit and Continue". Отсюда вы сможете
попасть по ссылкам на документацию по функции Edit and Continue на нужном вам языке.
Затем вы сможете воспользоваться ссылкой "Supported Code Changes". Там вы увидите
полный список поддерживаемых и неподдерживаемых изменений для вашего языка.
Сложные сценарии отладки
Иногда отладка может быть очень сложным процессом. Мы рассмотрели много простых
сценариев для Web-приложений и приложений Windows. Однако, например, отладка
удаленных процессов и многопоточных приложений имеет свои особенности в смысле
конфигурации и используемых инструментов. В данном разделе представлено несколько более
часто встречающихся сложных сценариев отладки.
Удаленная отладка
Удаленная отладка позволяет вам подключиться к выполняющемуся приложению на другом
компьютере и отладить это приложение в его среде выполнения. Это часто единственный
способ получить те ошибки, которые возникают только на определенном аппаратном
обеспечении. Все мы слышали крики разработчиков: "А на моем компьютере работает!"
Удаленная отладка помогает этим разработчикам определить, почему же их приложение не
работает в другой среде.
Глава 10. Отладка кода
355
Удаленная отладка очень ценна в самых различных случаях, в том числе при отладке:
хранимых на сервере SQL-процедур, Web-сервисов, Web-приложений, удаленных сервисов или
процессов и т. д.
Самое трудное в удаленной отладке — это ее настройка. Сам процесс отладки не отличается
от того, что мы обсуждали до настоящего момента. Однако настройка требует множества
шагов по инсталляции и системе безопасности. Эти шаги необходимы, поскольку вы не
хотите, чтобы при настройках по умолчанию разработчики могли легко подключать сеансы
отладки к приложениям на ваших серверах.
Есть и хорошие новости. Visual Studio старается минимизировать и упростить настройку и
конфигурацию удаленной отладки. Фирма Microsoft для этой цели создала Remote
Debugging Monitor (msvsmon.exe). Однако задачи настройки, скорее всего, покажутся
разработчикам не очень простыми (хотя это и окупится по их завершении). Мы не будем описывать эту
настройку очень подробно, поскольку обычно она очень зависит от рабочей среды. Для того
чтобы получить подробное руководство и советы по устранению проблем, мы предлагаем
вам сделать в MSDN запрос по словам "Remote Debugging".
Далее мы предлагаем вам список задач, которые необходимо выполнить для того, чтобы
удаленная отладка начала работать.
1. Инсталлировать монитор удаленной отладки (msvsmon.exe) на удаленном компьютере.
Он устанавливается при помощи приложения rdbsetup.exe. Вы можете запустить его и с
разделяемого сетевого ресурса.
2. Настроить разрешения для удаленной отладки. Обычно это означает одно из двух. Вы
можете настроить идентичные учетные записи (с одинаковыми именами пользователей и
паролями) на обоих компьютерах (отладочном и сервере). Отладочная учетная запись
может быть локальной или доменной. Однако серверная учетная запись должна быть
локальной. Либо вы можете дать своей учетной записи административный доступ к
отлаживаемому компьютеру. Это часто представляет собой определенный риск в смысле
безопасности (к которому не стоит относиться слишком легко).
3. Запустить монитор удаленной отладки на удаленном компьютере. Это приложение
Windows (с графическим интерфейсом пользователя). Вы можете также настроить монитор
для работы в качестве сервиса Windows. Это может быть полезно для специфических
серверных сценариев и удаленной отладки ASP.NET.
4. Если ваш отладочный компьютер работает под управлением операционной системы
Windows XP с пакетом обновлений SP2, то вам придется настроить вашу политику
безопасности и сетевой экран для удаленной отладки (см. тему "How to: Set Up Remote
Debugging" в документации MSDN). Если вы работаете под управлением Windows Vista, то
вам может понадобиться поднять привилегии при запуске Visual Studio (запускать ее с
правами администратора).
5. Запустить Visual Studio на вашем отладочном компьютере (как обычно). Открыть
проект, содержащий исходные коды для того процесса, который вы хотите отладить.
6. Прикрепиться к процессу на удаленном компьютере при помощи Attach to Process. Вам
придется указать компьютер (который вы хотите отлаживать) и найти на нем нужный
процесс.
356
Часть III. Программирование и работа с кодом
Как вы видите, настройка удаленной отладки может оказаться совсем непростой. Однако
если вы обычно отлаживаетесь в одной и той же тестовой среде, то такую настройку вам
нужно будет сделать только один раз.
Отладка сервисов WCF
Web-сервис (или сервис Windows Communication Foundation) вы обычно отлаживаете при
помощи тех же самых инструментов и методов, которые мы описывали до настоящего
момента. Основная проблема при отладке сервисов — это прикрепление к ним. Для этого есть
два основных варианта. Первый вариант— войти в сервис непосредственно из кода,
который вы отлаживаете (из клиента, который вызывает сервис). Второй вариант—
прикрепиться к сервису, который уже был вызван клиентом. Рассмотрим эти варианты.
Вход в сервис WCF
Вы можете войти непосредственно в сервис WCF (при условии, что ваш вызывающий код
(или клиент) имеет двусторонний контракт с сервисом). Это называется дуплексным
контрактом (duplex contract). Такой контракт позволяет клиенту и сервису обмениваться друг с
другом. Вызовы может инициировать каждый из них. Это полезно тогда, когда вашему
серверу нужно сделать обратный вызов клиента или породить события на клиенте. Для
настройки этого вы используете ServiceContractAttribute (подробности см. в главе 19).
Для того чтобы это работало, ваш клиент должен быть синхронным. То есть клиент не
может сделать асинхронный вызов сервиса WCF и продолжить заниматься другими задачами.
Он должен сделать вызов и ждать отклика.
Прикрепление к сервису WCF
Вы можете использовать опцию Attach to Process (будет описана позже) для отладки как
сервисов WCF, так и Web:cepBHCOB (asmx). В этих случаях сервис уже обычно работает в
процессе, который находится вне вашей отладочной среды. Для прикрепления к такому
процессу и его отладки вы должны убедиться в том, что у вас есть код этого сервиса
(загруженный в Visual Studio). Кроме того, процесс сервиса должен работать на сервере IIS или
ASP.NET Development Server. И наконец, сервис должен быть вызван WCF-клиентом (для
того, чтобы можно было получить доступ к его выполнению).
Отладка многопоточных приложений
Многопоточное приложение — это такое приложение, у которого в неком процессе
работает больше одного потока. По умолчанию каждый процесс вашего приложения имеет, по
крайней мере, один поток исполнения. Вы можете создавать несколько потоков для
выполнения параллельной обработки. Это может существенно повысить производительность,
особенно на современных многоядерных процессорах и при использовании технологии
гиперпоточности. Однако многопоточность дается не просто так. Такой код сложнее писать и
сложнее отлаживать. Если вы когда-либо писали многопоточное приложение, то вы уже
знаете об этом.
Глава 10. Отладка кода 357
К счастью, Visual Studio предоставляет несколько инструментов, которые немного
облегчают эту работу. Мы не будем здесь описывать программирование многопоточного
приложения; вместо этого мы опишем опции, предназначенные для отладки такого приложения. Вот
список этих инструментов и функций:
□ возможность просматривать потоки вашего кода во время сеанса отладки;
□ панель инструментов Debug Location, используемая для просмотра процессов, потоков
и помеченных потоков;
□ окно Thread, используемое для работы со списком потоков вашего приложения;
П фильтры точек останова, которые позволяют вам настроить точку останова для
конкретного потока.
Давайте более подробно рассмотрим все эти функциональные возможности.
Обнаружение потоков и установка флагов
Visual Studio позволяет вам визуализировать потоки вашего приложения в режиме отладки.
Когда вы останавливаетесь на точке останова, то ваше приложение приостановлено, и вы
отлаживаете активный поток. В это время прочие потоки вашего приложения никуда не
исчезают. Однако они могут быть не видны. Для того чтобы увидеть их в меню отладки, вы
можете использовать в меню (или на панели инструментов) Debug опцию Show Threads in
Source (рис. 10.37).
Рис. 10.37. Опция Show Threads in Source
Использование этой опции приведет к выделению других потоков (которые существуют в
вашем коде). Эти строки кода будут выделены в поле индикаторов окна кода (во время
сеанса отладки). Значок (используемый для выделения этих элементов) похож на две
волнистых линии. Такой пример показан на рис. 10.38.
Рис. 10.38. Поток выделен в поле индикаторов
llL^ed(sJ at Location:
^ [58841< No Name* j
Рис. 10.39. Наведение курсора на индикатор потока
358 Часть III. Программирование и работа с кодом
Обратите внимание на значок слева от строки 29. Он означает, что в данном месте в вашем
исходном коде существует поток. Наведение курсора на этот индикатор покажет поток (или
потоки), на который ссылается индикатор. Для каждого потока показаны его
идентификационный номер (в скобках) и имя (если имеется). Пример представлен на рис. 10.39.
Совет
Наличие у потока имени облегчает его идентификацию при отладке. Для того чтобы
дать потоку имя, необходимо использовать пространство имен Threading. Точнее
говоря, необходимо вызвать свойство Name класса Thread.
Теперь, когда вы нашли пбток, вы, возможно, захотите пометить его для дальнейшего
наблюдения. Это помогает отделить те потоки, которые вы хотите наблюдать, от тех, которые
вас не интересуют. Вы можете пометить поток прямо в поле индикаторов. Для этого
щелкните правой кнопкой мыши по индикатору и выберите опцию Flag контекстного меню. На
рис. 10.40 показан пример.
Рис. 10.40. Отметка потока
Точно так же можно и снять флажок с потока. Вы можете также пометить потоки
непосредственно в окне Thread. Помеченные потоки имеют особую группу в окне Thread и в панели
инструментов Debug Location. Мы опишем это далее.
Управление отлаживаемыми процессами и потоками
Вы можете переключаться между отлаживаемыми процессами и потоками этих процессов
при помощи панели инструментов Debug Location (рис. 10.41). Слева находится список
процессов. Здесь вы можете выбрать процесс для просмотра его подробностей (в том числе
и выполняющихся потоков). Однако многие многопоточные приложения выполняются в
одном процессе.
Г5М41 NFTSvitemEvenb
Рис. 10.41. Панель инструментов Debug Location
Список Thread в панели инструментов показывает потоки выбранного процесса. Этот
список показан на рис. 10.41. Обратите внимание, что потоки показаны вместе со своими
идентификаторами, именами и флажками. Вы можете выбрать поток в этом списке для того,
чтобы перейти к соответствующему коду. Если с выделенным потоком не связано никакого
Глава 10 Отладка кода
359
исходного кода, то имя такого потока при его выделении будет показано красным цветом.
Вы можете отфильтровать этот список для того, чтобы видеть только потоки с флажками
(для этого надо нажать вторую кнопку справа от списка Thread (кнопка с двумя флажка-1
ми)). Первая кнопка справа просто выставляет (или убирает) флажок для текущего
активного потока. Наконец, список справа показывает стек вызовов. Активный кадр стека — это то,
что показано в окнах отладки (наблюдения, Locals, Autos и т. д.).
Вы можете также управлять потоками из окна Threads (меню Debug | Windows | Threads).
Здесь вы увидите перечисленными все потоки данного процесса. Пример показан на рис. 10.42.
Обратите внимание, что левая часть списка отображает потоки с флажками. В нашем
примере мы пометили флажками два потока. Обратите также внимание, что эти потоки
именованные. Это позволяет легко распознать их в столбце Name.
Category
606-1 j Worker Thread
Y S704 j Worker Thread
!,■«■■$ ft$$ fonftH Н^ШИЙЩ
4155
Name
«JJoNaroo
Instance caller
2934
2596
a
Ccpy
Select All
Hexadecimal Display
Hide Threads in Source
Switch To Thread
Rename
Freeze
Unllag
Uoflao All Threads
Location
ServerClass InstanceMethod
;:*ШШШШ**ШШ;
P rtonty
Highest
Norma1
Norma1
Norma
Suspend
Рис. 10.42. Окно Threads
В окне Threads имеется несколько опций. Они показаны в контекстном меню на рис. 10.42.
Обратите внимание на опцию Switch to Thread. Она позволяет вам переключать активный
отлаживаемый поток. Активный поток показан в списке потоков с желтой стрелкой (справа
от флажка). Переключение активного потока приведет к изменению контекста отладки и
содержимого отладочных окон. Вы можете также сделать Freeze (сделать паузу) для потока
при помощи этого контекстного меню. Это эквивалентно приостановке потока.
Прерывание для конкретного потока
Вы можете также сделать останов в строке кода для определенного вызывающего потока.
Для этого настройте точку останова и выберите фильтр для точек останова (был описан
ранее). Пример показан на рис. 10.43. Вы можете выбрать останов по идентификатору потока
или по его имени. В данном случае точка останова будет срабатывать по имени потока.
Естественно, для этого в своем коде вы должны присвоить потоку название.
Отладка скрипта на стороне клиента
Visual Studio позволяет вам отлаживать скрипты VBScript и JScript на стороне клиента. Для
этого вы должны включить отладку скриптов в браузере. Это можно сделать внутри
браузера Internet Explorer через меню (Tools | Internet Options). В диалоговом окне Internet
Options выберите вкладку Advanced, а затем перейдите к категории Browsing. Пример показан
360
Часть III. Программирование и работа с кодом
на рис. 10.44. Здесь вам нужно снять флажок с Disable script debugging (по умолчанию он
установлен).
You can restnct the breakpoint to only being set in certain processes and threads.
Enter an expression to describe where the breakpoint should be set, or clear the
expression to have the breakpoint set in all processes and threads.
Enter one or more of the f oUowtng clauses. You can cambme clauses using fit (AND),
|| (OR), > (NOT), and parentheses
MachineNeme = "machine*
Proceed = 123
processName = ' process"
Threadld = 123
ThreedName = 'thread"
Filter.
Threadfome = 'Instance callea)"
Рис. 10.43. Настройка фильтра точек останова по потоку
Затем настройте точки останова в ваших aspx- или html-файлах внутри блоков <script>.
Потом вы сможете остановиться на этих строках и отладить их при помощи Visual Studio.
,Однако есть и некоторые ограничения. Если у вас возникли проблемы, посмотрите тему
"Limitations on Script Debugging" в документации MSDN.
Interne? Options
General | Security Privacy j Content Coomtflor» Program Advanced
L_ Oose unused folders п налогу and Favente*"'
£ Qkabte sere* debuggng (Ihtenel Ьфгтг)
< jNpcabte scrot debuggng (Diher)
i ^rapley a nobfca tan about every «npt error
У &s*b*FTPfciderv*w (outsrfeof Internet Expta»*)
j, enabsepagr tnrmtenM
'"" ЕрдЫе pcrsorulxed favorites menu
>; e^abetfird-oirrytirwewcxterwon»*
У 5лаЬ«^1ша<агИевопЬийог»аг^схг1»окг»*«Ьр»о^»
, &r^«w*bertestouMth«Mtrcipane*
j. rwaeWsaeencs^nJoetf^eveiundrrTermnriServ^
;V" Ndfefy«^dottrioari«<sn<pcte
V Reuse widows for lauvtaxi shortcuts {when tabbed &ro«'
* f . .. . ад ! *
*T*kes «feet efter ypu restart Internet Eapkrer
fte«tor«»d*an«dse1*r«j»
Reset Internet E*p*ore? settings — - ~
Deletes ai tenporary flies, dsabtes browser I a*e»L
add-ons, ana resets «a the changed settings, I—-=J
feu should only use «he tf your browser is m an unusable state.
Caned
Рис. 10.44. Включение отладки скриптов в Internet Explorer
Глава 10. Отладка кода
361
Резюме
Данная глава представила вам отладчик Visual Studio 2008. Мы описали установку точек
останова в коде, а также и настройку условий срабатывания этих точек. Мы обсудили
пошаговое прохождение кода после срабатывания точки останова. Кроме того, мы представили
вам точки отслеживания, которые выполняют некоторые действия (такие как вывод
сообщения в окно вывода) при прохождении строки кода в отладчике. В этой главе также
изучались многие способы, которыми вы можете просматривать представленные отладчиком
данные (в том числе окна контрольных значений, визуализаторы и DataTips). Наконец, мы
описали сложные сценарии отладки (удаленные процессы, Web-сервисы, многопоточные
приложения и скрипты на стороне клиента).
Отладчик Visual Studio 2008, несомненно, ускорит вашу работу. Это ключевой навык,
который необходимо освоить. Шлифовка ваших навыков при помощи инструментов отладки —
это еще один способ повышения производительности вашей работы.
HACTblV
Расширенные
возможности Visual Studio
Глава 11
Введение в объектную модель
расширяемости
Visual Studio создана расширяемой. Она поставляется с собственным интерфейсом
прикладного программирования (API), чтобы дать разработчикам возможность управлять многими
элементами интегрированной среды.
Этот API называется объектной моделью расширяемости Visual Studio, и понимание его
возможностей является ключом к освоению программирования и управления
интегрированной средой, для чего пишется код в виде макросов и надстроек (см. главы 12 и 13).
В данной главе мы обсуждаем компоновку и структуру объектной модели расширяемости.
Мы установим соответствие между различными объектами объектной модели и элементами
интегрированной среды, изучим различные способы взаимодействия с этими объектами
(при помощи управляемого кода) и начнем понимать возможности доработки Visual Studio.
Для того чтобы собрать воедино концепции объектной модели и рассмотреть их в общем
контексте, мы собрали различные фрагменты кода и листинги, причем почти 100% их
написаны на языке Visual Basic. Причина в том, что Visual Basic — это язык макросов (другие
языки не поддерживаются), и макросы — это самый простой и быстрый способ работы с
элементами интегрированной среды. Макросы являются прекрасным средством изучения и
понимания объектной модели. В главах 12 и 13 мы выйдем за пределы объектной модели и
будем разбираться с тем, как использовать, писать и выполнять макросы и надстройки
(надстройки не ограничены языком Visual Basic, так что большая часть кода надстроек будет на
языке С#).
На данный момент вам не следует слишком беспокоиться о технике написания надстроек
или макросов; вместо этого лучше сосредоточиться на понимании объектов расширяемости
и их использования. К сведению любознательного читателя: листинги кодов этой главы
можно скопировать непосредственно в редактор макросов Macros Editor и запустить.
Обзор объектной модели расширяемости
Объектная модель расширяемости — это структурированная библиотека классов с
корневым объектом верхнего уровня под названием dte (или DTE2, об этом несколько позже), что
означает Development Tools Environment (среда разработки инструментов). Сделав ссылку
366
Часть IV. Расширенные возможности Visual Studio
на сборку, которая реализует объект dte/dte2, вы можете получить экземпляр этого
корневого объекта и использовать его члены и дочерние классы для доступа к компонентам
интегрированной среды разработки.
Версии объектной модели
Объектная модель расширяемости реализована в трех разных взаимодействующих сборках:
EnvDTE, EnvDTE80 и EnvDTE90. EnvDTE — это исходная сборка расширяемости,
поставлявшаяся вместе с Visual Studio .NET 2003. EnvDTE80 — это библиотека, которая
поставлялась с Visual Studio 2005, a EnvDTE90 поставляется с Visual Studio 2008. Причина
использования нескольких сборок проста: они помогают сбалансировать потребность в новых
функциональных возможностях с необходимостью сохранения обратной совместимости.
Например, в Visual Studio 2008 фирма Microsoft столкнулась с необходимостью принять
обычное проектное решение: либо заменить (или обновить) предыдущую сборку,
поставлявшуюся с Visual Studio 2005 (EnvDTE80) и получить возможную несовместимость с
имеющимися макросами и надстройками — либо поставлять новую сборку, которую можно
будет использовать в тех случаях, когда требуется новая функциональность (существующий
код будет по-прежнему работать с предыдущей, неизмененной сборкой).
Был выбран второй вариант, и поэтому в сборке EnvDTE90 (90 означает версию 9.0)
содержатся те типы и члены расширяемости, которые являются новыми разработками для Visual
Studio 2008, в то время как EnvDTE80 (для Visual Studio 2005) и EnvDTE (для более ранних
версий Visual Studjo) содержат функциональность начального уровня и обеспечивают
обратную совместимость.
В сборке EnvDTE90 вы найдете типы, которые заменяют своих предшественников из
сборки EnvDTE80. To же самое верно и для некоторых типов из сборки EnvDTE80, которые
заменяют типы, реализованные в EnvDTE. В этих случаях к имени типа добавлена цифра
(указывающая на пересмотренную версию). Поэтому у нас есть dte и dte2; Solution,
Solution2 и Solution3; и т. д.
В табл. 11.1 показан список некоторых самых важных типов, реализованных в библиотеках
EnvDTE. Этот список неполный; он дан только для сведения. Однако эта таблица полезна
для нахождения обновленных типов в новых сборках; в следующем разделе мы увидим, как
эти типы могут быть организованы в категории расширяемости Visual Studio и как они
соответствуют физическим конструкциям интегрированной среды.
Таблица 11.1. Неполный список типов расширяемости
Тип
Add In
Breakpoint, Breakpoint2
BuildDependencies
BuildDependency
BuildEvents
Описание
Представляет собой надстройку Visual Studio
Представляет собой точку останова отладчика
Представляет коллекцию объектов BuildDependency для
выделенного проекта
Представляет проекты, от которых зависит успешная сборка
выделенного проекта
Представляет список событий, относящихся к сборке решения
Глава 11. Введение в объектную модель расширяемости 367
Таблица 11.1 (продолжение)
Тип
Command
Commands, Commands2
CommandWindow
Configuration
Debugger, Debugger2,
Debugger3
DebuggerEvents
Document
Documents
DTE
EditPoint
Events
ExceptionGroups
Find
HTMLWindow, HTMLWindow3
OutputWindow
Program(Process2)
Project
Projectltem
Projectltems
Property
Selectedltem
Solution, Solution2,
Solutions
SourceControl,
SourceControl2
Taskltem
Taskltems, Taskltems2
Описание
Представляет команду в интегрированной среде
Коллекция всех команд, поддерживаемых в интегрированной
среде
Представляет окно команд
Представляет свойства конфигурации проекта
Представляет отладчик Visual Studio
Представляет события отладчика
Представляет открытый в интегрированной среде документ
Коллекция всех открытых в интегрированной среде документов
Представляет интегрированную среду, это корневой объект
верхнего уровня для объектной модели расширяемости
Представляет точку текстовой операции внутри документа
Представляет все события расширяемости
Представляет категории исключений, поддерживаемых Visual
Studio (появился в Visual Studio 2008)
Представляет возможность текстового поиска внутри
интегрированной среды
Представляет окно документа HTML
Представляет окно вывода Output
Представляет программу, работающую внутри
интегрированной среды, полезен для изучения процессов и потоков внутри
программы Функциональность EnvDTE80 обеспечивается
объектом Process2
Представляет проект, загруженный и интегрированную среду
Представляет элемент внутри данного проекта
Коллекция всех элементов, содержащихся в проекте
Представляет обобщенное свойство объекта (может
использоваться для многих объектов библиотеки расширяемости)
Представляет проекты или элементы проектов, которые в
данный момент выделены в интегрированной среде
Представляет решение, загруженное в данный момент в
Visual Studio
Представляет систему управления версиями в Visual Studio
Представляет элемент в окне Task List
Коллекция всех элементов окна Task List
368
Часть IV. Расширенные возможности Visual Studio
Таблица 11.1 (окончание)
Тип
TaskList
Template
TextDocument
TextPane, TextPane2
TextWindow
ToolBox
ToolBoxItem,
To'olBoxItem2
ToolBoxTab, ToolboxTab2,
ToolboxTab3
Window, Window2
Windows, Windows2
Описание
Представляет окно Task List
Представляет шаблон Visual Studio
(появился в Visual Studio 2008)
Представляет открытый в интегрированной среде текстовый
файл
Представляет панель в открытом окне текстового редактора
Представляет текстовое окно
Представляет окно Toolbox
Представляет элемент в окне панели инструментов
Представляет закладку в окне панели инструментов
Представляет (в обобщенном виде) любое окно внутри
интегрированной среды
Коллекция всех окон в интегрированной среде
Категории расширяемости
Поскольку всякая работа по расширяемости Visual Studio начинается с объектной модели,
то вы должны сначала понять, как она соответствует конструкциям интегрированной среды,
и определить предоставляемые ею возможности.
Вы можете считать, что классы объектной модели организованы в категории, которые
непосредственно соответствуют следующим концепциям интегрированной среды:
□ решения и проекты;
□ окна и панели команд (панели инструментов и меню);
□ документы;
□ команды;
□ отладчик;
□ события.
Каждый объект имеет отношение к своему элементу интегрированной среды и доступ к
каждому объекту обычно производится через корневой объект DTE2.
Корневой объект DTEIDTE2
Объект dte/dte2 представляет собой верхушку дерева API. Вы можете считать его
представлением самой интегрированной среды Visual Studio, причем находящиеся ниже него
объекты соответствуют различным частям интегрированной среды.
Глава 11. Введение в объектную модель расширяемости
369
Как уже упоминалось, самая новая версия— это DTE2, а версия dte обеспечивает
совместимость с предыдущими версиями. В данной главе (если не будет необходимости
подчеркнуть различия между ними) мы будем называть объекты dte и dte2 — просто dte.
Свойства dte используются для получения ссылок на конкретный объект интегрированной
среды (или коллекцию объектов). Методы объектов используются для выполнения команд в
интегрированной среде, запуска мастеров или выхода из интегрированной среды.
В табл. 11.2 показаны основные свойства и методы, определенные для объекта DTE2; они
организованы в шесть категорий объектов, перечисленных в предыдущем разделе.
Таблица 11.2. Свойства и методы DTE2 для доступа к интегрированной среде
Категория
Commands
Debugger
Documents
Documents
Event
Notification
Solutions
and Projects
Solutions
and Projects
Windows and
Command Bars
Windows and
Command Bars
Windows and
Command Bars
Windows and
Command Bars
Windows and
Command Bars
Свойство
Commands
Debugger
ActiveDocument
Documents
Events
ActiveSolutionProjects
Solution
ActiveWindow
CommandBars
MainWindow
StatusBar
ToolWindows
Описание
Возвращает коллекцию объектов Command;
в общем случае команда — это действие,
которое можно выполнить в
интегрированной среде (такое как открывание или
сохранение файла)
Возвращает объект отладчика
Возвращает объект Document,
представляющий текущий активный документ
Возвращает коллекцию объектов
Document, представляющую все открытые
документы
Возвращает объект Events для обработки
уведомлений о событиях
Возвращает коллекцию объектов Pro j ect,
представляющую проекты, которые в
данный момент выделены в Solution Explorer
Возвращает объект Solution для текущего
загруженного решения
Возвращает объект Window,
представляющий то окно внутри интегрированной среды,
в котором в данный момент находится фокус
Возвращает коллекцию объектов
CommandBar, представляющую все панели
инструментов и меню
Возвращает объект Window,
представляющий окно самой интегрированной среды
Возвращает объект StatusBar,
представляющий строку состояния Visual Studio
Возвращает экземпляр ToolWindows,
который в свою очередь предоставляет доступ
к нескольким самым известным
инструментальным окнам* командному окну, списку
ошибок, окну вывода, Solution Explorer,
списку задач и панели инструментов
370
Часть IV. Расширенные возможности Visual Studio
Таблица 11.2 (окончание)
Категория
Windows and
Command Bars
(Commands
Свойство
WindowConfigurations
ExecuteCommand
LaunchWizard
Quit
Описание
Возвращает коллекцию объектов
WindowConf iguration, эти объекты
представляют различные компоновки окон,
используемые в Visual Studio
Выполняет команду среды
Запускает указанный мастер с заданными
параметрами
Закрывает Visual Studio
Примечание
Механизмы ссылок и создания экземпляра объекта dte несколько меняются в
зависимости от того, пишете ли вы надстройку или макрос, поэтому детали мы опишем в
главах 12\л 13.
В заключение можно сказать, что объект DTE — это инструмент для непосредственного
взаимодействия с определенными компонентами интегрированной среды и для получения
доступа к более глубоким слоям API при помощи его коллекции свойств. Если вы
опуститесь на один уровень вглубь API, то вы обнаружите основные объекты, которые являются
краеугольными камнями расширяемости.
Объекты решений и проектов
Объект Solution представляет собой текущее загруженное решение. Отдельные проекты
решения доступны через объекты Project, возвращаемые в коллекции
Solution.Projects. Доступ к элементам проекта можно получить аналогичным образом
через коллекцию Project. ProjectItems.
Как видно из рис. 11.1, эта иерархия точно отражает иерархию решение/проект, которую мы
уже обсуждали в главе 4.
Здесь есть некоторые несоответствия — например, каталоги решений трактуются как
проекты — но по большей" части дерево объектной модели достаточно точно соответствует
дереву проектов решения (к которому вы привыкли).
Члены объектов Solution и Solution2 позволяют вам взаимодействовать с текущим
решением для выполнения таких стандартных задач, как следующие:
□ определение количества проектов в решении (свойство Count);
□ добавление проекта в решение (метод AddFromFile);
□ создание нового решения или закрытие текущего (методы Create и Close);
□ сохранение решения (метод SaveAs);
□ удаление проекта из решения (метод Remove).
Глава 11. Введение в объектную модель расширяемости
371
Решение
Решение
М Каталог решения
И Текстовый файл
Ч Проект A (VB)
Объекты автоматизации
Solution/Solution2
\-\ Проект
п
И Файл кода
Ч Файл кода
Ч Проект В (С#)
И Файл кода
М Файл кода
Projectiltem
Через
Solution Projects
Через
Project Projeclltems
И Проект
И Projectiltem
Ч Projectiltem
Ч Проект
Projectiltem
Ч Projectiltem
Рис. 11.1. Соответствие между иерархией решение/проект
Вы можете также напрямую получить ссылку на любой из проектов текущего загруженного
решения (для этого надо перебрать коллекцию Solution. Projects). В качестве примера
взаимодействия с объектами Solution и Project следующий фрагмент кода на Visual
Basic удаляет первый проект из текущего решения:
Dim sol As Solution = DTE.Solution
Dim proj. As Project = sol. Projects. Item(l)
If proj.Saved Then
sol.Remove(proj)
Else
End If
В табл. 11.3 представлен список наиболее часто используемых свойств и методов,
реализуемых в Solution3.
Таблица 11.3. Основные члены типов Solution/Solution2/Solution3
Свойство/метод
Описание
Свойство
Addlns
Count
DTE
Возвращает коллекцию объектов Add in, связанных с
текущим решением
Количество проектов в решении
Ссылка на родительский объект DTE
372
Часть IV. Расширенные возможности Visual Studio
Таблица 11.3 (окончание)
Свойство/метод
Описание
Свойство
FullName
Globals
IsOpen
Projects
Properties
Saved
SolutionBuild
Полный путь и название файла решения
Возвращает объект Globals (кэш переменных,
используемый в решении)
Указывает, открыто ли решение
Возвращает коллекцию объектов Project, представляющую
все проекты в решении
Возвращает коллекцию объектов Property, которая
представляет все свойства решения
Показывает,'было ли решение сохранено с момента
последней модификации
Возвращает ссылку на объект SolutionBuild; это точка
входа для объектов расширяемости, применимых для
текущего решения
Метод
AddFromFile
AddFromTemplate
AddSolutionFolder
Close
Create
FindProjectltem
GetProjectItemTemplate
GetProjectTemplate
Item
Open
Remove
SaveAs
Добавляет проект в решение при помощи имеющегося файла
проекта
Берется существующий проект, клонируется и добавляется в
решение
Создает в решении новый каталог решения
Закрывает решение
Создает пустое решение
Инициирует поиск элемента в одном из проектов решения
Возвращает путь к шаблону, используемому для данного
элемента проекта
Возвращает путь к шаблону, используемому для данного
проекта
Возвращает экземпляр Project
Открывает решение
Удаляет проект из решения
Сохраняет решение
Управление проектами в решении
Объект Solution очень удобен для получения ссылок на различные проекты решения.
Каждый объект Project имеет свой собственный набор полезных членов для взаимодействия
с проектами и их элементами. Используя эти члены, вы можете взаимодействовать с проек-
Глава 11. Введение в объектную модель расширяемости
373
тами различными способами, такими как: переименование проекта, удаление проекта и со-
I хранение проекта.
В табл. 11.4 приведен обзор наиболее часто используемых членов Project.
Таблица 11.4. Основные члены объекта Project
Свойство
Описание
Свойство
Addlns
Count
DTE
FullName
IsOpen
Projects
Properties
Saved
SolutionBuild
Возвращает коллекцию объектов Addin, связанных с текущим
решением
Возвращает количество проектов в решении
Предоставляет ссылку на родительский объект DTE .
Предоставляет полный путь и название файла решения
Указывает, открыто ли решение
Возвращает коллекцию объектов Project, представляющую все
проекты в решении
Возвращает коллекцию объектов Property, которая представляет
все свойства решения
Показывает, было ли решение сохранено с момента последней
модификации
Возвращает ссылку на объект SolutionBuild Это точка входа для
объектов расширяемости, применимых для текущего решения
Метод
AddFromFile
AddFromTemp1ate
AddSolutionFolder
Close
Create
FindProjectltem
Item
Open
Remove
SaveAs
Добавляет проект в решение при помощи имеющегося файла проекта
Берется существующий проект, клонируется и добавляется в решение
Создает в решении новый каталог решения
Закрывает решение
Создает пустое решение
Инициирует поиск элемента в одном из проектов решения
Возвращает экземпляр Project
Открывает решение
Удаляет проект из решения
Сохраняет решение
Доступ к коду внутри проекта
Кроме основных атрибутов и элементов проекта через экземпляр Project можно получить
доступ к реальному коду исходных файлов проекта. При помощи свойства CodeModel вы
374
Часть IV. Расширенные возможности Visual Studio
можете получить доступ ко всей линейке прокси-объектов, представляющих собой
конструкции кода внутри проекта. Например, интерфейс CodeClass позволяет вам изучить и
отредактировать код для данного класса в данном проекте.
Примечание
Поддержка объектов модели CodeModel для разных языков отличается. В
документации MSDN для каждого типа CodeModel четко указана имеющаяся языковая
поддержка данного элемента.
После получения ссылки на CodeModel из экземпляра Project вы можете получить доступ
к его коллекции CodeElements (которая (естественно) является коллекцией объектов
CodeElement). CodeElement — это просто обобщенное представление определенной
кодовой структуры в проекте. Объект CodeElement является обобщенным, но у него есть
свойство Kind. Оно используется для определения точного типа объекта кода, содержащегося
внутри CodeElement.
Свойство CodeElement.Kind является перечислением (типа vsCMElement), которое
устанавливает тип конструкции кода, скрытой в объекте CodeElement. Используя свойство
Kind, вы можете сначала определить истинную природу элемента кода, а затем привести
объект CodeElement к его строгому типу. Вот фрагмент кода на языке С#, который делает
именно это:
if (element.Kind == vsCMElement.vsCMElementCIass)
{
CodeClass myClass = (CodeClass)element;
}
Для того чтобы лучше уловить иерархию модели кода, рассмотрим код на С#,
представленный в листинге 11.1; это "ядро" решения, которое просто реализует пространство имен,
класс внутри этого пространства и функцию в этом классе.
| Листинг 11.1. Простая реализация пространства шън и класса
using System;
using System.Collections.Generic-
using System.Text;
namespace MyNamespace
{
class MyClass
{
public string Sumlnt(int x, int y)
{
return (x + y).ToString();
}
i
Глава 11 Введение в объектную модель расширяемости
375
Если вы установите соответствие кода листинга 11.1с моделью объектов кода, то вы
получите структуру, показанную на рис. 11.2.
Для того чтобы получить представление о полной глубине дерева модели кода, доступ к
которому можно получить через коллекцию CodeElements, загляните в табл. 11.5; в этой
таблице показаны все возможные значения элемента vsCMElement, представляемый ими
тип и краткое описание этого типа.
jr^l > Source Code File
Cod#Mod«l
--> MyClass.cs
—fr^ Cod«Ehnn»nte j
|—»[ Codeimport | -> us»rtg System
|—►[ Godcimport | -> using System.Collections.Genenc
" ' -> using System .Text
-> namespace MyNamespace < ...
Codelmport
Cod «Namespace
»->( CodeElements ")
i
;-»| CodtClasi.
'-- +£ GodeEtements )
'—►! Code Fulton |
*-> class MyClass < ...
| Cod»Typ«fitf |
-*Q CodeElements ^)
—> public string Sumlnt( ...
> string (via CodeFuncNon.Type)
Cod*P«ranwter
—» Jot x
i-fr| CodcTypeRef | > ^nt (via CodeParameter.Type)
—-> «Ot у
L-Ц CodePdmmetwiT
l—»| CodieTypefief | -> Sot (via CodeParameter.Type)
Рис. 11.2. Иерархия объектов простой модели кода
Таблица 11.5. Соответствие значений перечисления vsCMElement
Значение перечисления
vsCMElementAssignmentStmt
vsCMElementAttribute
vsCMElementClass
vsCMElementDeclareDecl
vsCMElementDefineStmt
vsCMElementDelegate
vsCMElementEnum
Тип
CodeClass
CodeDelegate
CodeEnum
Описание
Оператор присваивания
Атрибут
Класс
Объявление
Оператор define
Делегат
Перечисление
376
Часть IV. Расширенные возможности Visual Studio
Таблица 11.5 (продолжение)
Значение перечисления
vsCMElementEvent
vsCMElementEventsDeclaration
vsCMElementFunction
vsCMElementFunctionlnvokeStmt
vsCMElementIDLCoC^ass
vsCMElementIDLImport
vsCMElementIDLImportLib
vsCMElementIDLLibrary
vsCMElementImplementsStmt
vsCMElementImportStmt
vsCMElementIncludestmt
vsCMElementInheritsStmt
vsCMElementInterface
vsCMElementLocalDeclStmt
vsCMElementMacro
vsCMElementMap
vsCMElementMapEntry
vsCMElementModule
vsCMElementNamespace
vsCMElementOptionStmt
vsCMElementOther
vsCMElementParameter
vsCMElementProperty
vsCMElementPropertySetStmt
vsCMElementStruct
vsCMElementTypeDef
vsCMElementUDTDecl
vsCMElementUnion
vsCMElementUsingStmt
vsCMElementVariable
vsCMElementVBAttributeGroup
Тип
CodeEvent
CodeFunction
Codelmport
Codelnterface
CodeNamespace
CodeElement
CodeParameter
CodeProperty
CodeStruct
Codelmport
Описание
Событие
Объявление события
Функция
Оператор вызова функции
Составной класс (co-class) IDL
Оператор импорта IDL
Библиотека импорта IDL
Библиотека IDL
Оператор implements
Оператор import
Оператор include
Оператор inherits
Интерфейс
Оператор локального объявления
Макрос
Сопоставление
Элемент сопоставления
Модуль
Пространство имен
Оператор option
Элемент кода, отсутствующий в
данном перечислении
Параметр
Свойство
Оператор настройки свойства
Структура
Определение типа
Пользовательский тип
Объединение
Оператор using
Переменная
Группа атрибутов Visual Basic
Глава 11. Введение в объектную модель расширяемости
377
Таблица 11.5 (окончание)
Значение перечисления
vsCMElementVBAttributeStmt
vsCMElementVCBase
Тип
Описание
Оператор attribute
в Visual Basic
Базовый класс Visual C++
Окна
Та видимая часть Visual Studio, которая содержит контент, представлена объектами window.
Объекты window— это экземпляры открытых окон интегрированной среды (такие как
Solution Explorer, окно Task List, открытое окно редактора кода и т. д.) Даже сама
интегрированная среда представлена объектом window.
Любое окно является либо окном документа, либо окном инструмента. Окна документов
содержат документы, редактируемые при помощи Text Editor. Окна инструментов
содержат элементы управления, которые отображают информацию, соответствующую текущему
контексту интегрированной среды; окна Solution Explorer и Task List являются примерами
окон инструментов, а открытый в редакторе файл исходного кода на языке Visual Basic —
это пример окна документа.
Ссылки на окна
Если вам нужно отыскать конкретное окно, то у вас есть несколько вариантов (оптимальных
для разных ситуаций).
Для новичков: главное окно интегрированной среды всегда доступно непосредственно из
объекта dte:
Dim IDE As Window
IDE = DTE.MainWindow
Очевидно, что если вам нужно выполнить определенное действие с окном интегрированной
среды, то это самый быстрый вариант.
Свойство DTE.ActiveWindow также предоставляет прямой и быстрый доступ к объекту
window (в данном случае это текущее активное окно):
Dim CurrentWindow As Window
CurrentWindow = DTE.ActiveWindow
Окна инструментов в интегрированной среде (окно команд, окно списка ошибок, окно
вывода, окна Solution Explorer.и Task List и панель инструментов)— также имеют прямой
способ нахождения своих экземпляров объектной модели — для этого используется
свойство DTE.Toolwindows. Это свойство возвращает объект Tooiwindows, который имеет от*
дельное свойство для каждого из окон инструментов.
378
Часть IV. Расширенные возможности Visual Studio
Этот код на Visual Basic получает ссылку на окно Task List и закрывает его:
Dim taskwin As Window
taskwin = DTE.ToolWindows.TaskList
taskwin.Close()
И наконец, четвертый способ доступа к окну интегрированной среды — это через
коллекцию dte. Windows; эта коллекция имеет элемент для каждого окна интегрированной среды.
Вы можете получить доступ к окну коллекции либо при помощи целого числа,
представляющего собой положение окна в коллекции, либо при помощи объекта или строки,
представляющих то окно, которое вы хотите найти.
Следующий код получает дескриптор окна Solution Explorer:
Dim windows As Windows2 = DTE.Windows
Dim window As Window = windows.Itern(Constants.vsWindowKindSolutionExplorer)
Взаимодействие с окнами
В табл. 11.6 перечислены свойства и методы, имеющиеся у каждого объекта window.
Таблица 11.6. Члены объекта Window
Свойство/метод
Описание
Свойство
AutoHides
Caption
Collection
CommandBars
ContextAttributes
Document
DTE
Height
IsFloating
Left
Linkable
Булев флаг, указывающий, может ли окно быть скрыто
(применим только к окнам инструментов)
Название/Заголовок окна
Коллекция Windows, к которой принадлежит текущий объект
Window 9
Коллекция панелей команд, реализованных в окне
Коллекция объектов ContextAttribute, они используются
для ассоциирования текущего контекста окна с окном помощи
Dynamic Help
Если в объекте window размещен документ, то этот член
возвращает ссылку на документ
Ссылка на корневой объект DTE
Высота окна в пикселах
Булев флаг, указывающий, является ли окно плавающим или
пристыковано
Расстояние (в пикселах) между левым краем окна и левым краем
его контейнера
Булев флаг, указывающий, может ли окно быть пристыкованным
Глава 11. Введение в объектную модель расширяемости
379
Таблица 11.6 (окончание)
Свойство/метод
Описание
Свойство
LinkedWmdowFrame
LinkedWmdows
Object
ObjectKind
Project
Projectltem
Selection
Top
Visible
Width
WindowState
Возвращает ссылку на объект window, который служит рамкой
для пристыкованного окна
Коллекция объектов Window, представляющая окна,
объединенные одной рамкой
Возвращает прокси объекта, который представляет окно и на
который можно ссылаться по имени
Идентификатор GUID, указывающий тип объекта,
возвращаемого из Window.Object
Экземпляр Project, представляющий проект, который
содержит объект Window
Экземпляр Projectltem, представляющий элемент проекта,
который содержит объект Window
Возвращает объект, представляющий текущий выделенный в
окне элемент (для окон документов это может быть текст, для
окон инструментов это может быть элемент списка и т д )
Расстояние (в пикселах) между верхним краем окна и верхним
краем его родителя
Булев флаг, указывающий, видимо окно или скрыто
Ширина окна в пикселах
Получает или устанавливает текущее состояние окна (при
помощи значений перечисления vsWindowState'
vsWindowStateMaximize, vsWindowStateMinimize,
vsWindowStateNormal)
Метод
Activate
Close
SetSelectionContainer
i
SetTabPicture
Предоставляет окну фокус
Закрывает окно, вы можете при помощи значения из
перечисления vsSaveChanges указать — должен ли быть сохранен
находящийся в окне документ или должна ли интегрированная среда
запросить решение пользователя по этому вопросу
Передает массив объектов в окно Properties тогда, когда объект
window имеет фокус. Это свойство в основном используется
для нестандартных окон инструментов — когда вам нужно
управлять тем, что отображается в окне Properties
Указывает объект для использования в качестве изображения
для вкладки; это изображение демонстрируется тогда, когда окно
является частью группы с вкладками (внутри интегрированной
среды)
380
Часть IV. Расширенные возможности Visual Studio
Помимо использования простейших свойств (таких как свойств Height и width— для
запроса или изменения размеров окна, либо метода Set Focus для установки фокуса)
необходимо особо отметить еще несколько свойств.
□ Свойство Document дает вам возможность программным путем взаимодействовать с
документом, имеющимся в окне (если он есть).
□ Свойства Project и Projectltem служат для связи» между такими частями API, как
window и Project/Solution; так же как и свойство Document, вы можете
использовать их для взаимодействия с проектом, который связан с окном (либо с элементом
проекта, таким как файл кода на Visual Basic, текстовый файл или файл ресурсов).
□ Если вы имеете дело с окном инструментов, то метод SetTabPicture предоставляет
способ настройки иконки для вкладки, которая отображается тогда, когда окно
инструмента является частью группы окон с вкладками (например, на вкладке окна панели
Toolbox отображается картинка с гаечным ключом и молотком (когда оно является
частью группы окон с вкладками)).
□ И (только для окон инструментов) SetSelectionContainer можно использовать для
предоставления объектов для отображения в окне Properties. Эта возможность полезна
в том случае, если у вас есть нестандартное окно, где вам нужно управлять тем, что
отображается в окне Properties, когда окно имеет фокус (все стандартные окна Visual
Studio уже делают это для вас).
В листинге 11.2 содержится простой макрос, иллюстрирующий использование объекта
window. В этом примере каждое окно запрашивается для определения его типа, а затем
данные о каждом окне выводятся в простом окне сообщения.
Imports EnvDTE
Imports EnvDTE8О
Imports System.Diagnostics
Imports System.Windows.Forms
Public Module MacroExamples
Public Sub InventoryWindows()
' Получить коллекцию всех открытых окон
Dim windows As Windows2 = DTE.Windows
1 Сосчитать количество открытых окон
Dim windowCount As Integer = windows.Count ,
1 Локальные переменные для цикла и хранения окна и строковых результатов
Dim idx As Integer
Dim results As String
Dim window As Window2
Глава 11. Введение в объектную модель расширяемости
381
results = windowCount.ToString + " windows open..." + vbCrLf
1 Итерация по коллекции окон
For idx = 1 То windowCount
window = windows.Item(idx)
Dim title As String = window.Caption
1 Если окно содержит документ, то при помощи Window.Document
1 будет возвращен объект Document
If Not (window.Document Is Nothing) Then
' Вывести это как окно документа
Dim docName As String = window. Document. Name
results = results + "Window '" + title + "' is a document window" + _
vbCrLf
Else
1 Если документа нет, то это окно инструмента
' (окна инструментов документов не содержат)
results = results + "Window '" + title + "' is a tool window" + _
vbCrLf
End If
Next
' Показать результаты
MessageBox.Show(results, "Window Documents", MessageBoxButtons.OK, _
MessageBoxIcon.Information)
End Sub
End Module
Примечание
Если вы хотите встроить собственные элементы управления в окно инструментов, то
вам придется написать надстройку и использовать метод windows. CreateTooiwindow.
Мы описываем это в главе 13.
Текстовые окна и панели окон
Текстовые окна имеют свою специфическую объектную абстракцию (в дополнение к той,
что имеет обобщенный объект window): для представления окон текстового редактора
используется объект Textwindow. Для получения ссылки на объект Textwindow данного окна
вы находите значение объекта Window и присваиваете его типу Textwindow:
Dim textwindow As Textwindow
textwindow = DTE.ActiveWindow.Object
382
Часть IV. Расширенные возможности Visual Studio
Объект Textwindow не предоставляет какой-либо особенной функциональности по
сравнению с типом window; его реальная ценность состоит в доступе, который он обеспечивает к
панелям окна.
Окно текстового редактора в Visual Studio можно разбить на две панели; для создания в
окне открытого текстового редактора новой панели просто выберите пункт Split в меню
Window. Свойство Textwindow. Act ivePane возвращает объект Text Pane, который
представляет текущую активную панель окна, а свойство Textwindow. Panes предоставляет
доступ ко всем панелям внутри текстового окна:
' Получить экземпляр панели из коллекции
Dim newPane As TextPane2
newPane = textwindow.Panes.ItemA)
' Получить текущую активную панель
Dim currPane As TextPane2
currPane = textwindow.ActivePane
Самое полезное, что можно сделать при помощи объекта Text Pane — это прокрутить
клиентскую область панели (например, видимую часть документа внутри панели) для того,
чтобы увидеть нужный фрагмент текста. Это делается при помощи метода
TextPane. TryToShow. Вот определение этого метода:
Function TryToShow(Point As TextPoint, Optional How As vsPaneShowHow, _
PointOrCount As Object)
Параметр TextPoint представляет собой конкретное место в текстовом документе,
которое вы хотите сделать видимым в текстовой панели (мы подробно обсудим объекты
TextPoint в разд. "Редактирование текстовых документов" далее в этой главе).
Значение vsPaneShowHow указывает, как панель должна себя вести при прокрутке до
указанного места:
□ vsPaneShowHow.vsPaneShowCentered приводит к тому, что текст (или выделенный
фрагмент текста) центрируется в середине панели (по горизонтали и вертикали);
□ vsPaneShowHow.vsPaneShowTop размещает текст на самом верху видимой области
панели;
□ vsPaneShowHow. vsPaneShowAsIs показывает текст как есть — без изменения его
расположения по горизонтали или по вертикали видимой области панели.
Последний параметр (объект Point Or Count) используется для того, чтобы указать конец
текстового фрагмента, который вы хотите показать. Если вы зададите здесь целое число, то
это будет означать количество символов от начальной точки текста; если вы зададите еще
одну точку текста, то выделенным фрагментом будет считаться текст, который находится
между этими двумя точками текста.
Объект TextPane используется также и для доступа к функции Incremental Search
(инкрементальный поиск) для панели окна. В листинге 11.3 показан пример этой функции в
действии.
Глава 11. Введение в объектную модель расширяемости
383
Листинг 11.3. Управление инкрементальным поиском
Imports EnvDTE
Imports EnvDTE80
Imports Microsoft.VisualStudio.CommandBars
Imports System.Diagnostics
Imports System.Windows. Forms
Public Module MacroExamples
Public Sub IncrementalSearch()
' Получить ссылки на активное окно;
' в этом примере мы подразумеваем, что это текстовое окно.
Dim window As Window2 = DTE.ActiveWindow
у
' Получить экземпляр TextWindow, который соответствует
1 нашему текущему окну
Dim txtWindow As TextWindow = window.Object
1 Получить активную панель текстового окна
Dim pane As TextPane2 = txtWindow.ActivePane
1 Используя активную панель, получить объект IncrementalSearch для панели
Dim search As IncrementalSearch = pane.IncrementalSearch
Попытаемся найти наш интерфейс IMessageMapper
при помощи поиска строки "IM".
Настроить поиск:
- поиск по документу вперед;
- соединить символы, которые мы ищем;
- закончить поиск,
search.StartForward()
search.AppendCharAndSearch(AscW("I"))
search.AppendCharAndSearch(AscW("M"))
' Для выхода из режима инкрементального поиска
1 мы можем вызвать IncrementalSearch.Exit()...
'search.Exit()
End Sub
End Module
384
Часть IV. Расширенные возможности Visual Studic
Типы оконных инструментов
Кроме объектной абстракции window, каждое стандартное окно инструментов в
интегрированной среде (командное окно, окно вывода, окно Toolbox и окно Task List) представлено
также отдельным типом, который предоставляет уникальные методы и свойства этого окна
инструментов. В табл. 11.7 перечислены стандартные окна инструментов и их базовый тип в
объектной модели расширяемости.
Таблица 11.7. Окна инструментов и их типы
Окна инструментов
Command window
Output window
Task List window
Toolbox window
Тип
CommandWindow
OutputWindow
TaskList
ToolBox
Для того чтобы сослаться на один из этих объектов, вы начинаете с его представления в
виде window, а затем приводите тип значения window.object к соответствующему типу.
Например, следующий фрагмент на языке Visual Basic начинается со ссылки window на окно
Task List, а затем использует этот объект window для получения ссылки на объект
|TaskList:
i Dim windows AS Windows = DTE.Windows
Dim twindow As Window = _
DTE.Windows.Item(EnvDTE.Constants.vsWindowKindTaskList)
Задачи и окно Task List
Объект TaskList дает вам возможность доступа к элементам, отображенным в данный
момент в окне Task List; каждый элемент окна представлен своим объектом Taskitem. Объект
Та ski tern предоставляет методы и свойства, которые позволяют вам манипулировать
элементами задач. Например, вы можете пометить элемент как завершенный, получить или
установить номер строки (связанный с задачей), а также изменить приоритет задачи.
Вы можете удалить задачи из списка при помощи использования метода Taskitem. Delete
и добавить их при помощи метода Taskltems. Add. Метод Add позволяет вам указать
категорию задачи, ее подкатегорию, описание, приоритет, значок и т. д.:
Dim tlist As TaskList = CType(twindow.Object, TaskList)
tlist.Taskltems.Add("Best Practices", "Coding Style", _
"Use of brace indenting is inconsistent", _
vsTaskPriority.vsTaskPriorityMedium, _
vsTasklcon.vsTasklconUser, True, _
"S:\ContosoCommonFramework\Contoso.Fx.Common\Classl.cs", _
7, True, True)
Глава 11. Введение в объектную модель расширяемости
385
В табл. 11.8 приведен список членов Taskitem.
Листинг 11.4 содержит короткий макрос на языке Visual Basic, демонстрирующий
использование объектов TaskList, TaskIterns и Taskitem для перебора задач и изменения их
статуса завершения.
Таблица 11.8. Ялены Taskitem
Свойство/метод
Описание
Свойство
Category
Checked
Collec.ti.on
Description
Displayed
DTE
FileName
IsSettable
Line
Priority
Subcategory
Категория задачи
Булев флаг, указывающий, помечена ли задача как завершенная (при этом
рядом с задачей появляется галочка)
Коллекция TaskList, к которой принадлежит текущий объект Taskitem
Описание задачи
Булев флаг, указывающий, видна ли задача в данный момент в окне
Task List
Ссылка на корневой объект DTE
Имя связанного с задачей файла (если такой имеется)
Если передать этому свойству значение из перечисления
vsTaskListColumn, то можно определить — редактируемый ли это
столбец \
Номер строки, связанной с данной задачей
Значение vsTaskPriority, указывающее уровень приоритета задачи.
Возможные значения: vsTaskPriorityHigh, vsTaskPriorityMedium
и vsTaskPriorityLow
Подкатегория задачи
Метод
Delete
Navigate
Select
Удаляет задачу из окна Task List
Приводит к переходу интегрированной среды в местоположение (например,
файл и строку), связанное с задачей
Выделяет или перемещает фокус на задачу в окне Task List
Imports EnvDTE
Imports EnvDTE80
Imports Microsoft.VisualStudio.CommandBars
Imports System.Diagnostics
Imports System.Windows.Forms
386
Часть IV. Расширенные возможности Visual Studio
Public Module MacroExamples
Public Sub ToggleAllTasks()
1 Сослаться на коллекцию окон
Dim windows As Windows = DTE.Windows
1 Извлечь окно списка задач из коллекции
Dim twindow As Window = _
DTE.Windows.Item(EnvDTE.Constants.vsWindowKindTaskList)
1 Преобразовать объект окна в экземпляр TaskList
' при помощи приведения типа его свойства Object
Dim tlist As TaskList = CType(twindow.Object, TaskList)
' Перебрать все элементы списка задач
For Each task As Taskltem In tlist.Taskltems
' Изменить "галочку" у каждого элемента
task.Checked = Not task.Checked
Next
End Sub
iEnd Module
Панель Toolbox
Для программного взаимодействия с панелью инструментов используются четыре объекта:
□ ToolBox — объект, представляющий саму панель инструментов Toolbox;
□ ToolBoxTabs — коллекция, представляющая вкладки панели;
□ ToolBoxitems — коллекция, представляющая элементы внутри вкладки панели;
□ ToolBoxitem — отдельный элемент, отображаемый внутри вкладки панели.
На рис. 11.3 показана иерархия объектов панели Toolbox.
1 ТооШох 1
Ч
TooBoxTabs ^)
—►) ToolBoxTab ]
.
-К"
ToolBoxitems }
L-tJ ToolBoxitem 1
Рис. 11.3. Иерархия объектов Toolbox
Глава 11. Введение в объектную модель расширяемости
387
Эти объекты используются в основном для добавления, удаления или изменения элементов,
имеющихся в панели Toolbox. Например, при помощи коллекции ToolBoxTabs вы можете
легко добавить в панель свою вкладку:
Dim tBox As ToolBox
Dim myTab As ToolBoxTab
tBox = DTE.Windows.Item(Constants.vsWindowKindToolbox).Object
myTab = tBox.ToolBoxTabs.Add("My TBox Tab")
Вы можете также добавлять элементы на любую вкладку при помощи метода
ToolBoxitems.Add, который принимает имя добавляемого элемента, представляющий
элемент объект "данных" и перечисление vsToolBoxitemFormat, которое указывает
формат элемента. Метод Add использует vsToolBoxitemFormat для того, чтобы определить,
как именно надо интерпретировать значение объекта "данных". Например, если вы хотите
добавить элемент управления .NET на вкладку, созданную в предыдущем фрагменте кода,
то можете сделать это всего одной строкой кода:
myTab.ToolBoxItems.Add("ContosoControl", _
"C:\Contoso\Controls\CalendarControl.dll", _
vsToolBoxitemFormat.vsToolBoxItemFormatDotNETComponent)
Обратите внимание, что в данном случае элемент представлен путем к сборке (которая
реализует данный элемент управления) и что он имеет формат vsToolBoxitemFormatDotNET-
Component.
В листинге 11.5 содержится функция Visual Basic, которая добавляет вкладку в панель
инструментов, добавляет элемент управления и фрагмент текста на вкладку, а затем удаляет
вкладку.
j Листинг 11.5. Добавление и удаление элементов в окне панели Toolbox \
Imports EnvDTE
Imports EnvDTE8О
Imports Microsoft.VisualStudio.CommandBars
Imports System.Diagnostics
Imports System.Windows.Forms
Public Sub AddAToolBoxTab()
Dim toolBox As ToolBox
Dim tabs As ToolBoxTabs
Dim tab As ToolBoxTab
Dim tabltems As ToolBoxItems
Dim win As Window
Try
1 Получить ссылку на панель Toolbox
win = DTE.Windows.Item(Constants.vsWindowKindToolbox)
toolBox = win.Object
388
Часть IV. Расширенные возможности Visual Studio
' Получить ссылку на коллекцию вкладок панели Toolbox
tabs = toolBox.ToolBoxTabs
' Добавить новую закладку в панель инструментов
tab = tabs.Add("New ToolBox Tab")
' Сделать добавленную вкладку активной
tab.Activate()
tabltems = tab.ToolBoxItems
With tabltems
' Добавить текст в панель Toolbox.
' Щелчок по тексту приведет к его добавлению
1 в активный документ...
.Add("Code Comment", "This is some text to add to the toolbox", _
vsToolBoxItemFormat. vsToolBoxItemFormatText)
1 Теперь добавим на панель Toolbox элемент управления.
1 При добавлении элемента управления вам нужно указать путь к сборке;
' вы можете добавить все классы сборки (как показано далее) или
' только один из них (такой синтаксис см. в документации MSDN)
.Add("My Login Control",
"С:\MyComponents\Contoso\LoginControl.dll", _
vsToolBoxItemFormat. vsToolBoxItemFormatDotNETComponent)
' Для демонстрации удалим те элементы, которые мы только что добавили,
' а затем удалим и созданную новую вкладку...
1 Выдать окно сообщения для подтверждения удалений
MessageBox.Show("Click OK to delete the tab and added items.", _
"Delete Toolbox Tab Items", MessageBoxButtons.OK, _
MessageBoxIcon.Information)
' Удалить вкладку
tab.Delete ()
End With
Catch ex As Exception
MsgBox("Error: " & ex.ToString())
End Try
End Sub
Глава 11. Введение в объектную модель расширяемости
389
Выполнение команд в командном окне
Командное окно — это окно инструментов для выполнения команд (или их алиасов)
интегрированной среды. Команды интегрированной среды — это по существу способ дать
указание интегрированной среде выполнить некое действие. Некоторые команды соответствуют
непосредственно пунктам меню (таким как File | Open), в то время как другие эквивалентов
в меню не имеют.
Объект Commandwindow позволяет вам программным путем перенаправить команды в
командное окно и выполнить их. Вы можете также вывести в окно текстовую строку (для
информационных целей) и очистить его текущее содержимое:
' Получить ссылку на командное окно
Dim cmdWindow As Commandwindow = _
DTE.Windows.Item(Constants.vsWindowKindCommandWindow).Obj ect
1 Вывести в командном окне некий текст
cmdWindow.OutputString("Hello, World!")
Imports EnvDTE
Imports EnvDTE80
Imports Microsoft.VisualStudio.CommandBars
Imports System.Diagnostics
Imports System.Windows.Forms
Public Module MacroExamples
Public Sub ExecCommandWindow()
Dim cmdWindow As Commandwindow = _
DTE.Windows.Item(Constants.vsWindowKindCommandWindow).Obj ect
1 Отобразить в командном окне некий текст
cmdWindow.OutputString("Executing command from the automation OM...M)
1 Послать строки команд в командное окно и выполнить их...
1 Эта команда запустит журналирование всего ввода/вывода
1 командного окна в указанный файл
cmdWindow.Sendlnput("Tools.LogCommandWindowOutput cmdwindow.log", True)
390
Часть IV. Расширенные возможности Visual Studio
' Открыть файл в редакторе кода:
1 1. Мы используем алиас 'of для команды File.OpenFile.
1 2. Эта команда принимает параметры в кавычках (в данном случае
1 это имя редактора, в который нужно загрузить файл).
Dim cmd As String = "of "
cmd = cmd & _
"""C:\Contoso\ContosoCommonFramework\Integration\Integration.cs"""
cmd = cmd & Ve:""CSharp Editor"""
cmdWindow.Sendlnput(cmd, True)
cmdWindow.Sendlnput("Edit.Find MessageTrxId", True)
' Выключить журналирование
cmdWindow.Sendlnput("Tools.LogCommandWindowOutput /off", True)
End Sub
End Module
Окно вывода
Окно вывода отображает сообщения, генерируемые различными источниками в
интегрированной среде. Прежде всего это — сообщения компилятора при сборке проекта. Для более
глубокого изучения функциональности окна вывода обратитесь к главе 10.
Окно вывода управляется тремя объектами:
□ Outputwindow — корневой объект, представляющий окно вывода;
□ OutputWindowPanes — коллекция объектов OutputWindowPane;
□ OutputWindowPane представляет одну из текущих панелей внутри окна вывода.
Используя эти объекты, вы можете добавлять и удалять панели из окна вывода, выводить
текст в любую из панелей и реагировать на события, происходящие в окне.
Следующий фрагмент кода на языке Visual Basic получает ссылку на окно вывода и пишет
тестовую строку в панель Build:
Dim outWindow As Outputwindow =
DTE.Windows.Item(Constants.vsWindowKindOutput).Obj ect
Dim pane As OutputWindowPane = outWindow.OutputWindowPanes.Itern("Build")
pane.OutputString("test")
Используя объект OutputWindowPane, вы можете также добавлять элементы одновременнс
как в указанную панель вывода, так . и в окно Task List. Метод
OutputWindowPane.OutputTaskltemString пишет текст в окно вывода и одновременнс
добавляет этот текст как задачу в окно Task List:
Dim output As String = "Exception handler not found"
Dim task As String = "Add exception handler"
Глава 11. Введение в объектную модель расширяемости
391
pane.OutputTaskltemString(output, vsTaskPriority.vsTaskPriorityMedium, _
"", vsTasklcon.vsTasklconNone, "", 0, task, True)
Поскольку большая часть действий окна вывода выполняется в конкретной панели, то
большинство полезных методов сосредоточено в объекте OutputwindowPane. Члены
OutputwindowPane перечислены в табл. 11.9.
Таблица 11.9. Члены OutputwindowPane
Свойство/метод
Описание
Свойство
Collection
DTE
Guid
Name
TextDocument
Коллекция OutputWindowPanes, к которой принадлежит
текущий объект OutputwindowPane
Ссылка на корневой объект DTE
Идентификатор GUID для панели окна вывода
Имя панели окна вывода
Объект Text Document, представляющий содержимое панели окна
Метод
Activate
Clear
ForceltemsToTaskList
OutputString
OutputTaskltemString
Перемещает фокус в окно вывода
Очищает содержимое панели окна
Записывает все элементы в окно Task List (те, которые еще не
записаны) |г
Пишет строку в панель окна вывода
Пишет строку в панель окна вывода и одновременно добавляет
задачу в окно Task List
В листинге И.7 представлено, как осуществлять управление окном вывода посредством
добавления новой панели в окно, записи текста в панель и очистки ее содержимого.
\ Листинг 117; Пишем в окно вывода
Imports EnvDTE
Imports EnvDTE80
Imports Microsoft.VisualStudio.CommandBars
Imports System.Diagnostics
Imports System.Windows.Forms
Public Module MacroExamples
Public Sub WriteToOutputWindow()
1 Получить ссылку на окно вывода
Dim outWindow As OutputWindow = _
DTE.Windows.Item(Constants.vsWindowKindOutput).Object
392
Часть IV. Расширенные возможности Visual Studio
1 Создать новую панель в окне вывода
Dim pane As OutputWindowPane = _
outWindow,OutputWindowPanes.Add("New Pane")
pane.OutputString("Text in the 'New Pane1")
pane.Clear()
End Sub
End Module
Связанные окна
Окна инструментов могут быть расположены внутри интегрированной среды различными
способами: вы можете оставить окна инструментов плавающими в пределах общего
контейнера интегрированной среды, пристыковать окно инструмента к одной из сторон
интегрированной среды, объединять окна и прикреплять их и т. д. (введение по компоновке окон см.
в разд. "Управление множеством окон в интегрированной среде разработки" главы 2).
Связанные окна — это два или более окон инструментов, которые сгруппированы вместе.
На рис. 11.4 показан пример: панель Toolbox и окно Solution Explorer объединены в общей
рамке. Каждое окно (которое является частью рамки) можно посмотреть при помощи
нажатия на его вкладку.
Щ АН Window* Form*
{? (дняшюв Control*
It Pointer
© Button
0 CheclcBo*
Ш ChccfcedListBox
5| Combo Box
]!!l DateThnePkker
A Label
A LmkLabeJ
*3 ListBox
\V ListView
|VJ MsskedTextBox
J5j MonthCafendar
"S^ Notrfylccn
113 NitmeririJpDowr*
УЗ PictureBox
ri feft1of&
Рис. 11.4. Объединенные окна
Путем объединения двух или более окон инструментов вы фактически создаете
дополнительный оконный объект, называемый связанным окном или связанным фреймом, который
работает как контейнер для находящихся в нем окон и доступен как часть коллекции
DTE.Windows.
Глава 11. Введение в объектную модель расширяемости
393
При помощи использования свойств Window.LinkedWindows и Window.WindowFrame, а
гакже метода Windows2.CreateLinkedWindowFrame вы можете программно объединять и
разъединять любые имеющиеся окна инструментов. Код на языке Visual Basic в
листинге 11.8 демонстрирует этот процесс следующим образом:
1. Вы получаете объекты окон для окна панели Toolbox и окна Solution Explorer.
2. Вы программным путем объединяете эти два окна вместе, создавая по сути связанное
окно (см. рис. 11.4).
3. После объединения окон вы получаете ссылку на вновь созданное связанное окно и
используете его свойство LinkedWindows для разъединения окон.
Imports EnvDTE
Imports EnvDTE8О
Imports System.Diagnostics
Imports System.Windows.Forms
Public Module MacroExamples
Public Sub LinkUnLink()
Dim windows^As Windows2 = DTE.Windows
1 Получить ссылки на панель Toolbox и Solution Explorer
Dim solExplorer As Window2 = _
windows.Item(Constants.vsWindowKindSolutionExplorer)
Dim toolbox As Window2 = windows.Itern(Constants.vsWindowKindToolbox)
' Использовать коллекцию Windows2 для создания рамки связанного окна
' (в которой будут содержаться окна панели Toolbox и Solution Explorer)
Dim windowFrame As Window2
windowFrame = windows.CreateLinkedWindowFrame(solExplorer, _
toolbox, vsLinkedWindowType.vsLinkedWindowTypeTabbed)
1 На данный момент мы создали связанное окно с двумя "внутренними"
1 окнами со вкладками: Solution Explorer и панель Toolbox...
MessageBox.Show("Press OK to Unlink the windows", "LinkUnLink", _
MessageBoxButtons.OK, MessageBoxIcon.None)
' Для разъединения окон:
' — использовать коллекцию LinkedWindows связанного фрейма;
' — удалить объекты окон из этой коллекции.
394
Часть IV. Расширенные возможности Visual Studic
windowFrame.LinkedWindows.Remove(toolbox)
windowFrame.LinkedWindows.Remove(solExplorer)
End Sub
End Module
Панели команд
Панель команд — это панель меню или панель инструментов; с точки зрения объектной
модели они представлены объектами CommandBar. Поскольку панели меню и панели
инструментов находятся в окне, то вы ссылаетесь на конкретные объекты CommandBar через
объект Window (при помощи свойства Window. CommandBars). В GBOK) очередь, каждые
CommandBar размещает внутри себя такие элементы управления, как кнопки и выпадающие
списки. На рис. 11.5 показано окно Solution Explorer с выделенной командной панелью.
Обратите внимание, что на панели команд находится шесть кнопок.
4rth>ttt-n fajfljflf».» - Ууч^ддг^ Qn^frnnP^rem^n $Щ
sT^'x ,v» 3 ^ П £t О
ш «^ 1
33 эокшВД CU!1LU!»lOW>Tkor.f;r&mmcrk A4 *
.. *■ , Architecture Mocels
, i\ A Пяп >Ыапде
i \\ ,i СОП50*16:5
* .: 4_> Forms
i ! ' ]£ Contsso UUVmdoi#s{:errm,.Empsoy „,
' ль MyPtcjctt
*Ji] CcmrjcnFu ics.vfc
CortcseUhYinriowsFerrrsEr-pIc
j ^j Moduli vb
| ц| UserCcntroli vb
f <"$ Contoso UlAVmdcvvs*orms,.Qrdefi:~
| * ^ Рю рея!»
[ i ,~d Refeience*
{ CortcscUr^dov^sfernvsCbcte
| T . *3 Forml.cs
Рис. 11.5. Окно Solution Explorer
и его командная панель
Примечание
В отличие от коллекции windows, которая содержит только экземпляры всех откры
тых окон, коллекция CommandBars содержит экземпляры всех зарегистрированны)
панелей команд, независимо от того, показана ли в данный момент эта панель в окне.
Код на языке Visual Basic в листинге 11.9 запрашивает объект CommandBar для окн*
Solution Explorer и выводит те объекты CommandBar, которые находит.
396
Часть IV. Расширенные возможности Visual Studio
помощи свойства CommandBar. Controls). Удалив следующую проверку свойства Enabled,
мы получим гораздо больше элементов управления в окне сообщения:
If control.Enabled Then
Обратите внимание, что в листинге 11.9 вы должны явным образом приводить тип
возвращенного из свойства window.CommandBars объекта. Интересно, что это не строго
типизированное свойство, и оно возвращает Object вместо реального экземпляра CommandBars.
Solution Explorer Command 8ar
Command bar contains
1 msoControlBtrttoru P&ioperttes
2 msoContrDlButton: Sh&ow Ail Files
3 msoControButton: Refitfiesh
4 msoControlButton. View &Code
5 msoCorttrolButton: View &Destgner
В rraoCorvtrolBLrttorv &View Class Diagram
Рис. 11.6. Элементы управления, обнаруженные в панели команд
Совет
Используйте свойство CommandBar.Туре для определения, является ли панель
' команд панелью инструментов или панелью меню. Значение
MsoBarType.msoBarTypeNormal подразумевает, что панель команд— это панель
инструментов, в то время как значение MsoBarType.msoBarTypeMenuBar — что ЭТО
меню.
Свойства и методы объекта CommandBar описаны в табл. 11.10.
Примечание
Предыдущие версии Visual Studio фактически опирались на определение объекта
CommandBar (пространство имен Microsoft.Office.Core) в сборке Microsoft Office.
Visual Studio 2005 и более поздние версии имеют собственную реализацию объекта
CommandBar, который определен в пространстве имен
Microsoft.visuaistudio.CommandBars (хотя вы по-прежнему можете найти
некоторые типы, которые ведут свое обозначение от сборки MS Office— такие как
различные перечисления Msoxxx).
Таблица 11.10. Члены CommandBar
Свойство/метод
Описание
Свойство
AdaptiveMenu
Для панелей меню этот булев флаг указывает, включено ли адаптивное
меню для данной панели команд. Адаптивное меню (иногда называемое
персонализируемым) — это меню, выпадающее содержимое которого
изменяется в зависимости от планируемого или фактического использования
пользователем; идея состоит в том, чтобы показывать в меню только те
команды, которые полезны, и скрывать прочие несущественные команды
Глава 11. Введение в объектную модель расширяемости 397
Таблица 11.10 (продолжение)
Свойство/метод
Описание
Свойство |
Application
Builtln
Context
Controls
Creator
Enabled
Height
Index
Left
Name
NameLocal
Parent
Position
Protection
Rowlndex
Top
Type
Visible
I Width
Объект, представляющий родительское приложение панели команд
Булев флаг, используемый для распознавания встроенных и
пользовательских панелей команд
Строка, указывающая место сохранения CommandBar (формат и
содержимое этой строки диктуются приложением)
Коллекция CommandBarControls, содержащая объекты
CommandBarControl; каждый из этих объектов представляет собой
элемент управления, отображаемый панелью команд
Целочисленное значение, которое идентифицирует то приложение, в
котором находится CommandBar
Булев флаг, указывающий, активирована ли панель команд
Высота панели команд в пикселах
Индекс панели команд в коллекции панелей команд
Расстояние (в пикселах) между левой стороной панели команд и левой
стороной ее родительского контейнера
Имя панели команд
Локализованное имя панели команд
Объект, который является родителем панели команд
Значение перечисления MsoBarPosition, используемое для получения
или установки положения панели команд (например,
MsoBarPosition.msoBarTop)
Значение перечисления MsoBarProtection, которое указывает защиту
против модификации пользователем (например,
MsoBarProtection.msoBarNoMove)
Целое число, представляющее стыковочный ряд панели команд
Расстояние (в пикселах) между верхним краем панели команд и верхним
краем ее родительского контейнера
Тип панели команд (значение из перечисления MsobarType; например,
MsoBarType.msoBarTypeNormal)
Булев флаг, указывающий — видима ли панель команд в настоящий
момент
Ширина панели команд в пикселах
Метод
Delete
FindControl
Удаляет панель команд из родительской коллекции
Позволяет вам получить ссылку на элемент управления, находящийся в
панели команд и удовлетворяющий различным параметрам (тип,
идентификатор, тег и видимость)
398
Часть IV. Расширенные возможности Visual Studio
Таблица 11.10 (окончание)
Свойство/метод
Описание
Метод
Reset
ShowPopup
Сбрасывает конфигурацию одной из встроенных панелей команд в
состояние по умолчанию
Отображает всплывающее окно, представляющее панель команд
Документы
Объекты документов применяются для представления в интегрированной среде открытых
документов. Для сравнения этой абстракции с той, которую предоставляет объект window:
объект window используется для представления физических аспектов пользовательского
интерфейса окна документа, в то время как объект Document служит для представления
физического документа, который отображается внутри окна документа.
Документ может быть визуальным конструктором (таким как визуальный конструктор
Windows Forms), либо он может быть текстовым документом (таким как ознакомительный
файл readme или файл с кодом на языке С#, открытый в редакторе).
Точно так, как вы получаете список всех открытых окон при помощи коллекции
dte.windows, точно так же вы можете использовать и коллекцию DTE.Documents для
получения списка всех открытых документов:
Dim documents As Documents = DTE. Documents
Коллекция Documents индексирована по свойству Name документа, которое является
именем файла документа (без информации о пути). Это облегчает быстрое получение
экземпляра Document:
Dim documents As Documents = DTE.Documents
Dim readme As Document = documents. I tern ("ReadMe.txt")
При помощи объекта Document вы можете делать следующее:
□ закрыть документ (и по желанию сохранить изменения);
П получить имя файла и путь к документу;
П определить, был ли документ модифицирован с момента последнего его сохранения;
□ определить, что в данный момент выделено в документе;
□ получить экземпляр Projectitem, представляющий элемент проекта, который связан с
документом;
□ читать и редактировать содержимое текстовых документов.
В табл. 11.11 содержатся описания членов объекта Document.
Глава 11. Введение в объектную модель расширяемости 399
Таблица 11.11. Члены Document
Свойство/метод
Описание
Свойство
ActiveWindow
Collection
DTE
Extender
ExtenderCATID
ExtenderNames
FullName
Kind
Name
Path
Projectltem
Saved
Selection
Windows
Текущее активное окно, связанное с документом (значение null или
Nothing означает, что активного окна нет)
Коллекция объектов Document, которой принадлежит данный экземпляр
Объект DTE корневого уровня
Возвращает объект-расширитель Document
Идентификатор категории расширителя для объекта
Список расширителей, имеющихся для текущего объекта Document
Полный путь и имя файла документа
Идентификатор GUID для типа документа
Имя (имя файла без информации о пути) для документа
Путь для файла документа (без имени файла)
Экземпляр Projectltem, связанный с документом
Указывает, было ли решение сохранено с момента последней
модификации
Объект, представляющий текущее выделение в документе (если есть)
Коллекция windows, содержащая окно, которое отображает документ
Метод
Activate
Close
NewWindow
Object
Redo
Save
I Undo
Перемещает фокус на документ
Закрывает документ. Вы можете указать (при помощи значения из
перечисления vsSaveChanges), нужно ли сохранять документ в окне — или
интегрированная среда должна запросить об этом пользователя
Открывает документ в новом окне и возвращает объект window нового
окна
Возвращает прокси объекта, который представляет окно и на который
можно ссылаться по имени
Повторно выполняет последнее действие пользователя в документе
Сохраняет документ
Отменяет последнее действие в документе
Текстовые документы
Как мы уже упоминали, документы могут иметь как текстовое, так и нетекстовое
содержимое. Для документов с текстовым содержимым существует отдельный объект —
Text Document. Объект Text Document предоставляет доступ к функциям управления,
специфичным для текстового содержимого.
400 Часть IV. Расширенные возможности Visual Studio
Если у вас есть объект Document, и если этот объект Document относится к текстовым
документам, тогда в свойстве Document. Object можно сослаться на экземпляр
TextDocument следующим образом: »
Dim doc As TextDocument
doc = myDocument.Object
В табл. 11.12 содержатся члены TextDocument.
Таблица 11.12. Члены TextDocument
Свойство/метод
Описание
Свойство
DTE
EndPoint
Parent
Selection
StartPoint
Объект DTE корневого уровня
Объект Text Point, размещенный в конце документа
Получает родительский объект текстового документа
Возвращает объект TextSelection, представляющий выделенный
в данный момент текст документа
Объект Text Point, размещенный в начале документа
Метод
ClearBookmarks
CreateEditPoint
MarkText
ReplacePattern
Удаляет все неименованные закладки в документе
Возвращает точку редактирования в указанном месте (если место
не указано, то подразумевается начало документа)
Устанавливает закладку на строку документа, которая совпадает
с указанным строковым шаблоном
Заменяет текст документа, который совпадает с шаблоном
Совет
Текстовый документ представляется как экземпляром Document, так и экземпляром
TextDocument. Нетекстовые документы (такие как форма Windows, открытая в окне
визуального конструктора Windows Forms) имеют представление в виде Document, но
не имеют соответствующего представления в виде TextDocument. К несчастью, нет
хорошего способа определить во время выполнения, является ли документ
текстовым. Есть один подход, который состоит в том, чтобы попытаться сделать приведение
типа или присваивание объекту TextDocument и перехватить исключения, которые
могут возникнуть при этом присваивании.
Для манипуляции закладками в документе полезны два метода TextDocument: метод
ClearBookmarks удаляет из документа все неименованные закладки, а метод MarkText
выполняет поиск по строковому шаблону и устанавливает закладки на соответствующие
строки документа. Простой макрос для установки закладок на циклы For в документе на
языке Visual Basic приведен в листинге НЛО.
Глава 11. Введение в объектную модель расширяемости
401
Пйсшнг 11J0. Установка закладон на цикл!» For в Документе на языке Visual Basic |
Imports EnvDTE
Imports EnvDTE80
Imports Microsoft.VisualStudio.CommandBars
Imports System.Diagnostics
Imports System.Windows.Forms
Public Module MacroExamples
1 Установить закладки на все лексемы 'For' в текущем документе
Public Sub BookmarkFor()
Dim doc As Document
Dim txtDoc As TextDocument
' Сослаться на текущий документ
doc = DTE.ActiveDocument
1 Получить экземпляр TextDocument из документа
txtDoc = doc.Object
1 Вызвать метод MarkText со строкой 'For1
Dim found As Boolean = _
txtDoc.MarkText("For", vsFindOptions.vsFindOptionsFromStart)
1 MarkText возвращает булев флаг, указывающий, был ли найден
1 шаблон поиска в текстовом документе
If found Then
MessageBox.Show("All instances of 'For1 have been bookmarked.")
Else
MessageBox.Show("No instances of 'For' were found.")
End If
End Sub
End Module
Объект TextDocument также предоставляет возможность читать и редактировать текст в
документе.
Редактирование текстовых документов
С точки зрения Visual Studio текст в текстовом документе имеет два различных
"представления": виртуальное и физическое. Физическое представление— это обычнцй файл кода,
находящийся на диске. Виртуальное представление — это то, что Visual Studio представляет
402
Часть IV. Расширенные возможности Visual Studio
на экране: это интерпретированное представление текста кодового файла, которое
учитывает различные функциональные возможности (такие как структурирование кода,
виртуальные интервалы и перенос слов).
На рис. 11.7 показана эта связь. При отображении текстового документа Visual Studio читает
исходный файл в текстовый буфер, а затем текстовый редактор отображает для вас его
представление (в зависимости от опций, которые вы настроили в редакторе).
Текстовый буфер
Текстовый
файл
о
о
Рис. 11.7. Представление текстовых документов в интегрированной среде
Манипуляции производятся либо с буферизованным текстом, либо с "представлением"
текста, которое вы видите в редакторе. Существуют четыре различных объекта расширяемости,
при помощи которых можно работать с текстом; два из них работают с текстовым буфером,
и два — с представлением редактора.
Для текстового буфера:
□ объекты TextPoint (текстовая точка) используются для нахождения в текстовом
документе определенных точек. Опрашивая свойства TextPoint, вы можете определить
номер строки этой точки, количество символов ее смещения относительно начала
строки, количество символов ее смещения от начала документа и номер ее столбца в окне
текстового редактора. Вы можете также получить ссылку на объект CodeModel,
представляющий код в текущем положении текстовой точки;
□ объект EditPoint (точка редактирования) наследует от объекта TextPoint; это
основной объект, используемый для манипулирования текстом в текстовом буфере. Вы
можете добавлять, удалять или переносить текст при помощи точек редактирования, и сами
эти точки также можно перемещать внутри текстового буфера.
И для представления редактора:
□ объект virtual Point (виртуальная точка) эквивалентен объекту TextPoint, за
исключением того, что он может использоваться для запроса тех мест текста, которые
находятся в "виртуальном" пространстве текстового представления (виртуальное
пространство — это незаполненное пространство после последнего символа в строке документа).
Экземпляр VirtualPoint возвращается через объект TextSelection;
□ объект TextSelection (выделение текста) эквивалентен интерфейсу EditPoint и
работает с текстом в представлении текстового редактора (а не с текстовым буфером).
Когда вы используете этот объект, то активно влияете на текст, который отображается в
текстовом редакторе. Методы и свойства этого объекта фактически являются про-
Глава 11. Введение в объектную модель расширяемости
403
граммными аппроксимациями различных способов ручной работы с текстом: вы
можете перемещаться по страницам отображения вверх/вниз; вырезать, копировать и
вставлять текст; выбирать блок текста; разворачивать или сворачивать области текста.
Поскольку объект Virtual Point почти идентичен объекту Text Point, а объект
TextSelection почти идентичен объекту EditPoint, то мы не будем подробно описывать
все эти четыре объекта. Вместо этого мы сосредоточимся на операциях с текстовым
буфером при помощи EditPoint и TextPoint. После этого вы сможете легко применить эти
концепции и к текстовому представлению.
Поскольку объекты EditPoint предоставляют большую часть функциональности и играют
центральную роль при редактировании текста, то мы приводим список их членов в
табл. 11.13.
Таблица 11.13. Члены EditPoint2
Свойство/метод
Описание
Свойство
AbsoluteCharOffset
AtEndOfDocument
AtEndOfLine
AtStartOfDocument
AtStartOfLine
CodeElement
DisplayColumn
DTE
Line
LineCharOffset
LineLength
Parent
Количество символов от начала документа до текущего
положения точки редактирования
Булев флаг, показывающий, находится ли точка в конце документа
Булев флаг, показывающий, находится ли точка в конце строки
документа
Булев флаг, показывающий, находится ли точка в начале
документа
Булев флаг, показывающий, находился ли точка в начале строки
документа
Возвращает элемент кода, который соответствует текущему
положению точки редактирования
Номер столбца точки редактирования
Возвращает корневой объект расширяемости (DTE)
Номер строки, где находится точка
Смещение в символах (внутри строки) точки редактирования
Длина строки, в которой находится точка редактирования
Возвращает родительский объект для объекта EditPoint2
Метод
ChangeCase
CharLeft
CharRight
ClearBookmark
Изменяет регистр для блока текста
Переносит точку редактирования на указанное количество
символов влево
Переносит точку редактирования на указанное количество
символов вправо
Сбрасывает все неименованные закладки, которые существуют
надой строке, где находится точка
404 > Часть IV. Расширенные возможности Visual Studio
Таблица 11.13 (продолжение)
Свойство/метод
Описание
Метод
Сору
CreateEditPoint
Cut
Delete
DeleteWhitespace
EndOfDocument
EndOfLine •
EqualTo
FindPattern
GetLines
GetText
GreaterThan
Indent
Insert
InsertFromFile
LessThan
LineDown
LineUp
MoveToAbsoluteOffset
MoveToLineAndOffset
MoveToPoint
NextBookmark
Копирует блок текста в буфер обмена
Создает новый объект EditPoint в том же месте, что и текущий
объект Edit Point
Вырезает блок текста и помещает его в буфер обмена
Удаляет блок текста из документа
Удаляет пробельные символы вокруг точки редактирования
Переносит точку редактирования в конец документа
Переносит точку редактирования в конец текущей строки
Булево значение, указывающее, равно ли значение
AbsoluteCharOf f set точки редактирования смещению другой
точки редактирования
Находит совпадающие шаблоны строк в документе
Строка, представляющая текст между двумя строками документа
Строка, представляющая текст между точкой редактирования и
другим положением в документе
Булево значение, указывающее — превышает ли значение
AbsoluteCharOf f set точки редактирования соответствующее
значение смещения другой точки редактирования
Делает отступ для выделенных строк на заданное количество
уровней
Вставляет в документ строку (начиная с текущего положения
точки редактирования)
Вставляет в документ содержимое текстового файла целиком,
начиная с текущего положения точки редактирования
Возвращает булево значение, указывающее, меньше ли значение
AbsoluteCharOf f set точки редактирования, чем
соответствующее значение смещения другой точки редактирования
Переносит точку вниз на одну или более строк
Переносит точку вверх на одну или более строк .
Переносит точку редактирования в место с заданным смещением
Переносит точку редактирования на заданную строку с заданным
смещением в этой строке
Переносит точку редактирования в местоположение другого
объекта EditPoint или TextPoint
Переносит точку редактирования на следующую закладку
документа
Глава 11. Введение в объектную модель расширяемости
405
Таблица 11.13 (окончание)
Свойство/метод
Описание
Метод
OutlineSection
PadToColumn
Paste
PreviousBookmark
Readonly
ReplacePattern
ReplaceText
SetBookmark
StartOfDocument
StartOfLine
TryToShow
Unindent
WordLeft
WordRight
Создает раздел структуры между текущим положением точки и
другим местом в документе
Дополняет пробелами текущую строку до указанного столбца
Вставляет содержимое буфера обмена в текущее положение
точки редактирования
Переносит точку редактирования на предыдущую закладку
Возвращает булев флаг, указывающий, является ли блок текста в
документе текстом "только для чтения"
Заменяет текст, совпадающий с предоставленным шаблоном
Заменяет блок текста предоставленной строкой
Создает закладку без имени на текущей строке точки
редактирования
Переносит точку редактирования в начало документа
Переносит точку редактирования в начало той строки, в которой
она находится
Пытается показать текущее местонахождение точки в окне
текстового редактора
Удаляет заданное количество уровней отступа из диапазона строк
документа
Переносит точку редактирования на заданное количество слов
влево
Переносит точку редактирования на заданное количество слов
вправо
Теперь рассмотрим различные сценарии манипуляций с текстом.
Добавление текста
Объект EditPoint является ключевым при добавлении текста, и вы создаете его либо при
помощи объекта TextDocument, либо при помощи объекта TextPoint.
Экземпляр TextPoint может создать экземпляр EditPoint в том же самом месте (при
помощи вызова TextPoint.Createlnstance). При помощи типа TextDocument вы можете
вызвать метод CreateEditPoint и передать в него TextPoint.
Поскольку объекты TextPoint применяются для определения конкретных точек в
документе, то объект TextPoint используется как входной параметр для CreateEditPoint. По
существу, объект TextPoint сообщает методу, где именно нужно создать точку
редактирования. Если вы не предоставляете объект TextPoint, то точка редактирования будет
создана в начале документа.
406
Часть IV. Расширенные возможности Visual Studio
Следующий фрагмент кода показывает создание точки редактирования в конце документа:
Dim doc As Document = DTE.ActiveDocument
Dim txtDoc As TextDocument = doc.Object
Dim tp As TextPoint = txtDoc.EndPoint
Dim ep As EditPoint2 = txtDoc.CreateEditPoint(tp)
1 Эта строка кода имела бы точно такой же эффект
ер = tp.CreateEditPoint
После создания точки редактирования вы можете использовать ее для добавления текста в
документ (помните, что при использовании объекта Edit Point вы редактируете
буферизованный текст). Для вставки строки в документ применяется метод insert:
' Вставить строку комментария на языке С#
ер.Insert("// some comment")
Вы можете даже взять содержимое файла и вставить его в документ при помощи метода
EditPoint.InsertFromFile:
' Вставить комментарии из файла комментариев
ер.InsertFromFile("С:\Contoso\std comments.txt")
Редактирование текста
ббъект EditPoint поддерживает удаление, замену, вырезку, копирование и вставку текста
в документе.
Некоторые из этих операций требуют для своей работы более одной точки. Например, если
вы хотите вырезать слово или целую строку кода из документа, то вам нужно указать
начальную и конечную точки, которые зададут этот блок текста (рис. 11.8).
Lorem ipsum dolor sit amet, V\__i\ _____
consectetueradipisctngelitSed ) ) ШШШ1ШШ
sodales dui hendrerit uma, LJ V
Рис. 11.8. Использование точек в документе для выделения текста
Следующий фрагмент кода использует две конечных точки — одна в начале документа и
одна в конце — для удаления всего содержимого документа:
Dim doc As Document = DTE.ActiveDocument
Dim txtDoc As TextDocument = doc.Object
Dim tpStart As TextPoint = txtDoc.StartPoint
Dim tpEnd As TextPoint = txtDoc.EndPoint
Dim epStart As EditPoint2 = txtDoc.CreateEditPoint(tpStart)
Dim epEnd As EditPoint2 = txtDoc.CreateEditPoint(tpEnd)
epStart.Delete(epEnd)
Глава 11. Введение в объектную модель расширяемости
407
Кроме второго EditPoint, работающие с блоком текста методы принимают также и целое
число, указывающее количество символов. Это равноценно описанию выделения текста.
Например, данный фрагмент вырезает из документа первые 10 символов:
epStart.CutA0)
Перемещение точки редактирования
После установки EditPoint вы можете перенести ее в любое заданное место документа
(при помощи различных методов). Методы Char Left и CharRight переносят точку на
любое количество символов влево или вправо, в то время как методы WordLeft и WordRight
выполняют то же самое для слов:
1 Перенести точку редактирования на 4 слова вправо
epStart.WordRightD)
Методы LineUp и LineDown переносят точку на указанное количество строк вверх или
вниз. Вы можете также перенести EditPoint на любую заданную строку документа при
помощи метода MoveToLineAndOf f set. Этот метод также помещает точку в определенную
позицию строки:
1 Перенести точку редактирования в строку 100, а затем на 5 символов вправо
epStart.MoveToLineAndOffsetA00, 5)
Код макроса в листинге 11.11 сводит воедино некоторые из рассмотренных нами вопросов
редактирования текстовых документов. Этот макрос и поддерживающие его функции
иллюстрируют использование EditPoint для записи текста в документ. В данном случае макрос
автоматически вставляет блок комментариев непосредственно перед процедурой. Для этого
макрос делает следующее:
1. Получает ссылку на текущий документ в интегрированной среде.
2. При помощи свойства TextDocument. Selection. ActivePoint определяется активное
положение курсора в этом документе.
3. При помощи VirtualPoint (возвращенного из ActivePoint) создается EditPoint.
4. Затем создается второй EditPoint; эти две точки используются для получения всего
содержимого строки определения процедуры.
5. Определение процедуры затем подвергается синтаксическому разбору (для того чтобы
определить название, возвращаемое значение и список параметров).
6. При помощи информации о процедуре создается строка, которая вставляется в
текстовый документ при помощи EditPoint.
\ Листинг 1 % Л1 Вставка комментариев в текстовое окно
Imports EnvDTE
Imports EnvDTE80
Imports Microsoft.VisualStudio.CommandBars
Imports System
Imports System.Collections
408
Часть IV. Расширенные возможности Visual Studio
Imports System.Diagnostics
Imports System. Text
Imports System.Windows.Forms
Public Module MacroExamples
Данная процедура демонстрирует различные сценарии редактирования текста
при помощи типов EditPoint и TextPoint. Если вы поместите ваш курсор
на процедуру или функцию, то она создаст стандартный блок комментариев,
вставит его непосредственно над процедурой и включит
его в структуру документа.
Для использования:
- поместите курсор в любую строку процедуры или функции;
- запустите макрос.
Если макрос не сможет определить начало процедуры или функции,
то он закончится неудачей (не вставит никаких комментариев)
без всякой выдачи сообщений
Public Sub InsertTemplateFlowerbox()
1 Получить ссылку на активный документ
Dim doc As Document = DTE.ActiveDocument
Dim txtDoc As TextDocument = doc.Object
Dim isFunc As Boolean
Try
Dim ep As EditPoint2 = txtDoc.Selection.ActivePoint.CreateEditPoint()
ep.StartOfLineO
Dim ep2 As EditPoint2 = ep.CreateEditPoint()
ep2.EndOfLine()
Dim lineText As String = ep.GetText(ep2).Trim()
If InStr(lineText, " Function ") > 0 Then
isFunc = True
Elself InStr(lineText, " Sub ") > 0 Then
isFunc = False
Else
Exit Sub
End If
' Произвести анализ информации, которую мы можем получить из
1 определения процедуры: тип возвращаемого значения (если это
' функция), названия параметров и название процедуры.
Глава 11. Введение в объектную модель расширяемости
409
Dim returnType As String = ""
If isFunc Then
returnType = ParseRetValueType(lineText)
End If
Dim parameters As String() = ParseParameters(lineText)
Dim name As String = ParseRoutineName(lineText)
Dim commentBlock As String = BuildCommentBlock(isFunc, name, _
returnType, parameters)
1 Перенести точку редактирования на одну строку вверх (для того
? чтобы попасть в точку непосредственно перед процедурой)
ep.LineUp(l)
1 Создать немного свободного пространства путем вставки пустой строки
ер.InsertNewLine()
1 Вставить наш блок комментариев
ер.Insert(commentBlock.ToString())
Catch ex As Exception
End Try
End Sub
Private Function BuildCommentBlock(ByVal isFunc As Boolean, _
ByVal name As String, _
ByVal returnType As String, ByVal parameters As String())
Try
Dim comment As StringBuilder = New StringBuilder()
' Создать блок комментариев при помощи переданной информации
comment ADDend(н,,,,,,,|,,,,,,,,,,,,,,,,,,,|,,,,,|,|,,,,,,,,|,|,н}
comment.Append(vbCrLf)
comment.AppendC" Routine: " + name)
comment.Append(vbCrLf)
comment.Append("f Description: [insert routine desc here]")
comment.Append(vbCrLf)
comment.Append("'")
comment.Append(vbCrLf)
410
Часть IV. Расширенные возможности Visual Studio
If isFunc Then
comment.Append('" Returns: A " & returnType & _
" [insert return value description here]")
End If
comment.Append(vbCrLf)
comment.Append("'")
comment.Append(vbCrLf)
comment.Append("' Parameters:")
comment.Append(vbCrLf)
For i As Integer = 0 To parameters.GetUpperBound@)
comment.Append("' ")
comment.Append(parameters(i) )
comment.Append(": [insert parameter description here]")
comment.Append(vbCrLf)
Next
comment ADDend("f''f f f'''f f''' ' ' ' ' ' ' ' ' ' ' ' f ' ' ' ' ' ' ' ' ' ' ' ' f ' ' ' ' ' ' ' ' '")
Return comment.ToStringO
Catch ex As Exception
Return ""
End Try
End Function
Private Function ParseRetValueType(ByVal code As String) As String
Try
1 Проанализировать возвращенное из функции значение.
1 Ищем 'As', начиная с конца строки.
Dim length As Integer = code.Length
Dim index As Integer = code.LastlndexOf(" As ")
Dim retVal As String = code.Substring(index + 3, length - (index + 3))
Return retVal.TrimO
Catch ex As Exception
Return ""
End Try
End Function
Private Function ParseParameters(ByVal code As String) As String()
Try
Гпава 11. Введение в объектную модель расширяемости
411
1 Проанализировать указанные в определении процедуры/функции
' параметры (если они есть)
Dim length As Integer = code.Length
Dim indexStart As Integer = code.IndexOf("(")
Dim indexEnd As Integer = code.LastlndexOf(")")
Dim params As String = code.Substring(indexStart + 1, _
indexEnd - (indexStart + 1))
Return params.Split(",")
Catch ex As Exception
Return Nothing
End Try
End Function
Private Function ParseRoutineName(ByVal code As String) As String
Try
Dim name As String
Dim length As Integer = code.Length
Dim indexStart As Integer = code.IndexOf(" Sub ")
Dim indexEnd As Integer = code.IndexOf("(")
If indexStart = -1 Then
indexStart = code.IndexOf(" Function ")
If indexStart <> -1 Then
indexStart = indexStart + 9
End If
Else
indexStart = indexStart + 5
End If
name = code.Substring(indexStart, indexEnd - indexStart)
Return name.Trim()
Catch ex As Exception
Return ""
End Try
End Function
End Module
412
Часть IV. Расширенные возможности Visual Studio
Объекты команд
Каждое действие, которое можно выполнить через меню и панели инструментов в Visual
Studio, в общем смысле является командой. Например, вставка текста в окно является
командой, точно так же, как и сборка проекта, активирование точки останова и закрывание
окна.
Для каждой поддерживаемой интегрированной средой команды существует
соответствующий объект Command; коллекция DTE. Commands содержит все экземпляры объектов
Command. Каждая команда имеет название, которое категоризирует, описывает и уникально
идентифицирует команду. Например, команда "paste" доступна по строковому ключу
"Edit.Paste". Если вы хотите получить объект Command, который соответствует команде
"paste", то вы должны извлечь его из коллекции Commands при помощи этого строкового
ключа:
Dim commands As Commands2 = DTE.Commands
Dim cmd As Command = commands.Item("Edit.Paste")
Вы можете запросить название команды при помощи ее свойства Name:
1 Название будет = "Edit.Paste"
Dim name As String = cmd.Name
В табл. 11.14 перечислены члены, объявленные в интерфейсе Command.
Таблица 11.14. Члены Command
Свойство/метод
Описание
Свойство
Bindings
Collection
DTE
Guid
ID
IsAvailable
LocalizedName
Name
Нажатия клавиш, которые можно использовать для запуска команды
Коллекция Commands, к которой принадлежит объект Command
Ссылка на объект DTE корневого уровня
Идентификатор GUID, который идентифицирует группу команд
Целое число, которое идентифицирует команду внутри группы
Булев флаг, указывающий, доступна ли команда в данный момент
Локализованное имя команды
Имя команды
Метод
AddControl
Delete
Создает для команды элемент управления, который может находиться
в панели команд
Удаляет именованную команду, которая была ранее добавлена при помощи
метода Commands . AddNamedCommand
Список всех имеющихся команд очень длинный (почти 3000 штук), и поэтому невозможно
описать здесь каждую из них (или даже большую их часть). Для того чтобы получить пред-
Глава 11. Введение в объектную модель расширяемости
413
ставление об имеющихся командах, вы можете заглянуть в диалоговое окно, используемое
для настройки панелей инструментов Visual Studio. Если вы выберете в меню View |
Toolbars | Customize, а затем щелкнете по вкладке Commands, то сможете исследовать все
имеющиеся команды по категориям (рис. 11.9). Другой способ— программным путем
перебрать коллекцию DTE. Commands и просмотреть их. Фактически мы будем использовать
этот вариант в главе 13 для демонстрации разработки надстроек.
И
Camminds:
Emacs Activate Region
Emacs Bottom Of Window
Emacs Break Line
Emacs Break Line Indent
Emacs Char left
Emacs Cher Right
Emacs Char Transpose
1ггла Close Other Window
Emacs Delete Selection
Emacs Delete To EOL
Emacs Document End
Btarrantp Commands»»
MccMy Select cr »
To add a command, drag the command from the Commands list and drop the command on the target
toolbar or menu.
Keyboard.»
Рис. 11.9. Использование диалогового окна Customize для просмотра команд
Итак, несмотря на то, что мы не можем описать все команды, мы можем научиться
выполнять при помощи объектов Command обычные задачи (такие как выполнение команды,
проверка текущего состояния команды и даже добавление в библиотеку ваших собственных
команд).
Выполнение команды
Команды можно выполнять двумя способами. Объект DTE имеет метод ExecuteCommand,
который вы можете использовать для запуска команды по ее имени:
DTE.ExecuteCommand("Window.CloseDocumentWindow")
Коллекция Commands также является средством запуска команд (при помощи ее метода
Raise). Вместо использования имени команды метод Raise применяет ее GUID и ID:
Dim commands As Commands2 = DTE.Commands
Dim and As Command = commands. Item ("Window. CloseDocumentWindow")
Dim customln, customOut As Object
commands.Raise(cmd.Guid, and.ID, customin, customout)
Некоторые команды принимают аргументы. Пример— команда Shell. Она используется
для запуска внешнего приложения в среде командного процессора и принимает в качестве
414 ^ Часть IV. Расширенные возможности Visual Studh
одного из своих параметров имя приложения. Вы можете запустить эту команду при помо
щи метода ExecuteCommand следующим образом:
Dim commands As Commands2 = DTE.Commands
Dim cmd As Command = commands. Item ("Tools. Shell")
Dim argl = "MyApp.exe"
DTE.ExecuteCommand(cmd.Name, argl)
Метод Raise также работает с аргументами: последние два параметра метода Raise
используются для указания массива аргументов (который будет использоваться командой) и
массива выходных значений (возвращаемых командой).
Соответствие привязок клавиш
Большинство команд может быть запущено при помощи клавиатурной комбинации
быстрого вызова (в дополнение к пункту меню или кнопке панели команд). Вы можете настроить
эти клавиатурные комбинации для каждой команды при помощи свойства
Command.Bindings. Это свойство возвращает или принимает SafeArray (по существу это
массив объектов), который содержит клавиатурные комбинации (в виде элементов массива).
Привязки клавиш представлены в виде строк следующего формата:
" [scopename] : : [modifiers] [key] ".
1 Scopename используется для ссылки на ту область видимости, где комбинация действует
(такую как Text Editor или Global). Лексема modifier используется для указания
модификатора, такого как "ctrl+", "Alt+" или "Shift+" (модификатор не обязателен).
A key— это клавиша, которая должна быть нажата (вместе с модификатором, если он
указан) для запуска команды.
Для добавления привязки к существующей команде вам сначала нужно получить текущий
массив значений привязки, затем добавить в массив вашу строку привязки, а потом
присвоить весь массив обратно свойству Bindings:
Dim commands As Commands2 = DTE.Commands
Dim cmd As Command = commands.Item("File.SaveSelectedlterns")
Dim bindings() As Object
bindings = cmd.Bindings
' Увеличить размер массива на единицу для новой привязки
ReDim Preserve bindings(bindings.GetUpperBound(O) + 1)
' Записать новую привязку в массив
bindings(bindings.GetUpperBound(O)) = "Global::Shift+F2"
' Присвоить массив обратно объекту команд
cmd.Bindings =-bindings
Глава 11. Введение в объектную модель расширяемости
415
Примечание
Вы можете создать собственные именованные команды, которые можно будет
запускать из панели команд в интегрированной среде (или из командного окна). Сам объект
Command добавляется в коллекцию Commands при помощи вызова
Commands.AddNamedCommand. Код, который будет ВЫПОЛНЯТЬСЯ по команде, нужно
будет реализовать надстройкой. Мы опишем это в главе 13.
Объекты отладчика
Объектная модель расширяемости предоставляет объект Debugger, который позволяет вам
управлять отладчиком в Visual Studio. Экземпляр Debugger можно получить при помощи
свойства DTE. Debugger:
Dim debugger As EnvDTE.Debugger
debugger = DTE.Debugger
При помощи объекта Debugger вы можете делать следующее:
□ настраивать точки останова;
□ запускать и останавливать отладчик для заданного процесса;
О управлять различными способами прохождения кода в отладчике (такими как Step Into,
Step Over и Step Out);
□ вызывать команду отладчика Run to Cursor; ,
□ запрашивать у отладчика его текущий режим (например, режим останова, режим
конструирования или режим выполнения).
Отладчик можно запустить (если он еще не запущен) при помощи следующего кода:
Dim debugger As Debugger2
debugger = DTE.Debugger
If debugger.CurrentMode <> dbgDebugMode.dbgRunMode Then
debugger.GoO
End If
События расширяемости
Если вашему макросу или надстройке нужно получить уведомление об определенном
событии, то для этого во всех ранее обсуждавшихся категориях объектов расширяемости
поддерживаются различные объекты событий. Имеются события для окон, редакторов,
проектов и т. д. Для каждого события (поддерживаемого интегрированной средой)
соответствующий класс модели расширяемости позволяет вам перехватить событие (и выполнить
нужное действие в случае его возникновения). Объектное дерево событий имеет корень в
свойстве DTE.Events (рис. 11.10).
416
Часть IV. Расширенные возможности Visual Studio
Поскольку события обрабатываются по-разному (в зависимости от того, работаете ли вы с
кодом настройки или кодом макроса), то описание подробностей обработки событий мы
отложим до следующей главы. Однако основная идея очень проста: вы получаете ссылку на
объект интересующего вас события, а потом пишете обработчик события, который
реагирует на одно из опубликованных событий объекта.
( PTEEvents ^)
BuildEvents
CommandSarEvente
CommandEvents
DebutfgerEvenls
Document Events
DTEEvente
FindEvents
MiscFHesEvertts
4
^
OutpuiWindowEvents
SelecticmEvewite
SakftbnEvents
SdutfonltemsEvente
TaskLlstEvente
TaskEditorEvenls
WindowE vents |
Рис. 11.10. Типы событий
Например, следующий код мог бы быть обработчиком события "build complete" внутри
надстройки на языке Visual Basic:
Dim WithEvents bldevents As BuildEvents
bldevents = DTE.Events.BuildEvents
После создания объекта BuildEvents вам нужно написать реальный обработчик события:
Private Sub bldevents_OnBuildDone(ByVal Scope As EnvDTE.vsBuildScope, _
ByVal Action As EnvDTE.vsBuildAction) Handles bldevents.OnBuildDone
" Здесь должен быть код обработки события
End Sub
Резюме
Объектная модель расширяемости Visual Studio— это глубокий и обширный интерфейс
прикладного программирования, который предоставляет многие компоненты
интегрированной среды для работы с управляемым кодом, выполняющимся как макрос или надстройка.
В данной главе мы описали организацию этого API и его возможности в плане управления
Глава 11. Введение в объектную модель расширяемости
417
средой Visual Studio: отладчиком, редакторами, окнами, окнами инструментов, решениями и
проектами.
Мы обсудили также модель событий этого API и рассмотрели его возможности в смысле
доступа к структуре кода проекта, запуска команд внутри интегрированной среды и
программного редактирования текстовых документов.
Используя методы и свойства объектов расширяемости, вы можете автоматизировать в
интегрированной среде стандартные задачи и расширить Visual Studio такими способами,
которые отвечают вашим конкретным потребностям в инструментах разработки.
В следующей главе мы будем основываться непосредственно на обсуждавшихся здесь
концепциях и конкретно изучим процесс написания макроса, который взаимодействует с
объектами расширяемости. -
Глава 12
Пишем макросы
В предыдущей главе мы изучили интерфейс прикладного программирования (API),
имеющийся у разработчиков для настройки и управления различными частями интегрированной
среды Visual Studio. Данная глава основывается на этих знаниях и показывает вам, как
писать макросы, которые используют объектную модель расширяемости.
Задача макроса— обеспечить вам способ написания ваших собственных модулей
расширения. В предыдущих главах вы видели множество функций интегрированной среды, которые
автоматизируют повторяющиеся задачи. Встроенная поддержка рефакторинга, технология
автоматического дописывания слов IntelliSense, фрагменты кода — вот только некоторые из
таких функций. И по мере того как вы разрабатываете решения в Visual Studio, вы будете
выполнять все больше повторяющихся задач, которые просто просят автоматизации. Таким
средством автоматизации являются макросы: это процедуры на языке Visual Basic, которые
взаимодействуют с объектной моделью расширяемости для управления различными
аспектами интегрированной среды. Несмотря на то, что макросы, безусловно, могут быть
логически сложными, их реальная ценность состоит в том, что можно относительно просто
написать короткую процедуру, которая снимет с вас часть ручного труда процесса разработки.
Макросы не часто используются для добавления в интегрированную среду новых
функциональных возможностей, обычно они группируют операции интегрированной среды и
создают единую точку запуска таких групп операций.
Если вы задумаетесь об обычных задачах, которые вы выполняете при разработке решения
внутри Visual Studio, то вы поймете, что ценность макроса состоит в его способности
помогать вам автоматизировать те задачи, для которых это имеет смысл. Глава 11 содержит
пример макроса, который вставляет стандартный блок комментариев в начало функции или
процедуры. Целью того макроса было уменьшить расход времени на комментирование
процедур. Макрос не был сложным и не решал никаких особенных проблем разработки
программного обеспечения. Он должен был просто взять на себя малую часть очень "ручной"
составляющей процесса создания кода: комментирования этого кода. Процесс разработки
макроса фактически начинается с нахождения возможности для автоматизации. Следующий
шаг — понять, с какими объектами интегрированной среды вам придется работать, чтобы
создать решение. Финальный шаг— связать эти объекты кодом на языке Visual Basic
(в форме макроса).
Мы уже описали два из трех необходимых элементов знаний, которые позволят вам стать
знатоками макросов: в предыдущей главе мы подробно обсудили объектную модель расши-
Глава 12. Пишем макросы
419
ряемости и разобрались, в каких ситуациях хороши макросы. Третий и последний
элемент— это понять механику написания макроса от начала до конца и его последующего
выполнения в интегрированной среде.
Макросы могут писаться вручную или генерироваться путем записи действий внутри
интегрированной среды. Фактически в Visual Studio имеется отдельная среда разработки
макросов — интегрированная среда Macros, созданная для помощи в разработке макрорешений.
Запись макроса
Простейший способ создать макрос— это записать его: для этого надо просто включить в
Visual Studio запись макросов и выполнить серию действий в интегрированной среде.
Запись макросов превратит ваше взаимодействие с интегрированной средой в макрокод.
Для начала записи макроса выберите Tools | Macros | Record Temporary Macro (или
нажмите комбинацию клавиш <Shift>+<Ctrl>+<R>). После этого немедленно начинается
запись; для того чтобы вы могли управлять процессом записи, появится маленькая панель
инструментов (рис. 12.1).
Рис. 12.1. Панель инструментов Macro Recorder
Три кнопки панели инструментов дают вам возможность приостановить и возобновить
запись, остановить запись или отменить ее. Приостановка записи прекращает запись ваших
действий в интегрированной среде, но запись остается в активном состоянии. Повторное
нажатие на эту же кнопку возобновляет запись. Если вы остановите запись, то макрокод
будет сгенерирован и сохранен для последующего выполнения. Отмена записи
останавливает запись, но не сохраняет макрос.
Выполните серию каких-либо действий внутри интегрированной среды при запущенной
записи. Предположим, что вы хотите получить легкий способ разворачивания узлов (и по-
дузлов) всех проектов в окне Solution Explorer. Для записи этих действий вы просто
запускаете запись, а затем щелкаете по каждому проекту в Solution Explorer (чтобы развернуть
их в древовидном представлении). После того как вы закончите это делать (для всех
проектов и их элементов), нажмите кнопку Stop Recording. В этот момент макрос сохраняется
как временный. Он не сохраняется на диск на данной стадии, но вы можете немедленно
выполнить его (при помощи пункта Run Temporary Macro в меню Tools | Macros).
Примечание
В Visual Studio одновременно может сохраняться только один временный макрос. Это
означает, что если вы зэпишете еще один временный макрос, то он просто заменит
собой текущий временный макрос. Если вы хотите сохранить макрос на некоторое
время, то можете записать его на диск (выбрав Tools | Macros | Save Temporary
Macro). Если в данный момент окно Macro Explorer отсутствует, то после выбора
этого пункта меню оно появится.
420
Часть IV. Расширенные возможности Visual Studio
Использование Macro Explorer
Macro Explorer— это центральный инструмент интегрированной среды для управления
макросами. Макросы организованы в проекты и модули. Например, созданный вами только
что временный макрос виден в проекте MyMacros под модулем с именем RecordingModule и
называется TemporaryMacro.
Если вы решили сохранить временный макрос, то Visual Studio автоматически переведет
узел TemporaryMacro в режим редактирования (название будет выделено). Это
подсказка для того, чтобы вы врели имя для макроса. Нажатие клавиши <Enter> зафиксирует
изменение имени и сохранит макрос на диск. Если вы не измените имя, то макрос сохранен
не будет.
При помощи Macro Explorer вы можете переименовывать или удалять макросы и
выполнять их.
Для запуска макроса надо просто дважды щелкнуть его по узлу в Macro Explorer. Это
приведет к автоматическому выполнению кода макроса. Во время выполнения макроса вы
видите анимированный значок и сообщение в строке состояния Visual Studio (рис. 12.2).
»^^«1щ||^в!^^!:|':
, file Ш Vie* Pe'actot ?ojtct Md C*fcJS ^И* Toali ^t» feir-dcw ijelp
11 »*„ *, *.* ;je ift z. 1 > n»1 »* & ^ *J j* *й *
жгрлге Concost,l*.Cca«sD»
put* ie claw - :• >esst»
(
*t*<3S.ctf reel
i %^i M*CK>5 С
( ^j txtoaibitt/TesU "]
£&i CoUpttA:»
.i Qu«tyCarnrt»nd8(
>■$ Samples
4hv l^s
Рис. 12.2. Выполняющийся макрос
Совет
Макросы не имеют никакого встроенного (или "по умолчанию") механизма
уведомлений, который мог бы сообщить вам о завершении макроса или о его ошибках. Если вы
хотите отслеживать ход работы макроса, то вам нужно соответствующим образом
изменить свой макрос, чтобы он выдавал сообщения в окно вывода (при помощи окон
сообщений или другими способами).
Глава 12. Пишем макросы
421
Для того чтобы увидеть код (реализующий макрос) на языке Visual Basic, вам нужно
щелкнуть правой кнопкой мыши по макросу в окне Macro Explorer и выбрать пункт Edit. Это
приведет к запуску интегрированной среды Macro. Вы можете также запустить эту
интегрированную среду при помощи выбора Tools | Macros | Macros IDE (или нажатием
комбинации клавиш <Ctrl>+<Fll>). Код, который был сгенерирован нашей предыдущей попыткой
записи, показан в листинге 12.1. Команды удаления или переименования макроса,
макромодуля или проекта макроса также находятся в контекстном меню в Macro Explorer.
Листинг 12.1 Сгенерированный записью макрокод
Option Strict Off
Option Explicit Off
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Public Module RecordingModule
Sub TemporaryMacro()
DTE.ActiveWindow.Obj ect.Getltern _
("ContosoCommonFramework\ArchitectureModels") .UIHierarchylterns.Expanded = True
DTE.ActiveWindow.Object.GetItern _
("ContosoCommonFramework\Class Libraries").UIHierarchylterns.Expanded = True
DTE.ActiveWindow.Object.GetItern _
("ContosoCommonFramework\ClassLibraries\Contoso.Fx.Analysis\Properties"). _
UIHierarchylterns.Expanded = True
DTE.ActiveWindow.Obj ect.GetItern _
("ContosoCommonFramework\ClassLibraries\Contoso.Fx.Analysis\References"). _
UIHierarchyltems.Expanded = True
DTE.ActiveWindow.Obj ect.GetItern _
("ContosoCommonFramework\ClassLibraries\Contoso.Fx.Common\Properties"). _
UIHierarchyltems.Expanded = True
DTE.ActiveWindow.Object.GetItern _
(nContosoCommonFramework\ClassLibraries\Contoso.Fx.Common\References"). _
UIHierarchyltems.Expanded = True
DTE.ActiveWindow.Object.Getltern _ .
("ContosoCommonFramework\ClassLibraries\Contoso.Fx.Integration\Properties"). _
UIHierarchylterns.Expanded = True
DTE.ActiveWindow.Obj ect.Getltem _
("ContosoCommonFramework\ClassLibraries\Contoso.Fx.Integration\References"). _
UIHierarchyltems.Expanded = True
DTE.ActiveWindow.Obj ect.Getltem _
("ContosoCommonFramework\Consoles\AdminConsole"). _
UIHierarchylterns.Expanded = True
422
\
Часть IV. Расширенные возможности Visual Studio
DTE.ActiveWindow.Obj ect.GetItem _
("ContosoCommonFrameworkXConsolesXHelloWorld"). _
UIHierarchyltems.Expanded = True
DTE.ActiveWindow.Ob]ect.GetItem _
("ContosoCommonFramework:\Consoles").UIHierarchyltems.Expanded = True
DTE.ActiveWindow.Object.GetItern _
("ContosoCommonFrameworkXConsolesXAdminConsoleKProperties") . _
UIHierarchyltems.Expanded = True
DTE.ActiveWindow.Obj ect.Getltem _
("ContosoCommonFrameworkXConsolesXAdminConsoleXReferences"). _
UIHierarchyltems.Expanded = True
DTE.ActiveWindow.Obj ect.Getltem _
(MContosoCommonFramework\Consoles\HelloWorld\PropertiesM). _
UIHierarchyltems.Expanded = True
DTE.ActiveWindow.Obj ect.Getltem _
("ContosoCommonFramework\Consoles\HelloWorld\References"). _
UIHierarchyltems.Expanded = True
DTE.ActiveWindow.Ob]ect.GetItern _
("ContosoCommonFramework\Consoles\HelloWorld\XMLSchemal.xsd") . _
UIHierarchyltems.Expanded = True
DTE.ActiveWindow.Obj ect.GetItern _
("ContosoCommonFramework\Forms") .UIHierarchyltems.Expanded = True
DTE.ActiveWindow.Obj ect.GetItern _
("ContosoCommonFramework\Forms\Contoso.UI.WindowsForms.TestHost\Properties") . _
UIHierarchyltems.Expanded = True
DTE k ActiveWindow.Obj ect.GetItern _
("ContosoCommonFramework\Forms\Contoso.UI. WindowsForms.TestHost\References") . _
UIHierarchyltems.Expanded = True
DTE.ActiveWindow.Ob]ect.Getltem _
("ContosoCommonFramework\Forms\Contoso.UI. WindowsForms.TestHost\Forml.jsi") . _
UIHierarchyltems.Expanded = True
DTE.ActiveWindow.Obj ect.Getltem _
("ContosoCommonFramework\C:\...\PortalSite\").UIHierarchyltems.Expanded = True
End Sub
End Module
Создание макроса при помощи
интегрированной среды Macro
Интегрированная среда Macro (рис. 12.3) является по существу специализированной
версией Visual Studio (избавленной от излишеств и упрощенной), предназначенной для
разработки макросов.
Глава 12. Пишем макросы
423
Вы сразу же заметите, что это фактически пользовательский интерфейс Visual Studio, с
которым вы уже привыкли к настоящему моменту работать. Все ведет себя точно так же: окна
инструментов можно стыковать, они могут плавать, их можно прикреплять и т. д. Окно
редактора кода (которое вы используете для редактирования вашего макрокода) точно так же
работает с IntelliSense, структурированием и всеми прочими средствами повышения
производительности, к которым вы уже привыкли. Несмотря на то, что интегрированная среда
Macro ведет себя аналогично полномасштабной среде Visual Studio, имеются и отличия.
Например, в ней поддерживаются не все окна инструментов и документов, имеющиеся в
полной интегрированной среде. Языковая поддержка в редакторе кода ограничена
исключительно Visual Basic (поскольку это единственный поддерживаемый макроязык), и вы не
можете конструировать здесь формы или другие подобные элементы.
*&> Microsoft Visual Studio Metio*
£ile fcdrt tfew firpjecr Eebug Icols Window Mdp
b.B
^ $ J3 tt D - *
*$wpt«s #4X
f.S
Я>_
i£] MyMacrci
♦, ~2& References
^ EnvironmentEk'ents
*J ExtensiblityTests
^J ReccrdingMadule
„^Project Explorer М^Пз« V
RecordbigModuie*
<Al RecordingModuie
▼ V TemporeryMacro
U Fofclic Module RsccrdiugModale
Д Sub TesporaryHacro|)
DTE.ActlveWiidow.Cbj ect,
DTE. ActiveWir.dow. Object
DTE. Act iveWir-dow. Cb} ect
DTE.ActiveWiidow.Cb3ect
DTE.ActiveWir.dow.СЬз e = C
DIE. ActiveWir-dow.Cb}ect
DTE.ActiveWindow.Cb3ect
DTE. ActiveWir.dov. СЬэ ecc
DTE ActrreWirdow Object
DTE.Act iveWiUdaw.Ob} ect
DTE.Active'rflndow.Cbj ect
1 DTE.Acti-TeWiZidow.CbJecc
DTE.ActiveWiudow.Cbject
DTE.ActiveWircdow.СЬэ ect
DTE . Acti.veWir.dow. Cb j ect
DTE.ActiveWindaw.Cbj ect
DTE.ActlveWindow.Cb} ect
TVTF brr )j»Bi T>«ir»v Г"У*+»г-г
GetltemC'^u,. tu«iC
Getltensp'lo^tcJSJ*.
Getltem ("~n".r mcC
Ge:lc«n(":ux r usjC
Getltein | "I'Gr.tosaJ
Getltem (" Zn^tniJwv
Ge'Item (" Jor tojscC
Gerlteas ("L'ontos эС
GerltefflC"o«,Ti4 >'
GetltemC'o-icoscC
Get Item ( "Tar. to г -■'
.Getltens (и lont'is S.
Getltem ( "wCCqjscC
Getltejr< ("Toiito" ->I
.Get;ItejL(";ontos3.
• Getltenj ("ContoscC
Getlteie ("ГоггоззС
"и/ я54-
icinscnl;
.csmcnFi
yj^y
Рис. 12.3. Интегрированная среда Macro
Работа с макропроектами
. Окно инструмента Project Explorer работает на тех же принципах, что и Solution Explorer;
оно отображает древовидное представление ваших используемых для работы элементов.
В случае макросов узлы дерева организованы таким образом: проект —► модуль. Отдельные
макросы отображаются в окне редактора кода (обратите внимание, что это по сути точно то
же, что и представление Macro Explorer, за исключением того, что дерево Macro Explorer
показывает каждый отдельный макрос поименно).
В нашем случае мы записали временный макрос, и он виден в проекте MyMacros в мо i\ к
RecordingModule. Если вы вернетесь к рис. 12.3, то увидите часть кода, которая бы id члда-
на при записи макроса; он содержится в подпрограмме Visual Basic v. названием
TemporaryMacro().
424
Часть IV. Расширенные возможности Visual Studio
Совет
Когда вы используете запись макроса, то создаваемый при этом код автоматически
сохраняется в проекте MyMacros. Для того чтобы изменить это, надо просто щелкнуть
правой кнопкой мыши любой другой макропроект в Macro Explorer и выбрать пункт
Set as Recording Project.
Каждому макропроекту соответствует каталог на диске; они не совпадают с проектами
Visual Studio. По умолчанию у вас есть проект MyMacros (которому соответствует каталог
MyMacros в DocumentsWisualStudio 2008\Projects\VSMacros80) и проект Samples (которому
соответствует каталог Samples в том же месте). В каждом каталоге макропроекта имеется
vsmacros-файл, название которого соответствует названию каталога проекта. Таким
образом, в каталоге Samples имеется файл Samples.vsmacros, а в каталоге MyMacros— файл
MyMacros. vsmacros.
Vsmacros-файл содержит код всех отдельных макросов (и модулей) для соответствующего
проекта. Это существенная разница по сравнению с тем, как Visual Studio работает с
файлами проектов: макрос не имеет собственного файла (в отличие, например, от элемента
проекта в проекте библиотеки классов Visual Basic).
Совместное использование макросов
Возможно, вы будете удивлены, ког^а узнаете, что формат хранения по умолчанию для
макросов — двоичный. С технической точки зрения vsmacros-файл является файлом
хранения с СОМ-структурой; внутри этого файла находится весь исходный код для всех макросов
проекта. Для того чтобы поделиться макромодулем с другими, вы можете экспортировать
данный модуль в файл Visual Basic (vb-файл). Для этого необходимо сделать следующее:
1. Щелкнуть правой кнопкой мыши макромодуль в Project Explorer среды Macro.
2. Выбрать пункт Export ModuleName. Появится диалоговое окно Export File (рис. 12.4).
3. Выберите местоположение и имя файла, после чего макрос будет записан в файл в виде
простого текста.
*& brpert File- '^ШмХ*
1 ,п J 1 I « Project* ► VSM«rot80 ►
-<s ->г*ц\ &' N»m* Date modified
. r &■■> MyMacros
iv Fresets *
*» r. 1 Samples
1? Deojnervts
jy ketertly f hatintd
■ Peslrtop
Ял ^Kerl P^CSb
%Щ Computer
Mcsr »
Folders ^
Filename ExterraibilityTeit4vb
J Save a* Jyp e [ Visual ifajc Fries (\vb)
- Hide Folders
^SiWfSwSiS*
" | *f ' | Settb
Type Site
Lfr? 1
igjrjyy'
p
Tag»
'1
Г
■H оч 1 |l
Рис. 12.4. Экспорт макромодуля
Глава 12. Пишем макросы
425
После экспорта макромодуля вы можете физически поделиться им с другими
разработчиками (просто передать его). Импортировать ранее экспортированный макрофайл просто:
внутри среды Macro надо выбрать Project | Add Existing Item и указать vb-файл макроса
для импорта; это приведет к его включению в выделенный в настоящее время в Project
Explorer проект.
^ 4 Macros
JH MyMatroi
4 *|3 LxtMiSiblityfVsts
•ua CJo*eAllOpen
Jii CountwOC
iva ListPrejectF.les
v^ii CpenAilProjetUtems
& PirAT
cxi UnP null
- , %\ MdcroFiwmples
g Macro Eap'orer «^'jstottor &pio'?r \
MyMacres M«ro P^ect Properties
ОДИ«пМ|к>*ег< 4fDMCN0\Dorumprj
Storage Format
Project Storage Fotroit
Рис. 12.5. Изменение формата хранения для макропроекта
£~
1 'ИИЩЩИ
wi i « Projects
| ffe fcdrt flew loots
3 F«/. frfh^
J J* Document'*
1 lp! F.ctures
1 Щ> Music
1 ^ P*itnUv Changed
1 J^ Searcn«
1 J* Pjbfic
1 Folders A
МШт
► V5Macros80 ► MyMacros
М«1р
Name
^] Env>ranmentEvents,VB
^]ExtensiblrtyTesh.VB
^MacroEumples.VB
U MyMecros.BIN
Ц MyMacros.vsmacro5
J2J MyMacros-vsmproj
j_j MyMacros.vsmprajex
[_j MyMacros.vsmprcjey
4J RecordmgModule VB
< г
*~
;%
-r|*tJ|Sr«.'r»t
Date modified
10/23/2007 4:03 PM
10/23/2007 4:03 PM
10/23/2007 4.03 PM
10/23/2007 4:03 PM
10,73/2007 3*7 PM
10/23/2007 4ДЗРМ
10/23/2007 4-03 PM
10/23/20074:03 PM
10/23/2007 4;03PM
J .,:,: !".
^ MyMicros,vsmproj Cite rrodtfed. 10/23/2007 4:03 PM
Щ
Visual Studio MacrD Project (Text)
Size; 839 KB
Catecietlerf, 10/23/2007 4ДЗ PM
Type
Vrsual Basic Sourc»
Visual Basic Sourc
Vtsual Baste Sourc».
BIN File
Vtsual Studio Mac
Visual Stud» Mac...
VSMPROJEXRIe
VSMPROJEYFBe
Vuual Bask Sourc».
i.^iia
Size
4KB
22 KB
5 KB
82 KB
144 KB
9 KB
3 KB
2KB
13 KB
ШШ
Tags
г 1
Рис. 12.6. Макропроект сохранен как текст
При помощи совместного использования всего vsmacros-файла вы можете поделиться и
целиком макропроектом. В этом случае часто бывает полезно поменять формат хранения по
426 Часть IV. Расширенные возможности Visual Studio
умолчанию с двоичного на текстовый. Это можно сделать в интегрированной среде Visual
Studio; для этого надо сначала выбрать макропроект в Macro Explorer, а затем в окне
свойств изменить Storage Format с Binary на Text (рис.-12.5).
Сразу же после изменения значения этого свойства Visual Studio конвертирует
единственный двоичный файл макропроекта в набор текстовых файлов. На этой стадии каждый
модуль представляется своим собственным vb-файлом. На рис. 12.6 вы видите файлы в
каталоге MyMacros после того, как проект MyMacros был конвертирован в текст.
Добавление проекта
Как ни странно, но возможность добавить макропроект в среде Macro отсутствует. Иначе
говоря, нет команды File | Open для открывания vsmacro-файла. Есть, однако, способ
сделать это в среде Visual Studio: выберите Tools | Macros | Load Macro Project. Здесь вы
просто переходите к vsmacros-файлу, содержащему тот проект, который хотите загрузить. Если
вы хотите создать новый пустой макропроект, выберите Tools | Macros | New Macro
Project.
После добавления макроцроекта он моментально становится доступным в среде Macro.
Написание макроса
Если вы вернетесь к коду листинга 12.1, который был сгенерирован для вас при записи
вашего расширения узлов Solution Explorer, то увидите, что он очень прост и
представляет собой буквальное воспроизведение всего того, что вы вручную выполняли в окне
Solution Explorer. Макрос ссылается на каждый отдельный элемент в окне Solution
Explorer при помощи метода ActiveWindow. Object .Getltem, передавая ему название
объекта для тощ, чтобы получить ссылку UIHierarchyltem. А там необходимо только
настроить простое свойство для того, чтобы развернуть все элементы на нижних уровнях
(UIHierarchyltems . Expand = True).
Код работает, но, вероятно, это не совсем то, чего вы хотели. Например, он ссылается на
проекты и элементы проектов (которые вы разворачиваете) по пути и имени. Это означает,
что данный макрос не является универсальным. Он будет работать только с этим
конкретным примером решения Contoso — и даже при этом он весьма "хрупкий": если вы добавите
или удалите проект или элемент проекта, то макрос не узнает об этом и будет по-прежнему
пытаться настроить свойство Expanded для бывшего элемента. Для того чтобы сделать
данный макрос действительно полезным, вам нужно переработать этот код. Преимущество
использования записи макроса состоит в том, что таким образом можно получить хорошую
стартовую точку для разработки макроса. Фактически при этой записи выявилось
использование объекта UIHierarchyltem, который мы в предыдущей главе не обсуждали. При
оценке общей структуры программы становится понятно, что должен существовать способ
рефакторинга этого кода в цикл, который будет рекурсивно разворачивать узлы дерева до
тех пор, пока не развернет их все. Возможно, что вместо разворачивания или сворачивания
узлов вы могли бы попробовать переключать свойство Expanded данного объекта.
Вы редактируете макрокод при помощи редактора кода точно так же, как вы редактировали
бы любой другой документ в Visual Studio. Для переработки данного макроса вы можете
начать с создания рекурсивной вспомогательной процедуры, которая принимает объект
Глава 12. Пишем макросы
427
UlHierarchyltem, переключает его свойство Expanded в значение True и вызывает сама
себя для каждого подэлемента, обнаруженного в коллекции ulHierarchyitems:
For Each subNode As UlHierarchyltem In node.UlHierarchyitems
ExpandNodes(subNode)
Next
node.UlHierarchyitems.Expanded = True
Примечание
В отличие от редакторов среды Visual Studio, текстовый редактор среды Macros
автоматически сохраняет редактируемый вами файл при его закрытии. Это делается без
всякого запроса. Если вы не отмените сделанные вами при редактировании
изменения, то они будут сохранены при закрывании редактора (независимо от того,
сохранили ли вы их явным образом).
Затем вам нужна родительская управляющая процедура, которая создает экземпляр объекта
окна (представляющего Solution Explorer) и получает от этого окна объект ulHierarchy
корневого уровня. Здесь вы делаете цикл по первому уровню узлов дерева и вызываете
рекурсивную процедуру:
Dim tree As UlHierarchy
Dim explorer As Window2
explorer = DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer)
tree = explorer.Object r
For Each node As UlHierarchyltem In tree.UlHierarchyitems
ExpandNodes(node)
Next
Следующий шаг: если вы модифицируете рекурсивную процедуру, чтобы она принимала
булево значение, то у вас получится процедура общего характера, которая может
разворачивать или сворачивать узлы. Если свести все это воедино, то у вас получатся два макроса:
один разворачивает все узлы в дереве Solution Explorer, а другой сворачивает все узлы в
дереве Solution Explorer. В листинге 12.2 вы видите эти два макроса как публичные
процедуры: ExpandAll и CollapseAll. Закрытая процедура ExpandCollapseNodes
вызывается обоими макросами.
i Листинг 12.2, Макрос; разаернуть/свернуть все узлы в Solution Explorer
Imports EnvDTE
Imports EnvDTE80
Imports Microsoft.VisualStudio.CommandBars
Imports System
Imports System.Collections
Imports System.Diagnostics
15 3ак 3716
428
Часть IV. Расширенные возможности Visual Studio
Imports System.Text
Imports System.Windows.Forms
Public Module MacroExamples
1 Разворачивает все узлы в Solution Explorer
Public Sub ExpandAll()
Dim tree As UIHierarchy
Dim explorer As Window2
' Ссылка на окно Solution Explorer
explorer = DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer)
' Ссылка на объект UIHierarchy, полученная из окна Solution Explorer
tree = explorer.Object
' Перебрать узлы верхнего уровня, вызвать рекурсивную процедуру
' для разворачивания каждого узла
For Each node As UIHierarchyltem In tree.UIHierarchyltems
ExpandCollapseNodes(node, True)
Next
1 End Sub
' Сворачивает все узлы в Solution Explorer
Public Sub CollapseAll()
Dim tree As UIHierarchy
Dim explorer As Window2
' Ссылка на окно Solution Explorer
explorer = DTE.Windows.Itern(Constants.vsWindowKindSolutionExplorer)
1 Ссылка на объект UIHierarchy, полученная из окна Solution Explorer
tree = explorer.Object
' Перебрать узлы верхнего уровня, вызвать рекурсивную процедуру
' для разворачивания каждого узла
For Each node As UIHierarchyltem In tree.UIHierarchyltems
ExpandCollapseNodes(node, True)
Next
End Sub
' Рекурсивная процедура для разворачивания или сворачивания всех
f подузлов данного UIHierarchyltem
Глава 12. Пишем макросы
429
Private Sub ExpandCollapseNodes(ByRef node As UIHierarchyltem, _
ByVal expanded As Boolean)
For Each subNode As UIHierarchyltem In node.UIHierarchyltems
1 Повторный вызов этой процедуры с новым подузлом
' в качестве родительского узла
ExpandCollapseNodes(subNode, expanded)
Next
' Выполнить сворачивание/разворачивание
node.UIHierarchyltems.Expanded = True
End Sub
End Module
При сравнении с кодом, созданным при записи макроса, сходства обнаруживается не
слишком много; однако повторим еще раз — записанный код полезен с познавательной точки
зрения, он дал вам понятие о возможном подходе и концепции использования объектов
UIHierarchy/UIHierarchyltem/uiHierarchyltems для разворачивания узлов.
Отладка
Отладка макросов аналогична отладке других проектов Visual Studio (которую мы подробно
рассмотрели в главе 10). Отладчик времени выполнения в интегрированной среде Macros
поддерживает все уже знакомые вам концепции точек останова и команд Step Into и Step Over. '
I
$# (Debugging) - Microsoft Visual Studio Macros
U_H*SJ<|
I File Edit tfew Pjoject Eebug look Window tfelp
Process; [45841 vsmsvrлисе
Project Explorer
- ?.X
3? MyMacros
3 ^ References
^3 EnvironmenlEvents
V) ExtensibhtyTrsts
< ^j MacroExamples
^3 RecordirtgModufe
^3 Samples
.> ^j| References
* S] Accessibility
\ *] AddDirAsSlnFolder
I V) DevStudio6Editor
i^ Project Explorer p$Oa« Viewj
Error ii«t
- Sack Frame VBAssembr/MyMacros Ma<
| MacToExamplest:
щ,
j&vMacroExarnpies
-f '3 & U •
;* ExpandCotUftseNodcs
:r enlii?
0,
* Pecr-rsLve rsuLire fcr expar
Pzi.va.te Sub ExpandCcjllapaeUariea IByPei ncde As OIJLLerarc
For Each subWcde Аз UIHierazchylceift In ncde.UTfliera
' Re-call сг-з rcut-irsc v-tr где new cihncde аз
fcxpaRdCollapseNodea (atibHodey expanded)]
Hext .:
' Perform th2 rcC*apr«/exj'i3.r.aic:s.
node.UTHierazcr.yIcea3 .Expanded - True
Descnptton
Column Project
^ Error Let ?3 Output
Ready
Рис. 12.7. Отладка макроса
430
Часть IV. Расширенные возможности Visual Studio
Если вы не были уверены в своем рекурсивном коде, то могли бы настроить точку останова
в рекурсивной процедуре и наблюдать за выполнением макроса. Среда Macro также
поддерживает окно Error List, которое помечает для вас все синтаксические ошибки. На
рис. 12.7 показаны точка останова и окно Error List в интегрированной среде разработки
Macros.
Примечание
Если отладка происходит в интегрированной среде Macros, то основная
интегрированная среда будет недоступна. Вы не сможете работать в основной интегрированной
среде.
Обработка событий
Мы описали отдельные классы событий в главе 77; каждое событие интегрированной среды
доступно через эти классы автоматизации. Для обработки события в макросе вам нужно
иметь две вещи: определение события и обработчик события.
Каждый макропроект имеет по умолчанию модуль EnvironmentEvents. Этот модуль
создается для вас автоматически каждый раз, когда вы создаете новый макропроект; он
реализует определения событий для многих событий автоматизации. Если вам нужно
обработать любую из следующих категорий событий, то об определении событий за вас уже
позаботились:
□ основные события DTE;
□ события документов;
□ события окон;
□ события Task List;
□ события поиска;
□ события окна вывода;
□ события выделения;
□ события сборки;
□ события решения;
□ события элементов решения;
□ события файлов;
□ события отладчика;
□ события проекта;
□ события нажатий на клавиши;
□ события модели кода.
В листинге 12.3 показан исходный код EnvironmentEvents (сгенерированный Visual
Studio), который отвечает за реализацию этих определений событий.
Глава 12. Пишем макросы
431
\ Листинг 12.3. Модуль £до£гсжт*п1^шИи»
Option Strict Off
Option Explicit Off
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics
Public Module EnvironmentEvents
#Region "Automatically generated code, do not modify"
' Автоматически сгенерированный код, не модифицировать.
1 Начало исходников событий.
<System.ContextStaticAttribute()> _
Public WithEvents DTEEvents As EnvDTE.DTEEvents
<System.ContextStaticAttribute()> _
Public WithEvents DocumentEvents As EnvDTE.DocumentEvents
<System.ContextStaticAttribute()> _ '
Public WithEvents WindowEvents As EnvDTE.WindowEvents
<System.ContextStaticAttribute()> _
Public WithEvents TaskListEvents As EnvDTE.TaskListEvents
<System.ContextStaticAttribute()> _
Public WithEvents FindEvents As EnvDTE.FindEvents
<System.ContextStaticAttribute()> _
Public WithEvents OutputWindowEvents As EnvDTE.OutputWindowEvents
<System.ContextStaticAttribute()> _
Public WithEvents SelectionEvents As EnvDTE.SelectionEvents
<System.ContextStaticAttribute()> _
Public WithEvents BuildEvents As EnvDTE.BuiIdEvents
<System.ContextStaticAttribute()> _
Public WithEvents SolutionEvents As EnvDTE.SolutionEvents
<System.ContextStaticAttribute()> _
Public WithEvents SolutionltemsEvents As EnvDTE.ProjectltemsEvents
432
Часть IV. Расширенные возможности Visual Studio
<System.ContextStaticAttribute()> _
Public WithEvents MiscFilesEvents As EnvDTE. Project I temsEvent-s
<System.ContextStaticAttribute()> _
Public WithEvents DebuggerEvents As EnvDTE.DebuggerEvents
<System.ContextStaticAttribute()> _
Public WithEvents ProjectsEvents As EnvDTE.ProjectsEvents
<System.ContextStaticAttribute()> _
Public WithEvents TextDocumentKeyPressEvents As
EnvDTE80.TextDocumentKeyPressEvents
<System.ContextStaticAttribute()> _
Public WithEvents CodeModeIEvents As EnvDTE80.CodeModelEvents
<System.ContextStaticAttribute()> _
Public WithEvents DebuggerProcessEvents As
EnvDTE80.DebuggerProcessEvents
<System.ContextStaticAttribute()> _
Public WithEvents DebuggerExpressionEvaluationEvents As
EnvDTE80.DebuggerExpressionEvaluationEvents
1 Конец исходников событий. N
' Конец автоматически сгенерированного кода.
#End Region
End Module
Пишем обработчик события
В дополнение к определению для вас различных объектов событий интегрированную среду
разработки можно также использовать и для вставки скелетного кода обработчика события.
Сначала откройте в редакторе кода модуль Environment Events. Затем используйте
раскрывающийся список типов (самый левый раскрывающийся список в верхней части
редактора кода) для выбора необходимого вам класса событий. На рис. 12.8 показан процесс
выбора типа SolutionEvents.
После выбора типа раскрывающийся список определений (список в правой верхней части
редактора кода) содержит перечень событий, определенных для данного объекта события.
Если, например, вам нужно получать уведомления каждый раз, когда решение открывается,
то вам следует выбрать событие Opened. Сразу после выбора этого события в редактор кода
вставляется код обработчика события. В данном случае будет вставлен такой код:
Private Sub SolutionEvents_Opened() Handles SolutionEvents.Opened
End Sub
Глава 12. Пишем макросы
433
Вы можете оставить этот код в таком виде в модуле EnvironmentEvents (это разумная
практика!) или вы можете вырезать и вставить его в любой другой модуль проекта. Теперь,
когда обработчик события находится на своем месте, необходимо позаботиться о написании
кода, который будет обрабатывать событие.
щл ^^^1^^' ^^,рр^|И
II Eile £drt Vjew £rojert Qebug I
tf 1 $^м*^<* -j
IIГ i*; У1 References '
|r*| ^ EnvironmerUEvents.
|S j *J ExterreiblityTests ■
I g. 1 5] MacroEx#rnples
12; *£ RecordingModule
1 i&l Samples
1 В J References
1 *) Accessibibty
I D AddDirAsSlnFolder
И *£ DevStudiofiEdrtar i
Л 2] EnvironmentEvents
1 *] KbkeAdrfm '■
У *J Utilities
I $J VSDebogger
| 2] VSEdilor j
1
|| |^5 Р™)*Л btptorer p$£im V&ew^
|| Ready
oois JjVjndov» Help
•4P--il ► f& Л *1*3эг:а
К 2D • 5 1
^Р1Р|||МИИНННННННННИ11 ' —~~
£i EnvironmentEvents
<* BuildEvtnts
$ DebuggerEvents
V DocumentEvents
* DTEEvents
$ FindEvents
<* MiscFilesEvents
¥ OutputWindowEvents
* SelertionEvents
* SoluttonEvents
^ SofutfonhemsEvenb
<* TaslcUrtEvents
¥ WindowEvents
<3узъет. ContextSuacicAt
snta
w 1
~ '" LJfl
'III
III
: Л
is. [
; П!
ruC"d c^dz, dc not modify" . jjf
it, do t^oc r;vdifv
:rabuce{)> Public
:ribute()> Public
:ribute(j> Public
tribute fj> Public
tribute ()> Public
<SyareB.ContextStatlcAttribure()> Public
<S-/3tea.Con-ce*rStaticuttributeO> Public
<3yatea8.ContextStaticAtcrd.hute (J > Public
<Systea.CDnteiitStaticAttributeO> Public
<Syatem.ContextScaticAttribute()> Public
„,'J ;» _ ,„„,„,„
LnX Coll Chi
~" \ 11
WitnCveita 1
Wlt^.'-TTCa HI
WithEve-ita 1 |||
tfitiiEvcrita HI
WitfeEverta j||
WttrEvenna < III
Wic^Fv-erca jit
WitfrEventa ' |||
WithEvenca ]|
WitRXverta |
_..._ „.,„!„ „ JI
INS ||
Рис. 12.8. Выбор типа события макроса
Каждый раз, когда макропроект с обработчиками событий будет загружаться в Visual Studio,
будет отображаться диалоговое окно обеспечения безопасности (рис. 12.9).
Это диалоговое окно только ставит вас в известность о том, что макрос содержит код
перехвата событий и позволяет вам деактивировать объекты событий в макросе; последнее
является хорошей идеей, если вы открываете макрос из непроверенного источника. У вас есть
также возможность просто прервать процесс загрузки проекта (нажав на кнопку Don't Load
Project в левом нижнем углу диалогового окна).
Warning
L The micro project TAlrsenVpovvenJlEDMOND\Documents\Vtsuat Studio
££&, 2ltXa\Project$\VSMacrps80^^^acro$\^^MatЛl*vsm4cro«, contains
event handling code.
/ > jjiabte event handling code
Л} Qisibte event handling code
Don't load Project
Рис. 12.9. Загрузка макропроекта с событиями
434
Часть IV. Расширенные возможности Visual Studio
Добавление нового объявления события
Если вам нужен доступ к событию, которое не было объявлено для вас в модуле
EnvironmentEvents, то можно добавить объявление события вручную. Для демонстрации
давайте добавим новый обработчик для события windowHiding, предоставляемого классом
windowVisibilityEvents. Это событие (которое не включено по умолчанию) говорит
вам, скрыто ли окно инструмента в интегрированной среде.
Сначала надо добавить объявление события где-нибудь внутри макропроекта. Подходящим
местом для этого будет модуль EnvironmentEvents; при этом весь код событий будет
находиться в одном месте. Не забудьте поместить объявление события вне области,
помеченной как "Автоматически сгенерированный код, не модифицировать". Вот объявление
события для класса WindowVisibilityEvents:
<System.ContextStaticAttribute()> _
Public WithEvents WindowVisibilityEvents As _
EnvDTE80.WindowVisibilityEvents
Теперь обработчик события: точно так же, как и в предыдущем примере, выберите тип
WindowVisibilityEvents в раскрывающемся списке типов и событие WindowHiding в
раскрывающемся списке членов. Это создаст скелет процедуры обработки события (где вы
должны отобразить окно сообщения):
Private Sub WindowVisibilityEvents_WindowHiding(ByVal Window As _
EnvDTE.Window) Handles WindowVisibilityEvents.WindowHiding
MessageBox.Show("WindowHiding fired for " & Window.Caption)
End Sub
Инициализируем объект события
Несмотря на то, что вы объявили объект события и написали обработчик события, это еще
не все: вам нужно еще инициализировать объект события. Исполняющая среда макросов
сама имеет два события, которые вам необходимо перехватить для того, чтобы обеспечить
правильную инициализацию объекта события при каждом старте или сбросе исполняющей
среды макросов. Без этого шага объект события синтаксически завершен, но не получит
никаких событий от основной интегрированной среды разработки.
Вам необходимо позаботиться о двух событиях, причем оба они предоставляются классом
DTEEvents. Первое из них — это DTEEvents . OnMacrosRuntimeReset; это событие
происходит тогда, когда по какой-либо причине происходит сброс исполняющей среды.
Поскольку сброс исполняющей среды вызывает очистку всего глобального состояния (и в том числе
и связи с событиями), то это помешает перехвату событий (если вы не инициализировали
объект события в процессе сброса).
Обработка этого события аналогична обработке любого другого: вы используете
раскрывающиеся списки типов и членов для генерирования скелета кода, а затем вставляете код
инициализации объекта события:
Private Sub DTEEvents_OnMacrosRuntimeReset() Handles
DTEEvents.OnMacrosRuntimeReset
WindowVisibilityEvents = CType(DTE.Events,Events2).WindowVisibilityEvents
End Sub
Глава 12. Пишем макросы
435
Второе событие, которое вам необходимо перехватить — это DTEEvents.OnStartupComplete.
Оно происходит тогда, когда исполняющая среда и макросреда завершили свой запуск:
Private Sub DTEEvents_OnStartupComplete() Handles DTEEvents.OnStartupComplete
. WindowVisibilityEvents = CType(DTE.Events, Events2).WindowVisibilityEvents
End Sub
Посредством инициализации объекта события при каждом старте или сбросе исполняющей
среды вы обеспечиваете жизнеспособную активную связь с движком собьггий
интегрированной среды.
Для тестирования обработчика событий вы просто переходите в основную
интегрированную среду и закрываете (или скрываете) любое из окон инструментов (нажатием кнопки
Close окна). Если вы сделали все правильно, то увидите окно сообщения, показанное на
рис. 12.10.
WtnefowHicfing fired for Solution
Explorer
WW
- ContosojTdntsgratton
L
.*:..i|
Рис. 12.10. Перехват события WindowHiding
Совет
Если вы добавили в ваш макропроект новое объявление события и не можете
заставить сработать его обработчик, то причин для этого может быть несколько. Во-первых,
убедитесь, что вы правильно добавили код инициализации класса событий как в
событие OnStartupComplete, так и в событие OnMacrosRuntimeReset. Во-вторых,
вам может понадобиться выгрузить и вновь загрузить ваш макропроект (для того
чтобы установить "подключение" для вашего события). Для выгрузки макропроекта
закройте среду Macros (если она открыта) и в окне Macro Explorer основной
интегрированной среды щелкните правой кнопкой мыши по макропроекту (в который вы
добавили события) и выберите Unload Macro Project. Затем добавьте макропроект
обратно при помощи щелчка правой кнопкой мыши по корневому узлу Macros в Macro
Explorer и выбора пункта Load Macro Project. Убедитесь в том, что вы выбрали
вариант Enable Event Handling Code в диалоговом окне обеспечения безопасности
(которое появляется при запуске проекта).
Запуск макросов
Из обсуждения Macro Explorer вы знаете^ что одним из способов запустить макрос
является простой двойной щелчок по макросу в окне Macro Explorer. Мы описали также запуск
макроса по событию интегрированной среды разработки. Другим обычным вариантом,
который вы, возможно, захотите обеспечить для некоторых макросов, является запуск макроса
из основной интегрированной среды при помощи кнопок панели инструментов, пунктов
меню и клавиатурных комбинаций быстрого вызова.
436
Часть IV. Расширенные возможности Visual Studio
Запуск макросов из панелей инструментов и меню
Если вы хотите обеспечить быстрый доступ к макросам разворачивания и сворачивания
узлов, то можете присвоить их кнопкам панели инструментов или пунктам меню главной
интегрированной среды. Это можно сделать при помощи диалогорого окна Customize:
1. Отобразите диалоговое окно (при помощи выбора меню Tools | Customize).
2. Выберите вкладку Commands.
3. Выберите категорию Macros в списке категорий. В списке команд будет показан каждый
отдельный макрос для всех загруженных макропроектов (в формате [Имя
макропроекта]. [Имя макромодуля].[Имя макропроцедуры]).
4. После выделения макроса перетащите его на любую видимую панель инструментов или
меню (рис. 12.11).
"ПГь!
| *** CqntaiioCemmonframmark- Microsoft Vjxuai Studio
. 8Ш1ШШ№ •.—riMKr Ж & ast„
J8k Ш 3&&—Шь
We £*t }£it** Project
Brbug DaU Ffirroat Josli T«jt Window d«*P
4
I. Categories
Ready
Twlbir? Commends
Action
Adtan*
Build
CUis Diagram
Qata
Database Diagram
Debug
DSl Toots
Ecft
File
Format
Help
Image
Insert
Laycul
Hv*t Menu
To add a tommarui
toolbar or menu.
Commands
М*сго^МуМ*сг«.Ейеп$<Ь|#уТей5чС1о*еА80рт
rVatres.MyMatrc».EitremibKtyTftrt^CountLOC
M*cro^kMyMecr«.E»tensibf»tyTcitf.EnumWindow$
rVafro*JHyMafro*,E«trniiblttyTMtvl«tProjpftFileb
M#crov^M»croVvExten«blrtyTf5tt.OpenAnProjectHemi
№Acroj.Mytoacro5.Eirtemiblit/TertvPtnAH
LT.Mirir '■'—•*•"]T^' '-"linftf .
ЬЫг**.Ь^иг<*,Ма«оЬ«тр1м,Сс11ар*еАЦ
М*оо£м
rV acrm Myttarrc&Rer mdtng^odtjfe^fmporaryMjrto
MyMauo^MacroExampie^&HoWWindow
I Rearrange Commands
u'149 the command from the Command* list *пй Crop the command en the target
A j KfybewcL,
Cle*e
J
Рис. 12.11. Перетащите макрос из списка на панель инструментов или меню
После добавления кнопки или пункта меню данный элемент останется выделенным; если вы
теперь нажмете кнопку Modify Selection в диалоговом окне Customize, то появится
выпадающее меню (рис. 12.12), которое позволит вам изменить внешний вид кнопки или пункта
меню.
При помощи этого интерактивного элемента вы можете изменить текст элемента, присвоить
ему картинку или даже нарисовать собственную картинку при помощи редактора Button
Editor (рис. 12.13). Диалоговое окно Button Editor можно запустить при помощи опции
Edit Button Image данного выпадающего меню.
Глава 12. Пишем макросы
437
Reset
Delete
Name IColfapseAll
71
Copy Button Image
Paste Button Image
Reset Button Image
Edit Button Image..
Change Button Image
Default Style
Tert Only (Ahvays)
Text Only (in Menus)
Image and Text
Begin a Group
Button Editor
Rdura
#
Colore
ГГГГ
Г111
■111
Qear
Era** Г"
Preview
Рис. 12.12. Выпадающее меню
Modify Selection
Рис. 12.13. Присваивание кнопке изображения
Присваивание макросам клавиатурных комбинаций
Для запуска макроса при помощи клавиатурной комбинации быстрого вызова вам нужно
присвоить макросу последовательность клавиш (при помощи диалогового ркна Options)
следующим образом:
1. Откройте диалоговое окно Options (при помощи выбора меню Tools | Options). r
2. В узле Environment выберите страницу Keyboard.
Option»
ИЖШ
Environment
General
Add-in/Macros Security
AutoRecover
Documents
Find and Replace
Fonts and Colors
Help
Import and Export Settings
International Settings
Keyboard
Startup
Task List
Web Browser
Projects and Solutions
Source Control
Text Editor
Database Tools
Debuoaino
Apply the following additional keyboard mapping schemer
| Visual C*200S
Show commands containing:
MyMacros
RfiStt
Macros MyMacros.ExtensiblityTests.OpenAIIProjectItems
Macros MyMacros.EidensiblityTests.P inAII
Macros MyMacros ExtensiblitvTeits.UnPioAl!
Mauos.MyMacros.MacroExamples.ExpandAII
Use new shortcut ire
[GtQbaJ
Press shortcut keys;
Ctri* Alt-
Assign
OK
Cancel
Рис. 12.14. Присваивание клавиатурной комбинации макросу
3. На странице настроек Keyboard выберите макрос в списке команд (вы можете
отфильтровать этот список при помощи ввода имени макроса или посредством ввода слова
438
Часть IV. Расширенные возможности Visual Studio
macros в текстовом поле Show commands containing). Все макросы перечислены по
макропроектам, названиям модулей и по именам.
4. Поместите курсор в текстовое поле Press shortcut keys, а затем нажмите клавишу или
клавиши, которыми вы хотите запускать макрос (рис. 12.14).
5. Нажмите кнопку Assign; ваш макрос теперь можно запустить при помощи введенной
вами комбинации клавиш.
Примечание
Visual Studio уже имеет много разных комбинаций клавиш для различных своих
действий и команд. Если вы нажмете уже используемую комбинацию клавиш, то в
раскрывающемся списке внизу диалогового окна Options будет показана соответствующая
команда (рис. 12.14). В этот момент вы можете либо выбрать другой набор клавиш,
либо заменить имеющееся клавиатурное присваивание. Замена — не очень хороший
вариант в том случае, когда вы заменяете часто используемую команду: вырезать,
открыть файл и т. д.
Выполнение макроса из командного окна
Как вы уже видели по шагам, необходимым для запуска макроса при помощи панели
инструментов/меню и клавиатурных комбинаций, каждый макрос представлен в
интегрированной среде командой (см. разд. "Объекты команд" главы II). Для выполнения команд
предназначено командное окно, поэтому макросы также можно запускать из командной строки.
В командной строке введите букву m для того, чтобы сработала IntelliSense и показала вам
список макросов. Прокрутите список и выберите нужный вам макрос; затем нажмите
клавишу <Enter>. Макрос выполнится.
Макросы с параметрами
Несмотря на то, что для макросов характерно выполнение без всякого взаимодействия с
пользователем, иногда может быть полезно написать макрос, который принимает
параметры (как часть определения его функции/процедуры).
Рассмотрим макрос ResizeiDE в листинге 12.4. Он принимает в качестве параметров
значения ширины и высоты, а затем соответственно изменяет размер окна основной
интегрированной среды.
гм~ ~ """ *...-....«...-..«• ~ _..„...M..^...„...W,..~ « „ ~ ~ ,?
; Листинг 12.4. Изменение размеров интегрированной среды
?..4*..»~..>*...~>..»^...~..vw;v^...i~..wr^^
Option Strict Off
Option Explicit Off
Imports EnvDTE
Imports EnvDTE80
Public Module MacroExamples
Public Sub ResizeiDE(Optional ByVal width As Integer = 800, _
Optional ByVal height As Integer = 600)
Глава 12. Пишем макросы
439
Dim ide As Window2 = DTE.MainWindow
ide.Width = width
ide.Height = height
End Sub
End Module
Если бы вам было нужно вызвать этот макрос из командного окна, то вам пришлось бы
передать в него эти параметры следующим образом:
Macros.MyMacros.MacroExamples.ResizelDE(800, 600)
Примечание
Если вы пишете макрос, который принимает параметры, то эти параметры должны
быть объявлены как необязательные, и вы должны предоставить для них значения по
умолчанию. Несмотря на то, что вы не получите никаких ошибок в том случае, если вы
напишете макрос с обязательными параметрами, такой макрос зарегистрирован не
будет. Вы не увидите его в Macro Explorer и не сможете его запустить.
Резюме
В этой главе мы описали, как использовать мощь интерфейсов прикладного
программирования расширяемости Visual Studio для создания макросов, дополнительных модулей и
мастеров.
Вы увидели, что запись макроса быстро дает вам начальную точку для управления
различными компонентами интегрированной среды разработки, что Macro Explorer является
центральным местом для управления вашими коллекциями макросов, и что Visual Studio
предоставляет полноценную среду разработки, созданную специально для разработки
макросов. При помощи этих инструментов вы можете либо записывать простые макросы и
использовать их как стартовую точку для более сложных макросов, либо создавать макросы
с нуля при помощи языка Visual Basic.
Глава 13
Надстройки и мастера
Если макросы представляют собой быстрый и простой подход к автоматизации, то
надстройки — это их более сложные и более мощные аналоги. Надстройки — это
откомпилированные проекты на языках Visual Basic, Visual C# и даже Visual C++. Надстройки полезны
для более сложных случаев расширения— вплоть до создания в интегрированной среде
ваших собственных форм, окон инструментов и визуальных конструкторов.
Еще одна родственная тема, которой мы коснемся в этой главе, — это создание и доработка
мастеров Visual Studio. Мастера запускаются каждый раз, когда вы создаете новый проект
finu добавляете в проект элемент. Эти мастера обычно представляют собой одно или более
диалоговых окон, в которых пользователь вводит свои предпочтения, а затем эти
предпочтения используются для создания структуры проекта, генерирования кода по умолчанию
или для выполнения еще более сложных задач. При создании начальной структуры кодового
файла или всего проекта мастера работают в сочетании с файлами шаблонов. Имеется целая
инфраструктура для мастеров и шаблонов (чтобы вы могли произвести настройку под ваши
конкретные потребности).
В двух предыдущих главах вы видели, как организован интерфейс прикладного
программирования (API) расширяемости, и как вы можете писать макросы, которые взаимодействуют
с этим API. Макросы являются идеальным способом управления различными элементами
интегрированной среды. Внутри макроса вы имеете доступ ко всей объектной модели
расширяемости, макросы писать легко и они имеют собственную среду разработки. Однако при
всех этих положительных качествах у макросов имеются также и ограничения:
□ макрос нельзя использовать для создания и отображения пользовательских окон
инструментов;
□ макрос не может предоставить никакого пользовательского интерфейса, кроме простых
диалоговых окон и окон сообщений;
□ макрос не может реализовать страницу свойств в диалоговом окне Options;
□ макрос не может динамически активировать или деактивировать меню и панели
инструментов в интегрированной среде;
□ макрос нельзя откомпилировать и распространять как исполняемый двоичный файл.
Надстройки Visual Studio могут делать все это и даже больше. Проще говоря, надстройки
предоставляют разработчикам более глубокие механизмы интеграции с интегрированной
Глава 13. Надстройки и мастера
441
средой. Итак, что же такое надстройка? Надстройка— это откомпилированный dll-файл,
содержащий СОМ-объект, реализующий конкретный интерфейс (iDTExtensibility2),
предоставляющий надстройке прямую связь с интегрированной средой. Как мы уже
упоминали, вы можете писать надстройки на вашем любимом управляемом языке. Поскольку мы
потратили в мире макросов очень много времени на работу с Visual Basic, то в этой главе
все примеры надстроек будут даны на языке С#.
Создание первого проекта надстройки
Самый простой способ начать работу с надстройками— это запустить мастер Add-in
Wizard. Так же как и при записи макроса, этот мастер даст вам стартовую точку для
реализации ваших собственных надстроек; а при изучении кода, создаваемого мастером Add-in
Wizard, вы поймете многие аспекты надстроек.
Мастер Add-in Wizard запускается тогда, когда вы пытаетесь создать новый проект типа
Visual Studio Add-in. В диалоговом окне New Project, открываемом командой File | New
Project, выберите узел Other Project Types | Extensibility в дереве типов проектов. Здесь вы
увидите два шаблона проектов: Visual Studio Add-in и Shared Add-in (рис. 13.1).
[ New Project ШИ£М
Visual Studio Solutions
Test Projects
Create an Add-in loadable in a Visual Studio based host
H»me ' MyAddinl
Location: C\U&e/f\lpcrwenREOMOND\Oi>ciiments^VisualStudic2008«Prcjects » grows e ,
Solution Name MyAddwl £ Create directory for solution
^ Add to Source Control
Рис. 13.1. Выбор типа проекта Visual Studio Add-in
Мы затронем разницу между этими двумя типами проектов чуть позже; на данный момент
нас интересует шаблон Visual Studio Add-in.
Нажатие кнопки OK запустит мастер Add-in Wizard.
Настройка параметров надстройки
Мастер Add-in Wizard соберет всю необходимую информацию для определения основных
параметров проекта надстройки: язык, на котором вы хотите вести разработку, хост-
£roject types;
Visual С*
Other languages
Other Project Types
Setup and Deployment
Database
txtennbilitv
Iemplites.
Visual Studio installed templates
-4 Visual Studio Add-in
-^Shared Add-in
My Templates
o3 Search Online Templates
442
Часть IV. Расширенные возможности Visual Studio
приложение, а также информацию о надстройке для стадии выполнения (такую как
описание, а также информацию для окна About). Давайте кратко изучим каждую страницу
мастера.
Выбор языка
После начальной страницы приветствия первое, что вы должны будете сообщить, — это
язык, который вы хотите использовать для разработки надстройки (рис. 13.2).
| Visual Studio Add-in Wizard (Page 1 of 6} ' VJ ll&flll
Select a Programming Language
You can create your Add-n usng different programmrg languages. Which language J
I wcH*d you Все to use' "P
ф' Qeate an Add-tn using tysuel С #
I '} Create an AddHn ue«g visual Basse
f rrotr >sn Adcc-r тп$ >.Va^C++ /Л 5
Lren it rn Mc r uiri- ->r»ni Cli' A;L
1 <*«*■ lLJtesk>JI Гь™*
Рис. 13.2. Выбор языка разработки надстройки
Имеющийся список языков будет зависеть от двух вещей:
Я от языков, которые инсталлированы как часть вашего пакета Visual Studio;
□ от типа надстройки (совместно используемый или для Visual Studio).
Надстройки Visual Studio поддерживают Visual С#, Visual Basic, а также как управляемый,
так и неуправляемый Visual C++.
Выбор хост-приложения
После выбора языка вы получаете вопрос о "хост-приложении". Эта страница просто
спрашивает вас о том, где вы хотите выполнять надстройку.
Поскольку вы указали, что это надстройка для Visual Studio (Visual Studio Add-in), а не
совместно используемая надстройка, то ваши варианты хостов будут такими:
интегрированная среда Visual Studio (Visual Studio IDE) или интегрированная среда Macros (Macros
IDE). Visual Studio 2008 имеет возможность вести разработку под различные версии
интегрированной среды. Например, если у вас есть Visual Studio 2005, которая
инсталлирована рядом с Visual Studio 2008, то у вас будут варианты разработки вашей надстройки
под обе версии. На рис. 13.3 обратите внимание на то, что показаны варианты для обеих
версий Visual Studio.
Глава 13. Надстройки и мастера
443
Visual Studio Add-in Wizard (Page 2 of 6)
Select An Application Host
You can customize your Add-ft so that the user can load it within mulbple application
hosts Which appicabons л>оиМ you bee to support?
У| Microsoft Visual Stud» 2005
1J Microsoft Visjal Studio 2005 Macros
V| Microsoft VISLal SujdloJ008
J focreoft Visual Studio 200B Macrov
[VMM
Рис. 13.3. Выбор хост-приложения
Примечание
Теперь самое время обсудить разницу между надстройкой Visual Studio и совместно
используемой надстройкой. Совместно исползуемая надстройка— это название для
надстроек, работающих внутри приложений Microsoft Office (таких как Microsoft Word или
Microsoft Excel). Надстройка Visual Studio может работать только внутри
интегрированной среды Visual Studio или интегрированной среды Macros. Если вы пройдете по
мастеру Add-in Wizard для случая совместно используемой надстройки, то обнаружите, что
список на странице (которая спрашивает вас о хосте приложения) будет заполнен
инсталлированными приложениями Microsoft Office; вы не сможете выбрать Visual Studio в
качестве хоста приложения для случая совместно используемой надстройки.
Описание для надстройки
Название и описание, которые вы вводите на странице 3 мастера (рис. 13.4), становятся
видны в Add-in Manager тогда, когда вы выбираете данную надстройку. Эта информация
предназначена для того, чтобы дать пользователям представление о функциональности
надстройки и ее цели.
Настройка опций надстройки
Следующая страница мастера (рис. 13.5) позволяет вам указывать различные опции
надстройки. Вы можете указать: хотите ли вы, чтобы модуль появился в меню Tools; когда вам
нужно загружать модуль; и может ли модуль показывать модальные окна во время своей
работы.
Настройка информации окна About
Предпоследняя страница мастера принимает тот текст, который Visual Studio будет
отображать в своем окне About (рис. 13.6). »
444
Часть IV. Расширенные возможности Visual Studio
Visual Studio Add-in Wirard fPao* 3 of 6)
Enter a flame and Description
An Add-ti needs a name and desapuon to better deserbe Itself tD the user
these values bdow.
What is the name off your Add-in?
MyAddrl-My First Add-In
What tath«d«CTipti«i for your Add kj?
Enter
MyAddh 1 - This add -n does nothing par&utady useful - but it was fun to write'
j 1
<&**
J^~-
II
H*>
1 1
ил
Caned
£20]
1 j
Рис. 13.4. Название и описание для надстройки
Visual Studio Add-In Wfcard (Page « of 6}
I Choose Add-In Options.
Тле fMwMng opttont are avatabte for your Add-ti.
WoofeJ you Ike to create command bar UI far your Add-in?
:у]^,стып;а^о^гтёшйт. ifrd7f#3fihVitf cauae n^AoV^toioadwhe
Wdktedti^e^AcW-^JiiettatoedwiitBrt^JDfo^hoetappiCBpon
You can fine tunc «Лея yew Add-In loads;
l 1МуШ*^г*мегр<ЛфпрМ{Л4ы*ак\Ы\ж6жЬаутпяпй^Ы*Ь
1 <Sadc |[; .Hprt> | |
1 ... .. __ .__ . _._ . — ,...___ .. _ ._
laLt*ail
•^f
n fttouttori
Cancel j I
Рис. 13.5. Настройка опций надстройки
VouaJ Stud» Add-in Wizaid (Page S of 6)
I Choosing 'Help About' Information.
Vkuat Snxto mpports acting tiformatlon to the 'About dufcgbox. If younfchto
urate tne nfarrnaoon, enter уаиг Information bdoW.
Would yo# Мое to geaerate setonas far the About dUtog box?
3r~>es,l «odd aVe my Add-In to o.ffer 'About' box hformatton
Where can yoaruw receive^ecbmcal a»f jort tor yoarAdd-ai?
I For more лгопяаЬоп about лв add-tv pleaae see.*|
http./Aw* •contoeo.com
For customer support, cat 1-600 mnr-xxxx
Copyright (c) 2007 Сопью Inc.
(НИ
t •> \
■• 4
An Icon feneeded for the Visual Stud» About box. "Пи Iconwdautonvocatybe . Л 1
J aeA\tdmd*№toyciMpro^iaen.<x,ntc*trrbe4te»ifoite.Kd<Unm. fj) 1
He Aaw^olbYderaulticqncanbescentothertght ^
f <&**. ]Гь5*>~! (
Cancel | i
Рис. 13.6. Ввод текста для окна About среды Visual Studio
Глава 13. Надстройки и мастера
445
Сюда можно включить такие подробности, как контактные данные автора надстройки (для
связи с пользователями), информацию о поддержке и лицензировании, а также информацию
о версии и авторском праве и т. д.
Завершение мастера
Последняя страница мастера содержит сводку всех выбранных вами опций. После нажатия
кнопки Finish мастер начнет создавать код для вашей надстройки (на основе всех сделанных
вами в мастере настроек).
Поскольку надстройки — это dll-файлы, то мастер Add-in Wizard создаст исходный код
надстройки (как часть проекта библиотеки классов в интегрированной среде). Этот первичный
файл с кодом реализует класс Connect. Этот класс наследует от всех необходимых СОМ-
интерфейсов (для того чтобы надстройка работала в контексте интегрированной среды
разработки).
В листинге 13.1 показан класс Connect (таким, каким он был сгенерирован мастером Add-in
Wizard).
using System;
using Extensibility;
using EnvDTE;
using EnvDTE80;
using Microsoft.VisualStudio.CommandBars;
using System.Resources;
using System.Reflection;
using System.Globalization;
namespace MyAddinl
{
/// <summary>06beKT для реализации надстройки.</summary>
/// <seealso class=,IDTExtensibility2f />
public class Connect : IDTExtensibility2, IDTCommandTarget
{
/// <summary>Реализует конструктор для объекта надстройки.
/// Разместите ваш код инициализации в этом методе.</summarу>
public Connect()
{
}
/// <зиттагу>Реализует метод OnConnection интерфейса
/// IDTExtensibility2. Получает уведомление, что
/// надстройка загружается.</summary>
446
i
Часть IV. Расширенные возможности Visual Studio
/// <param term='application'Жорневой объект
/// хост-приложения.</param>
/// <param term='connectMode'>Описывет, как загружается
/// надстройкам/pa r am>
/// <param term='addlnlnst'>Объект, представляющий эту
/// надстройку.</param>
/// <seealso class=lIDTExtensibility2, />
public void OnConnection(object application,
ext_ConnectMode connectMode,
object addlnlnst, ref Array custom)
{
_applicationObject = (DTE2)application;
_addlnlnstance = (Addln)addlnlnst;
if(connectMode == ext_ConnectMode.ext_cm_UISetup)
{
object []contextGUIDS = new object[] { };
Coramands2 commands = (Commands2)_applicationObject.Commands;
string toolsMenuName;
try
{
// Если вы хотите перенести команду в другое меню, то нужно
// изменить слово "Tools" на английское название меню. Этот код
// принимает культуру, прибавляет имя меню, а затем добавляет
// команду в меню. Вы можете найти список всех меню
// верхнего уровня в файле CommandBar.resx.
string resourceName;
ResourceManager resourceManager =
new ResourceManager("MyAddinl.CommandBar",
Assembly.GetExecutingAssembly());
Culturelnfo culturelnfo =
new Culturelnfo(_applicationObject.LocaleID);
if(culturelnfo.TwoLetterlSOLanguageName == "zh")
{
System.Globalization.Culturelnfo parentCulturelnfo =
culturelnfo.Parent;
resourceName = String.Concat(parentCulturelnfo.Name, "Tools");
}
else
{
resourceName =
Глава 13. Надстройки и мастера
447
String.Concat(culturelnfo.TwoLetterlSOLanguageName, "Tools");
}
toolsMenuName = resourceManager.GetString(resourceName);
}
catch
{
//Мы пытались найти локализованную версию слова Tools,
// но не нашли. По умолчанию принимается слово en-US,
// которое возможно будет работать и для текущей культуры.
toolsMenuName = "Tools";
}
// Поместить команду в меню Tools.
// Найти панель команд MenuBar, которая является панелью команд
// верхнего уровня, содержащей все элементы главного меню:
Microsoft.VisualStudio.CommandBars.CommandBar menuBarCommandBar =
((Microsoft.VisualStudio.CommandBars.CommandBars)
_applicationObject.CommandBars)["MenuBar"];
// Найти панель команд Tools в панели команд MenuBar
CommandBarControl toolsControl =
menuBarCommandBar.Controls[toolsMenuName];
CommandBarPopup toolsPopup = (CommandBarPopup)toolsControl;
// Этот блок try/catch block можно дублировать, если вы хотите
// добавить несколько команд для обработки вашей надстройкой
// Убедитесь только, что вы также обновили метод
// QueryStatus/Exec и включили в него имена новых команд.
try .'
{
// Добавить команду в коллекцию Commands:
Command command =
commands.AddNamedCommand2(_addlnlnstance,
"MyAddinl", "MyAddinl",
"Executes the command for MyAddinl", true, 59,
ref contextGUIDS,
(int)vsCommandStatus.vsCommandStatusSupported+
(int)vsCommandStatus.vsCommandStatusEnabled,
(int)vsCommandStyle.vsCommandStylePictAndText,
vsCommandControlType.vsCommandControlTypeButton);
448
Часть IV. Расширенные возможности Visual Studio
// Добавить элемент управления для команды в меню Tools:
if((command != null) && (toolsPopup != null))
{
command.AddControl(toolsPopup.CommandBar, 1);
}
}
catch(System.ArgumentException)
{
// Если мы оказались здесь, то исключение, вероятно, произошло
// из-за того, что команда с этим именем уже существует. Если
// это так, то нет необходимости повторно создавать команду, и
//мы можем спокойно игнорировать исключение.
}
}
}
/// <зиттагу>Реализует метод OnDisconnection интерфейса
/// IDTExtensibility2. Получает уведомление, что дополнительный
/// модуль выгружается.</summary>
/// <param term=,disconnectMode'>OnncbiBaeT, как дополнительный модуль
/// выгружается.</param>
/// <param term='custom'>Массив параметров, специфичных для
/// хост-приложения.</param>
/// <seealso class=fIDTExtensibility2' />
public void OnDisconnection(ext_DisconnectMode disconnectMode,
ref Array custom)
{
}
/// <зиттагу>Реализует метод OnAddlnsUpdate интерфейса
/// IDTExtensibility2. Получает уведомление, когда коллекция
/// надстроек изменяется.</summary>
/// <param term='custom1>Массив параметров, специфичных для
/// хост-приложения.</param>
/// <seealso class='IDTExtensibility2■" />
public void OnAddlnsUpdate(ref Array custom)
{
}
/// <зиттагу>Реализует метод OnStartupComplete интерфейса
/// IDTExtensibility2. Получает уведомление, что хост-приложение
IN закончило загружаться.</summary>
Глава 13. Надстройки и мастера
449
III <param term='custom1 >Массив параметров, специфичных для
/// хост-приложения.</param>
/// <seealso class='IDTExtensibility2l />
public void OnStartupComplete(ref Array custom)
{
}
/// <summary>Реализует метод OnBeginShutdown интерфейса
/// IDTExtensibility2. Получает уведомление, что
/// хост-приложение выгружается.</summary>
/// <param tenr^'custom^Macc^B параметров, специфичных для
/// хост-приложения.</param>
/// <seealso class='IDTExtensibility2' />
public void OnBeginShutdown(ref Array custom)
{
/// <зиттпагу>Реализует метод QueryStatus интерфейса
/// IDTCommandTarget. Он вызывается тогда, когда информация о
/// доступности команды обновляется</зиттагу>
/// <param term='commandName'>Имя команды, для которой надо
/// определить состояние.</param>
/// <param term=,neededText,>TeKCT, который необходим
/// для команды. </рагат>
/// <param term='status'>Состояние команды
/// в пользовательском интерфейсе.</рагат>
/// <param term=,commandText'>TeKCT, требуемый
/// параметром neededText.</param>
/// <seealso class='Execl />
public void QueryStatus(string commandName,
vsCommandStatusTextWanted neededText,
ref vsCommandStatus status,
ref object commandText)
{
if(neededText ==
vsCommandStatusTextWanted.vsCommandStatusTextWantedNone)
{
i f(commandName == "MyAddinl.Connect.MyAddinl")
{
status =
(vsCommandStatus)vsCommandStatus.vsCommandStatusSupported
450
Часть IV. Расширенные возможности Visual Studio
IvsCommandstatus.vsCommandStatusEnabled;
return;
}
}
}
/// <зиттагу>Реализует метод Exec интерфейса
/// IDTCommandTarget. Он вызывается тогда, когда
/// команда вызывается.</summary>
/// <param tem='commandName'>Имя команды, которую
/// необходимо выполнить.</рагат>
/// <param term=lexecuteOptionl>OnncbmaeT, как команда
/// должна выполняться.</рагат>
/// <param term='varIn'Параметры, передаваемые вызывающей
/// стороной обработчику команды.</рагат>
/// <param term='varOut'> Параметры, передаваемые обработчиком
/// команды вызывающей стороне.</param>
/// <param term=lhandled' >Информирует вызывающую сторону о том,
/// была ли команда обработана.</param>
' /// <seealso class=,Exec' />
public void Exec(string commandName,
vsCommandExecOption executeOption,
ref object varln, ref object varOut,
ref bool handled)
{
handled = false;
if (executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
{
i f (commandName == "MyAddinl.Connect.MyAddinl")
{
handled = true;
return;
}
}
}
private DTE2 _applicationObject;
private Addln _addlnlnstance;
}
}
Глава 13. Надстройки и мастера
451
На данном этапе надстройка реально ничего не делает. Вам еще нужно реализовать ее
логику. Однако мастер уже реализовал большую часть (если не все) необходимых
внутренностей, требующихся для:
□ связывания надстройки с интегрированной средой;
□ предоставления ее через меню Tools;
□ перехвата соответствующих событий для того, чтобы надстройка заработала.
Теперь, когда у вас есть основа кода для дальнейшей работы, вы должны быть готовы
изучить исходный код для того, чтобы понять общую структуру и компоновку надстройки.
Структура надстройки
Первое, что необходимо отметить, — это то, что класс Connect наследует от двух разных
интерфейсов: IDTCommandTarget И IDTExtensibility2.
public' class Connect : IDTExtensibility2, IDTCommandTarget
Интерфейс IDTCommandTarget обеспечивает функциональность, необходимую для
предоставления надстройки через панель команд. Код для наследования от этого интерфейса был
добавлен мастером (поскольку на странице 4 мастера надстроек был поставлен флажок Yes,
create a tools menu item).
Интерфейс iDTExtensibility2 предоставляет надстройкам возможности работы с
событиями. Он отвечает за все события, которые происходят в течение всего времени жизни
надстройки.
Жизненный цикл надстройки
При загрузке и выгрузке в хост-приложении надстройка проходит через целую череду
событий. Каждое из этих событий представлено методом, определенным в интерфейсе
!DTExtensibility2. Эти методы описаны в табл. 13.1.
Таблица 13.1. Методы IDTExtensibility2
Метод
OnAddlnsUpdate
OnBeginShutdown
OnConnection
OnDisconnection
OnStartupComplete
Описание
Вызывается тогда, когда надстройка загружается или выгружается
Вызывается тогда, когда Visual Studio завершает свою работу при
загрузке надстройки
Вызывается тогда, когда надстройка загружена
Вызывается тогда, когда надстройка выгружена
Вызывается тогда, когда надстройка загружается, если эта надстройка
настроена на запуск при старте Visual Studio
Диаграммы на рис. 13.7 и рис. 13.8 показывают, как эти методы (которые представляют
собой события) укладываются в процесс нормальной загрузки и выгрузки надстройки.
452
Часть IV. Расширенные возможности Visual Studio
Рис. 13.7. Последовательность событий загрузки
С VS Shut down J (\*Ш tottotf** J
Ш
j
ш
Рис. 13.8. Последовательность событий выгрузки
Если вы вернетесь назад к коду шаблона для надстройки, то увидите, что каждый из этих
методов IDTExtensibility2 реализован. Методы OnDisconnection, OnAddlnsUpdate,
OnStartupComplete и OnBeginShutdown пусты; мастер реализовал только их сигнатуру.
Однако метод OnConnection уже имеет порядочное количество кода (и это еще до того, как
вы приложили к нему руки).
Теперь вы готовы исследовать то, что происходит в каждом из методов iDTExtensibility2.
OnAddlnsUpdate
Метод OnAddlnsUpdate вызывается тогда, когда надстройка загружается или выгружается
из Visual Studio; поэтому данный метод в основном используется для обеспечения
зависимостей между надстройками. Если ваша надстройка зависит от функциональности другой
надстройки, то это идеальная точка для вставки той логики, которая обрабатывает такие
связи.
Вот метод OnAddlnsUpdate в том виде, как он реализован мастером Add-in Wizard:
/// <зшптагу>Реализует метод OnAddlnsUpdate интерфейса IDTExtensibility2.
/// Получает уведомление тогда, когда коллекция надстроек
Глава 13. Надстройки и мастера
453
/// изменяется.</summary>
/// <param term='custom1 >Массив параметров, специфичных для
/// хост-приложения.</param>
/// <seealso class='IDTExtensibility2' />
public void OnAddlnsUpdate(ref Array custom)
{
}
Совет
Поскольку вы не знаете, какая надстройка запустила метод OnAddlnsUpdate, то вам
придется перебрать коллекцию DTE.Addins и опросить свойство Connected для
каждой надстройки (чтобы определить ее текущее состояние).
OnBeginShutdown
Метод OnBeginShutdown вызывается для каждой выполняющейся надстройки при
завершении работы Visual Studio. Если интегрированной среде требуется какой-либо код очистки
(например, сброс настроек интегрированной среды, которые были изменены в течение
времени жизни надстройки), то такой код надо размещать именно в этом методе.
Пользователь может отменить процесс завершения работы Visual Studio. OnBeginShutdown
произойдет независимо от того, был ли процесс завершения работы Visual Studio успешным.
Поэтому вы — как разработчики надстройки — должны всегда считать, что Visual Studio
закончила свою работу, и действовать соответствующим образом.
Вот метод OnBeginShutdown:
/// <summary>Реализует метод OnBeginShutdown интерфейса
/// IDTExtensibility2. Получает уведомление, что
/// хост-приложение выгружается.</suramary>
/// <param term=fcustom1>Массив параметров, специфичных для
/// хост-приложения.</рагат>
/// <seealso class=lIDTExtensibility2, />
public void OnBeginShutdown(ref Array custom)
{
}
OnConnection
Метод OnConnection указывает, что надстройка загрузилась:
public void OnConnection(object application, ext_ConnectMode connectMode,
object addlnlnst, ref Array custom)
Он принимает четыре параметра. Первый параметр (application)— самый важный; он
дает ссылку на объект dte, представляющий интегрированную среду. Из главы 11 вы
знаете, что объект DTE — это ключ доступа ко всей объектной модели расширяемости. Для
макросов объект DTE — это глобальная переменная. Для надстроек метод OnConnection явля-
454
Часть IV. Расширенные возможности Visual Studio
ется единственным провайдером данного объекта, который таким образом обеспечивает
важнейшую связь между надстройкой и ее хостом (интегрированной средой).
Второй параметр (connectMode)— это перечисление extConnectMode. Он точно
показывает, как была загружена надстройка (список допустимых значений extConnectMode
см. в табл. 13.2).
Параметр addininst фактически является ссылкой на саму надстройку. И последний
параметр (custom) — это пустой объект Array. Этот массив передается по ссылке и может
использоваться для передачи параметров в надстройку и из нее.
Таблица 13.2. Члены ext_ConnectMode
Член
ext_cm_AfterStartup
ext cm CommandLine
ext_cm External
ext_cm Solution
ext cm Startup
ext cm UlSetup
Описание
Надстройка была загружена после старта Visual Studio
Надстройка была загружена из командной строки
Не используется (Visual Studio 2008 не использует это значение)
Надстройка была загружена вместе с решением Visual Studio
Надстройка была загружена во время запуска Visual Studio
Надстройка была загружена для настройки пользовательского
интерфейса (первоначальная загрузка надстройки)
Мастер Add-in Wizard взял первые два параметра, явно привел их к их базовым типам и
присвоил их двум полям класса для последующего использования:
_applicationObject = (DTE2)application;
_addlnlnstance = (Addln)addininst;
Следующий блок кода изучает значение extConnectMode. Если это первая загрузка
надстройки (например, если extConnectMode равен extcmUl Setup), то код делает две
вещи: создает в меню Tools пункт для надстройки и создает пользовательскую именованную
команду для запуска надстройки (эта именованная команда вызывается при выборе
надстройки в меню Tools).
if (connectMode == ext_ConnectMode.ext_cm_UISetup)
{
object []contextGUIDS = new object[] { };
Commands2 commands = (Commands2)_applicationObject.Commands;
string toolsMenuName;
try
{
// Если вы хотите перенести команду в другое меню, то нужно изменить
// слово "Tools" на английское название меню. Этот код принимает культуру,
// прибавляет имя меню, а затем добавляет команду в меню. Вы можете найти
// список всех меню верхнего уровня в файле CommandBar.resx.
Глава 13. Надстройки и мастера
455
ResourceManager resourceManager = new
ResourceManager("MyFirstAddin.CommandBar",
Assembly.GetExecutingAssembly());
Culturelnfo culturelnfo = new
System.Globalization.Culturelnfо(_applicationObject.LocalelD);
string resourceName = String.Concat
(culturelnfo.TwoLetterlSOLanguageName,"Tools");
toolsMenuName = resourceManager.GetString(resourceName);
}
catch
{
//Мы пытались найти локализованную версию слова Tools, но не нашли.
//По умолчанию принимается слово en-US,
// которое, возможно, будет работать и для текущей культуры.
toolsMenuName = "Tools";
}
// Поместить команду в меню Tools.
// Найти панель команд MenuBar, которая является панелью команд
// верхнего уровня, содержащей все элементы главного меню:
Microsoft.VisualStudio.CommandBars.CommandBar menuBarCommandBar =
((Microsoft.VisualStudio.CommandBars.CommandBars)
_applicationObject.CommandBars)["MenuBar"];
// Найти панель команд Tools в панели команд MenuBar:
CommandBarControl toolsControl = menuBarCommandBar.Controls[toolsMenuName];
CommandBarPopup toolsPopup = (CommandBarPopup)toolsControl;
// Этот блок try/catch block можно дублировать, если вы хотите
// добавить несколько команд для обработки вашей надстройкой.
// Убедитесь только, что вы также обновили метод QueryStatus/Exec
//и включили в него имена новых команд.
try
{
// Добавить команду в коллекцию Commands:
Command command = commands.AddNamedCommand2 (_addlnlnstance,
"MyFirstAddin", "MyFirstAddin",
"Executes the command for MyFirstAddin", true, 59,
ref contextGUIDS,
(int)vsCommandstatus.vsCommandstatusSupported
+(int)vsCommandStatus.vsCommandStatusEnabled,
(int)vsCommandStyle.vsCommandStylePictAndText,
vsCommandControlType.vsCommandControlTypeButton);
456
Часть IV. Расширенные возможности Visual Studio
// Добавить элемент управления в меню Tools:
if((command != null) && (toolsPopup != null))
{
command.AddControl(toolsPopup.CommandBar, 1);
}
}
catch(System.ArgumentException)
{
// Если мы оказались здесь, то исключение, вероятно, произошло из-за того,
// что команда с этим именем уже существует. Если это так,
//то нет необходимости повторно создавать команду,
//и мы можем спокойно игнорировать исключение.
}
Совет
Вы видите, что мастер Add-in Wizard очень щедр на комментарии. Когда вы начинаете
писать собственные надстройки, очень полезно прочитать автоматически
сгенерированные комментарии и просто скопировать и вставить соответствующие фрагменты
кода для использования той функциональности, которую мастер уже создал для вас.
, OnDisconnection
Метод OnDisconnection выполняется тогда, когда надстройка выгружается из Visual
Studio. Это действие противоположно тому, о котором сообщает метод OnConnection. Так
же, как и . для OnConnection, для этого метода предоставляется перечисление
(extDisconnectMode), которое указывает, как была инициирована выгрузка. Список
возможных значений ext DisconnectMode см. в табл. 13.3.
Таблица 13.3. Члены ext_DisconnectMode
Член
ext_dm_HostShutdown
ext_dm_SolutionClosed
ext_dm_UISetupComplete
ext_dm_UserClosed
Описание
Надстройка была выгружена потому, что Visual Studio
закончила свою работу
Надстройка была выгружена потому, что решение было закрыто
Надстройка была выгружена после завершения настройки
пользовательского интерфейса
Надстройка была выгружена вручную или программным путем
(используется только в том случае, если Visual Studio
продолжает работать; в противном случае будет использоваться
ext_dm_HostShutdown)
Вот метод OnDisconnection:
/// <summary>Реализует метод OnDisconnection интерфейса
/// IDTExtensibility2. Получает уведомление, что дополнительный
Глава 13. Надстройки и мастера
457
III модуль выгружается.</summary>
/// <param term=,disconnectMode,>OnncbmaeT, как дополнительный модуль
/// выгружается.</param>
/// <param term='custom1>Массив параметров, специфичных для
/// хост-приложения.</param>
/// <seealso class=,IDTExtensibility2' />
public void OnDisconnection(ext_DisconnectMode disconnectMode,
ref Array custom)
{
}
OnStartupComplete
Если надстройка настроена на автоматическую загрузку во время запуска Visual Studio, то
метод OnStartupComplete сработает после загрузки надстройки.
Вот метод OnStartupComplete:
/// <зиттагу>Реализует метод OnStartupComplete интерфейса
/// IDTExtensibility2. Получает уведомление, что хост-приложение
/// закончило загружаться.</summary>
/// <param term='custom'>Массив параметров, специфичных для
/// хост-приложения.</param>
/// <seealso class=,IDTExtensibility2' />
public void OnStartupComplete(ref Array custom)
{
}
Реакция на команды
Надстройки могут реагировать на команды, выдаваемые внутри интегрированной среды.
Если вы помните из обсуждения команд в главах 11 w 12, то это делается при помощи
концепции "именованных команд". Именованная команда — это просто действие, которое
имеет имя. Вы уже знаете, что Visual Studio имеет огромный список собственных команд,
которые соответствуют широкому разнообразию действий, имеющихся в интегрированной
среде. Используя коллекцию Commands/Commands2, вы можете создать собственные
именованные команды (при помощи метода AddNamedCommand2).
Еще раз возвратимся к анализу метода OnConnection: мастер создал тело кода,
отвечающего за создание новой именованной команды, добавление ее в меню Tools и для
последующего реагирования на команду. Метод iDTCommandTarget.Exec— это перехватчик,
используемый для реагирования на выданную команду. Вот его прототип:
void Exec (
[InAttribute] string QmdName,
[InAttribute] vsCommandExecOption ExecuteOption,
[InAttribute] ref Object VariantIn,
458
Часть IV Расширенные возможности Visual Studio
[InAttribute] out Object VariantOut,
[InAttribute] out bool Handled
)
Для обработки команды, выданной надстройке, вы пишете код в методе Exec, который
реагирует на переданную в него команду.
CmdName — это строка, содержащая имя команды; это метка, используемая для уникальной
идентификации команды — и, таким образом, она является тем параметром, который вы
будете изучать в теле метода Exec для того, чтобы определить, будете ли вы реагировать на
команду и каким именно образом.
ExecuteOption— это перечисление vsCommandExecOption, которое предоставляет
информацию об опциях, связанных с командой (табл. 13.4).
Таблица 13.4. Члены vsCommandExecOption
Член
vsCommandExecOptionDoDefault
vsCommandExecOptionDoPromptUser
vsCommandExecOptionPromptUser
vsCoiranandExecOptionShowHelp
Описание
Осуществляет поведение по умолчанию
Получает ввод пользователя, а затем выполняет
команду
Выполняет команду без ввода пользователя
Показывает помощь по команде (не выполняет ее)
Параметр Variantin используется для передачи любых аргументов, необходимых для
входящей команды, a VariantOut служит для передачи информации из надстройки обратно
вызывающей стороне.
Наконец, Handled показывает хост-приложению, обработала ли надстройка команду. Как
правило, если ваша надстройка обработала команду, то она устанавливает его в true. В
противном случае она будет установлена в false, что является сигналом для Visual Studio о
том, что ей нужно продолжить поиск обработчика команды.
Код обработки команды меню Tools выглядит следующим образом:
/// <зигатагу>Реализует метод Exec интерфейса IDTCoramandTarget.
/// Он вызывается тогда, когда команда вызывается.</summarу>
/// <param term=,conimandNameI>MMfl команды, которую
/// необходимо выполнить.</рагат>
/// <param term=,executeOption'>OnncbiBaeT, как команда
/// должна выполняться.</рагат>
/// <param term='varIn'>napaMeTpbi, передаваемые вызывающей
/// стороной обработчику команды.</param>
/7/ <param term='varOut'> Параметры, передаваемые обработчиком
/// команды вызывающей стороне.</param>
/// <param term='handled'>Информирует вызывающую сторону о том,
/// была ли команда обработана.</рагат>
Глава 13. Надстройки и мастера
459
/// <seealso class=,Exec' />
public void Exec(string commandName, vsCommandExecOption executeOption,
ref object varln, ref object varOut, ref bool handled)
{
handled = false;
if (executeOption == vsCommandExecOption.vsCoramandExecOptionDoDefault)
{
if (commandName == "MyFirstAddin.Connect.MyFirstAddin")
{
handled = true;
return;
Управление надстройками
Надстройками Visual Studio можно управлять при помощи менеджера Add-in Manager в
Visual Studio. Он позволяет вам сделать две вещи: загрузить и выгрузить любую
зарегистрированную надстройку и указать, как надстройку можно загружать. Для доступа к Add-in
Manager (рис. 13.9) выберите меню Tools | Add-in Manager.
Available Add-ins Startup Command Line
jDMyAddirfl-Wry First Add-In 0 □ }
Besuiptton;
MyAddinl - This add-tn dots nothing particularly useful * but It wn fun to wrhei
1 <*
> ^ '^..../шша^ ^■■■■;н..} a.,. :
ШВ1
У
N
1
3 [ с*** i
J
Рис. 13.9. Управление надстройками
Это диалоговое окно будет всегда выводить список всех имеющихся на локальном
компьютере надстроек. Установка или снятие флажка рядом с названием надстройки приведет к
немедленной загрузке или выгрузке надстройки. Флажок Startup определяет— будет ли данная
надстройка загружаться автоматически при запуске Visual Studio. Флажок Command Line
выполняет то же самое для случая, когда Visual Studio запускается из командной строки
(например, когда вы запускаете Visual Studio как часть автоматизированного сценария сборки).
16 3ак 3716
460
Часть IV. Расширенные возможности Visual Studio
Объекты автоматизации надстроек
Для программного управления надстройками используйте коллекцию DTE.Addins, которая
содержит экземпляр Addin для каждой зарегистрированной надстройки (как загруженной,
так и нет).
Вы можете напрямую ссылаться на надстройки (из коллекции DTE.Addins) по их имени
следующим образом:
Addin addin = this.DTE.Addins.Item("MyFirstAddln");
Вы можете использовать свойства объекта надстройки для того, чтобы определить —
загружена ли она, узнать ее имя, а также получить ProglD надстройки.
bool isLoaded = addin.Connected;
string name = addin.Name;
string id = addin.ProglD;
Примечание
Мы используем термин "зарегистрированный" для обозначения надстройки, которая
была инсталлирована на локальном компьютере и зарегистрирована в Visual Studio.
В версиях до Visual Studio 2005 это означало, что для надстройки создавался элемент
реестра. В версии 2005 эта концепция была заменена XML-файлами: Visual Studio
ищет файлы XML с расширением addin для того, чтобы определить список доступных
для загрузки надстроек (надстройка "загружена" тогда, когда она подключилась к
процессу хост-приложения и была загружена в нем). Эти addin-файлы создаются для вас
автоматически мастером Add-in Wizard, но их легко можно создать и редактировать
вручную. Для того чтобы получить представление о структуре этих файлов, загляните
в подкаталог Visual Studio 2008\Addins вашего локального каталога Documents.
Каждая зарегистрированная надстройка появляется здесь; вы сможете исследовать файл
надстройки, если загрузите его в Visual Studio, редактор Notepad или любой другой
текстовый редактор.
Пример надстройки: цветовая палитра
Для завершения обсуждения надстроек рассмотрим от начала и до конца процесс
разработки работоспособной надстройки. Этот модуль будет предоставлять возможность выбора
цвета. Он даст пользователю возможность щелкнуть по цветовой палитре, после чего
надстройка выдаст код для создания экземпляра цветовой структуры, которая совпадает с
выбранным в палитре цветом. Вот список требований для надстройки:
□ в окне инструмента она будет отображать цветовую палитру, представляющую все
возможные цвета;
□ при наведении на палитру курсора мыши элемент управления будет показывать
значения красного, зеленого и синего цветов (для точки, находящейся под указателем мыши);
□ если пользователь щелкает по палитре, то модуль берет текущие значения RGB и
выдает код на С# или Visual Basic (в текущее активное окно документа) для создания новой
цветовой структуры, которая инкапсулирует данный цвет;
□ выбор языков (например, С# или Visual Basic) будет настраиваемым свойством
элемента управления.
Глава 13. Надстройки и мастера
461
Начинаем
Для начала процесса разработки вы создаете новое решение и проект типа Visual Studio
Add-in с именем ColorSelectorAddln. Мастер Add-in Wizard создаст для вас код внутри
класса Connect (точно так же, как это было сделано в начале данной главы). Класс Connect —
это то место, где должен находиться весь код для интегрированной среды и код
специфичный для объектной модели расширяемости.
Кроме основных инструкций надстройки вам понадобится также создать класс типа User
Control, который инкапсулирует пользовательский интерфейс, а также логику обработки
для надстройки.
Создание User Control
Сначала вы можете заняться размещением пользовательского элемента управления там, где
имеются все нужные вам функциональные возможности. После того как у вас появится
рабочий элемент управления, вы можете начать подключать его к Visual Studio при помощи
класса Connect (созданного мастером Add-in Wizard).
l-jjjp ^змП
</» ColofSelectorAddln - Mterowtt Vi«*l$tu<tf0
File £dtt ¥>*" Eroject fiufW Qebug Oft* I©ols Tes* X£mdo* fjelp
jkj* ~J)iM 4 JljSJ.J?...'^^.^ лА „►.<.[>tbug _ .j An>CPU
4 **S' 2£ $Z «♦ |
R (Rvibe)
G £уйи)
(pud* дом гиге)
ttemfc) Saved
__, ^ / ^
«. x Stuart bpbf« ♦ Cok>rStt«tofAiiditt "
Solution 'CotorScfectorAddln' A project)
-, $ Cotor5clectorAttIn
ffl i^| References
< jjj Aiiembtylnfo ci
£Ji ColorSelectorAddln - For Te^ngAddln
jj CclcrSelertorAddln.Addln
Til .ji ComrnarvdBarrew
iJ ConnrcLcs
ф Я PtlrtlcCcnUoJ cs
Jjj Spectrum .bmp
РЯЖ11'1?
'tabcil System Windows FormsXabel
IdiueLijL ...»
' Locked False
jffl Margin 3,0,3,0
|S MawmumSize 0,0
'Ш MinimumSixe 0,0
| Modifiers Private
iTcarl
I The text associated with the control.
ЩЩ%Ш
Рис. 13.10. Пользовательский элемент управления PaletteControl
Добавьте пользовательский элемент управления PaletteControl в проект надстройки (при
помощи выбора Project | Add User Control). После добавления элемента управления вы должны
поместить девять элементов управления на поверхность конструирования пользовательского
элемента управления. Во-первых, добавьте поле изображения; оно будет использоваться для
показа цветовой палитры, хранимой как простое растровое изображение в файле ресурса
(в данном случае мы используем цветовую палитру из популярной программы для рисования).
462
Часть IV. Расширенные возможности Visual Studio
Кроме палитры вам понадобится шесть меток для отображения значений RGB (в соответствии
с требованиями). И, наконец, в самых лучших традициях, добавьте также поле изображения,
которое дублирует текущий выбранный цвет, а также поле, которое показывает код, который
надо сгенерировать для реализации этого цвета в цветовой структуре.
Рисунок 13.10 дает представление о пользовательском элементе управления после того, как
все эти элементы управления были размещены в визуальном конструкторе.
Обработка движений по палитре
Теперь, когда пользовательский интерфейс уже есть, мы можем сконцентрироваться на
коде. Сначала вы можете добавить обработчик события для движений мыши по полю
изображения палитры. При помощи обработчика события MouseMove вы можете мгновенно
обновить ваши метки и второе поле изображения (при движении указателя мыши по
изображению палитры):
public PaletteControl()
{
InitializeComponent();
this.pictureBoxPalette.MouseMove +=
new MouseEventHandler(pictureBoxPalette_MouseMove);
this.pictureBoxPalette.Cursor = System.Windows.Forms.Cursors.Cross;
}
void pictureBoxPalette_MouseMove(object sender, MouseEventArgs e)
{
// Получить цвет под текущим положением указателя мыши
Color color = GetPointColor(e.X, e.Y);
// Обновить метки RGB и второе поле изображения при помощи полученного цвета
DisplayColor(color);
// Сгенерировать наш код на языке Visual Basic или С# для цветовой структуры
SetCode(color, _generateVB);
}
Свойства генерирования кода
Класс PaletteControl предоставляет два свойства: Code — это строковое свойство,
которое содержит код цветовой структуры, сгенерированный при щелчке по палитре, а
GenerateVB— это свойство булева типа, которое указывает, какой код должен
генерировать элемент управления — на языке Visual Basic (GenerateVB = true) или на языке С#
(GenerateVB = false). Далее приведены объявления полей и свойств для этих двух
свойств:
string _code = "";
public string Code
Глава 13. Надстройки и мастера
463
{
get { return _code; }
}
bool _generateVB = false;
public bool GenerateVB
{
get { return _generateVB; }
}
Реализация вспомогательных процедур
Когда указатель мыши двигается по полю изображения, вам нужно перехватывать
компоненты цвета точек, находящихся непосредственно под курсором (GetPointColor),
обновлять метки и второе поле изображения (чтобы они отражали этот цвет— DisplayColor),
а затем генерировать код для реализации соответствующей цветовой структуры (SetCode).
Далее даны реализации этих процедур:
/// <suramary>
/// Возвращает структуру Color, представляющую цвет пиксела
/// в указанных координатах х и у.
/// </suramary>
/// <param name="x"></param>
/// <param name="y"x/param>
/// <returns>OrpyKTypa Color</returns>
private Color GetPointColor(int x, int y)
{
// Получить растровое изображение из поля изображения палитры
Bitmap bmp = (Bitmap)pictureBoxPalette.Image;
// Использовать GetPixel для получения цветовой структуры
// для текущей позиции указателя мыши
Color color = bmp.GetPixel(x, у);
// Вернуть цветовую структуру щ
return color;
}
/// <summary>
/// Показывает значения RGB values для данного цвета.
/// Также настраивает цвет фона второго поля изображения.
/// </summary>
/// <param пате="со1ог">Цвет для отображения</рагат>
private void DisplayColor(Color color)
{
// Взять значения RGB из цветовой структуры
464
Часть IV. Расширенные возможности Visual Studio
string R = color.R.ToString();
string G = color.G.ToStringO;
string В = color.B.ToStringO;
// Настроить показ текущего цвета во втором поле изображения
this.pictureBoxColor.BackColor = color;
// Показать значения RGB в метках
this.labelRValue.Text = R;
this.labelGValue.Text = G;
this.labelBValue.Text = B;
}
/// <summary>
/// Генерирует строку, представляющую код на языке С# или VB, необходимую
/// для создания экземпляра структуры Color, который соответствует
/// переданной внутрь структуре Color. Эта строка затем присваивается
/// полю _code данного пользовательского элемента управления.
/// </summary>
/// <param пате="со1ог">Цвет для представления в виде кода.</рагат>
/// <param name="isVB">ByneB флаг, указывающий используемый язык:
/// false обозначет С#, true обозначает VB</param>
private void SetCode(Color color, bool isVB)
{
// Прочитать настройки надстройки из реестра
SetPropFromReg();
string code = "";
if (isVB)
{
code = "Dim color As Color = ";
}
• else
{
code = "Color color = ";
}
code = code + "Color.FromArgb(" + color.R.ToStringO + ", " +
color.G.ToStringO + ", " + color.B.ToStringO + ");";
_code = code;
this.labelCode.Text = _code;
}
Глава 13. Надстройки и мастера
465
/// <suiranary>
/// Читает элемент реестра и настраивает соответствующим образом
/// выходные поля языка.
/// </summary>
private void SetPropFroraRegO
{
RegistryKey regKey =
Registry.CurrentUser.OpenSubKey(@"Software\Contoso\Addins\ColorPalette");
string codeVal = (string)regKey.GetValue("Language", "CSharp");
if (codeVal == "CSharp")
{
_generateVB = false;
}
else
{
_generateVB = true;
}
Сообщение о выборе цвета
Поскольку вам понадобится для элемента управления некий способ сообщения о том, что
пользователь выбрал цвет (например, щелкнул по палитре), то вы также определяете
событие пользовательского класса управления, которое происходит каждый раз, когда на
изображении палитры регистрируется щелчок мыцш:
public event EventHandler ColorSelected;
protected virtual void OnColorSelected(EventArgs e)
{
if (ColorSelected != null)
ColorSelected(this, e);
}
private void pictureBoxPalette_Click(object sender, EventArgs e)
{
OnColorSelected(new EventArgs());
}
Совет
Для изоляции и тестирования пользовательского элемента управления вы можете
добавить в решение проект типа Windows Forms и встроить элемент управления в
форму Windows для его тестирования. Просто перетащите элемент управления на
форму и запустите проект формы.
466
Часть IV. Расширенные возможности Visual Studio
Теперь, когда у вас есть пользовательский элемент управления, вы готовы перейти ко
второй стадии разработки надстройки: подключению этого элемента управления к
интегрированной среде разработки.
Завершение разработки класса Connect
Класс Connect уже имеет основной код надстройки; теперь настало время вернуться к нему
и добавить код для приведения в действие пользовательского элемента управления. Вы
хотите, чтобы надстройка без проблем интегрировалась в среду разработки; для этого вы
можете использовать окно инструмента (для отображения уже созданного пользовательского
элемента управления).
Припоминая обсуждение объектной модели расширяемости, вы знаете, что коллекция
windows2 имеет метод CreateToolwindow2, который позволяет вам создавать ваши
собственные нестандартные окна инструментов.
Примечание
Предыдущие версии Visual Studio требовали от вас создания промежуточного
элемента управления (при помощи языка C++), который обеспечивал бы показ элемента
управления в окне инструмента. Окно инструмента (в свою очередь) было бы хостом
для промежуточного элемента. Начиная с Visual Studio 2005 (при наличии
улучшенного метода windows2.CreateToolwindow2), это стало ненужным. Теперь вы можете
непосредственно обеспечивать работу пользовательского элемента управления в
окне инструмента.
Вот прототип метода:
Window CreateToolWindow2 (
Addln Addin,
string Assembly,
string Class,
string Caption,
string GuidPosition,
[InAttribute] out Object ControlObject
)
Отображение окна инструмента и пользовательского элемента управления
Поскольку вы хотите, чтобы окно инструмента создавалось и отображалось после загрузки
надстройки, то вызов метода CreateToolwindow2 надо поместить в метод
Connect.OnConnection. Сначала вы настраиваете локальный объект, чтобы он указывал
на коллекцию dte . Tooiwindows:
// Коллекция DTE.ToolWindows
Windows2 toolWindows= (Windows2)_applicationObj ect.Windows ;
Затем вам нужен объект, в котором будет храниться ссылка на создаваемое вами окно
инструмента:
// Объект для ссылки на создаваемое окно инструмента
Window2 toolWindow;
Глава 13. Надстройки и мастера
467
И наконец, вам нужно создать параметры, необходимые для метода CreateToolwindow2:
// Объект указателя места заполнения; в конечном итоге будет ссылаться
//на пользовательский элемент управления
object paletteObject = null;
// Данный раздел указывает путь и имя класса для элемента управления
// "палитра", который будет находиться в новом окне инструмента;
// нам нужно также указать его заголовок и уникальный GUID.
Assembly asm = System. Reflection.Assembly.GetExecutingAssembly();
string assemblyPath = asm.Location;
string className = "ColorSelectorAddln.PaletteControl";
string guid = "{62175059-FD7E-407a-9EF3-5D07F2B704E8}";
string caption = "Palette Color Picker";
Обратите внимание, что мы жестко закодировали идентификатор GLJID для передачи в
метод CreateToolwindow2. Поскольку наш пользовательский элемент управления — это
элемент управления на управляемом коде и его работа будет обеспечиваться "родным" СОМ-
компонентом (все окна инструментов в Visual Studio основаны на СОМ), то инфраструктуре
надстройки нужен какой-то способ установить интерфейс вызова для элемента управления.
Это делается при помощи использования параметра GUID. Нам также будет нужно
"пометить" пользовательский элемент управления идентификатором GUID (посредством
размещения атрибута Guid непосредственно перед объявлением нашего класса
PaletteControl):
namespace ColorSelectorAddln
{
[Guid(2175059-FD7E-407a-9EF3-5D07F2B704E8")]
public partial class PaletteControl : UserControl
{ ... }
} -
Вы можете использовать Visual Studio для генерирования вашего GUID (при помощи
выбора меню Tools | Create GUID | Registry Format). Вы можете затем напрямую скопировать и
вставить это в ваше окно с кодом.
Теперь вы всего лишь в нескольких строках кода от создания и отображения окна
инструмента:
// Создать новое окно инструмента с вложенным пользовательским
// элементом управления'
toolWindow = (Window2)toolWindows.CreateToolWindow2(_addlnlnstance,
assemblyPath, className, caption, guid, ref paletteObject);
// Если окно инструмента было создано успешно, сделать его видимым
if (toolWindow != null)
{
toolWindow.Visible = true;
}
468
Часть IV. Расширенные возможности Visual Studio
Перехват событий пользовательских элементов управления '
Надстройке не хватает только одного: вам нужно реагировать на щелчок пользователя по
палитре. Для этого надо взять сгенерированный код (доступный через свойство
PaletteControl.Code) и вставить его в текущий активный документ. При этом есть две
задачи. Сначала вам нужно написать обработчик события, для работы с событием щелчка,
генерируемым объектом PaletteControl. Но для этого вам нужна ссылка на
пользовательский элемент управления. Это— цель объекта paletteObject, который вы передаете
как последний параметр методу CreateToolwindow2. Поскольку он передается по ссылке,
то (после завершения метода и возвращения из него) он будет содержать экземпляр
PaletteControl. Затем вы можете привести тип этого объекта к типу PaletteControl,
присвоить его полю внутри класса Connect и прикрепить обработчик события к событию
PaletteControl.ColorSelected:
// Получить ссылку на наш объект пользовательского элемента управления
_paletteControl = (PaletteControl)paletteObject;
// Подключить обработчик ошибки для события PaletteControl.ColorSelected
_paletteControl.ColorSelected +=
new System.EventHandler(paletteControll_ColorSelected) ;
Совет
Получить ссылку на пользовательский элемент управления может быть не очень
просто. Если пользовательский элемент управления не является частью того же самого
проекта, что и класс вашей надстройки, то CreateToolwindow2 возвратит только
значение null (вместо ссылки на пользовательский элемент управления). Если вы
хотите разработать ваш пользовательский элемент управления вне проекта
надстройки, то вы должны убедиться, что пользовательский элемент управления
полностью атрибутирован и видим для вызывающих СОМ-компонентов. Подробности того,
как это делается, см. в теме "Exposing .NET Framework Components to COM"
документации MSDN.
Вставка сгенерированного кода
Вы реагируете на событие ColorSelected посредством получения содержимого свойства
PaletteControl.Code и записи его в текущий активный документ. Для этого вам опять
пригодятся знания по объектной модели расширяемости, полученные в предыдущей главе.
Класс DTE.ActiveDocument будет содержать ссылку на текущий активный документ. При
помощи использования точки редактирования вы можете легко вписать текст в текстовый
документ:
TextDocument currDoc =
(TextDocument)_applicationObject.ActiveDocument.Object("") ;
EditPoint2 ep = (EditPoint2) currDoc.Selection.ActivePoint.CreateEditPoint () ;
ep.Insert(jpaletteControl.Code);
ep.InsertNewLineA);
Глава 13. Надстройки и мастера
469
Предоставление настроек надстройки
Последний шаг— это сделать конфигурируемым язык надстройки. Пользователи должны
иметь возможность указать, какой код они хотят получить из надстройки: на языке С# или
на языке Visual Basic. Для этого вам нужно иметь пользовательский интерфейс в виде
страницы Options (которая выведет диалоговое окно Options), а также место для сохранения
выбранных опций.
Создание пользовательского интерфейса страницы Option
Надстройки могут ссылаться на страницу Options, которая будет появляться в диалоговом
окне Tools Options. Точно так же, как вы делали для пользовательского окна инструментов,
вы создадите пользовательский элемент управления для реализации логики и
пользовательского интерфейса страницы Options.
Начните с добавления нового пользовательского элемента управления в существующий
проект надстройки. Для нашего примера назовите этот класс PaletteControlOptionPage.
Добавление метки и двух переключателей позволит вам указать языковое предпочтение для
надстройки палитры. На рис. 13.11 показана панель конструирования страницы Options.
file Edit View Project guild Qebug Djtt Fgrmat loots Test Window Це»р
Pa4rtt«ControK>ptio«Pagexi [Design) ^
Coda oiiptl language*
C> Vtaud Век .
ij at о
£ УШН
* && s|.
^s^i c j
▼ X
1
i
j
j
•i
i
..
j
i
i
SeiubonLcfL^ * X j
w i"H JJ *
^3 Solution 'Color' * I
■-. 3 ColorSeledi j
'±* ^ Referenc, 1
"^J Asiemfal i
d^ ColorSet! 1
jfr ColorSeti 1
» >J3j Commai. 1
-jy Conned 1
£► В PiletteC „ 1
?fop«rti«s '«r"$ Xl
PaJetteControtOptk ^ I
*МЙ]Ё0* -J
И (Apptical о 1
Ш (DataBin \ 9
(Name) PalettK Я
Acces^ib 1
Accessib w I
(AppScationSettings) 1
Mips property 1
settings tc en applto„ 1
hem(s) Saved
Рис. 13.11. Пользовательский элемент управления страницы Options
Пользовательский элемент управления для страницы Options должен наследовать от
IDTToolsOptionsPage:
public partial class PaletteControlOptionPage : UserControl,
IDTToolsOptionsPage
{
470
Часть IV. Расширенные возможности Visual Studio
public PaletteControlOptionPageO
InitializeComponent();
}
Интерфейс iDTToolsOptionsPage определяет пять методов (табл. 13.5).
Таблица 13.5. Члены IDTToolsOptionsPage
Член
GetProperties
OnAfterCreated
OnCancel
OnHelp
OnOK
Описание
Возвращает объект свойств в ответ на вызов dte . Properties для этой
страницы Options
Происходит после того, как страница Tools Options создается
в первый раз
Происходит тогда, когда пользователь щелкает по кнопке Cancel
в диалоговом окне Tools Options
Происходит тогда, когда пользователь щелкает по кнопке Help в
диалоговом окне Tools Options
Происходит тогда, когда пользователь щелкает по кнопке ОК в
диалоговом окне Tools Options
0й"")
frropertl«$Qu*fT€dJ
iSisiJ
Get Properties
User Ok*» Page
—(Cww*l)-*l
OnCw**t
<OK)
Рис. 13.12. Последовательность действий страницы Tools Options
Эти методы вызываются по мере изменения нормальных состояний страницы Options
(рис. 13.12).
Размещая код внутри этих методов, вы можете считывать и сохранять любые изменения
конфигурации, которые пользователь делает на странице Options. В нашем случае все
можно сделать просто: надо прочитать значение из реестра (в методе OnAfterCreated) и
обновить этот же самый элемент в методе Опок:
public void OnAfterCreated(DTE DTEObject)
{
Глава 13. Надстройки и мастера 471
II Прочитать из реестра текущее значение.
// Учтите: здесь следовало бы добавить код на случай непредвиденных
// обстоятельств — для создания ключа реестра в случае его отсутствия,
// обработки непредвиденных значений, исключений и т. д.
RegistryKey regKey =
Registry.CurrentUser.OpenSubKey(@"Software\Contoso\Addins\ColorPalette");
string codeVal = (string)regKey.GetValue("Language", "CSharp");
if (codeVal == "CSharp")
{
this.radioButtonCSharp.Checked = true;
this.radioButtonVB.Checked = false;
}
else
{
this.radioButtonCSharp.Checked = true;
this.radioButtonVB.Checked = false;
}
}
public void OnOK()
{
string codeValue = "CSharp"; // значение по умолчанию f
if (this.radioButtonVB.Checked) '
{
codeValue = "VB";
}
// Обновить реестр новым значением
RegistryKey regKey =
Registry.CurrentUser.OpenSubKey(@"Software\Contoso\Addins\ColorPalette");
regKey.SetValue("Language", codeVal);
}
Примечание
Вы сами должны решить, где и как сохранить настройки вашей надстройки. Одно из
вполне логичных мест — это реестр. Вы также можете сохранить ваши настройки в
XML-файле, который будет размещаться вместе с вашими двоичными файлами.
Регистрация страницы Options
Механизм регистрации страницы Options такой же, как и для надстройки: используется
addin-файл. При помощи добавления нескольких строк кода XML вы можете указать Visual
472
Часть IV. Расширенные возможности Visual Studio
Studio, что в пользовательской надстройке существует страница Options. Вы можете
сделать это посредством редактирования addin-файла прямо в Visual Studio (поскольку он
автоматически создается как часть проекта).
Для включения необходимой регистрационной информации в виде XML отредактируйте addin-
файл и поместите в него следующий XML-код (перед закрывающим тегом </extensibility>):
<ToolsOptionsPage>
<Category Name="Color Palette">
<SubCategory Name="Code Generation">
<Assembly>C:\Users\lpowers\My Documents\Visual Studio 2008\Projects\
PaletteControlAddIn\PaletteControlAddIn\bin\PaletteControlAddIn.dll</Assembly>
<FullClassName>PaletteControlAddIn.PaletteControlOptionPage </FullClassName>
</SubCategory>
</Category>
</ToolsOptionsPage>
Для указания названия категории опций (отображаемой в диалоговом окне Tools Options)
нужно использовать тег Category. Тег Subcategory указывает подузел под этой
категорией. Тег Assembly дает путь к dll-файлу надстройки, а тег FullciassName содержит полное
имя класса надстройки.
Теперь надстройка полностью работоспособна. Вы можете откомпилировать проект и затем
немедленно загрузить надстройку при помощи менеджера Add-in Manager. На рис. 13.13
показана надстройка в действии, а полный код для классов Connect, PaletteControl и
PaletteControlOptionPage (именно в таком порядке) приведен в листингах 13.2—13.4.
Полный исходный код этой надстройки можно скачать с сайта SAMS (informit.com/sams).
gft ContosoCommcnFramevwir - Microsoft Visual Studio (AdmirtHtMtor}
IfrLiM
file £dtt Vjew Eroject guild Qtbxtg Djt» loots Tr$t Jflfmdow tfelp
^р-_У"к^У^#(^ t ^| "***** *»~ '-*>> ► Debu9 * Ml3,ed P'«tfofn«
* X Г» a*>(IiirjiH^*Г2Г^У5Г*
using 5vscorn;
l-j narce space Concoao. Fx. C<
public class ^2 v*f?i^
{
#xc<jicn regl
private string лаке;
/// <'*" JTW«%. <j .>
protected arrinjr Mane
t
get { teturi same; J
set { nase - value; }
* X ' SofuUon Btplorer - AfcWiitttur... ▼ a X~
% *jje Jfl 23 ^..^
~~4 ^ Solution 'CenlewCommofiFwne *
ti ^i Architecture Models \„l
U_| ContQioAppDiagram »d
_ Cortto«LogtcilDiUcenter
__] CorrtosoSyrtemDregrarrLsc
t-< ^ Class Libraries T
G 159 ^^П
В 30
Color odor * Color FromAebO. 1», 30;
Reedy
Рис. 13.13. Надстройка Color Selector
Глава 13. Надстройки и мастера
473
"Листинг 13.2. Класс connect
using System;
using Extensibility;
using EnvDTE;
using EnvDTE80;
using Microsoft.VisualStudio.CommandBars;
using System.Resources;
using System.Reflection;
using System.Globalization;
using System.Windows.Forms;
namespace ColorSelectorAddln
{
/// <summary>06beKT для реализации надстройки.</summary>
/// <seealso class='IDTExtensibility2' />
public class Connect': IDTExtensibility2, IDTCommandTarget
{
#region Fields
private DTE2 _applicationObject;
private Addln _addlnlnstance;
private PaletteControl _paletteControl;
#endregion
/// <summary>Реализует конструктор для объекта надстройки.
/// Разместите ваш инициализационный код в этом методе.</summary>
public Connect()
{
}
tregion Events and Event Handlers
private void paletteControll_ColorSelected(object sender, EventArgs e)
{
try
{
TextDocument currDoc =
(TextDocument)_applicationObject.ActiveDocument.Object("");
EditPoint2 ep = (EditPoint2)
currDoc.Selection.ActivePoint.CreateEditPoint();
474
Часть IV. Расширенные возможности Visual Studio
ер.Insert(jpaletteControl.Code);
ер.InsertNewLineA);
}
catch (Exception ex)
{
MessageBox.Show("Exception caught: " + ex.ToString());
}
}
#endregion
/// <summary>PeajiM3yeT метод OnConnection интерфейса IDTExtensibility2.
/// Получает уведомление о том, что надстройка
/// загружается.</summary>
/// <param term='application'Жорневой объект хост-приложения.
///</param>
/// <param term='connectMode'>Описывает, как загружается
/// надстройкам/pa r am>
/// <param term=,addlnlnst'>Объект, представляющий эту
/// надстройку.</рагат>
/// <seealso class=,IDTExtensibility2' />
public void OnConnection(object application, ext_ConnectMode connectMode,
object addlnlnst, ref Array custom)
{
_applicationObject = (DTE2)application;
_addlnInstance = (Addln)addlnlnst;;
if (connectMode == ext_ConnectMode.ext_cm_UISetup)•
{
object []contextGUIDS = new object[] { };
Commands2 commands = (Commands2)_application0bject.Commands;
string toolsMenuName;
try
{
string resourceName;
ResourceManager resourceManager =
new ResourceManager("ColorSelectorAddln.CommandBar",
Assembly.GetExecutingAssembly());
Culturelnfo culturelnfo =
Глава 13. Надстройки и мастера
475
new Culturelnfo(_applicationObject.LocalelD);
if (culturelnfo.TwoLetterlSOLanguageName == "zh")
{
System.Globalization.Culturelnfo parentCulturelnfo =
culturelnfo.Parent;
resourceName = String.Concat(parentCulturelnfo.Name, "Tools");
}
else
{
resourceName =
String.Concat(culturelnfo.TwoLetterlSOLanguageName,"Tools");
}
toolsMenuName = resourceManager.GetString(resourceName);
}
catch
{
//Мы пытались отыскать локализованную версию слова Tools,
// но не нашли. По умолчанию принимаем слово en-US word,
// которое, возможно, будет работать для текущей культуры.
toolsMenuName = "Tools";
}
// Поместить команду в меню Tools.
// Найти панель команд MenuBar, которая является панелью команд
// верхнего уровня, содержащей все пункты главного меню:
Microsoft.VisualStudio.CommandBars.CommandBar
menuBarCommandBar =
((Microsoft.VisualStudio.CommandBars.CommandBars)
_ applicationObject.CommandBars)["MenuBar"];
// Найти панель команд Tools в панели команд MenuBar:
CommandBarControl toolsControl =
menuBarCommandBar.Controls[toolsMenuName];
CommandBarPopup toolsPopup = (CommandBarPopup)toolsControl;
// Этот блок try/catch block можно продублировать, если вы хотите
// добавить еще несколько команд в обработку вашей надстройкой.
// Просто не забудьте обновить метод QueryStatus/Exec
//и включить названия новых команд.
try
{
// Добавить команду в коллекцию Commands:
476
i
Часть IV. Расширенные возможности Visual Studio
Command command = commands.AddNamedCommand2 (_addlnlnstance,
"ColorSelectorAddln", "ColorSelectorAddln",
"Executes the command for ColorSelectorAddln", true, 59,
ref contextGUIDS,
(int)vsCommandstatus.vsCommandStatusSupported+
(int)vsCommandStatus.vsCommandStatusEnabled,
(int)vsCommandstуle.vsCommandStylePictAndText,
vsCommandControlType.vsCommandControlTypeButton);
// Добавить элемент управления для команды в меню Tools:
if((command != null) && (toolsPopup != null))
{
сommand.AddControl(toolsPopup.CommandBar, 1);
}
}
catch(System.ArgumentException) ,
{
// Если мы попали сюда, то, вероятно, исключение произошло потому,
// что команда с таким именем уже существует. Если это так, то
// нет необходимости повторно создавать команду, и мы можем просто
// игнорировать исключение.
}
}
#region Create Tool Window
// Коллекция DTE.ToolWindows
Windows2 windows = (Windows2)_application0bject.Windows;
// Объект указателя места заполнения; в конечном итоге ссылается
//на пользовательский элемент управления, находящийся
// в пользовательском элементе управления,
object paletteObject = null;
// Этот раздел указывает путь и имя класса для элемента управления
// "палитра", который будет находиться в новом окне инструмента;
// нам нужно также указать его заголовок и уникальный GUID.
Window toolWindow;
Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();
string assemblyPath = asm.Location;
string className = "ColorSelectorAddln.PaletteControl";
string guid = "{62175059-FD7E-407a-9EF3-5D07F2B704E8}";
string caption = "Color Selector";
Глава 13. Надстройки и мастера
477
try
{
// Создать новое окно инструмента и вставить в него
// пользовательский элемент управления.
toolWindow = windows.CreateToolWindow2(_addlnlnstance,
assemblyPath, className, caption, guid, ref paletteObject);
// Если окно инструмента было создано успешно, сделать его видимым
if (_toolWindow != null)
{
_toolWindow.Visible = true;
}
// Получить ссылку на объект пользовательского элемента управления
jpaletteControl = (PaletteControl)paletteObject;
// Подключить обработчик события PaletteControl.ColorSelected
jpaletteControl.ColorSelected +=
new System.EventHandler(palet.teControll_ColorSelected);
}
catch (Exception ex)
{
MessageBox.Show("Exception caught: " + ex.ToString());
}
#endregion
>
/// <summary>Реализует метод OnDisconnection интерфейса
/// IDTExtensibility2. Получает уведомление, что
/// надстройка выгружается.</summary>
/// <param term=fdisconnectMode'>OraicbiBaeT, как надстройка
/// выгружается.</param>
/// <param term-1custom'>Массив специфичных для
/// хост-приложения параметров.</param>
/// <seealso class=,IDTExtensibility2' />
public void OnDisconnection(ext_DisconnectMode disconnectMode,
ref Array custom)
{
i
478
Часть IV. Расширенные возможности Visual Studio
/// <зиттагу>Реализует метод OnAddlnsUpdate интерфейса
/// IDTExtensibility2. Получает уведомление, когда
/// изменяется коллекция надстроек.</suramarу>
/// <param term='custom'>Массив специфичных для
/// хост-приложения параметров.</param>
/// <seealso class='IDTExtensibility2' />
public void OnAddlnsUpdate(ref Array custom)
{
}
/// <зиттагу>Реализует метод OnStartupComplete интерфейса
/// IDTExtensibility2. Получает уведомление, что хост-приложение
/// загрузку закончило.</summary>
/// <param term=fcustom*>Массив специфичных для
/// хост-приложения параметров.</param>
/// <seealso class=fIDTExtensibility2f />
public void OnStartupComplete(ref Array custom)
{
}
/// <зиттагу>Реализует метод OnBeginShutdown интерфейса IDTExtensibility2.
/// Получает уведомление, что хост-приложение выгружается.</summary>
/// <param term='custom'>Массив специфичных для
/// хост-приложения параметров.</param>
/// <seealso class='IDTExtensibility2' />
public void OnBeginShutdown(ref Array custom)
{
}
/// <зиттагу>Реализует метод QueryStatus интерфейса IDTCommandTarget.
/// Вызывается тогда, когда обновляется доступность команды</зиттагу>
/// <param term='commandName'>Ha3BaHne команды, состояние
/// которой надо определить.</param>
/// <param term='neededText'>Текст, который необходим для команды.</рагат>
/// <param term='status'>Состояние команды в пользовательском
/// интерфейсе.</рагат>
/// <param term='commandText'>Текст, необходимый для
/// параметра neededText.</param>
/// <seealso class='Exec' />
public void QueryStatus(string commandName,
vsCommandStatusTextWanted neededText, ref vsCommandstatus status,
ref object commandText)
Глава 13. Надстройки и мастера
479
{
if(neededText == vsCoramandStatusTextWanted.vsCommandstatusTextWantedNone)
{
if(commandName == "ColorSelectorAddln.Connect.ColorSelectorAddln")
{
status = (vsCommandStatus)
vsCommandstatus.vsCommandStatusSupported
IvsCommandStatus.vsCommandStatusEnabled;
return;
}
}
}
/// <зиттагу>Реализует метод Exec интерфейса IDTCommandTarget.
/// Вызывается при запуске команды.</summary>
/// <param term='commandName'>Имя команды, которую надо
/// выполнить.</param>
/// <param term='executeOption'>Описывает, как команда
/// должна выполняться.</рагат>
/// <param tenr^'varln'MIapaMeTpbi, передаваемые от вызывающей стороны
/// обработчику команды.</param>
/// <param term=?varOut ^Параметры, передаваемые от обработчика команды
/// вызывающей стороне.</param>
/// <param term='handled'>Информирует вызывающую сторону о том,
/// была ли команда обработана.</рагат>
/// <seealso class='Exec' />
public void Exec(string commandName, vsCommandExecDption executeOption,
ref object varln, ref object varOut, ref bool handled)
{
handled = false;
if (executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
{
if (commandName == "ColorSelectorAddln.Connect.ColorSelectorAddln")
{
handled = true;
return;
}
}
}
}
}
480 Часть IV. Расширенные возможности Visual Studio
\ Листинг 1&2L Класс £al*tt»CoiitroX j
using System;
using System.Collections.Generic-
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32;
namespace ColorSelectorAddln
{
[Guid(2175059-FD7E-407a-9EF3-5D07F2B704E8") ]
public partial class PaletteControl : UserControl
{
#region Fields
string _code = "";
bool _generateVB = false;
#endregion
#region Properties
public string Code
{
get { return _code; }
}
public bool GenerateVB
{
get { return _generateVB; }
}
#endregion
#region Ctor(s)
public PaletteControl()
{
InitializeComponent();
this.pictureBoxPalette.MouseMove += new
Глава 13. Надстройки и мастера
481
MouseEventHandler(pictureBoxPalette_MouseMove);
this.pictureBoxPalette.Cursor = System.Windows.Forms.Cursors.Cross;
}
#endregion
tregion Event Handlers and Delegates
void pictureBoxPalette_MouseMove(object sender, MouseEventArgs e)
{
// Получить цвет под текущим положением указателя мыши
Color color = GetPointColor(e.X, e.Y);
// Обновить метки RGB и второе поле изображения
// при помощи полученного цвета
DisplayColor(color);
// Сгенерировать наш код (на языке VB или С#) для структуры Color
SetCode(color, _generateVB);
}
public event EventHandler ColorSelected;
protected virtual void OnColorSelected(EventArgs e)
{
if (ColorSelected != null)
ColorSelected(this, e);
}
private void pictureBoxPalette_Click(object sender, EventArgs e)
{
OnColorSelected(new EventArgs());
}
#endregion
tregion Private Routines
/// <summary>
/// Возвращает структуру Color, представляющую цвет пиксела
/// в указанных координатах х и у.
/// </summary>
/// <param name="x"x/param>
482
Часть IV. Расширенные возможности Visual Studio
/// <param name="y"x/param>
/// <returns>Структура Color</returns>
private Color GetPointColor(int x, int y)
{
// Получить растровое изображение из поля изображения палитры
Bitmap bmp = (Bitmap)pictureBoxPalette..Image;
// Использовать GetPixel для получения цветовой структуры
// для текущего положения указателя
Color color = bmp.GetPixel(х, у);
// Вернуть цветовую структуру
return color;
}
/// <summary>
/// Отображает значения RGB для заданного цвета. Также настраивает
/// цвет фона второго поля изображения.</summary>
/// <param пате="со1огм>Цвет для отображения</рагат>
private void DisplayColor(Color color)
{
// Извлечь значения RGB из цветовой структуры
string R = color.R.ToString();
string G = color.G.ToString() ;
string В = color.В.ToString();
// Настроить наше второе поле изображения на показ текущего цвета
this.pictureBoxColor.BackColor = color;
// Показать значения RGB в метках
this.labelRValue.Text = R;
this.labelGValue.Text = G;
this.labelBValue.Text = B;
}
/// <summary>
/// Генерирует строку, представляющую код на языке С# или VB,
/// необходимый для создания структуры Color, которая соответствует
/// переданной внутрь структуре Color. Эта строка затем присваивается
/// полю _code данного пользовательского элемента управления.
/// </summary>
/// <param name="color">Цвет для представления в коде.</рагат>
/// <рагат пате=зУВ,,>Булев флаг, указывающий используемый язык:
Глава 13. Надстройки и мастера
483
/// false означает язык С#, a true означает VB</param>
private void SetCode(Color color, bool isVB)
{
// Прочитать настройки надстройки из реестра
SetPropFromReg();
string code = "";
if (isVB)
{
code = "Dim color As Color = ";
}
else
{
code = "Color color = ";
}
code = code + "Color.FromArgb(" + color.R.ToString() + ", " +
color.G.ToStringO + ", " + color.B.ToString() + ");";
_code = code;
this.labelCode.Text = _code;
}
/// <summary>
/// Читает элемент реестра и настраивает соответствующим образом
/// выходные поля языка.
/// </summary>
private void SetPropFromReg()
{
try
{
RegistryKey regKey =
Registry.CurrentUser.OpenSubKey(@"Software\Contoso\Addins\ColorPalette,f);
string codeVal = (string)regKey.GetValue("Language", "CSharp");
if (codeVal == "CSharp")
{
_generateVB = false;
}
else
{
_generateVB = true;
484 Часть IV. Расширенные возможности Visual Studio
}
}
catch (Exception ex)
{
// Ошибка чтения из реестра; принимаем по умолчанию язык С#
_generateVB = false;
}
}
#endregion
}
}
using System;
using System.Collections.Generic-
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using EnvDTE;
using Microsoft.Win32;
namespace ColorSelectorAddln
{
public partial class PaletteControlOptionPage : UserControl,
IDTToolsOptionsPage
{
public PaletteControlOptionPage()
{
InitializeComponent();
}
#region IDTToolsOptionsPage Members
public void GetProperties(ref object PropertiesObject)
{
throw new NotlmplementedException();
}
public void OnAfterCreated(DTE DTEObject)
{
"лава 13. Надстройки и мастера
485
// Читаем наше текущее значение из регистра.
// Учтите: здесь следовало бы добавить код на случай непредвиденных
// обстоятельств — для создания ключа реестра в случае его
// отсутствия, обработки непредвиденных значений, исключений и т. д.
RegistryKey regKey = Registry.CurrentUser.OpenSubKey _
(@"Software\Contoso\Addins\ColorPalette");
string codeVal = (string)regKey.GetValue("Language", "CSharp");
if (codeVal == "CSharp")
{
this.radioButtonCSharp.Checked = true;
this.radioButtonVB.Checked = false;
}
else
{
this.radioButtonCSharp.Checked = true;
this.radioButtonVB.Checked = false;
}
}
public void OnCancel()
{
throw new NotlmplementedException();
}
public void OnHelpO
{
throw new NotlmplementedException();
}
public void OnOKO
{
string codeValue = "CSharp"; // значение по умолчанию
if (this.radioButtonVB.Checked)
{
codeValue = "VB";
}
// Обновить регистр новой настройкой
RegistryKey regKey = Registry.CurrentUser.OpenSubKey _
(@"Software\Contoso\Addins\ColorPalette");
486
Часть IV Расширенные возможности Visual Studio
reg'Key. SetVa ■ je ("Language", codeVal ue) ;
i
#endreaion
Примечание
Если у вас есть надстройки, которые были написаны для предыдущей версии Visual
Studio, то вам понадобится произвести некоторые изменения в их исходном коде (для
полной миграции их функциональных возможностей в Visual Studio 2008) Подробно
шаги такой миграции описаны в документации MSDN по Visual Studio Ищите статью
"How to Update Visual Studio 2005 Add-ins to Visual Studio 2008"
Создание мастера для Visual Studio
Visual Studio интенсивно использует разные мастера для руководства действиями
разработчика при выполнении различных задач. Мастер Add-in Wizard (который мы обсудили в
предыдущих разделах) — это пример одного из мастеров новых проектов New Project Wizard
(он запускается тогда, когда вы пытаетесь создать новый проект надстройки). Существуют
также мастера для добавления в проекты новых элементов Вы можеге модифицировать
существующие мастера для добавления элементов (Project | Add New Item) или создать
свой мастер (вместе с его собственным пользовательским интерфейсом)
В следующих разделах мы сосредоточимся на том, чтобы разобраться в мастерах, а также на
создании пользовательскою мастера Add New Item Wizard
Изучение структуры мастера
Каждый мастер состоит из двух основных компонентов- класса, который содержит код (и
пользовательский интерфейс) для мастера и vsz-файла, который предоставляет информацию
о мастере для Visual Studio
Интерфейс IDTWizard
Для подключения к движку мастеров Visual Studio ваш класс Wizard должен реализовать
интерфейс ErvDTF.. IDTWizard Этот интерфейс определяет единственный метод
(Execute), который вызывается средой Visual Studio при каждом запуске мастера. Вот
прототип для метода IDTWizard.Execute (на языке С#)
void Execute (
Object Application,
inI LwndOwner,
ret Object[] Ccntex-Pdrams,
ref Object IJ CustorrParams,
cut wizardRcsu_t retval
Глава 13. Надстройки и мастера
487
Передаваемые в метод Execute аргументы используются для связи мастера со средой
Visual Studio и для передачи мастеру необходимых данных:
О Application — экземпляр DTE для интегрированной среды Visual Studio;
□ hwndOwner — дескриптор родительского окна; это окно будет родителем для всех
элементов пользовательского интерфейса, созданных мастером;
О Context Pa rams — для мастеров New Project | Add New Item используется массив
объектов для передачи информации о типе мастера (который был запущен), а также
различных данных, необходимых для работы мастера (таких как название проекта и
каталог для инсталляции);
□ CustomParams — массив объектов, используемый для любых параметров, которые вы
определили для вашего мастера;
□ wizardResult — значение перечисления wizardResult, которое указывает результат
работы мастера.
Содержимое параметра ContextParams будет изменяться в зависимости от типа мастера.
Например, для мастера New Project Wizard третье значение в массиве ContextParams
представляет собой то местоположение, куда будет сохранен файл проекта (называемое
LocalDirectory). Но для мастера Add Item Wizard третье значение массива является
указателем на коллекцию Project Items. В табл. 13.6 показано соответствие различных элементов
массива трем разным типам мастеров.
Таблица 13.6. Значения ContextParams
Индекс
0
1
2
3
4
5
6
New Project Wizard
Перечисление WizardType
Имя проекта
Локальный каталог
Каталог инсталляции Visual
Studio
Флаг FExclusive (создать
новое решение или
использовать текущее)
Название решения
Флаг Silent (выполнять с
пользовательским
интерфейсом или без него)
Add Sub Project Wizard
Перечисление
WizardType
Имя проекта
Объект Project Items
Локальный каталог
Название добавляемого
элемента
Каталог инсталляции
Visual Studio
Флаг Silent
Add Item Wizard
Перечисление
WizardType
Имя проекта
Объект
Projectltems
Локальный каталог
Название
добавляемого элемента
Каталог инсталляции
Visual Studio
Флаг silent
Для определения результатов работы мастера вы должны обратиться к значению,
помещенному в параметр wizardResult. В табл. 13.7 перечислены значения перечисления
wizardResult.
488
Часть IV. Расширенные возможности Visual Studio
Таблица 13.7. Значения перечисления wizardResult
Член
wizardResultBackOut
wizardResultCancel
wizardResultFailure
wizardResultSuccess
Описание
Пользователь вышел из мастера при помощи нажатия кнопки Back
Мастер был отменен
Запуск мастера закончился неудачей
Работа мастера была удачной
Содержимое метода Execute зависит от вас. В теле этого метода вам понадобится
реализовать весь код, необходимый для выполнения работы мастера и отображения
пользовательского интерфейса для пользователя.
Примечание
Несмотря на то, что мастера кажутся вам последовательностью страниц,
перемещение по которым происходит при помощи кнопок Next и Back, мастер для Visual Studio
является СОМ-объектом, который реализует iDTWizard. Фактически мастеру вовсе
не нужно отображать пользовательский интерфейс. Он может, например, просто
использовать переданные ему параметры для выполнения некоторой работы.
Файлы с расширениями vsz и vsdir
Если вы помните из нашего обсуждения надстроек, то каждый такой модуль использует
addin-файл для регистрации надстройки в Visual Studio. Для мастеров таким эквивалентом
являются файлы с расширением vsz; они сообщают Visual Studio о мастере и о его
реализующем классе.
Вот пример vsz-файла:
VSWizard 8.0
Wizard=ContosoWizard.AddNewClassWizard
Param=
Строка vswizard в этом файле указывает версию мастера. Число 9.0 соответствует Visual
Studio 2008, а предыдущие номера версий соответствуют предыдущим версиям Visual
Studio.
Примечание
Формат vsz-файла не изменился с версии Visual Studio 2003, так что номер версии
значения практически не имеет; многие из входящих в комплект Visual Studio 2008
мастеров промаркированы как файлы версии 6!
После номера версии указан идентификатор класса. И наконец, имеется одна (или
несколько) необязательных строк Pa ram. Эти строки определяют любые параметры, которые вы
хотите передать мастеру. Все определенные здесь параметры мы встретим в параметре
CustomParams метода Execute.
Глава 13. Надстройки и мастера
489
Visual Studio имеет особую иерархию каталогов, которую она использует для хранения vsz-
файлов мастеров. Каталог, в который вы поместите vsz-файл, будет определять то место, где
появится опция запуска мастера. Например, если вы хотите создать мастер Add Item Wizard
для обоих языков (Visual Basic и Visual C#), то вам необходимо будет поместить копию vsz-
файла в оба каталога— для Visual Basic и для Visual C#. Если Visual Studio 2008 была
инсталлирована в каталог по умолчанию, то вам придется поместить файлы сюда:
□ C:\Program Files\Microsoft Visual Studio 9.0\VC#\CSharpProjectltems;
□ C:\Program Files\Microsoft Visual Studio 9.0\VB\VBProjectItems.
Если бы вы создавали мастер New Project Wizard, то файлы нужно было бы поместить в
каталоги VC#\CSharpProjects и VBWBProjects.
Каталоги мастеров могут также содержать vsdir-файл. Этот файл используется для того,
чтобы обеспечить Visual Studio значком и прочими ресурсами для конкретного мастера.
Файл с расширением vsdir является простым текстовым файлом. Каждая строка файла
представляет собой определенный vsz-файл/мастер и предоставляет несколько полей
(разделенных символом конвеера, |) с необязательной информацией о мастере. В табл. 13.8 описаны
поля строк vsdir-файла (по порядку). Необязательные поля помечены.
Таблица 13.8. Поля записей vsdir-файла
Поле
Relative
Path
Class ID
Localized
Name
Sort
Priority
Description
DLL Path
Icon
Resource id
Flags
Name
Описание
Относительный путь к vsz-файлу мастера
Идентификатор Class ID компонента мастера в формате GUID Не обяза- '
телен
Локализованное имя мастера, которое появится в диалоговом окне Add
Item. He обязательно
Число, используемое как относительный номер группирования для мастера
в диалоговых окнах. Мастер со значением 1 будет выводиться рядом с
другими мастерами, имеющими номер 1 (и т. д )
Описание мастера. Оно появится при выделении мастера в диалоговом
окне Add Item
Полный путь к сборке, содержащей значок мастера
Идентификатор ресурса, указывающий внутри DLL на значок, который нужно
отображать
Одно или более битовых значений, используемых для управления
определенными аспектами поведения мастера. Полный список см в документации
MSDN. Не обязательны
Имя мастера, которое будет отображаться в поле Name диалогового окна
(в отличие от Localized Name, данное поле обязательно)
Вот простой пример vsdir-файла с единственной записью о мастере:
CSharpContosoDataClass.vsz | | |l|Create a new Contoso storage
class|с:\ContosoFramework\Wizards\DataClassWizard.dll| | |Contoso Data Class
490
Часть IV. Расширенные возможности Visual Studio
Совет
Записи в vsdir-файле представляют собой способ связывания ресурсов значков с
мастерами (вы можете указать путь к DLL и идентификатор ресурса значка). Есть
также и более простой способ сделать это: просто создайте ico-файл, дайте ему то же
самое имя, что и vsz-файлу, и поместите в тот же каталог.
Создание мастера Add New Item Wizard
Вот основные шаги для создания мастера:
1. Создайте новый проект библиотеки классов; в этом проекте создайте новый класс,
который реализует интерфейс iDTWizard.
2. В классе мастера в методе Execute напишите код для выполнения задач мастера и
отображения его пользовательского интерфейса.
3. Создайте vsz-файл для мастера.
4. Создайте или отредактируйте vsdir-файл для ссылок на новый мастер и vsz-файл.
Для освоения этих концепций давайте рассмотрим их в действии. Мы проследим за
разработкой мастера от начала и до конца. В данном случае это будет мастер Add Item Wizard для
С#. Его цель — собрать у пользователя некоторые основные данные, а затем создать класс
страницы Tools Options (аналогично тому, как вы делали это вручную ранее в этой же
главе), который будет адаптирован в соответствии с данными, введенными пользователем в
J диалоговом окне мастера.
Реализация метода Execute
Методу Execute нужно сделать две вещи: показать диалоговое окно Windows Forms для
ввода предпочтений (таких как имя класса) и обработать эти предпочтения (сгенерировать
класс, который реализует страницу Tools Options, и добавить этот класс в текущий проект).
Создание диалогового окна
Сначала диалоговое окно: оно должно выглядеть примерно так же, как диалоговое окно на
рис. 13.14 (в реализации этой формы нет ничего особенного, так что мы не будем подробно
заниматься здесь ее кодом).
Когда пользователь щелкает по кнопке ОК, то вы должны настроить несколько свойств
формы, которые отражают выбранные в диалоговом окне элементы. Например, если вы
реализуете эту форму как класс wizardDialog, то вам понадобятся свойства
WizardDialog.ClassName, WizardDialog.Category и т. д. Последнее, что нужно сделать
при щелчке по кнопке ОК,— это настроить свойство DialogResult формы. Метод
Execute мастера (который мы изучим чуть позже) будет запрашивать свойство
DialogResult для определения — зафиксировал ли пользователь изменения в мастере или
отменил их. Вот обработчики событий ОК и Cancel для кнопки:
private void buttonOK_Click(object sender, EventArgs e)
{
// Присвоить значения элементов управления экраном нашим публичным полям
Глава 13. Надстройки и мастера
491
this.ClassName = this.textBoxClassName.Text;
this.Category = this.textBoxCategory.Text;
this.Subcategory = this.textBoxSubCategory.Text;
this.UseRegistry = this.checkBoxUseRegistry.Checked;
this.RegKey = this.textBoxRegKey.Text;
// Указать, что диалог был принят
this.DialogResult = DialogResult.OK;
private void buttonCancel_Click(object sender, EventArgs e)
{
// Указать, что диалог был отменен
this.DialogResult = DialogResult.Cancel;
Tools Options Page Class Wizard
Enter the Tools Options Page Class hfaiiattu»
This wizard will create a class for implementing a custom tools ophorvs page
in Visual Studio Please enter the details below arvo click OK
What name should be used far fte class?
I
What category and s ub-category should be used far tie class?
Category: sub-category
Will the option page store values m Ihe nsgjsky?
_J Yes. use the registry
Regsstry key
OK
Cancel
Рис. 13.14. Форма мастера
Использование файла шаблона
Здесь есть два подхода к созданию класса страницы Tools Options: вы можете создать все
строки кода при помощи либо интерфейса Code DOM API (или при помощи примитивного
создания/конкатенации строк), либо при помощи файла шаблона. Подход с файлом шаблона
немного проще и, вероятно, несколько более эффективен, поэтому именно его мы здесь и
опишем (тема шаблонов в Visual Studio подробно исследуется в следующей главе).
Шаблон класса — это файл, который выглядит точно так же, как любой другой
пользовательский элемент управления. Используя стандартный код, созданный для класса
пользовательского элемента управления, вы заменяете его ключевые области строковыми
указателями мест заполнения.
ПЗак 3716
492
Часть IV. Расширенные возможности Visual Studio
Например, имя класса указывается внутри мастера, поэтому вам придется кое-что заменить
в шаблонном классе:
public class %TemplateClassName% : UserControl, IDTToolsOptionsPage
{
}
Вам понадобятся в классе также и члены iDTToolsOptionsPage — такие как
OnAf terCreated, OnOK и т. д. Для большинства из этих методов подойдет простой вызов
System.NotImplementedException, напоминающий пользователю о том, что нужно
ввести код. Однако для OnAfterCreated и ОпОК вам нужен вариант включения строки кода
для открытия указанного ключа реестра:
public void OnAfterCreated(DTE DTEObject)
{
// Прочитать наше текущее значение из реестра.
//Не забудьте включить сюда код для чтения из реестра.
%StartRegistryCode%
RegistryKey regKey = Registry.CurrentUser.OpenSubKey(@"%TemplateRegKey%") ;
%EndRegistryCode%
}
public void OnOK()
{
//He забудьте включить сюда код для сохранения опций.
// Обновить реестр новым значением
%StartRegistryCode%
RegistryKey regKey = Registry.CurrentUser.OpenSubKey(@"%TemplateRegKey%") ;
%EndRegistryCode%
}
Здесь вы опять используете указатели места заполнения: %StartRegistryCode% и %Еп-
dRegistryCode% ограничивают строку кода OpenSubKey. Если пользователь снимает в
мастере флажок User Registry, то вы удаляете все между этими двумя указателями места
заполнения (включая и сами указатели). %TemplateRegKey% используется как
идентификатор для значения ключа реестра; его вы тоже получаете от пользователя в диалоговом окне
мастера.
Выполнение мастера
Метод Execute откроет форму мастера и (если пользователь не отменил диалоговое окно)
будет использовать свойства формы для вызова нескольких внутренних процедур,
отвечающих за генерирование выходного класса:
public void Execute(object Application, int hwndOwner, ref object[]
ContextParams, ref object[] CustomParams, ref wizardResult retval)
{
Глава 13. Надстройки и мастера
493
// Экземпляр диалога для мастера
WizardDialog dig = new WizardDialog();
// Показать диалог
dig.Show();
// Обработать результаты мастера
if (dlg.DialogResult == DialogResult.OK)
{
// Загрузить файл шаблона, заменить маркеры,
// вернуть содержимое в виде строки
string classContent = ReplaceTokens(dlg.ClassName, dig.Category,
dig.Subcategory, dlg.UseRegistry, dlg.RegKey);
// Поместить возвращенную строку в файл и добавить файл в текущий проект
// (третий элемент ContextParams — это коллекция элементов
// текущего проекта)
Projectltems projltems = (ProjectItems)ContextParams[2];
AddFile(classContent, projltems);
retval = wizardResult.wizardResultSuccess;
}
// Мастер был отменен; действий не требуется
else
{
retval = wizardResult.wizardResultCancel;
}
}
Для реакции на нажатие пользователем кнопки ОК вы вызываете три отдельные внутренние
процедуры. Первая (ReplaceTokens) открывает файл шаблона класса и заменяет маркеры
(поскольку это простой процесс замены строк, то мы не будем приводить здесь этот код).
Вторая процедура (AddFile) пишет новое содержимое класса в новый файл и добавляет его
в текущий проект. Поскольку этот код может оказаться не слишком очевидным, вот один из
его вариантов: ,
private void AddFile(string className, string classContent,
Projectltems projltems)
\
{
// Определить путь к файлам проекта
string fileName =
Path.GetDirectoryName(projIterns.ContainingProject.FileName);
494
Часть IV. Расширенные возможности Visual Studio
// Использовать путь и имя класса для создания имени файла для класса
fileName = fileName + className + ".cs";
// Сохранить файл класса в каталог проекта
using (TextWriter writer = new StreamWriter(fileName, false))
{
wrirer.Write(classContent);
writer.Close();
}
// Добавить созданный файл в текущий проект
proj Items .AddFromFile (fileName) ;
}
И наконец, вы вызываете UpdateXML. Эта процедура открывает addin-файл и добавляет
соответствующий узел <ToolsOptionsPage> в XML-контент:
private void UpdateXml(Projectltems projItems, string category,
string subcategory)
{
// Создать строковый фрагмент XML
, string xml = "";
xml += "<ToolsOptionsPage>\r\n";
xml += " <Category Name=\l,,f + category + M\">\r\n";
xml += " <SubCategory Name=\"" + subcategory + M\">\r\n";
xml += " <Assembly></Assembly>\r\n";
xml += " <FullClassName></FullClassName>\r\n";
xml += " </SubCategory>\r\n";
xml += " </Category>\r\n";
xml += "</ToolsOptionsPage>\r\n";
xml += "</Extensibility>";
// Перебрать элементы проекта в поиске addin-файла
string projName = projItems.ContainingProject.FullName;
foreach (Projectltem itm in projItems)
{
if (itm.Name == projName + ".addin")
{
// Открыть объект документа addin-файла
itm.Document.Activate();
TextDocument txtDoc = (TextDocument)itm.Document.Object("");
TextRanges nullObj = null;
// Добавить во фрагмент "категория/подкатегория XML"
Глава 13. Надстройки и мастера
495
txtDoc.ReplacePattern("</Extensibility>", xml,
int)vsFindOptions.vsFindOptionsFromStart, ref nullObj);
}
}
}
Теперь код мастера готов.
Создание vsz- и vsdir-файлов
Все, что осталось сделать, — это создать vsz-файл и добавить элемент в vsdir-файл. Файл
с расширением vsz прост:
VSWizard 8.0
Wizard=ContosoWizards.ToolsOptionsPageWizard
Param=
Запись, которую вы добавляете в vsdir-файл, выглядит следующим образом:
ToolsOptionsPageWizard.vsz | | |1|Create a new Tools Options Page
class|c:\ContosoFramework\Wizards\ToolsOptionsPageWizard.dll| | |Contoso
Options Page Class
Теперь мастер полностью работоспособен, и его можно выбрать в диалоговом окне Add Item.
Резюме
В этой главе мы обсудили, как использовать возможности API расширяемости Visual Studio
для создания надстроек и мастеров.
Вы познакомились с практически неограниченными возможностями расширения Visual
Studio при помощи надстроек, которые делают вызовы API расширяемости и предоставляют
свои интерфейсы самыми различными способами (включая нестандартные окна
инструментов и диалоговые окна).
Вы также видели, как можно использовать вездесущую объектную модель расширяемости и
встроенный движок мастеров для создания ваших собственных нестандартных мастеров
(для добавления новых проектов, добавления новых элементов проектов, а также для
выполнения пошаговых процессов практически любого типа внутри Visual Studio).
ЧАСТЬ V
Создание промышленных
приложений
Глава 14
Создание приложений ASP.NET
Web-разработка продолжает оставаться центральной частью последней версии Visual Studio.
Так же, как и ее предшественницы, версия 2008 продолжает развивать направления Web-
разработки под .NET. Новая версия снабжена дополнительными средствами повышения
производительности проектирования, имеются новые и улучшенные элементы управления,
улучшена технология IntelliSense, имеется также поддержка LINQ — и это далеко не все.
Эти дополнения и улучшения предназначены для того, чтобы Web-разработчики
почувствовали себя увереннее при создании своего следующего Web-приложения при помощи .NET.
Данная глава помогает Web-разработчикам использовать ASP.NET для создания приложений
(на основе браузеров), код которых выполняется на сервере. Приложения такого типа дают
Web-разработчикам максимально широкие возможности в смысле работы приложения незави-1
симо от используемого браузера и платформы (совместимость на базе HTML). Конечно, Web-
разработка продолжает развиваться и помимо браузеров. Более подробную информацию о
таких вещах, как ХВАР, Ajax и Silverlight, см. в главе 17. Если вы хотите разрабатывать
приложения на основе XAML при помощи технологии Microsoft WPF, то см. главу 16.
Мы начнем с описания основ определения Web-проектов Visual Studio и создания простых
Web-форм. После этого мы перейдем к более сложным темам и продемонстрируем вам, как
вы можете создать цельный пользовательский интерфейс для вашего приложения ASP.NET,
который включает шаблоны страниц, темы, WebParts ("Web-части") и привязку данных.
Наконец, мы потратим некоторое время на описание набора главных элементов управления,
встроенных в ASP.NET.
Примечание
ASP.NET— огромная тема. Мы не сможем углубиться во все ее аспекты. Вместо
этого мы сосредоточимся на тех областях, в которых вы сможете использовать Visual
Studio для улучшения производительности создания пользовательских Web-
интерфейсов. Именно это — основная тема для всех Web-разработчиков.
Мы предполагаем, что по мере создания интерфейса ASP.NET вы столкнетесь с
такими местами, которые потребуют дальнейшего изучения. Поэтому по мере
изложения материала в данной главе мы будем стараться обращать ваше внимание на
некоторые из них. Некоторые примеры таких вопросов: членство, пользовательские
профили, кэширование, администрирование Web-сайтов, а также передача форм
между страницами (cross-page posting).
500
Часть V. Создание промышленных приложений
Основы сайта ASP.NET
Web-сайты в Visual Studio начинаются с проекта Web-сайта. Проект Web-сайта
представляет собой связь между Visual Studio, разрабатываемой вами версией Web-сайта
(дополнительную информацию см. в главе 4) и Web-сервером (локальным или нет). Однако то, что
подразумевается под Web-сайтом, продолжает развиваться и расширяться.
Простые HTML-сайты с текстом, гиперссылками и небольшим количеством изображений
уже практически не создаются и даже серьезно не обсуждаются в качестве Web-сайтов.
Вместо этого .NET принесла определение Web-сайта, значительно выходящее за пределы
исходной модели ASP, в которой сочетались HTML и скрипты на стороне сервера. В наши
дни Web-сайт означает: интерактивные Web-формы; откомпилированный код, который
связывает эти Web-формы с промежуточным уровнем; шаблоны страниц, стили и темы
(которые управляют внешним видом сайта); настройка таких вещей, как безопасность, членство и
кэширование; подключение к базам данных и привязка данных; и т. д. Инструменты Visual
Studio 2008 сводят все эти концепции воедино для того, чтобы дать вам возможность
создавать богатые современные Web-сайты, которые предлагают все более высокий уровень
взаимодействия с пользователем. В последующих разделах мы изучим строение
современного Web-сайта и обсудим, как его создавать и конфигурировать.
Создание нового проекта Web-приложения
Проект Web-приложения представляет собой шаблон нового сайта. Этот шаблон помогает
определить каталоги по умолчанию, конфигурацию, Web-формы и прочие файлы и
настройки. Visual Studio поставляется с целым набором шаблонов Web-сайтов. Эти шаблоны
позволяют вам определить несколько различных версий Web-сайта.
V ;t. • Stud ; installed *eTei.»tes
& S «ft
ASP NET ASP NE" EmpU *Veb
Web Site Web Service Srte
Ms TM"olat«
JJ
Search
Online Те
vVCF Servire
j*—-^
ASF NET
Peporti W
A blank ASP.NET Web site ' NET Framework 3.5}
locaticrv File System •» C'.Use'iXmsnei^DccumentsWisua Studio 2D03WYebS.t«4VebSrtej
Language Visuil C* ▼
Рис. 14.1. Создание нового Web-сайта
Глава 14. Создание приложений ASP.NET
501
Вы можете также использовать эти шаблоны как основу для создания ваших собственных
шаблонов (дополнительную информацию по созданию нестандартных шаблонов см. в главе 7).
Начиная с Visual Studio 2005, Web-сайты больше не считаются проектом Visual Studio
(вроде проектов Windows Forms или приложений библиотек классов). Вместо этого Web-сайты
получили в Visual Studio свой особый статус. Для создания Web-сайта вы выбираете в меню
File | New Web Site. При этом открывается диалоговое окно New Web Site (рис. 14.1),
которое отличается от стандартного диалогового окна для нового проекта. Мы рассмотрим все
те элементы, которые отличают процесс описания Web-сайта.
Выбор шаблона Web-сайта в Visual Studio
Visual Studio no умолчанию инсталлирует пять шаблонов ASP.NET. Вы выбираете шаблон
под свои потребности. Однако ббльшая часть сайтов создается при помощи стандартного
шаблона — ASP.NET Web Site. Вот пять шаблонов ASP.NET по умолчанию.
□ ASP.NET Web Site— представляет собой стандартный Web-сайт ASP.NET, который
начинается с каталога AppData, Web-формы Default.aspx и файла web.config. Конечно,
при создании вашего сайта вы можете добавлять дополнительные каталоги и файлы.
Этот шаблон чаще всего используется для создания нового Web-сайта с нуля.
□ ASP.NET Web Service — представляет собой сайт для создания Web-сервиса на основе
XML (подробности см. в главе 19). Шаблон включает: сервис Service.asmx, который
содержит код простого Web-сервиса; каталог AppCode для файлов класса сервиса;
каталог AppData для данных, к которым имеет доступ ASP.NET; а также файл Web.config
для управления конфигурацией сайта.
□ Empty Web Site — представляет собой проект Web-сайта, лишенный всех каталогов и
файлов. Этот проектный контейнер используется в качестве стартовой точки. Он не
подразумевает наличия каталогов и файлов. Вы добавляете их сами по мере
необходимости.
□ WCF Service— используется для создания Web-сайта, который содержит сервисы
WCF (подробности см. в главе 19). Подобно шаблону проекта Web Service, шаблон
WCF Service содержит стандартные каталоги AppCode, AppData и файл Web.config.
Однако файлом сервиса является Service.svc. Этот сервис является заглушкой класса,
который реализует настраиваемый сервис на основе WCF (а не просто на основе XML).
□ ASP.NET Reports Web Site — создает сайт для формирования Web-отчетов (при
помощи инструментов Microsoft Report Viewer). Создание такого сайта не только приведет
к созданию начального отчета вашего проекта и настройке соответствующих ссылок на
библиотеки отчетов фирмы Microsoft, но запустит также и мастер для настройки вашего
первого отчета. Сюда входят: подключение к источнику данных, выбор данных, а также
настройка характеристик отображения. Затем вы можете запустить отчеты в Web-
браузере. Средство просмотра отчетов имеет опции для экспорта отчетов в форматах
Excel и PDF.
Совет
Те разработчики, которые работали с Visual Studio 2005, вероятно, заметят, что с
Visual Studio 2008 Professional больше не поставляется шаблон Personal Web Starter
Kit. Этот шаблон позволял вам создавать полностью работоспособный сайт буквально
502
Часть V. Создание промышленных приложений
несколькими щелчками кнопок мыши. Однако эти стартовые шаблоны были развиты и
расширены. Теперь их существует множество, и поэтому они не поставляются вместе
с Visual Studio. Этими стартовыми наборами могут воспользоваться разработчики,
имеющие Visual Web Developers Express Edition и Visual Studio 2008 Professional.
В них включены наборы для блогов, порталов, электронной коммерции, малого
бизнеса, клубов, Wiki-сетей и многое другое. Вы можете прочитать об этих сайтах по
адресу: http://www.asp.net/community/projects.
Выбор местоположения Web-сайта
В более старых версиях Visual Studio (до 2005) при создании вашего Web-сайта для
разработки не было выбора. У вас должен был работать локальный сервер Internet Information
Services (IIS), и вы должны были хранить ваше Web-приложение внутри структуры
каталогов wwwroot. Такая модель вызывала немало проблем. Первая состояла в том, что ваше
приложение обычно было "размазано" по всему вашему компьютеру. Файл вашего решения
и dll-файлы проектов находились в одном каталоге, а ваше Web-приложение было зарыто в
специальном каталоге диска С:. Вторая проблема состояла в том, что эта модель заставляла
держать серверы IIS на каждом настольном компьютере разработчика (иначе работать было
невозможно). Обычно это нарушало стандартную политику. Было также много проблем с
версиями IIS, развертыванием и т. д.
Visual Studio 2005 эти проблемы решила. Варианты подключения к разрабатываемому
приложению были значительно расширены. Теперь вы можете работать с вашим приложением
при помощи локального (или удаленного) сервера IIS. Вы можете также работать с
файловой системой и использовать для разработки локальный Web-сервер (вместо локального
экземпляра IIS). Или вы можете работать с удаленным сервером и подключаться к нему по
FTP или HTTP. Давайте же рассмотрим настройку этих вариантов расположения Web-сайта
при помощи Visual Studio 2008.
Вы определяете положение вашего Web-сайта (и, следовательно, способ доступа к нему)
тогда, когда вы создаете его или подключаетесь к нему. Вспомните, что на рис. 14.1 рядом с
опцией Location имеется раскрывающийся список (внизу слева). Этот список содержит
следующие значения: File System, HTTP и FTP. Каждый из этих вариантов требует от вас
ввода местоположения вашего Web-сайта и предоставления соответствующих учетных данных
для создания (или открытия) вашего сайта. Щелчок по кнопке Browse дает вам возможность
перейти к желательному местоположению сайта. Эта кнопка открывает окно Choose
Location. В следующих разделах мы рассмотрим многие опции этого диалогового окна.
File System
Первый вариант (который находится в верхней части окна Choose Location)— это File
System. Он позволяет вам выбрать любой каталог на вашем компьютере (в котором будет
сохранено содержимое вашего Web-сайта). Вы можете использовать это диалоговое окно
для перемещения по файловой системе и выбора (или создания) нового каталога для вашего
сайта. На рис. 14.2 показано это диалоговое окно для выбора каталога. Кнопка создания
нового каталога (Create New Folder) находится в правом верхнем углу (вместе с кнопкой
удаления Delete).
Если вы выбираете для локальной разработки Web-сайта вариант File System, то вам не
нужно иметь на вашем компьютере сервер IIS. При этом Visual Studio распознает содержи-
Глава 14. Создание приложений ASP.NET
503
мое каталога файловой системы как Web-сайт и запускает локальный экземпляр сервера
ASP.NET Development Server. Этот сервер имитирует IIS и его при необходимости можно
запускать и останавливать. В итоге вы создаете экземпляры для каждого Web-сайта
(который вы запускаете, отлаживаете или собираете при помощи Visual Studio).
Каждый экземпляр сервера для разработки располагается в системном лотке. Вы можете
щелкнуть правой кнопкой мыши по экземпляру сервера для разработки и перейти к сайту,
который он обслуживает (при помощи Web-браузера); остановить сервер, а также просмотреть
его подробности. Пример окна подробностей для сервера разработки показан на рис. 14.3.
Здесь вы видите физический и виртуальный путь к серверу, номер порта, а также корневой
URL. У вас также есть возможность остановки работающего сервера при помощи кнопки Stop.
File S/sttm
" Ч ~
FTP Site
«ft
Ferwrte bite
Fit* System
5«i«ct the folcUf ycu went to open
{ > Visjaliieri
WebSites
97214
t 9Ч7С1
' \ «pService
. Bus.neisServices
[i CortOiO
^ . ReportiWebsttel
j + Rep<wtsWeb5rte2
«' WCCServcel
I -ti WebSitel
j , Web5ite2
j .. WebSiteS
I *i Щ Downloids
I « |^ Favorites
{i Щ iirVs
: , ш Musk
1 H g P.CtUK!
Folder
CAUsers4msnell\Docb>r.ents\V sual Stjdic 2008\WebStes\WebSrte4
Open
Рис. 14.2. Создание Web-сайта, хранящегося в файловой системе
|*W; «P.NET Devetecroen.*Server- tat£fe»'
ASP NETD*v*fcni»tSew
Runs ASP NETAjvbcatom looiy
Red URL
Port
Vfcjrf Path
Physical Pain
*&?
■ //Walho». 5785S Rcpyts,- ifailt' J1
&7855
i'RepcrtiWeb*«2
С \U$«n.sJi»s.TeihD3ajmert»"<H$i«i Studio 2X2\¥»'eb5i*ei .Rep
Рис. 14.3. Окно подробностей сервера для разработки ASP.NET Development Server
Совет
По умолчанию сервер для разработки работает на случайном номере порта. Однако
вы можете принудительно указать серверу определенный порт. Для этого вы
выбираете Web-сайт и смотрите его свойства. Пример показан на рис. 14.4. Вы можете на-
504
Часть V. Создание промышленных приложений
строить свойство Use dynamic ports в значение False, а затем указать номер порта
при помощи свойства Port number.
<Л WebSiteS - Microsoft Visual Studio
File Edit View Website Build Debug Data Took Test Analyze Window Help
Ready
0\Usera\mmeflU>ominmti\Vnua! Studio 20(MI\WebS«tes\Wei .
Always Start When Debug; True
f o.-r^tUK f.' ,-;' . ' -f; r« .HI П.
Use dynamic ports False
Virtual path /WebSite5
| Set the port number that the ASP.NET DeveJopment Server should
use,
^SotuSpbcpiorerW Properties
Рис. 14.4. Принудительное указание номера порта для сервера разработки
Local IIS
Visual Studio 2008 по-прежнему позволяет вам настроить Web-приложение на
использование локального экземпляра IIS. Этот вариант обеспечивает вам работающий сервер даже
тогда, когда вы не ведете разработку. Он также позволяет вам иметь более высокую степень
управления конфигурацией вашего сайта (при помощи инструмента администрирования
сервера IIS). Однако в большинстве случаев наличие локальной версии IIS на компьютере
разработчика нежелательно. Она занимает ценные системные ресурсы и часто нарушает
внутренние политики компании (представляя собой лишний сервер в сети).
Для настройки локальной версии Н5?выберите вариант Local IIS. На рис. 14.5 показано
диалоговое окно с выделенной опцией Local IIS. Обратите внимание, что в данном случае IIS
локально на компьютере не инсталлирован. Вы видите также, что если вы работаете в Visual
Studio под управлением Windows Vista, то вам нужно кое-что сделать дополнительно. Вы
должны инсталлировать все необходимые компоненты сервера IIS. Затем вы должны
настроить Visual Studio для работы с повышенными привилегиями администратора. Это
опять-таки не очень хорошая идея.
Для инсталляции всех этих компонентов локально под Windows Vista вам нужно открыть
Control Panel (Панель управления). Затем вы можете выбрать Uninstall Program (Удаление
программ). Здесь вы получаете вариант добавления или удаления компонентов Windows.
Выберите этот вариант, и вы получите диалоговое окно Windows Features, показанное на
Глава 14. Создание приложений ASP.NET
505
рис. 14.6. Найдите Internet Information Services и убедитесь, что вы инсталлировали его
вместе с ASP.NET.
То access local BS Web sites, ycu must install «II of the fallowing W:ndov»s components'
Intetnet Information Services
OS 6 Metabast and DS6 Configuration Compatibility
ASP.NET
In addit on, you trust fur. Visuaf Studio tn the context of an administrator account By oefault,
vVindcvti runs applicators in a limited-privilege лег account even twhen you are togged en to the
computer as in administrator To f jn Visuei Studio <4ith adrmp'Strative privileges right-c iric the
V'isjel Studio icon end then click. Rm as admmiSiratGt
For mere information, press Fl.
Рис. 14.5. Создание сайта для работы
на неинсталлированной локальной версии IIS
А<«>Ш*т]
I j*n Windows fedtu? еь on uf uf f I
Totiirn я (enure on, select its check box To turn t(eature off, clear its cheel box Д lilted box means that
only part of the feakire •* turned on.
- jS, internet Information Services
, FTP Pub.isning Service
• Ш Web Management Tools
ч+ ч ; OS б Management Compatibility
J ■. US Management Console
IIS Management Scr-pts and Tools
IIS Maragement Service
it World vV.de Web Screes
U < Application Development Features
(<, s < NET Extensibility
L. ASP
1 , CGI
[V l$A?l Extensions
\J tSAPJ Firteu
{ Sever S de Include:
<- Ш , Common Http Features
* Щ Heattn and Diagnostics
- Щ Perfcnance Features
■ ; Secunty
F > Microsoft NET Framework ЗД
и Microsoft Message Queue (MSMQJ Server
Рис. 14.6. Инсталляция IIS и ASP.NET под Windows Vista
Теперь вы должны увидеть больше опций в диалоговом окне нового Web-сайта (при выборе
варианта Local IIS)— рис. 14.7. Во-первых, вы видите три кнопки в правом верхнем углу
506
Часть V. Создание промышленных приложений
диалогового окна. Эти кнопки позволяют вам создать новое Web-приложение, создать
новый виртуальный каталог, а также удалить выбранный элемент. Если вы выберете создание
нового виртуального каталога, то получите просьбу указать имя каталога и местоположение
того каталога, в котором вы хотите хранить сайт. Вы не привязаны больше к wwwroot.
Теперь вы можете создать свой сайт в любом каталоге. Вы можете также выбрать вариант
подключения к данному сайту по протоколу Secure Sockets Layer (SSL). Эта возможность
полезна в том случае, когда вам нужно зашифровать конфиденциальную информацию
между компьютером разработчика и сервером.
File Svrtt'r
FTP Srte
Local Internet Information Server
Se'ect the <,Vtb % ie ,'ou *. ait to open
'•§ Loral Лее Servers
$ Def*jrtvVebSrte
i ,j arpret_chert
Jse SecjfeSsctefc tayef
Рис. 14.7. Создание Web-сайта на локальной версии сервера IIS
Совет
Если вы используете Windows Vista, то для подключения к IIS вам необходимо
запускать Visual Studio с привилегиями администратора. Для этого щелкните по ярлыку
Visual Studio правой кнопкой мыши и выберите пункт Run as administrator (Запуск от
имени администратора).
FTP Site
Есть еще один вариант работы с вашим сайтом — по протоколу FTP (File Transfer Protocol).
Диалоговое окно New Website позволяет вам указать, в каком месте данного FTP-сервера
находится ваш сайт. Для этого вы должны ввести адрес сервера и порт, а также
предоставить соответствующие учетные данные. К FTP-сайтам применимы все ограничения FTP;
например это означает, что пароли не зашифрованы. На рис. 14.8 показаны настройки FTP-
сайта. Обратите внимание, что FTP-сайты в режиме отладки используют локальный сервер
разработчика ASP.NET Development Server. FTP используется для получения и размещения
файлов. Конечно, у вас может иметься Web-сервер, который раздает файлы с FTP-сервера.
Но это «езависимый сервер, и Visual Studio его не видит.
Глава 14. Создание приложений ASP.NET
507
■W%^rfAn7fArj^^t^.^^P^.v.,<<<^]:$a^
Ш
\.ОСЯ 1
FTP Str
Fe»roteS"ie
FTP Sit*
ftp 'ftp COP»C5C СОП
Port-
21
Director,
MySte
if Kitve Mode
Ancnymcjslcgtr
Uscname
joedcv
Pasiwc 'd
Pi:swcrd: э>\= sent acrcji the net^ort n plaintsxi (jreia, sled te<:) nak >ig the^i
* u -\erabte to hterception
Рис. 14.8. Описание Web-сайта с протоколом FTP
Remote HTTP Site
Наконец, при описании вашего Web-сайта вы можете выбрать вариант обмена с Web-
сервером по HTTP. Обычно это удаленный Web-сервер, на котором вы ведете разработку в
разделяемом режиме. Для того чтобы такой тип подключения из Visual Studio был возмо-»
жен, этот сервер должен иметь инсталлированные расширения FrontPage Server Extensions.
На рис. 14.9 показан пример указания местоположения сайта на удаленном сервере I1S.
rhcxjjf locevc)
„оса -а
FTP Sits
Remote Site
zno
Remote Sit*
for the vVe-a s te lo:at or eitfthe UP- of 5 *»feo site ccr'icjred ,vitn Ff rrtPsge Server Extensions
File S/stenr
Ш Л'ес i\'t lecatan
http /www centric сzn
?*e* VV«b Srte
Рис. 14.9. Создание Web-сайта на удаленном сервере
508
Часть V. Создание промышленных приложений
Выбор языка программирования по умолчанию
Visual Studio 2008 позволяет смешивать языки программирования, которые вы используете
для разработки элементов вашего сайта. Когда вы создаете Web-форму или файл класса, то
настраиваете язык, на котором написан каждый отдельный элемент. Однако при создании
нового сайта вы настраиваете язык по умолчанию для всего сайта. Язык по умолчанию
настраивается в диалоговом окне New Web Site (см. рис. 14.1). Настройка этого значения
говорит Visual Studio, как необходимо генерировать ваш шаблон. Кроме того, она
устанавливает начальное значение для той настройки, которая управляет языком по умолчанию для
всех новых элементов, добавляемых в ваш сайт.
На рис. 14.10 показан Web-сайт со смешанным кодом. Здесь имеются два Web-файла: один
с выделенным кодом на языке Visual Basic и один с выделенным кодом на языке С#.
Обратите также внимание, что в каталоге AppCode имеется файл класса на языке С#. Если вам
нужно добавить файлы классов на языке Visual Basic, то вам придется поместить их в
другую библиотеку классов. Однако вы можете сделать это в том же самом Web-сайте: вы
просто должны поместить код в другой каталог (каталог More Code на рис. 14.10). Компилятор
группирует код по каталогам; поэтому весь код в данном каталоге должен быть одного и
того же типа.
Fil* Edit ч'1е«л Re*actsF Website Euilo Debug Toc'< Jtu \>'mdc\\ help
J- —' J d d h i 1 - ,2- '* э«"д
.*, j 4j *♦ -i= %' Z t= 'J *i » -
ь App.Code/OaisLcs
I ХССМъ-Л $88f&4$988ft
NET
■'trc-ls V*bFarts,
j Z h Л *j3 0
% Sc ot.or 92714' Ц project»
jl C.U\»2714\
^ Apo_Cod«
U Classl :j
_> Mc eOde
^ С1к*2.о
| Default asp»
*»1 Defijlt aspx с:
] De(autt2 aspx
v£j D»t*jlt2 asp> vb
^ %v*j ccnf p
Mo e Cede С ас^ ,-o
„ {General}
T»sae^Ba«ic
*»i '-.Tir ^jSoluton Exolcrer
Read/
Рис. 14.10. Web-сайт с файлами на языках Visual Basic и С#
Состав файлов вашего Web-сайта
В состав определения Web-сайта ASP.NET входит несколько файлов. Кроме того, Visual
Studio 2008 добавляет различные специальные каталоги. В следующих разделах дается
справка по многим каталогам и файлам, которые определяют Web-сайт .NET.
Глава 14. Создание приложений ASP.NET
509
Каталоги
ASP.NET определяет несколько каталогов, которые она использует для организации и
распознавания различных файлов, составляющих ваше приложение. Эти каталоги носят
зарезервированные имена, которые имеют для ASP.NET особое значение; поэтому с ними
следует обходиться соответственно.
Каталог ASP.NET добавляется в ваше приложение при помощи контекстного меню (щелчок
правой кнопкой мыши) для данного сайта. Выберите в этом меню пункт Add ASP.NET
Folder. На рис. 14.11 показано Web-приложение со всеми этими специальными каталогами.
Все эти каталоги перечислены в табл. 14.1, там же дано и объяснение их применения.
Solution Explore - G\,A92714\
* H\h ^ Э Щ
^2 Solution '52714' fl project;
: jfigggp
<4 App_Bfow:m
i j App_Code
J Лл Apc.Gata
I _j Acp_GlobalRescurces
I ,j A^p^ocalResoyccs
II •• ^ App_The"ne5
[ ^ AppjVebCeferencK
II ~& s,n
|| i j Defeu't aipv
|| J^ vvec.ccnfig
^
и
i
j
r
Рис. 14.11. Специальные каталоги ASP.NET
Таблица 14.1. Каталоги ASP NET
Каталог
Bin
App_Code
App_Data
App_GlobalResources
Описание
Этот каталог содержит откомпилированный код (файлы dll), на который
имеются ссылки в вашем приложении Сюда могут входить внешние
библиотеки классов или элементы управления, которые вы хотите
встроить в ваше приложение (без встраивания исходного кода)
Этот каталог содержит файлы классов, которые помогают определить
ваше приложение. Например, вы можете поместить в этот каталог ваш
бизнес-объект или классы доступа к данным. Весь код данного каталога
(и всех подкаталогов) компилируется в единую библиотеку Поэтому
весь код в данном каталоге должен быть на одном языке
Этот каталог содержит файлы данных, используемые вашими
приложениями. Это могут быть файлы SQL Express (mdf), данные XML, файлы
Excel и т. д.
Этот каталог содержит файлы ресурсов (resx и resources), которые
составляют ваше приложение. Вы используете файлы ресурсов для
абстрагирования таких вещей, как строковый текст и изображения для
ваших приложений.
510
Часть V. Создание промышленных приложений
Таблица 14.1 (окончание)
Каталог
App_Loca I Resou rces
App_WebReferences
App_Browsers
App_Themes
Описание
Ваше приложение читает из файла ресурсов (вместо жесткого
кодирования этих значений) Это позволяет вам поддерживать
пользовательский интерфейс на нескольких языках, внесение изменений во время
проектирования и прочие вопросы
Этот каталог также содержит файлы ресурсов Однако эти файлы
специфичны для конкретной страницы или элемента управления Они не
являются глобальными для всего приложения
Этот каталог используется для хранения и обслуживания ссылок на
Web-сервисы. Файлы внутри данного каталога включают контракты
Web-сервисов (wsdl) и схемы (xsd), а также прочие элементы
Этот каталог содержит файлы определения браузера (browser) Эти
файлы обычно используются для поддержки мобильных приложений
Каждый файл .browser определяет возможности данного браузера Это
позволяет вашему пользовательскому интерфейсу выполнять
визуализацию для конкретного устройства
Этот каталог содержит подкаталоги, каждый из которых определяет
тему (внешний вид) для вашего приложения Каждый каталог темы
содержит один или несколько файлов обложки (skin), таблицу стилей
(ess), а также изображения для данной темы Подробности по темам см
в разд "Создание общего внешнего вида" далее в этой главе
Файлы
Типичный сайт ASP.NET описывается множеством файлов и типов файлов. Конечно,
существуют файлы, которые вы используете часто (такие как Web-формы, пользовательские
элементы управления, классы и файлы конфигурации); есть и такие файлы, которые нужны
реже (файлы обложек, главные страницы, ресурсы и карты сайтов). В табл. 14.2 дан список
некоторых наиболее часто используемых файлов, которые могут присутствовать в любом
Web-приложении ASP.NET.
Таблица 14.2. Файлы ASP NET
Расширение
файла
aspx
asmx
ascx
asax
Описание
Определяет Web-форму ASP NET. Это самый часто используемый файл
ASP NET См. разд "Создание Web-страниц"далее в этой главе
Определяет Web-сервис на основе XML в ASP.NET См. главу 19
Представляет пользовательский элемент управления ASP NET
Пользовательские элементы управления позволяют вам определить вашу собственную
версию или комбинацию элементов управления и повторно использовать их на
вашем сайте
Создает глобальный класс приложения Позволяет вам задавать код внутри
событий, которые происходят тогда, когда I IS запускает или останавливает
приложение, происходит ошибка; пользователь начинает или завершает сеанс
Глава 14. Создание приложений ASP.NET
511
Таблица 14.2 (окончание)
Расширение
файла
cs, vb
master
config
CSS
dbml
rdlc
sitemap
SVC
skin
Описание
Определяет файл класса Расширение cs — это файл класса С# Расширение
vb — это класс, написанный на Visual Basic
Представляет собой главную страницу Главная страница используется для
определения общих элементов, которые могут появляться на многих страницах Web-
сайта. Это могут быть пункты меню, навигация, верхние и нижние колонтитулы, а
также прочие элементы См разд. "Главные страницы" далее в этой главе
Представляет собой конфигурационный файл вашего Web-приложения Вы
используете конфигурационный файл для управления настройками отладки и
для хранения специфичных для приложения данных (таких как шифрованная
строка подключения к базе данных)
Представляет собой каскадную таблицу стилей Хранит стили или темы вашего
приложения. См. разд "Таблицы стилей" далее в этой главе
Файл класса LINQ для SQL Вы создаете такой файл для того, чтобы
предоставить LINQ-запросы для данной базы данных SQL
Позволяет вам создать Web-отчет, который использует технологию отчетности
фирмы Microsoft
Позволяет вам создать файл, который определяет карту вашего Web-сайта Карты
сайтов используются для различных элементов управления навигацией в ASP NET
Представляет собой сервис WCF Более подробно см в главе 19
Представляет собой обложку для одного или нескольких элементов управления
вашего приложения. Обложка определяется для темы приложения
См. разд "Темы и обложки" далее в этой главе
Ada Kev; Лег*
Terp itt'.
.'Ч.5-И
Л'ео lэггч
1 ''*
| Згivvser -tie
==1
I Feporc
1 Ч
I -*
1 Wefc
1 Conf curat
I M. 'игр л
1 i
1 Seatc l
I On ne'e
С Uzti? wir^ S «CocLJ-nent
11 tailed v,
3
Master =>jge
1
С las:
/Я
Reoon
v' .iar1
Jl[
Weo Service
"
ipla»e;
♦ eb User
Con»'c
Г-]
Gas:
D ag atv
™1
PMaurceFie
if
XML =ile
ЛчШ Ъ**а&2Ш Wea$itev^?l4v
I I
<i'A>' С »nt AW Clten
Uein«vio Cont'c
- L 4=x
Di'aStt Gener с
-Urn. ei
v.* ' \
SiteVap S«nEile
^ J
>MLj.heivs <SL'He
S
£J£\ Client
Liorsr.
a
bobal
~pp icefi
SQL Serve
Database
Ш^щ^ь r
5
- ~s Masts.
C»c,e
v?*
HTM. Рое
4
Style Shset
- „\ v.'ffc
For.-n
J
IS г &t Fi -.
"I
Text "iie
*
« ~N enah
Л ^F Ser ce
>1
JliQt. ^QL
'"ia'ses
'-vx£
vVCFSet-ice
1 4 -**; '
П".
Carvel
Рис. 14.12. Добавление файла ASP.NET в ваш Web-сайт
512
Часть V. Создание промышленных приложений
Новый файл ASP.NET вы добавляете в ваше приложение при помощи щелчка правой
кнопкой мыши по вашему сайту и выбора пункта Add New Item. На рис. 14.12 показано
диалоговое окно Add New Item. В виде шаблонов элементов перечислены доступные для вашего
сайта файлы. Visual Studio позаботится о размещении каждого файла в соответствующий
каталог.
Управление свойствами и опциями проекта
Приложения ASP.NET имеют собственный набор свойств и опций конфигурации. Эти
свойства управляют тем, как приложение работает, собирается, взаимодействует с отладчиком
и т. д. Вы получаете доступ к свойствам вашего Web-сайта через диалоговое окно Property
Pages. Вы можете открыть это диалоговое окно при помощи щелчка правой кнопкой мыши
по вашему Web-сайту и выбора пункта Property Pages. В следующих разделах описаны
многие опции этого диалогового окна.
Ссылки
Ссылки вашего приложения описывают тот код, который используется в вашем приложении
по ссылке. Вы добавляете ссылки на другие проекты вашего решения, другие пространства
имен .NET в .NET Framework, элементы управления сторонних организаций, а также прочие
библиотеки .NET. Код, на который вы ссылаетесь, компилируется в dll-файл и существует
сам по себе. Он может быть как установлен в глобальный кэш сборок Global Assembly Cache
(GAC), так и нет. На рис. 14.3 показан раздел References диалогового окна Property Pages.
С \Uici V,»n$ftef\Da«;-»
ШЙР*
References
Build
Accessibi ity
Start Options
WSBuild Optio
Reference Name
^yitem Cere
S/rtem DdLi DataSetLrtenMonj
System vVeb Extensions
System Xrril Linq
Type
GAC
GAC
GAC
GAC
Version
3SjOO
3.5 0.0
35ЛЭ
33 0 0
JH
Add Reference i
Add Web Reference- I
Add Service Reference
^Cancd ]
Рис. 14.13. Управление ссылками Web-приложения
Каждая текущая ссылка для Web-сайта приведена в списке вместе с соответствующим ей
ссылочным типом. На рисунке показаны стандартные ссылки для нового Web-сайта ASP.NET.
Вы видите, что имеются ссылки на System.Core, System.Xml.Linq, System.Web.Extensions и
System.Data.DataExtensions. Все эти элементы хранятся в GAC (как указано в столбце Туре).
Глава 14. Создание приложений ASP.NET
513
Вы видите также версию (в данном случае это 3.5). В этом диалоговом окне вы можете также
добавить новую ссылку, удалить существующую ссылку или обновить ссылку.
Добавление новой ссылки
Вы можете добавить в ваше приложение ASP.NET ссылки трех типов (как это показано на
рис. 14.13): стандартную ссылку на библиотеку классов .NET (Add Reference), ссылку на
Web-сервис XML (Add Web Reference), а также ссылку на сервис WCF (Add Service
Reference). Мы опишем обе ссылки на сервисы в главе 19. Когда вы добавляете стандартную
ссылку, то делаете подключение к dll-файлу, который существует как часть другого
приложения или другого проекта. Настройка такой ссылки приводит к размещению копии
откомпилированного dll-файла в каталоге bin вашего Web-сайта. После этого пространства имен,
классы и методы внутри этого dll-файла будут доступны для использования их в коде.
Компилятор также будет проверять ваше приложение по всем dll-файлам, на которые в нем
имеются ссылки— для проверки соблюдения вами ограничений типов, сигнатур методов
и т. п.
На рис. 14.14 показано диалоговое окно Add Reference. Вы можете использовать вкладки в
верхней части диалогового окна для поиска элементов, на которые вы хотите сделать
ссылки. Например, если вы хотите сделать ссылку на пространство имен .NET Framework, то вам
нужно выбрать вкладку .NET. Эта вкладка покажет элементы, инсталлированные в GAC
(такие как элементы пространств имен System или Microsoft). Вы можете также
настроить ссылки на компоненты СОМ, выполнить поиск dll-файлов, сделать ссылки на другие
проекты, а также просмотреть недавно сделанные ссылки.
Обратите внимание, что элементы на вкладке Projects представляют собой только
существующие в текущем решении элементы. Эти ссылки работают так же, как и все остальные, но
с одним исключением. Для вашего удобства все ссылки, помеченные как ссылки проекта,
автоматически обновляются при повторных компиляциях проекта.
\i >* Add Refe'env*
, -NET COM t Projects j Browse } Recent
Component Name
System IdentityModel Selector,
Svrterr 10 Leg
I System Mai sgement
1 System Management Instrumentation
1 5,item Messaging
i S»sterr Net
1 System Pr nt">g
■ System P.unfme Peno*irg
1 System Runtime Serie cation
■ System Runtitre Serialization Fcmult
1 System.Security
1 SvrtemServicerVodt
1 System SerwtceMrde 'ЛеЬ
1 System SeryicePricess
1 System Speetn
■ System Transactions
1 System Web
Version
30C0
3000
2jOJC 0
3 5X0
2 <j£ 0
3500
30C0
20C0
3.0 CO
:/>ro
:c»a>o
3000
3500
20C0
30C0
2.0 f 0
2 Cm. 0 r
Furtime
v2 0 50727
>.2C5C727
v2£50727
v2jC 50727
v2f 5C727
ч2СЧЧ27
v2.0 50727
v2C5C727
v2JC 50727
v2f SO'2?
/2А 5С727
v2 0 50727
s2С 50727
s2C5C727
v2i5 50727
V2J&5C727
v2£ 5>Г2~
•>. f«-|-,-
Path
С l F tog-am Files1 Pe^erei
С \Progran FitesxPe^erei
С V» ndo«vs M ircjoit N
С \Ргзд'*гл File^Fe'erei
С >Л nc ows'f.1 с го;oft f i
С Piog am Files4Re'eitn
С Frog am Files Re'erci
C'V\nd=ws'W :icseftN
С \Prng'em Fites\F«*pren
CVii ndo»ss Microsoft N
С »»incovMS\N1 croiott N
С Ргсд am Files Re'eien
С Prcg am Files4 Re*eiei
С°Л ndcvsvrV :rc:cft N
С \Prog am Files\Pe'€re4
С \VV nt'o^svMicrciolt Ы
С W* ndO'MS'N4 cro;oft N
OK
' {WWfI><^)l
I
Сsnee 1
Рис. 14.14. Добавление новой ссылки в ваше Web-приложение
514
Часть V. Создание промышленных приложений
Build
Страница Build диалогового окна Property Pages позволяет вам управлять сборкой вашего
приложения в Visual Studio 2008. На рис. 14.15 показаны имеющиеся опции.
С Wsefsyr^fff-vPoiu ns^tsWtfjjJ Stjdic.2Z62VA> &Srt*i'.3??H\ ^Tjp«"tf ^«g*4
{ -- *.
Fefererce:
Bjh.J
ai cessibitt/
Start Opt rn:
MSBji d Opt от
Stst+*:t3i'.F5)
Eefce гопп ->g s*et;.tp page
Build vVeb 5;te
7a'g«F avw,c-k
■NsTf»*m«v*otk3 5
Buitd&ckit о setter
-' 3i»ild vSeb site a Dsrt of »o Jti
Acctsitb Ith v»fidtticn
v»code ecces; b U vslidatien \vhe-i auitdmg p*g«
.tc.Lde ecces: о ity vilicutior» «ho building *efc
Рис. 14.15. Управление опциями сборки для вашего сайта
Start Action
Раздел Start Action страницы Build позволяет вам указать, как ваше приложение
компилируется при его запуске из интегрированной среды разработки. В этом раскрывающемся
списке есть три варианта: No Build, Build Page и Build Web Site (по умолчанию). Давайте
рассмотрим каждый из них.
Опция No Build говорит интегрированной среде о том, что надо просто запустить сайт в
браузере без выполнения компиляции. В этом случае сборка страниц и элементов
происходит по мере доступа к ним. Вместо показа ошибок внутри интегрированной среды
разработки (до запуска приложения) теперь ошибки отображаются в браузере тогда, когда вы их
находите.
Совет
Вариант No Build может быть чрезвычайно полезным тогда, когда у вас есть большое
приложение, содержащее страницы, над которыми вы в данный момент не работаете
(или которые содержат ошибки, а вы их хотите избежать). Он также ускоряет время
запуска, поскольку предварительной компиляции страниц не происходит.
Вариант Build Page дает указание интегрированной среде разработки откомпилировать
только текущую стартовую страницу (или ту страницу, над которой вы работаете). Эта
возможность очень полезна в том случае, когда вы работаете только с одной страницей. Если
интегрированная среда находит ошибки, то они отображаются в Visual Studio до запуска
страницы.
Глава 14. Создание приложений ASP.NET
515
Последний вариант— Build Web Site— дает интегрированной среде указание выполнить
сборку всего Web-сайта (и всех зависящих от него проектов) перед его запуском в браузере.
Эта возможность полезна в том случае, когда вы единолично работаете над небольшим
сайтом. Однако для больших проектов этот вариант приведет к увеличению времени сборки.
Target Framework
Новой для версии 2008 является опция Target Framework. Эта функциональная
возможность позволяет вам указать (и изменить) версию .NET Framework, под которую
разрабатывается ваше приложение. Это означает, что вы можете при помощи Visual Studio 2008
писать приложения ASP.NET, предназначенные для версий .NET 2.0, 3.0 и 3.5. Изменение этой
опции приведет к компиляции и проверке вашего приложения на соответствие указанной
здесь версии .NET Framework. Когда ваше приложение будет выполняться, оно будет
вызывать код указанной здесь целевой версии .NET Framework.
Build solution action
На странице Build профессиональной версии Visual Studio имеется единственная опция для
Build solution action. Эта опция — Build Web site as part of solution — указывает, должна
ли Visual Studio включать Web-сайт как часть сборки решения. Значение по умолчанию для
нее — да (флажок установлен). В этом случае при выборе в меню Build пункта Build
Solution будет собран также и Web-сайт.
Для разработчиков, работающих с версией Visual Studio Team System Development Edition,
есть еще одна опция (она не показана). Эта опция — Enable Code Analysis — указывает)
хотите ли вы делать в Visual Studio анализ вашего Web-сайта по производительности,
неиспользуемым переменным, стандартам именования и т. д. Это отличный инструмент
контроля за соблюдением разработчиками общепринятых стандартов кодирования для .NET.
Accessibility validation
Опции Accessibility validation на странице Build позволяют вам сделать так, чтобы Visual
Studio проверяла ваше Web-приложение на соответствие стандартам доступности. Эти
стандарты обеспечивают работоспособность вашего приложения для людей с ограниченными
возможностями. Сами стандарты описываются в следующем разделе. На этой странице
имеются два варианта включения проверки: для всего сайта или только для текущей
стартовой страницы. Если эти опции отмечены, то Visual Studio при выполнении приложения
показывает в интегрированной среде проблемы, возникающие в плане доступности.
Accessibility
Страница Accessibility диалогового окна Property Pages позволяет вам определять, какие
проверки на соответствие должны проводиться для вашего сайта. На рис. 14.16 показаны
опции настройки проверок. Существуют три уровня проверок, основанных на двух
стандартах: W3C Web Content Accessibility Guidelines (WCAG) 1 и 2, а также стандарты
доступности правительства США (Access board section 508).
516
Часть V. Создание промышленных приложений
С 4<ie -sVrjre* \Dac *>c.
Build
A:>.er*bt it.
Star. Opl cni
MSGuiHG&'ions
П
1
^sv Visual
Sh«iie ^Oa^Wefci ♦«;''i$*i4* £той**¥ ?***£*Я
•>' ЛСкСрпспЬ2
иго»™^»!? «s=f5?5?5g^
'
Ъ>
L *' •У&ЗЙЯ
i
У
1
C*-c») |
irmTiTiiiiiiiiMHTiiiiimiiilffi ffl 1
Рис. 14.16. Управление опциями доступности
Совет
Visual Studio при сборке проверяет на соответствие стандартам доступности только
ваши HTML-страницы. Она не проверяет элементы управления ASP.NET, поскольку
эти элементы управления выдают собственный HTML. Большая часть этого HTML
стандартам соответствует (но не весь). Если вам нужно проверить, что ваш конечный
HTML на 100% соответствует стандартам доступности, то вам необходимо знать
следующее: большинство элементов управления ASP.NET не должны создавать вам
проблем. Однако существует список элементов управления, которые необходимо
правильно настроить для их соответствия стандартам доступности. Этот список
можно найти в MSDN (надо искать слова "ASP.NET Controls" и "Accessibility"). От этих
элементов управления стоит держаться подальше.
Есть быстрый способ проверить, является ли весь ASP.NET совместимым со
стандартами доступности — для этого надо запустить страницу в Web-браузере, зайти в
просмотр исходного HTML, скопировать HTML-код страницы и вставить его в ваше
решение как отдельный HTML-файл. При сборке Visual Studio проверит
совместимость этой новой страницы.
Дополнительную информацию по созданию удовлетворяющих стандартам доступности
приложений см. в статье "Walkthrough: Creating an Accessible Web Application" в MSDN.
Start Options
Страница Start Options в диалоговом окне Property Pages позволяет вам определять, что
происходит при старте (или выполнении) вашего приложения. На рис. 14.17 показано
множество имеющихся опций. В последующих разделах мы рассмотрим каждую из них.
Start action
Раздел Start action страницы Start Options полезен для указания того, что происходит при
загрузке страницы, когда вы запускаете свое приложение внутри интегрированной среды
Глава 14. Создание приложений ASP.NET
517
разработки. Первая опция (Use current page) дает IDE указание запустить приложение в
интегрированной среде с использованием текущей активной страницы. Эта возможность
полезна для тех разработчиков, которые работают одновременно только с одной отдельной
страницей. Следующий вариант (Specific page) позволяет вам указать стартовую страницу.
Это все равно, что щелкнуть страницу правой кнопкой мыши и выбрать пункт Set as Start
Page. Третий вариант (Start external program) позволяет вам указать ехе-файл, который
должен быть запущен (вместо браузера) при старте приложения. Вариант Start URL
позволяет вам при запуске вашего приложения направить браузер на другой URL. Эта
возможность может быть полезна при отладке Web-сервиса. Например, вы можете запустить
клиент, который использует ваш Web-сервис. Наконец, вы можете использовать последний
вариант для того, чтобы Visual Studio ничего не запускала и ждала запроса. Это тоже может
быть полезно в случае Web-сервиса.
CVjj«w\rr5»»}f<.0ccar>s"^ts>V зиЫЪЫю JX^Wefc^tes^?!^ f^P^V ра8е?
Fsfef«r"-ei
В a.Id
Start Optscns
MSBu -d Cptic
Defiu+aipx
Slut actscn
Use ссгмг' page
« Specific page.
Stj-te»te rat proyam
Сетлыич! nt мдиrverts
Wcrk r»g <*re<tcry
StsiUP.
Don't open я page. Wa t fcr a request г'с-п en *xt* rat app i.-eticn
Server
■0 U««fefajrt Web server
Use custom server
Debuggers
* «P NET
«TLM Ajthentt:«ticn
Рис. 14.17. Настройка опций запуска вашего приложения
Server
Раздел Server страницы Start Options позволяет вам указать сервер, который должен быть
запущен для вашего приложения. Для большинства приложений это будет Use default Web
server. Этот вариант представляет собой Web-сайт в файловой системе. Для случаев
использования IIS или FTP вы должны будете указать URL реального сервера.
Debuggers
Группа опций Debuggers страницы Start Options позволяет вам указать активированные
при выполнении вашего приложения отладчики. По умолчанию установлен только флажок
ASP.NET. Вы можете совсем отключить эту настройку. Вы можете также добавить
отладчики Native code и SQL Server.
518
Часть V Создание промышленных приложений
MSBuild Options
Последняя страница MSBuild Options диалогового окна Property Pages позволяет вам
управлять предварительной компиляцией вашего приложения. Эти опции характерны для
запуска инструмента компиляции MSBuild из командной строки. Пример показан на
рис. 14.18. Здесь вы можете настроить выходной каталог предварительной компиляции и
управлять соответствующими настройками.
С и«ч ,г> $ -о' Эос. ~>s-x$4 \ isuaJ $&«('* 233S- Wzbi- ^$2Щ< Froswt/ **pii
To fci tld the Wefc st'e ircn t->e <: зт^апс11 -v uimg 4<iB i
precompiled ;ersicr ef *tt Web s*t should be ccpteo
ip«r fv the drt'sol» output fcfoe> wb'-f Ие
SarOplcrs
f.'SButtd Qp'icns
С Miers mne I DoCLr>erki V u*l SO. с :0Jc"Pi. ■*<: siCl^Pic о »р1«(ЛеЬ327И
v' Allc«.tb s prec--npt*d i'etj b* jydz*tb e
Js**kee пгтмтд *r>o single page iijeivL'uu
tn»ote str-ng -i*m п] п rf*->-omj-it*' A;<cm» .«
Рис. 14.18. Управление опциями MSBuild и ASP.NET
Примечание
Те же самые результаты (что и в случае приложения MSBuild командной строки) вы
можете получить и через опцию Publish Web Site интегрированной среды разработки.
Создание Web-страниц
Web-страницы ASP.NET (называемые также Web-формами) составляют основную массу
любого Web-сайта. Вы создаете Web-страницы для описания вашего пользовательского
интерфейса. Web-страницы в ASP.NET имеют и конструкторский компонент, и модель
событий. Визуальный конструктор позволяет вам определять элементы управления и вид данной
Web-страницы. Модель событий используется на сервере для реагирования на действия
пользователя (либо на события, переданные обратно на сервер по протоколу HTTP). В этом
разделе мы рассмотрим основы как визуального конструктора Web-страницы, так и ее
модели событий.
Добавление Web-страницы в ваш Web-сайт
Первый шаг работы с Web-страницами — это добавление их в ваш Web-сайт. Для этого
служит диалоговое окно Add New Item, в котором надо выбрать шаблон элемента Web
Form. На рис. 14.19 показан пример добавления страницы CustomerEdit.aspx в Web-сайт.
Глава 14. Создание приложений ASP.NET
519
Adc Ыел Лете - &1$екчжЩ$ьыт*г^\$?ю $tucso £008\Web$itf^$27t#
"!>,
'expiates
\ . i4\ St к -> if Ы\*ь
„j Л«0 Fcrm
jAJ-UCIier;E=rw:;r
.lAJA^Mastei P±ge
-J Browser = e
\ ;>*aSet
^ HTML Page
, Repair
w4 Site Map
Aj 3tv te Z teet
_j> %'.e.> Cc4figurattcn Fi
JL XML Schema
H, Тет^г;
\ Search Or me T*mpli
er->| * г
e
**s
Л fv'asiei °age
j^AJAa Client Ccit'cl
jAJA'AebFcw
JK'»"
*-J Generic Hardier
^ISciptFile
^ ]Report vYnaid
Ji oktp pil=
JTert=ile
^ \\ eb Se-> tee
ji'XS.TFite
i Web Jser.lcr«tc
^AJi-< С e-it .. bit» >
а$А*А*-ечлЬ eel WCF Serv ce
, j.3 Clas-5 D *дгэ-п
.£.. Global Applicat op Clas;
.^UNCic SQL Claries
;*Rescur:eFtle
jSQLSe\erCaiab=se
^}VVC=Serv ce
3"ML - e
A f eft» for Weo Apclieet on;
NiTrte Cj:tcve-Bciaspx
Language Viiual C»
' 3!acecs<e r> sepa'ate file
Select rrs:tef page
Рис. 14.19. Добавление новой Web-страницы в ваш Web-сайт
При добавлении новой Web-страницы в Web-сайт у вас есть несколько опций. Во-первых,
вы можете задать имя страницы. Лучше всего использовать стандартную схему именования
и стараться, чтобы имя страницы соответствовало ее основному назначению. Имена Web-
страниц в данном каталоге должны быть уникальными. Хорошим правилом было бы указа-
ние данных, с которыми работает страница, а за ними — действия пользователя для данной
страницы. В нашем примере так и сделано— CustomerEdit.aspx. Вторая опция — это язык,
на котором основана Web-форма. Ваш Web-сайт обычно весь выполнен на С# или Visual
Basic. Однако он может быть выполнен и на смеси обоих языков. При создании новой
страницы язык по умолчанию выбирается на основе языка по умолчанию для вашего Web-сайта.
Однако вы можете использовать раскрывающийся список в нижней части диалогового окна
Add New Item для выбора другого языка для вашей страницы.
Затем вы можете указать, хотите ли вы, чтобы код Web-страницы был в отдельном файле.
ASP.NET позволяет вам создавать Web-форму в виде отдельного файла. В эту форму входит
как ASP-разметка, так и код серверной стороны. Фактически внутри редактора разметки для
этих типов форм вы имеете и поддержку технологии IntelliSense.
Преобладающей настройкой у большинства профессиональных разработчиков является
выделенный код (Place code in separate file) — она же принята и по умолчанию. Размещение
кода в новом файле позволяет вам управлять этим кодом независимо от разметки
пользовательского интерфейса. Это создает гораздо более четкую среду разработки. Кроме того,
ASP.NET помещает ваш код в частичный класс. Этот частичный класс содержит только тот
код, который пишете вы. Код, который выдается инструментами или самой Framework, не
является частью этого файла. Ваш код и сгенерированный инструментами код
комбинируются во время компиляции. Таким образом, вас не обременяют тем кодом, который вам не
принадлежит.
Последняя опция в диалоговом окне Add New Item при добавлении Web-формы — это
Select master page. Эта настройка говорит интегрированной среде, что вы хотите, чтобы
520
Часть V. Создание промышленных приложений
ваша новая Web-форма использовала главную страницу для своего содержимого и
компоновки по умолчанию. Мы рассмотрим главные страницы далее в этой главе.
Добавление элементов управления на вашу Web-страницу
Элементы управления на Web-страницу добавляются путем перетаскивания их из панели
Toolbox в Visual Studio. В визуальном конструкторе страниц имеется несколько
представлений вашей формы: конструкторское, исходный код и совместное представление.
Конструкторское представление позволяет вам строить вашу форму при помощи перетаскивания в
визуальном редакторе (конструкторе). Это аналогично конструированию форм Windows.
Когда вы перетаскиваете на страницу элементы, то видите визуальное представление того,
как они будут выглядеть во время выполнения (в том числе и их взаимное расположение).
Вы можете выделить на странице элемент и использовать редактор свойств для изменения
вида и поведения.данного элемента.
На рис. 14.20 показана страница в конструкторском представлении. Обратите внимание на
панель Toolbox слева. Это источник элементов управления, которые вы можете добавлять
на вашу страницу. В центре рисунка находится поверхность конструирования. Обратите
внимание, что кнопка Save выделена. Свойства кнопки Save показаны справа. Вы можете
использовать редактор свойств для внесения изменений во внешний вид и работу элемента
управления. Эти изменения сохраняются внутри разметки страницы.
92"?К- Micrcicft Visu«! *tud ? . !z S
File Edit Viev.- Website
il'J'jiiJ ft
, Toolbg* #• 3 Ж
£ Standard
1^ Pci iter
Ll Л Label
•ы ~extB;>
1 s.' |*bl Btttcn К
| ч П LinkButtcU^ . ,
J "' Q} ImageBut >".<»:<• g
4 H\per^-ilc
1 V? C'opDcwilis*
► * Li'-Bcir
J ' ChtckBcx
J Ciecl-BaxList
я >v PeoicBurton
I Rac'ioButtciL.
Ij _J Im»ge
| <vti IrrageMap
I J Table
| • В и etedList
I HiJdenField
I * | Liteta
| * О enddf
1 _j AdPctatcr ^ ~
Ц ''>»l » Toe j
' Reaay
3i 'd Debi.
Ш^НШШШШШШШШШШ
g Fcrmat Tooli Test Window Help
~л Л ► Deb,Js ' NET
CustomerEditacpx
Edit Customer
First Narre L?st Name
Erne Phore Number
£dG ess City
Г custarrer has approved cortact via email
Г customer has approved phone contact
»ij е_Пс*Е ncSav;Inter]
.>
■# Des gn Split '»J Source 4 ' <.*4p'6j*tcn Kittcr>#8uttor
^" ' ^«.^-brtfj
- *5
» x t ,n\> ■»"■*
5 1
^ i X Г
ButtonSave System W » :
Enabled
True * J:
EnabieTh True if
< Enable* i' True IS
CnCltent I
PcitBact ii
State
|[»Uct
slr.nlD J
'colTip Jl
UseSufcrr Trut ]|
Validatioi r
Vicible Tiue 1
В
i'Expreni<
В
Height
{ Л' dth
В
(ID'
Mac
►
> * - зчм -»
ButlonSat ^ ii
Y-'ropert j!
rniniirmmttinifff
Рис. 14.20. Добавление элемента управления
в конструкторское представление страницы ASP.NET
Представление в виде исходного кода позволяет вам видеть (и редактировать) разметку,
относящуюся к Web-странице. Здесь вы также можете перетаскивать элементы управления
Глава 14. Создание приложений ASP.NET
521
из панели инструментов в редактор, но вместо визуального представления вы получаете код
разметки, который представляет собой данный элемент. Вы можете затем использовать
редактор разметки для изменения значений в разметке (в том числе и для настройки значений
свойств, и для изменения информации о расположении). Конечно, в Visual Studio для этого
работает IntelliSense. На рис. 14.21 показана та же самая страница в представлении
исходного кода. Обратите внимание, что свойства кнопки можно редактировать из IntelliSense. Это
более привычно для кодировщиков.
- * 927+4 - Micncsot* VHj*
$Ы;о „!^^ . ' ^ '' ' '
Fii-e Edit View 'Aeojit*
JI'J'JJ^
. . iodtj* -r * X
;, > Standard
- 1^ Pointer
Z A L«bel
1 ^ ш "trtBox
I i, ч«ь) Button
1 * ~J LinkButton
| ijjj InrageBUtcn
i \ H>peiLnk
1 ilf DropDcvnLiit
1 ** ListBcx
I R CheckBc*
1 CheckBo<Li*t
| (♦> PecicBi-tfon
1 RadioBcttc-iL
1 Л Im*3<
I эд ImsgeMip
1 ] T»ble
I ; - BUietedLtst
I HiddenField
1 * . Literal
1 *" Calendar
1 ч 3 AdRotetcr
1 *$lt*-y~t уЛоо\Ъ
1 Ready
*
Bu d Debug Format Tee's Test WihJca welp
i ^ *> " ' 4*J » * Debjy » NET - $
Customer befitaspx"
r-9_r«r ' ss ! ;rc*i :-:«' i a-s~
< -
' н - j.
- J - -•;•.
'A'r л ;^лг '..iuy^ii.-r; ^ -. - •
,Tt J ,}\ .v / ,t , ,<"
ОГ->
<'~:>
- -1 ; =' ч" =' ?*Vf4 > . * i>
; ^";^
""V. --r.
<d r ' <-<" - «-<л—~5, • -"- •,: | = ' "
4, <,,_^ "' " " u """ 1 „» ACCe'3»fej,
4'CRu>i ' Bcrde Ccloi
*> BrratSMe
> >/ So.ce \\ dth
,ri.v
,
л Design C3 Split .<•: Scjtce < <tat ?> -:r> 'td> <=;p Зиюг cj'bn?3u:''cn *
Lr lid Ccl 64 Ch 64
*"' *
';
-x ^
w _.
_
J <
t
1
* i
i
*
Рис. 14.21. Редактирование элемента управления
в представлении исходного кода страницы ASP NET
Третье представление появилось в Visual Studio 2008 впервые — это совместное
представление. Оно дает вам одновременно и разметку, и поверхность визуального конструирования,
причем они стараются поддерживать синхронизацию между собой. Например, если вы
сделаете изменение в представлении исходного кода, то конструкторское представление будет
стараться обновиться (или будет ждать вашего щелчка по нему для его обновления). Это
может быть очень полезно в том случае, если вы работаете одновременно визуально и в
коде (и если у вас есть большой монитор). В итоге вы гораздо меньше будете переключаться
между представлениями. На рис. 14.22 показан пример той же самой страницы в
совместном представлении. Обратите внимание, что в обоих представлениях Visual Studio знает, что
кнопка Save выбрана.
Обратите внимание, что вы можете переключаться между этими тремя представлениями
при помощи кнопок в нижней части окна конструктора формы. Здесь вы видите кнопки для
представлений: конструкторского, совместного и исходного кода.
522
Часть V. Создание промышленных приложений
Э27
* Eftit viw. V-ftbsite Б titd
\- ~~ -> *k ё
1'C С- x О. X
Standard
~ ^ Pcir *(
J. A L«ofI
-Г |*Г But*cr»
s f~ Li-uEjttsr ,
(~J^ JnageBUtcr
ч- К pet. i>
T? DirpDc-nLst
-. bst3._<.
Tj LIt kbc*
Chert Bex,. '+
FiJicBunop.
_J Image
4 ImagerVap
| ТзЫе
; EjllrtectLit
H Jde-iFiela
'«_ L»:=u
Calendar
_J Ai.=V;3tor
. . - xcolb
Dm? mar^tr lan-tles tc tei
Pebjg Fctmat
CustomertoLaspx*
Client Objects & Events
ТаЫе тоо5
WircicA
• NET
» Jk Everts)
'[selert state]
Г cjston*" has e^prcsed contact из ema
Г" cjstone' has eoptced pune cor tact
asp B. torsB..^,c За/ebAcn
i Dei gn ~i S(i * '. S»
«> margin 0»«s SHIFT с C"F
/table» -•
Ln 134
^Ь34
Рис. 14.22. Использование совместного представления для работы со страницей ASP NET
Совет
Вы можете изменить способ отображения ваших Web-форм в Visual Studio. В качестве
режима представления по умолчанию вы можете выбрать либо просмотр в
представлении исходного кода, либо просмотр в конструкторском представлении. Для этого
выберите в меню Tools пункт Options. Затем в дереве нужно выбрать узел HTML
Designer. На рис 14.23 показан пример этого окна. Раздел Start pages in позволяет вам
изменить эту настройку
Erv mm<=nt
Frojecs anc1 lutjtio
->rjrce Cent с
'e<t Editor
[Nraba:=~cols
D^bugg ng
D?4ire T->c '.
HTML Dtitg w
01 ice Toe ;
"eitTcols
Text Temp aticg
V.incobvsFcm: Des
V.ctk'ic-. Ce'iqr;
qre-
Stait page n
w Scjrce vie*.
Des gn «ir*
As i gi > jn que IDs to new ti Ыег
Auto &г/Ьсз с i«*. tch'ic.
5p it / ewsvert :alK
Рис. 14.23. Выбор представления по умолчанию для Web-страниц
Глава 14. Создание приложений ASP.NET
523
Реакция на события
Когда вы пишете страницы ASP.NET, то важно понимать, как работает модель событий.
Модель событий — это то, как происходят события на сервере, когда пользователи делают
запросы (или вызывают действия). Модель событий ASP.NET отличается от стандартной
модели событий Windows Forms, поскольку она сочетает события (которые происходят на
сервере) с Web-приложением (работающим внутри браузера).
В странице ASP.NET больше от жизненного цикла, чем от модели событий. Жизненный
цикл — это последовательность стадий, через которые проходит страница. На каждой
стадии обычно происходит одно или несколько событий. Стадии жизненного цикла страницы
ASP.NET показаны на рис. 14.24.
^
Запрос пользователе
\s
* i
^Ответ пользователю
N
Начало обрабо!ки 1
т
Инициализация страницы
>
f
Загрузка страницы
ч
г
Проверка страницы 1
и элементов управления |
>
f
Обработка событий 1
возврата формы на сервер |
>
г
Создание/сохранение информации
о состоянии просмотра |
>
1
Визуализация страницы
1
f
Выфузка страницы
Рис. 14.24. Жизненный цикл страницы ASP NET
Все стадии рис. 14.24 описаны здесь:
1. Запрос пользователя — пользователь делает запрос данной страницы.
2. Начало обработки — ASP.NET определяет, можно ли получить версию страницы из
кэша или необходимо выполнить стадию жизненного цикла страницы.
18 Зак 3716
524
Часть V. Создание промышленных приложений
3. Инициализация страницы — ASP.NET инициализирует страницу и делает каждый
элемент управления страницы доступным (в отношении кода). Однако элементы
управления в этот момент не соответствуют никакому состоянию просмотра и данные обратной
передачи не загружены.
4. Загрузка страницы — ASP.NET загружает страницу, подключает элементы управления
к информации об их состоянии просмотра и подключает данные обратной передачи ко
всем элементам управления.
5. Проверка страницы и элементов управления — после загрузки страницы она
проверяется. Это означает вызов каждого элемента управления и обеспечение срабатывания
метода Validation. И наконец, по результатам проверки настраивается свойство
IsValid для страницы.
6. Обработка событий обратной передачи — если запрос пользователя передает обратно
на страницу данные (т. е. это не простой запрос), то в этот момент вызываются все
связанные с обратной передачей события (такие как событие нажатия кнопки).
7. Создать/сохранить информацию о состоянии просмотра— ASP.NET начинает процесс
отправки ответа пользователю. Первым делом необходимо создать данные о состоянии
просмотра и встроить их внутрь ответа.
8. Визуализация страницы — на этой стадии ASP.NET генерирует весь HTML для
страницы и записывает его в выходной поток.
9. Ответ пользователю— ответ посылается назад тому пользователю, который сделал
запрос.
10. Выгрузка страницы — ASP.NET выгружает страницу и убирает ее из памяти.
По мере того как страница продвигается по своему жизненному циклу, происходит
определенная последовательность событий. Именно в эти события вы помещаете свой код. Важно
знать этот жизненный цикл для того, чтобы понимать: события; кргда они происходят; а
также что доступно вам внутри этих событий. Вы должны иметь нужный код в нужном
событии для того, чтобы выполнить нужную работу. Давайте рассмотрим основы модели
событий Web-страницы. Далее перечислены ключевые события жизненного цикла страницы
(в том порядке, в котором они происходят):
1. Page Prelnit— это первое событие, для которого вы можете писать код. Событие Prelnit
полезно в том случае, когда вы создаете элементы управления динамически,
настраиваете динамически главную страницу или динамически настраиваете тему страницы.
2. Page Ink — это событие вызывается для создания элементов управления, используемых
Web-страницей. Оно также инициализирует свойства этих элементов управления. Это
событие обычно автоматически создается интегрированной средой разработки для
настройки свойств элементов управления данной страницы.
3. Page Load — это событие вызывается тогда, когда страница загружена (после
инициализации элементов управления). Это событие часто используется Web-разработчиками. Вы
можете использовать это событие для определения, запрашивает ли пользователь
страницу или выполняет обратную передачу (отправляет данные). Затем на основе этой
информации вы вызываете соответствующий код.
Глава 14. Создание приложений ASP.NET
525
4. Control Specific Event(s) — инфраструктура страницы выполняет событие (или события),
связанное с элементом управления, который пользователь использовал* для отправки
формы (если они есть). Например, если пользователь щелкнул кнопку на вашей форме,
то вызывается событие нажатия кнопки (после загрузки страницы).
5. Page Pre Render— это событие вызывается непосредственно перед тем, как
окончательная визуализация страницы посылается обратно в браузер. Вы можете использовать это
событие для выполнения изменений страницы после вызова всех событий.
6. Page Unload — это последнее событие, которое вызывается для страницы (после
визуализации страницы). Вы используете это событие для выполнения очистки. Например, вы
можете закрыть подключения, выполненные на уровне страницы, или выполнить какое-
либо журналирование. Однако вы не можете делать изменений, которые повлияют на
ответ пользователю. Он был закончен на стадии визуализации (см. рис. 14.24).
Эти операции представляют собой основу модели событий для страницы. Имеются также и
дополнительные события для страницы. Кроме того, пользовательские элементы
управления имеют собственные события, которые вызываются во время специфичной для элемента
управления стадии события. Главные страницы также могут добавить определенную
обработку по умолчанию для всех страниц. Понимание событий страницы всегда поможет вам
при отладке.
Примечание
Дополнительную информацию по тому, что происходит внутри инфраструктуры
ASP.NET, см. в статье "ASP.NET Application Life Cycle Overview" на Web-сайте MSDN.
Эта статья дает подробный обзор того, как ASP.NET работает с запросами пользова-1
теля и как визуализирует страницы. Она также описывает специфичные для
приложений и сеансов события (находящиеся в global.asax).
Добавление обработчиков событий страниц
Есть несколько способов обеспечить вызов ваших обработчиков событий в ASP.NET при
выполнении страницы. Во-первых, вы можете вызвать их автоматически. Если вы
установите атрибут уровня страницы AutoEventwireup в значение True, то ASP.NET найдет
события, которые соответствуют схеме наименования PageEvent, и автоматически вызовет их в
соответствующее время. Этот подход удобен, но он требует от вас запоминания имени
каждого события (для правильного их указания).
Вы можете также явно привязать события страницы к методам вашего кода. При этом вы
можете использовать ваши собственные имена событий. Вы можете также позволить Visual
Studio сгенерировать имена событий. Вы можете добавить события на страницу в
визуальном конструкторе (точно так же, как вы привязываете события к элементам управления —
при помощи окна Properties). Однако для доступа к событиям страницы вы должны
находиться в конструкторе Component Designer данной страницы. Конструктор Component
Designer— это еще одно конструкторское представление страницы. Оно используется для
добавления на страницу компонентов (таких как журналирование событий). Вы можете
попасть в этот конструктор компонентов при помощи щелчка правой кнопкой мыши по
странице и выбора пункта View Component Designer. После того как вы его откроете, вы от-
526
Часть V. Создание промышленных приложений
крываете окно Properties данной страницы. Здесь вы можете нажать значок молнии для
того, чтобы отобразить все события для данной страницы. Пример показан на рис. 14.25.
На правой стороне рисунка показаны свойства страницы CustomerEdit.aspx. Обратите
внимание, что значок с молнией в панели инструментов Properties нажат. При этом
отображаются события (а не свойства). Вы можете дважды щелкнуть по событию в этом списке,
чтобы создать заглушку метода для данного события. Вы можете также выбрать метод в вашем
коде и явным образом привязать его к событию.
Fife Edit <ii*vt 'Aebstte 8'iilc1 Debug Too» Test
^ Customerf<Kt,Mpx.« (Design!* кмътШ**т',
Window Help
(► Debug
* NET • '3
CustomerEdft System Лез UI Page
в
DatiBirdirg
В <
Abort! «nsacticn
CommitTnn5»<-ticn
Disponed
Ere
To add сот por>ems to vcur class drag them fiorn the Toolbox and
use {he Properties window to set their properties To create methods
and events for your class "isck lere t*\ switch tn rode view
► * *
In tComp.ete
Page.load
LcjsdCcnplete
Preiivt
PreLoad
PiePenoei
FreReoaeiComp ete
Sev eStateC omplett
Unload
Load
Г fs when the p<agt h»t bttn leaded.
Рис. 14.25. Использование конструктора компонентов Component Designer
для добавления событий на страницу
Добавление обработчиков событий элементов управления
События в элементы управления вы добавляете аналогичным образом. Для элементов
управления не существует визуального конструктора компонентов (к счастью!). Вы просто
выбираете элемент управления на данной странице и смотрите его свойства в окне свойств
Properties. В этом окне вы можете выбрать значок с молнией для показа всех событий для
данного элемента управления. Затем вы дважды щелкаете по событию для добавления его в
ваш выделенный код.
Большинство событий, добавляемых вами в элемент управления, будут событиями типа
Action. Это события, которые основаны на действиях пользователя (таких как нажатие
кнопки). Существуют, однако, и другие события. Эти события обычно используются в
специальных целях и только разработчиками элементов управления. На рис. 14.26 показано
добавление события в действие Click кнопки Save.
Глава 14. Создание приложений ASP.NET
527
Erfi- *ie4 V.ebsite B-iild Dehjg Format Тзс'й "tit Wtrdciv H#ip
' _ " -i i]l d? £ ) U> ^ * ' ' * :>efcu9
CiftfertiEUit мр»,«* CusiemerEdiUaspx'
Edit Customer
Rist f.ane
([select st
f~ :usa>n*»' has cpproved contact vie etiait
Г" ciiscorifir has eop'c<.ed p-icre cc-ircct
NET - *
ButtonS*ve SvsteT /»еэ UI >>'*tCc-H
s
^ » к
-|;Bjttc~
BuUonSave.CIkk
Ccmnipj
1
Dat*3irdirg
]
Disposed
Jr.
Los.1
P'eFe-tcIt
Unload
Click
F'« when t'le butici is dieted
friwmHtmwftiYt*- ^ЧИГ 'IN'Ml^tomfltomPM"*"* ВИНИТИ
Рис. 14.26. Добавление события в элемент управления
Конструирование вашего
пользовательского интерфейса
Для создания хорошего Web-интерфейса пользователя требуется многое. Настолько многое,
что перед тем как начать перетаскивать элементы управления на формы, необходимо
серьезное планирование. Первым делом необходимо обдумать все варианты, потребности
пользователей, а также ваши требования к сопровождению. Затем всю эту информацию нужно
свести в некий план конструирования. Ваш план конструирования должен содержать
следующее.
□ Определить тип информации и активности пользователей, которые должен
поддерживать ваш сайт. Вы можете сделать список типов экранов вашей системы. Например,
возможно, у вас будут страницы, которые: отображают данные отчетов; позволяют
пользователям выполнять ввод данных; делают поиск, и т. д. Это поможет вам при
определении стилевых элементов, требующихся вашему сайту.
□ Решить, нужна ли вам многоязычная информация и информация о культуре. Это может
оказать большое влияние на то, как вы создаете элементы содержимого ваших страниц
(такие как метки, текст меню и т. п.).
□ Определить ключевые области вашего сайта и то, как пользователи будут перемещаться
между ними. Это часто называется таксономией сайта (или картой сайта).
□ Определить элементы, которые должны присутствовать на всех страницах. Это могут
быть элементы навигации, логотипы, элементы дизайна, информация нижних колонти-
528
Часть V. Создание промышленных приложений
тулов и т. д. Например, вы можете свести ключевые области вашего сайта в меню
верхнего уровня, которое должно появляться на всех страницах.
□ Определить стилевые элементы вашего сайта. Или, по крайней мере, определить те
элементы, которые необходимо стилизовать. Например, вы можете решить, что вам нужен
согласованный способ показа заголовков страниц, элементов навигации, кнопок,
заголовков столбцов, табличных данных и т. д. Составление такого списка позволяет вам
спланировать все заранее. Вы можете также передать этот список дизайнеру, и он
разработает стили для приложения.
□ Решить, будете ли вы поддерживать различные темы или настраиваемые пользователем
опции. Например, вы можете модифицировать ваш сайт в зависимости от пользователя,
получившего к нему доступ. Возможно, вам понадобится также разрешить
пользователю настройку компоновки и содержимого. В этом случае вам следует предусмотреть
использование портальных элементов управления.
Эти и многие другие решения составляют часть планирования хорошего пользовательского
Web-интерфейса. Продумывание таких вещей заранее с лихвой оправдается впоследствии,
когда оно сэкономит вам массу времени на ненужных переделках.
Когда у вас будет план, то Visual Studio 2008 будет готова помочь вам. Она позволяет вам
создавать главные страницы для определения общего внешнего вида. Имеются элементы
управления ссылками и меню. Вы можете поддерживать темы при помощи файлов обложек
и таблиц стилей. Вы можете даже позволить пользователям настраивать компоновку при
помощи WebParts. Следующие разделы демонстрируют множество функциональных
возможностей ASP.NET, которые используются при создании пользовательских Web-
интерфейсов.
Определение компоновки страницы
и размещение элементов управления
При создании Web-страниц важно решить, как расположить на странице элементы
управления. Это большая тема, которая продолжает развиваться. Многие Web-сайты хранят свой
макет в таблицах. Каждый элемент страницы находится в таблице, состоящей из столбцов и
строк. Другие сайты размещают элементы на странице (так, что они не двигаются). Если
элементы накладываются друг на друга (как это бывает при увеличении размера шрифтов),
то они так и отображаются наложенными. Есть и такие сайты, которые на стадии
конструирования создают страницы без всякого реального содержимого. Затем на стадии
выполнения они используют таблицы стилей (для применения макета элементов управления). И
конечно, существуют страницы и сайты, которые используют все эти способы (в зависимости
от ситуации). Следующий список описывает имеющиеся у вас варианты более подробно.
□ Flow Layout — если вас устраивает динамический характер Web-страницы в браузере,
то, возможно, вы предпочтете управление позиционированием при помощи flow layout
("перетекающее размещение"). Это означает перемещение ваших элементов управления
вместе с движением страницы. Это отличная возможность, если вы собираетесь
выполнить табличную компоновку вашей страницы и разместить ваши элементы управления в
ячейках таблицы. Все выравнивается по отношению к соседним элементам. Например,
если элемент перемещается вниз, то все, что находится ниже этого элемента, также
перемещается вниз. В Visual Studio 2008 это настройка по умолчанию.
Глава 14. Создание приложений ASP.NET
529
1 Absolute Positioning — если вы привыкли создавать формы Windows, то, возможно, вам
более привычно управлять позиционированием каждого отдельного элемента. В этом
случае вы перетаскиваете элемент на форму и перемещаете его по форме относительно
других элементов. Он будет размещен там, где вы его отпустите. Кроме того, при
абсолютном позиционировании элементы размещаются относительно их родительского
контейнера. Например, если вы помещаете кнопку внутрь тега <div> и настраиваете
положение кнопки как 5 пикселов от верха и 5 пикселов от левой стороны, то эти 5
пикселов в обоих случаях будут отсчитываться от границы тега <div> (а не страницы).
□ Relative Positioning — этот способ сочетает перетекающее размещение с абсолютным
позиционированием. При относительном позиционировании элементы размещаются по
движению страницы. Однако если вы настроите для элемента свойства top и left, то
эти расстояния будут отсчитываться в зависимости от относительного расположения
элемента на странице.
□ CSS Positioning — это более сложный вариант позиционирования. Элементы обычно
раскладываются на странице при помощи перетекающего размещения. Однако каждый
элемент имеет специфичный стиль, определенный либо на странице, либо в таблице
стилей (это предпочтительный вариант). Стиль имеет информацию позиционирования
(в том числе поля, высоту, ширину и т. п.). Настроить это несколько сложнее. Однако
после этого вы сможете легко менять раскладку страницы (при помощи изменения
таблицы стилей, а не самой страницы).
У вас могут быть такие ситуации, когда вам нужно смешать в одной странице как
перетекающее, так и абсолютное позиционирование. Например, вы можете определить
основанную на таблицах страницу, которая перетекает. А внутри ячейки таблицы вы можете
настроить элемент управления типа "панель". Этот элемент управления может быть настроен
исключительно на абсолютное позиционирование элементов внутри панели. Либо вы
можете добавить изображение на страницу, которая использует перетекающее размещение или
CSS-позиционирование. Вы можете указать, что это изображение должно быть
позиционировано абсолютно или относительно (аналогично тому, как вы встраиваете изображение в
документе Word).
Какой бы способ вы ни выбрали, вы должны быть последовательными. Вы должны
определить стратегию компоновки уже на стадии вашего плана проектирования. Все страницы
сайта должны вести себя идентичным образом (для того чтобы облегчить вам задачу его
сопровождения). Кроме того, большинство страниц зависит от других элементов вроде
страниц (таких как главные страницы и пользовательские элементы управления). Поэтому
все эти элементы следует раскладывать на странице одинаковым образом.
Настройка позиционирования элементов управления
По умолчанию Visual Studio настроена на компоновку элементов вашей страницы при
помощи упорядочения потоком. То есть при перетаскивании элементов из панели
инструментов в визуальный конструктор они будут размещаться относительно друг друга. Если вы
используете для компоновки вашей страницы сетку или CSS-позиционирование, тогда это
вам подходит. На рис. 14.26 показана страница с упорядочением потоком (использующая
сетку).
Вы можете встретить такую ситуацию, когда вам понадобится абсолютное
позиционирование элемента на странице с упорядочением потоком. Предположим, что на рис. 14.26 мы
530
Часть V. Создание промышленных приложений
хотели встроить логотип нашей компании на правой стороне страницы. Мы могли бы
попробовать вставить его в сетку, но скорее всего из этого ничего не получилось бы,
поскольку элементы быстро теряют выравнивание. Вместо этого мы можем выделить изображение
и в меню Format выбрать пункт Position. После этого появится диалоговое окно Position
(рис. 14.27).
* .NET
File EJrt View V*ebsrte EjKc Drbjg Fennel T>bfe TooJs Teit ".VirvdoA Heip
<J' , • J A «Jf 4 ~Л Л ** " ' <*J • r Debug
\_ s Custom«rt<fit^»px* 4Abi<
f Edit Customed
=trst Name
.t
Г custome» hes approved q]
Г custom*: hes app-cved d| L*atonara tat
vmnosol
Pus\sar <
Ж
'v'yiappngsUke
Ncc*
П
Мете
'□
left
a
n
□
; Top.
; Bottom
* He git:
L-.
OK
{ЭСЗэх
>* :
.78px *
CwrceF
-*Гесрг ci Sp'it <b Sojrce ч <hSTl.>! <Ьс*>> <*зсг*Ьгт<1 >
3»<»g nai^ir handfet to resiie mergm» Press SHIR с CTRL fc-nce options.
Рис. 14.27. Настройка абсолютного позиционирования для элемента на странице
с упорядочением потоком
Диалоговое окно Position позволяет вам указать позиционирование на странице для
выделенного элемента. Вы видите, что это аналогично позиционированию графики в документе
Word. Вы выбираете стиль переноса и стиль позиционирования (в данном случае это
Absolute). He беспокойтесь об указании информации о местоположении. Вы можете
изменить ее простым перетаскиванием элемента.
На рис. 14.28 показано перетаскивание этого же элемента по странице. Обратите внимание,
что интегрированная среда показывает вам вертикальные и горизонтальные центры в виде
линий в визуальном конструкторе. Это помогает вам выравнивать элемент. Если вы
выравниваете кнопку или текстовое поле, то интегрированная среда будет показывать вам также
индикаторы полей и расстояний.
Если вы собираетесь использовать абсолютное позиционирование для всей страницы, то
вам наверняка не захочется вручную выделять каждый элемент и задавать для него
Position в меню Format. Это было бы действительно утомительно. Вместо этого вы
можете настроить опцию, которая подскажет Visual Studio, как по умолчанию добавлять
элементы управления на страницу. Вы настраиваете это в диалоговом окне Options
(Tools | Options). Здесь вы переходите в узел HTML Designer | CSS Styling. На рис. 14.29
показан пример. Вы видите выделенный флажок выбора. Выбор этого флажка означает,
Глава 14. Создание приложений ASP.NET
531
что с этого момента все элементы управления должны добавляться на страницу при
помощи абсолютного позиционирования.
*9?>
File
Edrt View "Aebsrt* Build Debjg Format Table Т00к 'e3t Winder Hep
_J ' J *J Ш * Л Л - « |У • . * Debug - NET
CuttonwrfdfUfp*" ^oit^MMKt*
Edit Customer
Rrsl Name
Ema.l
Г" customer has approved contact vie email
Г customer has approved pnone contact
| Save | | Caryl
Last Name
Phone Njmber
City
Stat* Posts! Code
I [select state] j^l
l.
comoso
!-♦ Des gr П Split J'J Sojrte -< *htrrl>i <bcdv» <fsrr»*far«I >
left 512px, top 225pa, width. 130p>; height 78ря
Рис. 14.28. Абсолютное позиционирование элемента
Opt on?
* Environment
| Projects and Solutions
Scarce Cent'ol
Text Editor
j Database Toots
Debugging
> Device Too'i
л HTML Designer
General
CSS
CSS Styling
RL.erandGrd
View
Office Toots
"est Tcols
Text Templsting
Winoovvs Fcrms Designer
•- Workflow Designer
Style Appi:c»tion Mode:
» Manual Style Appliciticn
Ajta Sty'eApp' c»tic~t
, ] Узе width end height attributes fer image instead c* CSS
J Use shorthand properties v/hen generating ity'es
V Change positioning to absolute for centre!» adced using Toolbo, paste crdisg ;
and drop
Рис. 14.29. Выбор абсолютного позиционирования
для всех добавляемых на сайт элементов управления
Когда вы выполняете компоновку страницы при помощи абсолютного позиционирования,
то все элементы должны быть помещены на свои точные места. Поэтому вы должны
позаботиться о полях и расстояниях. Например, на рис. 14.30 показано начало создания
страницы с абсолютным позиционированием. Здесь кнопка Cancel размещена справа от Save и
532
Часть V. Создание промышленных приложений
ниже текстового поля First Name. Вы видите индикаторы полей. Однако если необходимо
будет добавить дополнительные элементы между текстовым полем и кнопками, то придется
перемещать каждую кнопку. При упорядочении потоком элементы просто сместились бы
(или вы вставили бы в таблицу новую строку).
File Edit View Website Bjifo Debag Foimrt Table Tcoli Teit Window Help
Cl'-j'J'JJlbJI^i-»-**'''^!'' ► Debug - NET - £
_j AbfotutePaiifpx ■-■ X
Edit Customers
1 v ■
1 ч
i j
H
1 -
1 i
ix
[/'
1 **
1 Peadi
-irst Nam* L*st Name
_s?p> В(Д«Л*ЁиП?пСтсе1
f о*ч* ~| q Ci< )c^f>Np
9—«4«S
JCes.gr "HSpit "i Source '« 'n«H> <bcdv> -
fcm**'3Hil> <р>
Ln33
<as3 8jt*cn bj*tap*6jnar >'
Col 29 Zb 19
■ s i
lt 1
t i 1
= 1
I
J
Рис. 14.30. Создание целой страницы при помощи абсолютного позиционирования
Когда элемент на странице позиционирован абсолютно, то визуальный конструктор просто
меняет "за кулисами" стиль элемента. То есть он настраивает подробности
позиционирования для каждого элемента при помощи стилевого тега. Например, следующий код
показывает разметку для одного из текстовых полей рис. 14.30:
<asp:TextBox ID="TextBoxl" runat="server" CssClass="inputBox"
style="z-index: 1; left: 275px; top: 91px; position: absolute">
</asp:TextBox>
Здесь вы видите, что атрибут position устанавливается в значение absolute, задается
также положение слева и сверху. По этой причине порядок следования элементов в коде
разметки страниц с абсолютным позиционированием не совпадает с их порядком на экране.
Они размещаются в коде разметки в том порядке, в каком они добавляются на страницу.
Обратите также внимание на то, что в коде указано нечто под названием z- index. Это
позволяет вам делать в вашем выводе слои. Каждый элемент находится в слое (в данном
случае в слое 1). Слои могут перекрывать друг друга.
Примечание
Набор функциональных возможностей абсолютного позиционирования в Visual Studio
2008 отличается от того, который был в версии 2005. Например, в версии 2008 вы
Глава 14. Создание приложений ASP.NET
533
больше не сможете выделить несколько элементов в визуальном конструкторе Web-
форм, чтобы работать с ними как с одной группой. Кроме того, нет больше опций
меню Format для того, чтобы сделать размер нескольких элементов одинаковым, или
для выравнивания их друг с другом. Кроме того, не все элементы при перетаскивании
из панели инструментов автоматически реализуют абсолютное позиционирование.
В то время как текстовые поля и кнопки делают это, метки и флажки выбора — нет.
Для этих элементов вы должны вручную установить абсолютное позиционирование, а
уже после этого вы сможете работать с ними в визуальном конструкторе.
Мы подозреваем, что причин такого уменьшения поддержки абсолютного
позиционирования может быть несколько. Первая причина состоит в том, что фирма Microsoft
переписала ббльшую часть движка позиционирования (для повышения его
совместимости с CSS). Вторая состоит в том, что абсолютное позиционирование несколько
вышло из моды. Ббльшая часть новых сайтов создается при помощи упорядочения
потоком (с сетками) или при помощи CSS-позиционирования.
Создание общего внешнего вида
Когда вы создаете Web-сайт, то вы хотите, чтобы все его страницы выглядели так, как будто
они принадлежат одному приложению. Навигация должна быть стандартной, цвета и
шрифты для аналогичных элементов должны совпадать, а размеры должны быть согласованными.
Пользователям при переходе с одной страницы на другую не должно казаться, что они
прыгают по разным сайтам. Кроме того, у вас не должно быть необходимости управлять такой
согласованностью всех страниц вашего сайта вручную. Это было бы исключительно
утомительно в том случае, если бы вам, например, вдруг понадобилось изменить внешний вид
всех кнопок сайта.
К счастью, у вас есть инструменты для поддержания согласованного внешнего вида страниц
и для облегчения управления ими. Visual Studio 2008 предоставляет расширенную
поддержку создания стилей, управления ими, а также применения их к вашим страницам. Кроме
того, на уровне сайта вы можете использовать таблицы стилей, главные страницы и темы.
Давайте рассмотрим все это.
Стили и основы таблиц стилей
Стили и таблицы стилей позволяют вам определять общий дизайн и поведение. После этого
вы можете применить этот общий вид к элементам вашей страницы и приложения. Таким
образом, если вы решите что-то изменить, то должны будете сделать это в одном месте —
и изменения произойдут во всех местах, где используется данный стиль.
Встроенный стиль
Стиль просто определяет вид данного элемента. Вы можете создать встроенные стили,
которые используют атрибут стиля данного элемента формы для указания того, как этот
элемент выглядит. В следующем коде имеется встроенный стиль, который настраивает для
метки шрифт, размер шрифта и цвет:
<asp:Label ID="Labell" runat="server" Text="Edit Customer"
style="font-family: Arial; font-size: large; color: Blue">
</asp:Label>
534
Часть V. Создание промышленных приложений
Встроенные стили ничего не дают в смысле повторного их использования. Наоборот, вы
должны определять стиль для каждого элемента на каждой странице. Это может быть
допустимо в некоторых исключительных обстоятельствах. Однако если вы хотите
поддерживать сходство аналогичных элементов на похожих страницах, то ситуация быстро станет
неуправляемой. В этих случаях лучше абстрагировать определение стиля от самого
элемента. Вы можете сделать это при помощи помещения определения стиля в стилевой класс.
Стили уровня страниц
Стилевой класс может быть определен в одном из двух мест: на самой странице или в
таблице стилей, связанной со страницей. Если вы определяете стилевой класс в самой
странице, то он применим только к этой странице (но не к остальным страницам сайта). Стили,
определенные на уровне страницы, встроены в раздел <head> кода XHTML. Например,
следующая разметка абстрагирует уже обсуждавшийся ранее стиль в стиль уровня
страницы:
<head runat="server">
<title>Edit Customer</title>
<style type="text/css">
.titleText
{
font-family: Arial;
font-size: larger-
color: Blue;
</style>
</head>
Для применения этого стиля к элементу формы вы настраиваете его свойство Class или
CssClass (для элементов управления ASP.NET) так, как показано здесь:
<asp:Label ID="Labell" runat="server" Text="Edit Customer"
CssClass="titleTextMx/asp:Label>
Стили элементов (правила стиля)
Вы можете создать правило стиля для элемента HTML. Это правило стиля будет затем
автоматически применяться ко всем HTML-элементам данного типа (и соответствующим им
эквивалентам ASP.NET). То есть вам не нужно присваивать стиль элементу; он просто
выберет стиль.
Предположим, что вы хотите управлять тем, как выглядят гиперссылки вашего сайта в тот
момент, когда пользователь наводит на них указатель мыши. Для этого вы можете
определить стиль внутри таблицы стилей для поведения тега анкера при наведении курсора
(A: hover). Внутри стиля вы можете настроить цвет, название и размер шрифта. Вы можете
также выключить подчеркивание при наведении пользователем курсора на ссылку. После
определения этого стиля вы применяете его к странице. Все теги анкеров на странице после
этого будут использовать данное определение стиля.
Глава 14. Создание приложений ASP.NET
535
В следующем коде показан пример:
а:hover
{
font-family: Tahoma;
font-size: lOpt;
color: #0099FF;
text-decoration: none;
}
Таблицы стилей
Таблица стилей представляет собой файл, содержащий набор стилей, которые должны быть
применены к странице. Таким образом, вы можете абстрагировать все ваши стили
страницы, централизовать их и управлять ими как группой. Файл таблицы стилей имеет
расширение ess. Внутри этого файла вы можете добавлять стили элементов и ваши собственные
классы стиля. Код этих стилей похож на тот код, который мы уже показывали.
После определения таблицы стилей вы связываете страницу с таблицей стилей. Вы можете
сделать это при помощи перетаскивания таблицы стилей на визуальный конструктор форм
или посредством добавления следующего кода в раздел <head> страницы:
<head runat="server">
<link href="StyleSheetMaster.ess" rel="stylesheet" type="text/css" />
<title>Edit Customer</title>
</head>
Визуальный конструктор Visual Studio при конструировании будет показывать применимые
стили. Та есть во время конструирования вы можете видеть, как будет выглядеть ваше
приложение.
Набор инструментов для стилей
Итак, мы рассмотрели основы стилей и таблиц стилей. Конечно, есть еще много вопросов
по созданию стилей, управлению ими и применению их к вашему сайту. К счастью, Visual
Studio имеет несколько встроенных инструментов для помощи в работе со стилями. Давайте
изучим эти инструменты.
Создание таблицы стилей
Вы можете добавить одну или несколько таблиц стилей в приложение при помощи
диалогового окна Add New Item (см. рис. 14.19). Вы можете открыть таблицу стилей в редакторе
кода Visual Studio. При этом Visual Studio предоставляет вам панель инструментов Style
Sheet, меню Styles и фактическое содержимое таблицы стилей. На рис. 14.31 показаны все
эти элементы.
Средняя панель рис. 14.31 показывает содержимое таблицы стилей. Вы можете
редактировать здесь таблицу стилей вручную. Конечно, возможность редактирования требует от вас
приличного знания CSS. К счастью, технология IntelliSense готова вам помочь. Как и во всех
остальных случаях, чем больше вы работаете с ней, тем лучше вы становитесь знакомы. Вы
536
Часть V. Создание промышленных приложений
можете также щелкнуть здесь правой кнопкой мыши внутри стиля и получить доступ к
созданию стиля (при помощи диалогового окна Modify Style — об этой теме чуть позже).
Панель инструментов Style Sheet имеет несколько кнопок. Первая слева запускает
диалоговое окно Add Style Rule. Вторая открывает диалоговое окно Modify Style.
Следующая кнопка позволяет вам просматривать результаты в окне браузера. И наконец,
раскрывающийся список позволяет вам указать тот стандарт CSS, под который вы хотите
делать разработку.
• F ie Ed't V е*ч Website Build Debug Tools ■ est Styles vVindcw Heip
| <il ' JJ ' J A S & -*й 'Л ^ * ' ^ * ► Debug
I » ty Build Style... CSS 2.1 • _
i
| I j StyieShe*tMastevxss
"
: 4J
l ,; Taiioira;
ICtt;
< : л*>10гл;
• iert;
: bcl'J;
.wli-;
1ont-f»m3y
- -/-' "J
• a
. s-. : i
pat£--c '
A f cnt face name sequence | inherit!
J ч# Syilem *• \
4Ъ™™?тщщшшщшшшшшш
1 4 Tempus SenL^rC 1
■4 Terminel
j -# Time: New Porran
Ready
Рис. 14.31. Работаем с таблицей стилей в интегрированной среде разработки
Создание стиля
Вы можете писать код стиля непосредственно в редакторе или вы можете использовать для
этого диалоговое окно Modify Style. В Visual Studio 2008 диалог Modify Style был
расширен для обеспечения улучшенного доступа к основным атрибутам стиля. Этот инструмент
генерирует правильную разметку для вашего стиля.
Вы можете получить доступ к диалоговому окну Modify Style при помощи: щелчка
правой кнопкой мыши внутри существующего стиля; посредством выбора пункта Build Style
в меню Style; щелчком по кнопке Build Style в панели инструментов Style. На рис. 14.32
показан пример. Этот рисунок показывает разные варианты управления шрифтом в стиле.
Диалоговое окно Modify Style имеет много других опций, таких как фон, таблицы и
рамки. Кроме того, элементы Layout и Position позволяют вам управлять работой
позиционирования CSS.
Глава 14. Создание приложений ASP.NET
537
Нажатие кнопки ОК в диалоговом окне Modify Style сохранит все ваши изменения в
таблице стилей. Изменения сохраняются в таком виде, как они видны в поле Description в нижней
части диалогового окна.
> Category.
Bteck
Background
Border
Box
Position
Layout
ll«t
Table
■ fort-family'
Vrt-ase'
wit-woyit.
font-stye;
fort v«rwnt.
text-tr «re form.
ctibc.
tanonia
1С
#003399
text decors tiwi.
jndclre
OVe'll'*
AeSuY/GgLU]
fontfamiy taroma; 'br.t-stie- lCpt, color «COli^badcgrojnd-cocr *FFFFFF bed*
jlpx sokd #CCCCCC, w-сзг 250p*, height: aclo
Рис. 14.32. Создание разметки вашего стиля
Создание правила стиля
Правило стиля определяет стиль для элемента или класса. Вы можете создать новое правило
стиля при помощи набора его непосредственно в редакторе (конечно, соблюдая при этом
правильный синтаксис). Вы можете также определить правило стиля при помощи
диалогового окна Add Style Rule.
Define a new style rutt by adding at least one element, class, с г Шб element Addition*, elements.
|| classes, and ID d elements can be combined to create a h erarchy
# Element
л hover
<,y?w.'t,
Style rule nierarchy
Style rule preview:
rhover
OK | Ctrx*
Рис. 14.33. Добавление правила стиля
538
Часть V. Создание промышленных приложений
Вы можете получить доступ к этому диалоговому окну при помощи: щелчка правой
кнопкой мыши в панели редактора таблиц стилей; щелчка по самой левой кнопке панели
инструментов Style Sheet; посредством выбора пункта Add Style Rule в меню Style. Это
диалоговое окно полезно в том плане, что в нем имеется список множества HTML-элементов, для
которых вы можете определять стили. Оно также позволяет вам определять иерархию
стилей. На рис. 14.33 показан пример.
После нажатия кнопки ОК стиль сохраняется в таблице стилей. Вы можете затем
редактировать содержимое стиля точно так же, как и при создании стиля.
Управление стилями
Visual Studio 2008 теперь имеет новую панель Manage Styles. Эта панель позволяет вам
видеть стили для данной страницы, создать новый стиль, прикрепить новую таблицу стилей,
применить стиль и т. д. Это делает применение стилей к вашей странице плавным и
быстрым процессом.
Вы можете получить доступ к панели Manage Styles из меню View (View | Manage Styles).
По умолчанию панель загружается на правую сторону интегрированной среды разработки.
На рис. 14.34 показана панель Manage Styles, загруженная для страницы EditCustomer.aspx.
File
J
\~s
V
-.
' -
1 '-'
1 "
I V
%
\ '
Edit tfiewr VVebsfte EjiIo D*b «j Formal Table Tcoi "est Winder
• _j ' J SaJ *# Д *> » ^J - > Deoug • NET
3y№h«*tUMtmAK CitttomerEdikasp* ▼ X
;to t tit
Edit Customer
=irst Name Las: Чете
Ema Phon* Njrvbe'
Address Oty Stste
[[select sta-
Г customer hes asp'eved contact via email
Г customer hes apprcved p"icne antact
J --is? J | С«ГС<=1 J
л Ces gr Split "i Sojrce i -ал ^mle> ':r> «'dti'ft' *•
у Ln 24
Hep I
' 3 -
S~t%t<A>t~ * Z X
, *4 Г£ Су* Opftcrs ▼ j
Aj A w, .*,<-*
CSS styles ~ ,
- yt*4ebhe*tn.s*tei c** -
i bod/
* э 1-е t ~ j
"T
t*l*Tt<*
;cnt fan-1!/ A ial
color Ebe |
Selected *tyte preview 1
AdB&YyGgLLj
Рис. 14.34. Управление стилями вашего сайта
Здесь необходимо отметить сразу несколько обстоятельств. Первое — это то, что панель
показывает все стили для страницы. Сюда входят и те, которые определены на странице, и
те, которые связаны со страницей через таблицу стилей. Фактически вы можете
перетаскивать элементы (которые определены на текущей странице) в таблицу стилей и обратно.
Visual Studio перенесет их код. Обратите также внимание, что вы можете видеть предвари-
Глава 14. Создание приложений ASP.NET
539
тельное представление выбранного стиля. Если вы наведете на стиль курсор, то получите
его определение.
Seectu пел 51/lei
Define in Cwentpage
'-'] fontfamK W
ВасУасьгс
Butcer
Pnrtcu
LavoJt
Vit-wetg^t:
fcnt style:
fa-it^'a'ia-it
tsxttancfanr
Ap? t гел style to cbcunent selector
undedre
i^'erf re
it e-trough
none
Aa3bYvGgLL'j
Рис. 14.35. Диалоговое окно New Style
- ^ZyH- VUct0jsfcV$u$5$U,dt0
IP
File EJit v'lew Website Build Deb jg Fernet Tjbfe Tcots Test tfrmbov/ Че о
;,'J'J^ *» • Г* - - ' » 3ebjg ^ NET
1» St/ve5*,«l.M«stef>s« CustorowEdhjisp*
'" U sfi*ii4
Edit Customer
-irs: Ham*1
Phone Umber
Г customer las approved corsact via email
Г rustoner nas app^o/ed phone coricc:
► l>e:igr CJ Spfrt -it Socce
<hlrr)> <"socfy
State
[[select st;
CSSstytes-
; utie
> button
x l'1DUt£CX
л a he % <v
л .htteTe^
, * X
0?ЬЗП5 ж
App Ct/fe
Qc ToCctlt
New St, e
NevvSt. *Cop>
Moa -y Sr> ie
Delete
Alta.TSty c"lieet
AaiSfcYytSgUJj
fc
Рис. 14.36. Контекстное меню для стиля
540
Часть V. Создание промышленных приложений
Кнопка Attach Style Sheet позволяет вам выбрать существующую таблицу стилей и
прикрепить ее (привязать) к странице. Нажатие кнопки New Style открывает диалоговое окно New
Style. Это версия уже обсуждавшегося ранее диалогового окна Modify Style. Обратите
внимание, что верхняя часть диалогового окна отличается. Здесь вы можете указать то место,
где вы собираетесь определять ваш новый стиль (Current Page | New Style Sheet или
Existing Style Sheet). Пример показан на рис. 14.35.
Кнопка Options (верхний правый угол панели Manage Styles) позволяет вам фильтровать
показ стилей в списке. Есть варианты категоризации стилей по элементам, типам и порядку.
Вы можете также указать, что вы хотите видеть: все стили; только те, которые
использованы на текущей странице; только те, которые использованы внутри выделенных в данный
момент элементов страницы.
Наконец, вы можете щелкнуть по стилю в меню правой кнопкой мыши и выполнить одну из
многих операций. Они включают: применение стиля к выделенному в визуальном
конструкторе элементу; переход к выделенному коду стиля. Вы можете также модифицировать
стиль, удалить его или создать новый стиль копированием выбранного. На рис. 14.36
показаны варианты контекстного меню для стиля.
Применение стиля
Есть много способов, которыми вы можете применить стиль к элементу страницы. Вы уже
видели некоторые из них. В предыдущем разделе вы видели, что можете выделить стиль в
панели Style Manager, а затем выбрать опцию Apply Style из контекстного меню (рис. 14.36).
Есть еще похожая на Style Manager панель под названием Apply Styles (View | Apply Styles).
<? 927U - Mtcrc:c4 v'sj*$ Stjdie^
File Edit view Wcciite Build Debug F
I » Styfc$h«t!vt?5ter.w Cu«lom*rl<ftt.ajpx
7 Edit Customer
4 First Narte
j? Address
Г* ciiSCOTier las approved contact va en ail
Г cbstoTier las approved p'rore contact
asp 3utt3i>~5ut:c5a cbuttcn
ijliffl?
^dbie Tools Test Wtrdow
fr Debug » NET
- X
Fbore Number
j [select st«
Help
AA N*w „U-lft,
Select CSS style to apply:
Clear Styles
• .title
'Щг-
ioi:bo;
button
- CurreatPe* 'orw-familv Tanoma
. ron-sze iOpt
> tltleT< color «003395
I b«cko'ouad relet «FFFFFF _
j border thinno9e*ft.33», *
л А\*\. SOpv
height 25p<
» Desicjn . ~i Spirt ".. Scjrce i <'c> *»;p8u£ci bL.rtc->*5ut:cp > p д, Appv St>les 4M 'чt,»c? Cv i"s
Рис. 14.37. Применение стилей при помощи панели Apply Styles
Глава 14. Создание приложений ASP.NET
541
Панель Apply Styles ведет себя аналогично Style Manager. Разница в том, что вы можете
видеть визуальное представление стиля в самом его названии. Это показано на рис. 14.37.
Вы просто щелкаете по названию стиля для применения его к вашему выбору.
Еще один способ применения стиля к вашим элементам — это сама разметка. Хорошая
новость состоит в том, что внутри IntelliSense доступны как стили, определенные на странице,
так и стили в связанных таблицах стилей. Это показано на рис. 14.38.
И наконец, вы можете также настроить стиль элемента внутри окна свойств Property.
Просто выберите элемент и посмотрите его свойства. Свойство CssClass даст вам выпадающий
список всех стилей, доступных для данного элемента.
File Edit View Website Biiild Debug Fcffi«t Tocis Test VYindo* <->t'p
Л ' _ • J A A* A »i k1' - ^ ' t ^ebug - .NET
L_j' %leS***tM«st*.c» СийотегЫКлрх
~ (Sent Objects & Events ▼ (Ne Events)
-«-4- л ,„»• 4tyi*;-^ ->^
':xl>
ser"cr*' - '»4ici-."
irtpjtBox
'iUe
titleTe*t
w« Dei дг 3 Split ■.") Source 4 «"body* <*&.T**<cir.» <0v> <-*вЬе>.! -ti > <;d> <espSu**e»v*Su~c->!ia,e>
Dreg rwgir Indies tc resire rrurgir* Ргем SHIFT cr CTR Ln §9 Cof 34 ' Ch S4
* §
Рис. 14.38. Использование технологии IntelliSense для выбора вашего стиля
Редактирование стилей
Редактировать стили можно различными способами. Вы можете просто щелкнуть правой
кнопкой мыши по коду и выбрать пункт Build Style для того, чтобы открыть диалоговое
окно Modify Style. Кроме того, для редактирования стилей Visual Studio 2008 имеет новую
панель CSS Properties (View | CSS Properties).
Панель CSS Properties позволяет вам видеть все свойства данного стиля в редакторе
свойств. Это показано на рис. 14.39.
Обратите внимание, что выделено текстовое поле. Панель CSS Properties показывает
правила и стилевую информацию для выделенного элемента. В этой панели вы можете
редактировать свойства данного стиля. Произведенное здесь изменение стиля применяется везде,
где определен данный стиль. В данном примере редактируется стиль .inputBox, опреде-
542
Часть V. Создание промышленных приложений
ленный в файле StyleSheetMaster.css. Изменение будет немедленно отражено в окне
визуального конструктора. Оно будет также сохранено в ess-файле.
* "С
File
Z
Li
'-
2
fc>
'X
z
. -
seart
riS-vJKizs-k /»s-* :*Лп
Eel t Vw Wecjte Ejild Dekjg fcrmat Table T
'J'JilJ ^ ' ' *
Sty sSheetMartebcss* Customer E<ftLaspx*
Edit Customer
"asp fext3o**Text3oKFHStNam*»TOt3oxl *-** Кзгге
f r^—i
E-nia Phone Nvirpjer
Add'ess Cty
Г" enstcrfer hes approvec cor act via en ail
Г с tstcrrer hes apsrovec phone coriact
| s.«. || c~. |
i Des gn — Sp t -i SoL'ce 4 «asc'V Ег< inp.uEs
'
ools
Debjg
/«'ev.
Test W ndcA-
♦
State
{{select
\ET
■»• X
3t3t
Help
'
Applied 3jie s
bocV
s. n me sHe >
rpLtSox
CSS Pf->perbes
- *4»»t
color
four family
font-slvl*
♦ brt
r-nt star к
<oi\: e»3it
♦'H-deaxa'-c^
evt «.'ansfoim
- iteck
И+* specrg
Ine-heij-it
text «tan
tert-r>dent
ertnal akyi
«tote-space
",ord spacng
- —
3
{<•} 1> 1
;
Stwary ^
«body »
«rtabte* £ !
<asp Texti?<-*sText - |
i
Ш *cc::ss
taho^a
гог~з1
^ rher•
i
Рис. 14.39. Редактирование стиля при помощи панели CSS Properties
Главные страницы
Главные страницы были впервые введены в Visual Studio 2005. Они позволяют вам
визуально конструировать общий вид вашего приложения в одном файле, а затем использовать этот
вид в других файлах. Таким образом, вы можете централизовать такие вещи, как навигация,
верхние и нижние колонтитулы. Кроме того, когда вы создаете страницу из файла главной
страницы, то Visual Studio одновременно отображает в визуальном конструкторе
содержимое обеих страниц. Это помогает разработчикам видеть создаваемую страницу в контексте
всего сайта.
Создание главной страницы
Главная страница добавляется в проект при помощи диалогового окна Add New Item. Вы
можете иметь в своем приложении много главных страниц. Эта возможность особенно
полезна тогда, когда ваше приложение имеет несколько компоновок по умолчанию (для
разных областей сайта). Обычно главная страница содержит общую навигацию, общую
графику и общий нижний колонтитул. Вы можете также вкладывать главные страницы одна в
другую (подробнее об этом далее).
Главная страница определяет основной код HTML для страницы. Сюда входят:
открывающие и закрывающие HTML-теги, заголовок, тело и форма. Внутри главной страницы есть
Глава 14. Создание приложений ASP.NET
543
один или несколько элементов управления ContentPlaceHolder. Эти элементы управления
указывают те области на странице, куда страницы содержимого (производные от главной
страницы) могут размещать свой контент.
Совет
Вы можете добавить к главной странице таблицу стилей. Таким образом, все
страницы, которые используют главную страницу, будут также связаны с таблицей стилей.
Главные страницы имеют также собственный файл выделенного кода. Этот файл должен
содержать весь код, который относится к функционированию самой главной страницы. Если
на странице есть работающие элементы управления (например, меню), то их код должен
оказаться внутри этого файла выделенного кода. Кроме того, главная страница имеет свой
набор событий (точно так же, как и стандартная aspx-страница).
На рис. 14.40 показан пример главной страницы. Обратите внимание, что эта главная
страница скомпонована как сетка (при помощи упорядочения потоком). Ячейка в центральной
строке содержит элемент управления ContentPlaceHolder. Это единственное место, где
страницы содержимого (использующие главную страницу) могут добавлять свой контент.
Edit Vie* vVebsrte Build DeDug сгчгм1 Toes Te'i Wide a HHp
' _ ' _' *J 30 & ) - " ** Debjg
StyleShe^tMaster tit SiteM*ster.irwster*
coiifoso
Customer Manager
Irstr'jcttcns...
Г id ■.">..•'tor'->r
"J Sc u'ict Э2714 ч2 prriects'i
i >CV.\92714\
f_'^J Jfc С Ci,stomerVlaP5gerv
* & ■op.-heme:
CjsT-.r->* Ecbt =:p<
^ С jstc r->e Edit -ip< iz j <
Се*'аиК aspx
^* SrteMa^er master cs
&i StvfeSheelMastet ess
^> web ro'ifig
3 p-C tturt of ContOJ
i Design ~i Spirt ► Scjrce
„ iSolut en Explcer jjP*:
If
Рис. 14.40. Создание главной страницы
Создание страницы содержимого
Пользователи не имеют прямого доступа к главным страницам. Они вызывают страницы
содержимого, которые производны от главной страницы. При этом .NET комбинирует
содержимое обеих страниц и возвращает единый ответ (как будто есть только одна страница).
544
Часть V. Создание промышленных приложений
Страница содержимого создается посредством выбора главной страницы при добавлении
Web-страницы на ваш сайт. При этом в нижней части диалогового окна имеется флажок
Select master page (см. рис. 14.19). Выбор этой опции представит вам все имеющиеся
главные страницы вашего приложения.
Когда ваша страница содержимого откроется, вы увидите на заднем плане содержимое
главной страницы. На переднем плане будут находиться элементы управления Content-
PlaceHolder. Именно сюда вы будете добавлять специфичные для вашей страницы
элементы управления. Таким образом, обеспечивается разделение функциональности между тем,
что принадлежит вашей странице, и тем, что принадлежит главной странице. Работать со
страницей можно точно так же, как и с любой другой Web-страницей ASP.NET. Добавляйте
элементы управления на форму и пишите код событий в файле выделенного кода.
Примечание
Раскладка и позиционирование элементов управления могут быть важны при работе с
областями содержимого. Например, если вы включили абсолютное
позиционирование, то указатель места размещения содержимого является просто подсказкой. Из-за
характера этой опции позиционирования указатель места размещения не может
воспрепятствовать вам разместить ваши элементы управления где угодно на странице.
Опция же упорядочения потоком имеет обратный эффект. Элементы управления
будут разрешены только внутри областей содержимого (если они не помечены как
абсолютно позиционируемые).
Пример показан на рис. 14.41. Эта Web-страница была создана для редактирования профиля
клиента; она основана на главной странице приложения. Обратите внимание, что страница
содержимого имеет такое же расширение, как и любая Web-форма (aspx).
File
J
г*
-
bi»'
j
:>
Reach
E iit view Website
' _-. * w od *tf
iA '*" ] Z sf
Bjild Debug Fernet Table To^s Tert vVindc* Help
Л ^ ' ' >P * * Otbuq ' -NET ' 3
CurtemerEcwUsp* CustomerbtttZaspx" &}M*wetM*4ter,cs5 SrteMsstermwtw1 w x
_ :*'-l«t«vns3ter
conloso
Custxttiter Manager
Ш^^^Ш
И^^^В^^Ш^ш
^^^жг ?^И
Щ^Шя^ш&ЩШ^^ш
•4 Design a Split '»
*
Hnd C^stJtr*»( Mev* Cus'ctf ei mi d С cei f«>„\-Ок1е*
,Co-4_»>r-.e-'3ldf'i<C s^'^JtdtttJ»]
Edit Customer] ^
First Nam*» Las: Чвте
. Ena» P^one Number
Address City State Postal Code
| [select state] jrj
Г customer has ppp-oved contact via *тяН
> Г customer hes approved phone contact
сач'с I Сиро? |
„ ~ ~ . „ . .
Sojrce < <sip,Ccntsnt*Csrterf2» <ak<> <table>| <*.t> i*tdtkle'> ►
if "
;
У
-*
Ц
[
i
i
i
l
i
t
)
Рис. 14.41. Создание страницы содержимого
Глава 14. Создание приложений ASP.NET
545
Совет
Вы можете использовать объект Master для ссылок на главную страницу из файла
выделенного кода вашей страницы содержимого. Предположим, что вы хотите
настроить текст указаний с главной страницы внутри каждой страницы содержимого.
Вам нужно будет найти элемент управления, используемый главной страницей для
текста с указаниями. После этого вы сможете настроить соответствующее свойство
этого элемента управления. Код для поиска элемента управления на главной
странице будет выглядеть примерно так:
Label lb = (Label)this.Master.FindControl("LabelInstructions");
Вкладывание главных страниц
До версии 2008 у вас мог быть только один уровень главных страниц. Вы не могли
вкладывать одну в другую и просматривать полученные результаты в визуальном конструкторе.
Visual Studio 2008 такой вариант поддерживает. С ее помощью вы можете создать главную
страницу. Затем вы можете создать другую главную страницу и выбрать главную страницу,
от которой она наследует. Таким образом вы создаете иерархию главных страниц. Простой
пример вложенной главной страницы см. в главе 1.
Темы и обложки
Концепцию тем для Web-страниц и всего Web-сайта ввела Visual Studio 2005. Эта
функциональная возможность позволяет вам определить один или несколько специфических
внешних обликов для элементов управления, составляющих ваше приложение. После этого вы
можете переключаться между ними в зависимости от предпочтений пользователя, его
отношений с компанией или тому подобных факторов.
На первый взгляд кажется, что темы дают практически то же самое, что и таблицы стилей.
Однако темы заходят несколько дальше. Во-первых, они используют таблицы стилей. Каждая
тема может иметь связанную с ней таблицу стилей. При использовании темы можно либо
работать с существующей таблицей стилей, либо переопределить ее (см. разд. "Применение
темы к сайту или странице" далее в этой главе). Следующее отличие состоит в том, что темы
позволяют вам встраивать графические файлы (в качестве части темы). Таким образом, вы
можете переключаться с одного набора графики на другой. Таблицы стилей этого делать не
могут. Темы также позволяют вам определять файлы обложек для ваших элементов
управления ASP.NET. Эти файлы обложек позволяют вам устанавливать такие значения свойств
элемента управления, которые выходят за пределы обычных стилей (однако эти свойства не
должны иметь отношения к поведению). И наконец, тема для страницы может устанавливаться
(и изменяться) во время выполнения. Для этого вы можете изменить свойство объекта Page.
Это позволяет выполнять быстрое переключение вида вашего сайта.
Примечание
В отличие от таблиц стилей к сайту можно применить только одну тему.
Создание темы
Темы создаются внутри каталога AppThemes. Каждая тема имеет свой каталог. Имя
темы — это название каталога (которое должно быть уникальным).
546
Часть V. Создание промышленных приложений
Этим обеспечивается отсутствие путаницы при применении темы. Вы применяете ее по
имени каталога.
Для примера предположим, что вы создаете приложение для управления информацией о
клиентах и заказах. Допустим, что доступ к этому приложению осуществляется со многих
сайтов компаний. То есть компания А будет управлять своими клиентами, а компания В —
своими. В такой ситуации владелец сайта может определить для каждой компании свою
тему. В основе темы могут быть фирменные цвета компании, шрифты и графика.
Для создания темы обычно нужно выполнить стандартный набор шагов:
1. Сначала вы должны создать каталог AppTheme. Вы можете сделать это при помощи
контекстного меню. Вы выбираете Add ASP.NET Folder, а затем Theme. Либо вы
можете добавить в ваше приложение файл обложки (при помощи диалогового окна Add New
Item), а затем Visual Studio автоматически создаст каталог AppTheme для хранения
skin-файла.
2. Теперь, когда у вас есть каталог AppTheme, то вы можете щелкнуть по нему правой
кнопкой мыши для добавления нового каталога темы. Это можно сделать через меню
Add ASP.NET Folder. Вам нужно назвать этот каталог именем вашей темы.
3. Затем добавьте файлы, которые составляют вашу тему. Эти файлы обычно содержат
таблицу стилей, изображения и ресурсы, а также файл обложки.
На рис. 14.42 показан каталог и файловая структура для описанного здесь примера. Здесь
три темы: одна для компании А, другая для компании В, а также тема без привязки к
компании (ThemeMain).
'9Г,
1 Fife
]$'
~
!
г
Т ''
1V*'
I и
!г *!
|К
|| С
if
Ir {
1
!' Feecr
14->
Ее t
_J
-'ictojch
\ iesv
Vfsus'
Web
J
Sijd-o
te
*
Bud
-.J
Deeug
Tccts
TTg8
■■аяимдЕ.г^-'-т tk
Tert Wmecw He?
/
Debjg - NE"" «• $
_j ~l4\i in 0
_^P Sc ution £2^4 <2 project:,1
* f CV.A92714\
ЛрСу \CustonerM»r»egeix
_ Aps_Data
j£ contosojpg
Jf SUnFileA $Ип
AJ ShleShertucii
^j rCT>pirr'B
$ fabfil^s njpg
2 SkinFileB $k n
Aj SMeSheetB ess
^ ThemeMain
J '°&OjP9
^' SkinMs n si tr
*] St)leSheetMainrsS
_j 'Tiages
_ ^bsolutePciasp*
, Ctstc-nerEciit aspK
Ji Ci,$tonnefEcitaspnfe:x
. CustomerEd t2 asp*
< _, [Msi'♦ asox
i кшш}Ш1Ш1Я11№-^тштш1«ииидшг1П11п^пА1^п1111<111100^11^11||[
TT f^^*^^
*, * X!
-
-
_ _
Рис. 14.42. Темы приложения
Глава 14. Создание приложений ASP.NET
547
Создание файла обложки
Таблицы стилей мы уже обсуждали. Теперь нам надо рассмотреть определение файла
обложки. В вашей теме может быть один или несколько файлов обложек. Возможно, вы
захотите создать отдельный файл обложки для каждого элемента управления, облик которого вы
намереваетесь менять. Либо вы можете определить единый файл обложки для всей вашей
темы. Выбор за вами.
Внутри файла обложки находятся определения обложек для элементов управления (именно они и
называются скинами). Вы объявляете каждую обложку точно так же, как вы пишете код разметки
для элемента управления на Web-странице. Синтаксис аналогичен. Однако вы опускаете
присвоение значений тем свойствам элемента управления, которые не относятся к обложке.
Существуют два типа определения для обложек: именованные обложки и неименованные
обложки. Именованная обложка создается при помощи атрибута Skinid. Это позволяет вам
определить уникальное имя для объявления обложки. В этом случае объявление обложки
влияет только на те элементы управления вашего сайта, которые имеют точно такой же
Skinid. С другой стороны, неименованные обложки применяются ко всем элементам
одного типа. Например, если вы хотите, чтобы все ваши кнопки выглядели аналогично, то
создайте неименованную обложку для элемента управления "кнопка". Когда вы примените эту
обложку к странице, то все кнопки примут этот внешний вид. Давайте рассмотрим пример.
Для примера предположим, что вы хотите определить несколько обложек для вашей темы.
Вы определяете именованные обложки для логотипа клиента на главной странице и для
меток заголовков на каждом экране. Затем вы создаете неименованные обложки для меток,
текстовых полей, кнопок и элементов управления сеточным представлением просмотра.
В листинге 14.1 показан пример файла обложки. В верхней части находятся именованные
обложки. Обратите внимание на использование атрибута Skinid. Этот атрибут будет
использоваться тогда, когда обложка применяется к специфическим экземплярам этого типа элементов
управления (в данном случае — к изображениям и меткам). Ниже следуют обложки, которые
применяются к стандартным элементам управления — по одному для всех кнопок, меток,
текстовых полей и сеточных представлений просмотра. Обратите внимание, что определение
Gridview включает определения для многих частей элемента управления. Эти определения
вложены внутри определения Gridview точно так же, как и для любой страницы ASP.NET.
Для компании В вам также нужен аналогичный файл. Для его создания скопируйте и
вставьте данный файл в каталог компании В. Потом внесите незначительные изменения в
обложку изображения, а также в шрифты и цвета определений других обложек. Затем вам
нужно будет применить эти обложки к страницам сайта.
| Листинг 14.1 Файл обложки для компаний А
<%— named skins — %>
<asp:Image runat="server" SkinID="CustomerLogo"
ImageUrl="-/App_Themes/CompanyA/contoso.jpg"/>
<asp:Label runat="server" SkinID=MTitleLabel"
Font-Names="Arial Black"
Font-Size="X-Large" />
548
Часть V. Создание промышленных приложений
<%— default, control skins —%>
<asp:Button runat="server" Width="80px" Height=4px"
BackColor="#FFFFFF" ForeColor=MMidnightBlue"
Font-Name="Tahoma" Font-Size=M10pt"
BorderColor="#003399" BorderStyle="Solid" />
<asp:Label runat="server" ForeColor="MidnightBlue"
Font-Names="Arial" Font-Size=MSmall" />
<asp:TextBox runat="server" Width=65px" BackColor="White"
BorderColor="MidnightBlue" BorderStyle="Solid" BorderWidth="lpx"
Font-Names=MArial" Font-Size=MSmall" />
<asp:GridView runat="server" CellPadding=" ForeColor="#333333"
GridLines="None">
<FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
<RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
<EditRowStyle BackColor="#999999" />
<SelectedRowStyle BackColor="#E2DED6" Font-Bold="True"
ForeColor="#333333" />
4<PagerStyle BackColor="#284775" ForeColor="White"
HorizontalAlign="Center" />
<HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
<AlternatingRowStyle BackColor="White" ForeColor="#284775" />
</asp:GridView>
Совет
Серьезной инструментальной поддержки для описания объявлений обложек нет. Вам
придется писать эту разметку вручную. Однако для сокращения затрат времени
можно создать страницу, которая включает все элементы управления темы. Затем
используйте визуальный конструктор для редактирования элементов управления на
странице. И наконец, скопируйте эту разметку из страницы в объявление обложки, а
затем удалите весь ненужный код объявления (включая и тег id).
Применение темы к сайту или странице
Для применения темы существует несколько способов. Каждый из них обеспечивает разный
уровень управления. Например, вы можете настроить глобальную тему для всего сервера.
Вы можете настроить тему только для одного Web-сайта. Вы можете также настроить тему
на уровне отдельной страницы. Наконец, вы можете применить одну обложку к одному
элементу управления. Как видите, это очень разные уровни— от макроуровня (сервер) до
самого низкого (элемент управления). Большинство Web-сайтов окажется где-то в середине
(применение темы на уровне страницы или сайта).
Глава 14. Создание приложений ASP.NET
549
Тему на уровне страницы вы применяете при помощи использования директивы @ Page
внутри кода разметки страницы. Здесь у вас есть несколько опций. Вы можете решить, что
ваша тема должна всегда подавлять все настройки элементов управления. То есть если
разработчик явным образом устанавливает значение элемента управления и это значение
переопределяется темой, то тема берет верх. Такой тип объявления выглядел бы примерно так:
<%@ Page Theme="MyPageThemeM %>
Другой вариант: вы можете настроить на уровне страницы то, что называется
styleSheetTheme. Это указывает, что тема применима только там, где элементы
управления не имеют явно заданных совпадающих значений. В предыдущем объявлении тема
переопределит локальные настройки элементов управления. При помощи же StyleSheetTheme
вы можете задать применение темы только к тем настройкам элементов управления,
которые не установлены явным образом. То есть если элемент управления имеет значение для
некого атрибута, то будет использоваться именно это значение. Если он его не имеет, то
будет использоваться значение из темы. Такой тип темы для страницы настраивается
следующим образом:
<%@ Page StylesheetTheme="MyPageTheme" %>
При помощи конфигурационного файла вы можете определить тему для всего Web-сайта.
Это позволяет вам настроить тему, а затем сменить ее без перекомпиляции вашего кода. Для
этого вы добавляете атрибут Theme или StyleSheetTheme (см. предыдущий пример) в
элемент pages внутри узла system, web. Вот пример:
<system.web>
<pages theme="MySiteTheme" />
</system.web>
Для определения только темы таблицы стилей вы будете использовать следующее:
<system.web>
<pages stylesheetTheme=" MySiteTheme" />
</system.web>
Вы можете также настроить тему в вашем коде. Эта возможность может быть полезной в
том случае, когда вы позволяете пользователям выбирать тему или когда вы динамически
настраиваете тему по некой информации о пользователе. Вспомним пример с двумя
компаниями: А и В. Вы помните, что для каждой из них была определена тема. Если вы
определите в своем коде, что зарегистрировался представитель компании А, то вы настраиваете тему
следующим образом:
Page.Theme = "CompanyA"
На рис. 14.43 показан пример темы, определенной в листинге 14.1. На рис. 14.44 показано
переключение темы на компанию В.
Совет
Вы можете делать изменения в файлах тем или обложек без перекомпиляции
вашего сайта. Эти изменения будут просто применены при следующем обновлении в
браузере.
550
Часть V. Создание промышленных приложений
<h '-Ы *fed р«уе - Wtndov
^IrteTHrt&p'bfft'-
,, • >, http,, 'locdlr4o*^276E;CustOfy>e»Managef;Find
t" Untitled Ргде
eontoso
ц Customer Manager
Instructions
id л» чагге ^nd
clic< lbs Finr
btttcT tc re*uf>- а
ijj {rate ( jg yoi
J searc crtsra
i
1
1
lOoe
"«к ;, n. »r • «>„• ~»<t
Find Customer
Enter a Custoirer 1Чвт»е
1
тттштжжшшшшш
A j-i-: Var з Ande s
,< iTO" AiiDiiic Mor^f i
* <OLv ihciijH' r.
br:-i> Lhn^irt Вет ,.ir
П~,"> n«tr a vjo<
btONF ~'«J»r« )«t <. eo.x
L'.>u.':> 'ос ксг?
^w^jpapproiiiiiMrrPF^in
Customer «ipx ■*(*? x\ |
«i - С
>Г 2 f . .' J* i N« '
~|| F.,d |
«шшшшшшшншш
"£з<е£ Rep eseife^e Be fir
0. is Mf „o[ F
Ovw e Mc .J D.r
^ J SL R».p «=•'". "lU . \ <D 1иГ' ;Г
O'Ci-ЗГ Mr» -TTltC IlllfcS
:j >^Fe| **» i»ot •» Mo* it- n
He'iVt Kj'.Htwcpr c j-ij&CK/g
Ov' > t г?: j
ШИюглтМЖлг
- Щ -
" О
:so:i
° ч: is*
-> J >8 л
f/CJ'J
t°C«i.
Trurted s«tes Pretexted Mode OF
^^тшгш^11шпп1МтпШтШ1Мпппппппппппппппппгг-
4.-,<£,**>
>' ▼
Page ▼ Tools ▼
m^SfrSSili
'JiC OL/tl-Л
'5; 555 3^32
io:t i? ~a
65
:e;j >иг
зам 1л i
/*j, ♦,>*->
M00% -
Рис. 14.43. Применена тема компании А
£~ Lt4 tied Page - Window: sterns: bpfo»*'
JL
<te* L-^.'L.
nttp "'focalhost52768 С us+onei Manager 'FindCustomrrasr* ▼ J *^ *. >£
fc Untitled Page
ч - r:
' Fa£t ▼ Tools i
fABRIKAM
в«ч UJStC 46
■• Customer Manager
J
.. Instructions
Cniar a ci<»tc«ier
id or чзп з ?ir{
rites IN Finr
bi^Uei tc «e;uf4 a
list Of CJSl3T9'S
n'3tci ig>oi'
Find Customer
Enter e Cistcmer Name
ч1ГПЦ
qiDflP
30 ID
Mo lo ЛГС!' Г<> S-i.iL R>-p'P4 Jl?).'<' Ьв'Ьг *i?"f>
*4 If I] 10 O, I.J' И-'s С Г F <";> '
ч»г w H<" iv
"j<< R>> *ч Uoi..t In
С it s.t no 3^f<|f< t Л O'J'ir AJ(f i rtu'c Luic3
mo t :-jt( -i<
UK R<.p pscitt.s? rii'iht-n tfeit'J'.
Mi- k>4 lij M<iii<< }Of Stta'iiJOt, ( ^73''C
Cvi fc Mo J J 2CO/I
Trjstedsrte5 Prelected Mode Ofl
C'J
Рис. 14.44. Применена тема компании В
Глава 14. Создание приложений ASP.NET
551
Для настройки темы одного элемента управления используйте атрибут Skinid элемента
управления. Этот ID может быть настроен на конкретную обложку внутри файла обложек.
Определение обложки будет иметь такой же идентификатор обложки, что и использованный
внутри кода разметки. Разметка выглядит следующим образом:
<asp:SomeControl runat="server" ID="ControlID" SkinID="MySkinId" />
Вы можете настроить идентификатор обложки в разметке или при помощи окна свойств
Properties для данного элемента управления в визуальном конструкторе. Это окно выдаст
выпадающий список обложек, которые доступны для данного типа элемента управления.
Вы можете также настроить идентификатор обложки программным путем. Вот пример:
SomeControl.Skinld = "MySkinld"
Создание пользовательского интерфейса,
конфигурируемого пользователем
ASP.NET предоставляет поддержку создания пользовательского интерфейса, который
может быть настроен и персонализирован каждым отдельным пользователем сайта. Например,
если вы когда-нибудь работали с сервером Microsoft Office SharePoint Server (MOSS) или
посещали MSN.com, то замечали, что страницу определяют функциональные блоки.
Пользователи могут удалять, добавлять, перемещать и конфигурировать эти блоки. Для
использования этой функциональной возможности все блоки должны работать совместно как часть
портальной инфраструктуры. .NET имеет такую инфраструктуру в своем составе.
В следующих разделах дается обзор создания конфигурируемого пользовательского
интерфейса при помощи элементов управления WebParts (Web-частей). Мы пройдем по основамг
создания страницы WebParts, которая позволяет пользователям наблюдать за клиентами в
приложении управления клиентами. При этом мы рассмотрим многие основные части
WebParts. Однако мы не сможем описать все. WebParts— это большая тема. Данный раздел
должен задать вам верное направление для продвижения вперед.
Примечание
Встроенные в Visual Studio элементы управления WebParts зависят от
функциональных возможностей персонализации ASP.NET. Поэтому для их применения вам
необходимо использовать базу данных ASPNETDB. Она будет инсталлирована для вас
при первом выполнении страницы WebParts. По умолчанию это база данных SQL
Express, и для нее нужно наличие на вашем компьютере SQL Express.
Работа с элементами управления WebParts
ASP.NET содержит много элементов управления и классов WebParts; одна только панель
инструментов Visual Studio определяет 14 элементов управления WebParts (рис. 14.45). Кроме
того, пространство имен System.Web.UI.WebControls.WebParts содержит почти 100
классов. Эти элементы управления и классы работают вместе для управления структурой страницы
WebParts, ее персонализацией и настройкой, а также и самим ее представлением.
Когда вы создаете простую страницу WebParts, то вы обычно работаете с тремя типами
элементов управления: WebPartManager, WebPartZone и собственно элементами
управления представлением. Первый элемент управления (WebPartManager) необходим на всех
552
Часть V. Создание промышленных приложений
страницах WebParts. Это элемент управления, который отвечает за управление самими
WebParts на странице. Вы должны определить этот элемент управления на каждой
странице WebParts, причем только один на страницу. WebPartManager отвечает за отслеживание
элементов управления и их зон на странице. Он также управляет состоянием, в котором
может находиться страница (таким как режим просмотра или редактирования).
Toolbox
[ - Standard
Date
+ Validation
- Navigation
• Login
WebParts
It Pointer
•= * tf/ebPartManager
$1 yb ProryWebPartManager
WebPartZone
Ц ^J CataiogZoie
Л; Declar3tiveCatalogPart
PageCatafogPart
| Vi, ImpcrtCatalogPart
S EditcrZcne
Ac1* AppearanceEdrtorPart
1 J BehaviorEditorPart
I J LayoutEdrtorPart
J H* PrapertyGridEaitcfPart
l| '«и CcnnectJonsZone
* AJAX Extension»
1 У Reporting
HTML
I ' General
! ^^-^rNphf^'1^ Tool-box'
F»|
1
1
Рис. 14.45. Элементы управления WebParts
Второй элемент (WebPartZone) позволяет вам управлять компоновкой "зон" вашей
страницы. Зона представляет собой область страницы, куда можно поместить элементы
управления или функции. Для того чтобы понять зоны, попробуйте представить вашу страницу в
виде горизонтальных и-вертикальных зон содержимого. Например, в верхней части вашей
страницы у вас может быть зона, которая представляет собой заголовок приложения. Под
ней могут находиться две вертикальные зоны. Левая зона может использоваться для ссылок
и навигационных элементов управления. Средняя зона может содержать >VebParts
содержимого. И наконец, в нижней части страницы у вас может быть еще одна зона для
управления содержимым вроде нижнего колонтитула.
На рис. 14.46 показан пример страницы WebParts, разбитой на зоны. Конечно, вы можете
определить любое количество зон и скомпоновать их так, как вам нравится. Это просто
пример.
Примечание
Зоны тоже имеют связанные с ними стили. Каждая зона предоставляет обычный
пользовательский интерфейс для элементов управления внутри зоны. То есть они
Глава 14. Создание приложений ASP.NET
553
определяют шапку, заголовок, стиль кнопок и т. д. Это называется "хромом"
элементов управления данной зоны.
WebPartManager
Горизонтальная зона 1
Горизонтальная зона 2
Вертикальная
зона1
Вертикальная
зона 2
Горизонтальная зона 3
Рис. 14.46. Пример зон WebParts для страницы
И наконец, вы размещаете элементы управления в каждой зоне страницы WebParts. Эти
элементы управления могут быть любым элементом управления .NET, которым вы хотите
управлять при помощи зоны. Вы можете также создавать ваши собственные
пользовательские элементы управления и WebParts, которые можно будет поместить в эти зоны.
Преимущество WebParts состоит в том, что вы можете обеспечить для них возможности
настройки. Это позволяет пользователям редактировать свойства WebParts в Web-браузере
(аналогично тому, как работает продукт SharePoint фирмы Microsoft).
В табл. 14.3 дан краткий обзор основных элементов управления, которые используются для
управления страницей WebParts. Все эти элементы управления можно увидеть в панели
инструментов Visual Studio (см. рис. 14.45). Все эти элементы — это элементы управления
зонами (кроме WebPartManager). Поэтому они определяют тип элемента управления,
который может быть добавлен в данную зону.
Таблица 14.3. Элементы управления зонами WebParts
Элемент
управления
WebPartManager
CatalogZone
*
Описание
Этот элемент управления отслеживает зоны на странице и находящиеся в
них элементы управления WebParts Каждой странице WebParts
необходим один (и только один) экземпляр этого элемента управления
Этот элемент управления определяет зону, которая содержит один (или
более) элементов управления CatalogPart Этот элемент обеспечивает
список Web-частей, которые доступны для данной страницы. Когда
пользователь редактирует данную страницу, то эта зона активирована. При этом
пользователи используют элемент управления CatalogPart для выделения
одного (или нескольких) объектов WebParts и перетаскивания их в зоны
WebPartZones
554
Часть V. Создание промышленных приложений
Таблица 14.3 (окончание)
Элемент
управления
WebPartZone
EditorZone
Описание
Используйте этот элемент управления для определения главных зон
вашего пользовательского интерфейса В эти зоны добавляйте элементы
управления ASP NET и WebParts Большинство страниц Web Parts определяет
одну или несколько зон WebPartZones
Используйте эту зону с целью предоставления пользователю области для
редактирования и настройки данной WebParts. Редактор для WebParts
определен как элемент управления EditorPart Данная зона содержит
элементы управления именно этого типа
Создание страницы WebParts
Страница WebParts создается при помощи любой стандартной Web-формы (aspx). Для
следующего примера создайте форму MonitorCustomer.aspx. Следующий шаг— перетащить на
эту форму элемент управления WebPartManager. Этот элемент не имеет визуального
представления на форме. Он просто необходим для создания страницы WebParts.
Совет
* Внутри визуального конструктора форм вы можете решить, показывать или скрывать
те элементы управления, которые не имеют визуального представления. Для этого
используйте меню View | Visual Aids, а затем установите или снимите опцию
ASP.NET Non-Visual Controls. Невизуальные элементы управления видны как серые
поля внутри визуального конструктора. Такое поле обычно содержит название
элемента управления и его идентификатор.
Определение зон
Затем добавьте на страницу зоны. Вспомните, что именно зоны определяют, где могут
существовать ваши WebParts, а также как они выглядят и какой размер имеют. Вы можете
скомпоновать ваши зоны внутри сетки, использовать абсолютное или относительное
позиционирование для размещения зон в определенных местах. Если вы позволяете
пользователям скрывать или закрывать элементы управления в зоне, то вам следует применять сетку
или относительное позиционирование. Если же ваши зоны статичны,.то следует
остановиться на абсолютном позиционировании.
Перед добавлением WebParts вам нужно будет добавить на страницу HTML-таблицу и
создать три ряда: верхний для заголовка страницы, средний для ваших WebParts и нижний для
нижнего колонтитула. Внутри среднего ряда определите новую HTML-таблицу с тремя
столбцами. Каждый столбец будет содержать зону страницы. Левая зона будет содержать
имеющие отношение к клиентам WebParts, средняя зона будет содержать информацию,
связанную с заказами и статистикой, а правая зона позволит пользователям модифицировать
отображенные на данной странице WebParts. На данный момент ваша форма выглядит
вроде показанной на рис. 14.47.
Глава 14. Создание приложений ASP NET
555
Э2":- - Micro -.с»! \Д$.лз*^>ъЗ<с<
File EHi" 4>v» V ebsite 8 n\<? DeLjg Pcrnat bi-le V; "est WiHca He о
J' _' _. ij «$ ^ л ' ^' > :'efcug • »ET
_, MoratorCustomerjspK* CtqrnwE*t,«p*
„ СКел» Objects & Events ▼ No E^rrty
<• >
"
лсе-ге~ч^2.< ; -rcdu^i :f J-~t:3c<
Monitor Customers Dashboard
2ЭГЗ 5rod ict cf Contosu
iCesjr I Spit ч co^ce * r~-l. bcJ'> 'cir<*^r-i- <"£, -• tiL i> <+r
Reai<, Lr.l? Lai 62
' *
» *tj\ te-
Lr-62
l„>< 3 >> м]
;l
"* "p
" "!
-Ц
F
* I
- :
INS j
Рис. 14.47. Начальная компоновка вашей страницы Web Parts
Теперь вы должны скомпоновать зоны внутри HTML-таблицы центрального ряда. Для этого
нужно сделать следующее:
1. Поместить элемент управления WebPartZone внутрь первого столбца таблицы.
2. Установить свойство HeaderText первого элемента управления в значение Customer
Links. Это позволит людям (которые редактируют страницу) видеть название зоны
(и, соответственно, понимать ваши намерения относительно нее).
3. Установить свойство ID первого элемента управления в значение
WebPartZoneCustomerLinks.
4. Повторить шаги 1—3 для среднего столбца в ряду. На этот раз назовите зону Customer
Statistics. Она займет самую большую часть экрана и позволит пользователям этого
экрана искать заказы и просматривать статистику.
5. Добавить элемент управления CatalogZone в самый правый столбец среднего ряда. Эта
WebParts позволит пользователям настраивать то, что они видят на экране.
На данной стадии ваша страница WebParts должна выглядеть примерно так, как показано
на рис. 14.48.
Следующий шаг— надо определить "хром" для WebParts, которые размещаются в зонах.
Хром — это стили (такие как шапка, ссылки и кнопки). Есть много стилей, которые вы
можете настроить для зоны и ее WebParts. Сюда входят стили для ошибок, стили для
неактивных элементов и многое другое. Эти стили настраивают все это при помощи множества
свойств зоны. Для автоматического форматирования зоны вы можете также использовать
смарт-тег, связанный с элементом управления. На рис. 14.49 показан пример диалогового
окна AutoFormat. Слева находятся возможные форматы. Справа— предварительный про-
19 3ак 3716
556
Часть V. Созданий промышленных приложений
смотр, показывающий, как будут выглядеть WebParts в зоне. Этот просмотр основан на
фактическом содержимом зоны.
Используйте опцию AutoFormat для настройки хрома для каждого элемента управления
зоны. Установите пользовательские ссылки и зоны статистики клиентов в значение
Professional. Установите Catalog Zone страницы в значение Colorful.
* К714 - Microsoft VIsu** S
Monitor Customers Dashboard
Customer Links Customer Statistics Page Catalog Zoie
i I < i
Add
2008 Product of Contoso
File Edit View Website Build Debug Format Т*Ые Tools Test Windo* Help
Jl ' J " J У J , ^ A *> ♦ • £J • . I» Debug * .NET
Lk (solba< * ft >f MonitorCUftomer^Hm*
Standard
: » Data
_ f Validation
£ у HavtgaUoa
л » Loeln
5 WabPart*
£ »; Pc-n»er
* VvebPartMinager
ф PrcxyWebPartM»
WebPartZore „
,< C»tai»gZcne
, DeefarattveCataic
; PageCatalcgPart
Nj ImportCatstegParr
■*■* EditcZone
/V AppearsrceEditor '
•^ BehavtorEdrto.Paft
^ La\outEditorPart
^ Propert/GftdEdrto
♦* ConnectionsZone !
»■ AMXExtemioRf - <
^..«'/erbctr ^-Toolbox j Л Design j £3 Spk ; ii Source lif"^'?!** !
$. s\z< List
Peaoy
-X 4<
Cos*
tA | Zone Nacre ^ Add j Close |
< aspfCaiakigZ зпе*С а tatoaZ...
In 49
Рис. 14.48. Зоны WebParts, добавленные на страницу
AutoFownai
Select a *d>eme:
Remove rornatttio
Professor*!
Smpte
ЩШШШШШЖ::^.
Prevtew.
Page Catalog Zone
Г WebPart 1
Г WebPart 2
Г1' WebPart 3
Ho: !z
? Narre w Add Close
Рис. 14.49. Настройка хрома для зоны
Глава 14. Создание приложений ASP.NET 557
Добавление WebParts в зоны
Теперь вы готовы добавить WebParts в зоны, которые вы определили. Для этого есть
несколько способов. Вы можете создать реальные элементы управления, которые реализуют
класс WebPart. Это даст максимальную гибкость для создания WebParts. Это также
позволит вам создать для ваших WebParts настройку пользователями. Эта настройка видна тогда,
когда пользователь редактирует WebParts. Это самый сложный способ. Разумеется, он
рекомендован для разработчиков порталов. Другой (быстрый) способ создания WebParts —
это применение пользовательских элементов управления или обычных элементов
управления ASP.NET. Например, когда вы перетаскиваете на форму такой элемент управления, как
Label, то ASP.NET определяет WebParts вокруг этого элемента. Это дает легкий способ
создания WebParts.
Для примера вы будете реализовывать последний способ. Сначала вы создадите WebParts
для клиентских ссылок. Эта WebParts даст целый набор ссылок, используемых для
управления клиентом. Далее приведена схема процесса создания этой WebParts:
1. Перетащить элемент управления ASP Label внутрь элемента управления WebPartZone
(для ссылок пользователя).
2. Эта метка автоматически превратится в элемент управления WebPart. Вы можете видеть
это в разметке. Элемент <ZoneTemplate> добавлен внутри узла <asp:WebPartZone>.
Внутри находится элемент управления Label, который вы добавили на форму.
3. Настройте заголовок для WebParts. Для этого добавьте атрибут title к элементу
управления Label. Этот атрибут подхватывается ASP и применяется к WebParts.
4. Добавьте несколько ссылок в пределах объявления <asp:Label>. Окончательная
разметка представлена в листинге 14.2. Здесь мы опустили информацию о стилях, которая
обычно находится в зоне WebParts; это сделано в интересах доходчивости.
I Лисшнг 14,2. WabPerts для клиентских ссылок I
<asp:WebPartZone ID="WebPartZoneCustomerLinks" runat="server">
<ZoneTemplate>
<asp:Label titls="Customer Links" ID="Labell" runat="server" Text="Label">
<a href="FindCustomer.aspx">Find Customer</a><br />
<a href="FindOrder.aspx">Find Order</a><br />
<a href="CustomerDiscounts.aspx">Customer Discounts</a><br />
</asp:Label>
</ZoneTemplate>
</asp:WebPartZone>
Повторите этот метод для еще нескольких WebParts. Для нашего примера создайте
WebParts: Active Shoppers, Help, Edit Mode indicator, Find Customer Orders и Top Products.
Вы можете попытаться создать пару этих элементов как пользовательские элементы
управления (дополнительную информацию по пользовательским элементам управления см. в
разд "Работа с элементами управления ASP.NET" далее в этой главе). Можете также
попытаться создать один или два этих WebParts как таблицы, вложенные внутри элемента
558
Часть V. Создание промышленных приложений
управления Label. На рис. 14.50 показано то, как ваша страница должна теперь выглядеть в
визуальном конструкторе.
92'^ М|сга«А Visual Su,d*c«
Fife Ed«t ч «•«?>• Yvtbutt БШ Debjg Fcinat ТаЫе "cols Test Wirdcw Ht p
3 * ™ ' J ** J Л * - ' vJ ' ' ^ecug ' NET
^ MonitorCustomer-Mpx
«» ~fc «I
Monitor Customers Dashboard
СТрщчдуяя
Prfgg Catdloy Zotvtt
n^n
Product
Sold
_ ?ПГ Я Crnr irt л* ГлКгсл
«D'sgn ~i 5p it -j-ojrce < 'Zcie'er pistes <asp л)el*.ab* 6> ~-zzle' <v- <?c
Рис. 14.50. WebParts внутри визуального конструктора
Разрешение пользователям настраивать страницу
Есть много способов разрешить пользователям настраивать внешний вид и поведение
WebParts. Вы можете создать редакторы для ваших элементов управления, которые
позволят вам делать полную настройку каждого элемента управления. У вас могут быть
WebParts, которые способны подключаться к другим WebParts или вести обмен с ними.
Им обычно требуется некоторая настройка. Вы можете позволить пользователям выбирать
элементы управления из каталога (для того чтобы они указали, какие элементы управления
они хотели бы видеть на странице). Обычным делом является также разрешение
пользователям минимизировать, закрывать и перемещать ваши элементы управления из зоны в зону.
Здесь мы рассмотрим несколько этих вариантов.
Сначала давайте настроим нашу страницу WebParts для того, чтобы позволить
пользователям добавлять WebParts на страницу так, как они сочтут необходимым. То есть
пользователи смогут определять, какие WebParts они хотят видеть на странице и где они хотят их
видеть. Следующий список определяет шаги, необходимые для модификации нашей страницы
WebParts таким образом, чтобы сделать возможным этот уровень пользовательской
настройки:
I. Мы начинаем со страницы WebParts, которая включает две WebParts на основе меток:
Active Shoppers и Find Customer Orders. Страница содержит также три WebParts на
основе пользовательских элементов управления: Help, Customer Links и Top Products.
Глава 14 Создание приложений ASP NET
559
Именно последние три мы хотим отдать на усмотрение пользователя. Пользователь
сможет добавлять и удалять эти элементы со страницы. Ваш первый шаг— удалить их
со страницы. Мы скоро вернем их обратно.
2. Вы используете WebParts с названием CatalogZone для активирования управления
группой (или каталогом) WebParts. Когда страница была скомпонована впервые, мы
добавили этот WebParts в самую правую зону. Если у вас его нет, добавьте его.
3. Затем внутри WebParts с названием CatalogZone добавьте DeclarativeCatalogPart. Этот
элемент управления указывает, что вы будете объявлять все WebParts, которыми можно
управлять в этой зоне. Есть аналогичные WebParts вроде PageCatalogPart, который
управляет всеми WebParts на странице.
4. Следующий шаг — объявить WebParts, которые будут управляться внутри каталога. Вы
делаете это при помощи размещения определения каждого пользовательского элемента
управления (или WebParts) внутри раздела DeclarativeCatalogPart. Ваша разметка
должна выглядеть примерно так:
<asp:CatalogZone ID="CatalogZonel" runat="server"
HeaderText="Manage WebParts">
<ZoneTemplate>
<asp:DeclarativeCatalogPart Title="Select a WebParts"
ID="DeclarativeCatalogPartIм runat="server">
<WebPartsTemplate>
<ucl:TopProducts title="Top Products" ID="TopProductsl"
runat="server" />
r
<uc2:HelpControl title="Help" ID="HelpControll" runat="server" />
<uc3:CustomerLinks title="Customer Links" ID="CustomerLinksl"
runat="server" />
</WebPartsTemplate>
</asp:DeclarativeCatalogPart>
</ZoneTemplate>
</asp:CatalogZone>
5. Последний шаг — разрешить пользователю активировать редактирование для включения
этого каталога. Для этого мы будем использовать кнопку LinkButton. Добавьте элемент
управления LinkButton в правую нижнюю часть страницы. Создайте обработчик
события щелчка для элемента управления LinkButton. Внутри этого обработчика события
вам нужно переключать состояние отображения страницы между режимом Browse
(нормальное представление) и режимом Catalog (пользовательское представление
выделения WebParts). Это делается в нижеследующем коде:
protected void LinkButtonChangeContent_Click(object sender, EventArgs e) {
if (LinkButtonChangeContent.Text == "Change Content") {
// EditorZoneMain.
WebPartManagerMain.DisplayMode =
WebPartManagerMain.SupportedDisplayModes["Catalog"];
} else {
560
Часть V. Создание промышленных приложений
WebPartManagerMain.DisplayMode =
WebPartManagerMain.SupportedDisplayModes["Browse"];
}
Вот и все. Теперь вы должны запустить страницу и позволить пользователю произвести
выбор этих трех WebParts. На рис. 14.51 показана запущенная в браузере страница.
Пользователь щелкнул по ссылке Change Content внизу справа для запуска менеджера WebParts.
Пользователь может выбрать WebParts и указать, в какую зону страницы она должна быть
добавлена. Обратите также внимание, что WebParts с названием Top Products уже
добавлена на страницу пользователем. Наконец, пользователь может при желании добавить на
страницу несколько вариантов одной и той же WebParts.
Ш MQRitQr Customer* - Win;
mm
i.
& Morwtor Customer*
fil " Ш ~ «• * uLKp*9« w '- J*Qi* "
«wBMu^awsaauta^
lr Customers Dashboard
№d bas-fitr
Product
beach be
\.лг*г> Cbair
'id"» V *3"
«5л beck
K*i*«gftW«fc Parti
Top Produ :i*
Sold '£ h<"p
j»0 ' Cjstoner Lirvfcb
Searcti hy onde» number-
Sear;'* by customer-:
4 Trusted sites} Protected Mode: Off *i 100% '
Рис. 14.51. Использование каталога WebParts во время выполнения
Еще одна стандартная пользовательская настройка— это разрешение перемещения
WebParts между зонами и относительно друг друга. Когда пользователь находится в
режиме каталога (как в предыдущем примере), то эта функциональная возможность включена.
Однако бывают случаи, когда вы добавляете эту функцию для пользователей, но требуете
повышенного уровня доверия при добавлении и удалении WebParts со страницы.
Для того чтобы разрешить пользователям менять только компоновку страницы WebParts,
вам нужно сделать несколько шагов:
1. Добавить на страницу элемент управления EditorZone. Добавление этого элемента
управления создает зону, куда вы можете поместить EditorParts. Обычно вы
показываете эту зону тогда, когда ваша страница находится в режиме редактирования. В данном
Глава 14. Создание приложений ASP.NET
561
примере предположим, что вы используете эту зону, но не собираетесь показывать ее
пользователям.
2. Добавьте элемент управления LayoutEditorPart в только что созданную вами
EditorZone. Эта WebParts позволяет включить редактирование компоновки страницы.
3. Создайте элемент управления LinkButton, чтобы разрешить пользователю включать
режим редактирования страницы. Конструкция вашей формы должна выглядеть примерно
так, как на рис. 14.52.
- .МЕТ
< WA - Мкгозс*: Visjai Studio
File Edit View Website Build Debug Format Table Tcols Test Wirdow Help
J • i " J -A 4 A -J % *> • ♦ *d - * Эюид
°e t ft jv
-* Ц
cfi' b лу Cbsa-mr
HEED
Г Top OfO'Ju^S
Г ннр
Г" Ci st'Jt <sr Lirks
. . ..I 7,-r* :.»k»"t Lie , _
S£D idtt3rZone*Ectc-Zcr*4*»>rLi_r_:
Lditor Zfitte
l^yfjirt
|Nn>nfl ^
I'^j-re чагге.г.1
^cv. i: ■■?? >
^
i ,.;>
D
C»vf | ^r-l^
JL
i1 Ц t **y )tt i cinngtK-MH'i
2008 Product c* Contoso
>iD«sgn э Split ••! Source '4 <ssp<Eo ?o'Zc^e#EditofZcn.. > )<lorf'erelate>•} <a$o:L«>'3UtEd(tcr?art»^ay...> *
Dreg margin bardies to reitfe margins Press SHIFT or CTRi In 202 Col 50 CH 50
Рис. 14.52. Конструирование опций компоновки для пользователя
4. Теперь вам нужно написать код для события щелчка LinkButton. Этот код аналогичен
нашему предыдущему примеру. Вот пример:
protected void LinkButtonEditPage_Click(object sender, EventArgs e) {
if (LinkButtonEditPage.Text == "Edit Layout") {
// EditorZoneMain.
WebPartManagerMain.DisplayMode =
WebPartManagerMain.SupportedDisplayModes["Edit"];
LinkButtonEditPage.Text = "Finish Edit";
} else {
WebPartManagerMain.DisplayMode =
WebPartManagerMain.SupportedDisplayModes["Browse"];
LinkButtonEditPage.Text = "Edit Layout";
}
562
Часть V. Создание промышленных приложений
Теперь вы можете запустить страницу и посмотреть результаты. Когда вы щелкнете по
ссылке Edit Layout, то страница перейдет в режим Edit. Здесь пользователь может
перемещать элементы управления между зонами, передвигать их и переключать их состояние
(закрывать и открывать). На рис. 14.53 все это показано в действии.
Совет
Персонализация Web-частей между сеансами сохраняется. Если пользователи (или
разработчики) закроют элементы управления, то им нужно дать способ вернуть их
назад. Вы можете написать код для сброса персонализации страницы. Например, вы
можете дать пользователю ссылку для этого. Внутри события данной ссылки вы
должны будете добавить примерно такую строку кода:
WebPartManagerMain.Personalization.ResetPersonalizationState()
Рис. 14.53. Режим редактирования страницы на стадии выполнения
Работа с элементами управления ASP.NET
В Visual Studio 2008 и новой версии ASP.NET введены несколько новых элементов
управления и сделано множество улучшений элементов управления. Мы уже описали в этой главе
несколько элементов управления ASP.NET, таких как WebParts, метки и кнопки. В
последующих разделах мы хотим дать описание множества других элементов управления
ASP.NET. Сюда входят как стандартные элементы управления, так и элементы для
проверки, регистрации, навигации и данных. Мы потратим также определенное время на
обсуждение определяемых пользователем элементов управления.
Глава 14. Создание приложений ASP NET
563
Примечание
Описание элементов управления Ajax см. в главе 17.
Обзор элементов управления ASP.NET
Элементы управления визуализируют пользовательский интерфейс внутри браузера. Элементы
управления ASP.NET считаются серверными элементами управления. Серверные элементы
управления имеют несколько основных членов. Они существуют на стадии конструирования
(в панели инструментов) и позволяют вам манипулировать своей компоновкой и свойствами.
Они также имеют соответствующие классы в .NET Framework. Код вашего сайта создает
экземпляры этих классов для манипулирования данным элементом управления. Кроме того, вся
обработка серверных элементов управления происходит на Web-сервере. То есть код элемента
управления выполняется (вместе с вашим кодом) и выдает свой HTML, который посылается в браузер
пользователя. Когда пользователь возвращает страницу на сервер, то ASP.NET перестраивает
элементы управления, а затем повторно обрабатывает их для создания ответа пользователю.
Примечание
ASP.NET поддерживает также и стандартные элементы управления HTML. По
умолчанию эти элементы на сервере недоступны. Однако вы можете пометить любой из
них как runat="server" для того, чтобы иметь возможность работать с ними в
вашем классе выделенного кода. Вообще, если вы считаете, что доступ к элементам
управления на сервере вам не понадобится, то разумнее всего просто пользоваться
элементами управления HTML.
Функциональные возможности элементов управления ASP.NET
Серверные элементы управления ASP.NET представляют собой набор абстрактных
элементов управления, которые визуализируют свой пользовательский интерфейс в браузере
пользователя множеством различных способов. Они могут выдавать HTML и JavaScript. Они
сохраняют состояние между запросами и некоторые из них работают с базами данных.
В следующем списке указаны некоторые ключевые функциональные возможности,
имеющиеся в модели элементов управления ASP.NET.
□ Совместимость с XHTML. Элементы управления ASP.NET отсылаются в браузер
пользователя как стандартный HTML. Все элементы управления генерируют
совместимую с XHTML 1.1 разметку. Это обеспечивает отсутствие лишних сюрпризов при
просмотре ваших страниц в Web-браузере.
□ Определение браузера и адаптивная визуализация. Элементы управления ASP.NET
могут также адаптировать выдаваемую ими разметку под запрашивающий браузер.
Поэтому они могут быть одновременно и XHTML-совместимыми, и специфичными для
конкретного браузера. Для элементов управления ASP.NET эта функциональная возможность
по умолчанию включена. Это может сэкономить большое количество времени, поскольку
вам не приходится беспокоиться о кодировании под различные типы браузеров.
□ Модель событий. Все элементы управления ASP.NET имеют одинаковую модель
событий на стороне сервера. Вы можете написать код, который будет вызываться при
порождении пользователем события на странице (такого как разворачивание
выпадающего элемента или нажатие кнопки).
564
Часть V. Создание промышленных приложений
О Клиентская модель событий. Набор элементов управления ASP.NET может
участвовать и в событиях на стороне клиента. То есть вы можете в качестве части процесса
визуализации элемента управления выдать JavaScript и вызвать этот JavaScript как часть
модели событий клиента (браузера).
□ Поддержание состояния. Элементы управления ASP.NET (включая и элементы
управления HTML) автоматически поддерживают состояние между циклами обработки на
сервере. Предположим, что пользователь вводит значение в текстовое поле и
отправляет страницу на сервер. Если вы отправляете пользователю ответ, то введенные им
данные сохраняются внутри элемента управления. Это избавляет вас от необходимости
писать в ваших страницах код для такой функции (при выполнении на сервере таких
операций, как проверка достоверности).
□ Привязка к данным. Многие элементы управления ASP.NET могут быть привязаны к
данным в вашем приложении. Модель привязки к данным позволяет вам привязываться
ко многим источникам данных (таким как базы данных, бизнес-объекты, XML и т. д.).
В большинстве случаев привязка данных почти не требует от вас кодирования.
Я Компоновка на основе шаблонов. Некоторые из элементов управления ASP.NET
имеют шаблоны для того, чтобы разработчики могли определить их упорядочение.
Например, вы можете использовать элемент управления ListView для создания шаблона,
который определяет, как элемент управления визуализируется при редактировании
данных и при их отображении.
□ Обложки и поддержка стилей. Мы уже описывали, как темы и таблицы стилей могут
быть использованы для изменения внешнего вида сайта. Каждый элемент управления
ASP.NET имеет поддержку как обложек, так и стилей CSS.
□ Ввод данных. Элементы управления ASP.NET поддерживают такую компоновку,
которая облегчает ввод данных. Например, вы можете определить порядок вкладок для
элементов управления на странице, установить фокус на определенный элемент управления
и даже назначить клавишу быстрого доступа для данного элемента управления. Все это
делается при помощи свойств элемента управления. Сами элементы управления для
активации этих функциональных возможностей генерируют JavaScript на клиенте.
□ Проверка. В ASP.NET есть встроенные элементы управления для проверки. Серверные
элементы управления работают с этими проверяющими элементами управления и самой
ASP.NET для обеспечения цельной модели проверки для ваших страниц. Например, вы
можете сгруппировать набор проверяющих элементов управления и управлять
проверкой на уровне группы (на уровне разделов вашей страницы).
Этот список представляет некоторые основные функциональные возможности набора
элементов управления ASP.NET. Кроме того, каждый элемент управления имеет собственный
набор функциональных возможностей. Для того чтобы понять, что лучше всего работает
для вашей ситуации, вам придется поэкспериментировать с каждым элементом управления.
В следующих разделах мы обсудим многие из этих элементов управления.
Стандартные элементы управления ASP.NET
В ASP.NET имеется большой набор стандартных элементов управления. Они видны в
панели инструментов в группе Standard. Большинство создаваемых вами страниц будет интен-
Глава 14. Создание приложений ASP.NET
565
сивно использовать элементы этого списка. В него входят: метка, текстовое поле, кнопка,
флажок, переключатель, календарь и многие другие элементы управления.
На стадии конструирования вы перетаскиваете один из этих элементов управления из
панели инструментов в визуальный конструктор. Затем вы можете работать с этим элементом
управления при помощи диалогового окна Properties. Каждый элемент управления имеет
массу свойств для управления внешним видом, поведением, доступом и т. д.
На рис. 14.54 с левой стороны показан список элементов управления Standard. В центре вы
можете видеть элементы управления метки, текстового поля, кнопки и флажка выбора.
Обратите внимание, что текстовое поле выделено. С правой стороны находится окно свойств
для этого текстового поля. Для доступа к событиям данного элемента управления вы
должны нажать значок с молнией в этом окне свойств.
Стандартных элементов управления множество. В табл. 14.4 приводится список некоторых
из них (вместе с кратким описанием использования).
$t*wnA \*Щ^Щ&иШ
■} File Edit View Website
<: я--**Л0 к
Ь
\ ^
'. Ч
1а
1 ®
ftiwtfr * ttf
- StaMbrd
it Pointer
A Libel ..
•ы TtxtBc*
(a. Bjttor» j5 ч
1 ? j (£D LmlrButten
1 v> (jfj ImageBbttor.
I Д HyoerLink
1 Tj DropDowrvbst
1 ** L«itSox
I El ChedfBex
1 ; ;. CKsckBcxLtit
1 (♦? ftodioButton
I ' RtdteBottonlat
1 Л Image
1 M JmageMap
1 ; 72 TAIt
1 ♦_: BulletedLut
I HtddenFiefc)
1 l»_ Liter»!
1 J3 AdRotatcr
1 ' %'*M'«r> & „' %. Todbo* •
Buita Debug Form«t Too*f Test «Afindcw Heip
i Ц * ♦ 4< - >> - ' > Debug - .WET
'^'^^Ij^tfiMl I W *
Edit Customer
Г 0 jj>
Emai. Phone Numb
Address City
Г* customer has approved contact via «mail
Г customer has approved phone contact
| Sav? | 1 Cancel 1
" * V4M» < J!Lb»Si~X i I *
■Л Design j 2 Split «1 Sourer \i\ <»t|K?etft3tt<.inpt>i
1 Dr«g msrgin bandies to resize rrwrgtns, Pre*» SHIFT or CTRL for more options.
^^ВКГ.." ., \<^'з&&&3ш$)
- л * \
Рщ- -*\t' * -* X |
TcxtBoxFirstName Systeri V/eb.JJ vVet - |
в . ♦:!
АссепКе> У
Tabfode< Э I
В * I
ВаскСЫог f I
BoroerColoi i
i Boroe-Styie NctSet I
Bcrcie'Widih §
Columns 0 1
CsiClaii inputBox 1
ffl Font 1
ForeColQ»- 1
i Text §
в - >- J
AutcComp eteT None i
AtircPostBtck False 1
CeusesVahdat or False w f
С«Ски 1
CSS С l«ss name a ppi>ed to t>ie ccnti oi §1
' ««^PropertiesI^1^> +i< «bp„•**" 1
j
Рис. 14.54. Стандартные элементы управления ASP.NET
Таблица 14.4. Стандартные элементы управления
Элемент
управления
Описание
Label
Используйте этот элемент управления для передачи пользователю текстовой
информации. Элемент Label вам нужен только в том случае, если текст
должен быть динамическим (формируется на этапе выполнения). Если у вас
статический текст, то вы можете просто вписать его на страницу при помощи
стандартного форматирования HTML
566
Часть V. Создание промышленных приложений
Таблица 14.4 (продолжение)
Элемент
управления
TextBox
Button
HyperLink
DropDownList
CheckBox
RadioButton
Image
Table
Calendar
Описание
Используйте этот элемент управления для того, чтобы пользователь мог
ввести на вашей странице текстовые данные Элемент управления TextBox
имеет свойство TextMode Используйте это свойство для указания типа ввода
пользователя* одна строка (по умолчанию), много строк, пароль
Используйте этот элемент управления тогда, когда вы ожидаете от
пользователя запуска на странице некого действия (такого как сохранение, сброс или
отмена). Существуют также элементы управления LinkButton и ImageButton
LinkButton ведет себя как кнопка, но выглядит как гиперссылка ImageButton
аналогична, она ведет себя как кнопка, но для определения ее внешнего вида
вам нужно указать изображение
Используйте этот элемент управления тогда, когда вам нужно работать с
гиперссылкой на стадии выполнения Например, вы можете настраивать
значение свойства NavigateUrl динамически в зависимости от данных Если вам на
странице нужна просто статическая ссылка, то вы можете использовать тег
якоря в HTML (<а />)
Используйте этот элемент управления для предоставления списка опций, из
которого пользователь может выбирать Вы можете привязать этот список к
данным Вы можете также реагировать на выбор пользователя из списка Если
у вас имеется множество опций, из которых пользователь должен иметь
возможность выбрать, используйте элемент управления ListBox Для списка с
возможностью множественного выбора есть элемент управления
CheckBoxList, а для списка со взаимно исключающим выбором — элемент
RadioButtonList
Используйте этот элемент управления тогда, когда вы хотите позволить
пользователю указывать значение (да или нет, включено или выключено) Если
вам не нужна обработка на стороне сервера, то для этого есть эквивалент на
HTML
Используйте этот элемент управления для предоставления пользователю
группы элементов, из которой можно выбрать только один Используйте
свойство GroupName для группирования набора селективных кнопок, которые
должны работать совместно
Используйте этот элемент управления тогда, когда вам нужно динамически
заполнять изображение на вашей странице (при помощи свойства ImageUrl)
Статические изображения могут использовать HTML-тег <img />
Существует также элемент управления ImageMap, который позволяет вам определять
различные части изображения, при помощи которых вы сможете
дифференцированно реагировать на действия пользователя
Используйте этот элемент управления для динамического построения таблиц
в вашем коде Если у вас статические таблицы, используйте управление
таблицами при помощи HTML
Применяйте этот элемент управления тогда, когда вам нужно позволить
пользователю видеть набор дат и выбрать одну из них Используйте свойство
SelectionMode для того, чтобы пользователь мог выбрать день, неделю или
месяц
Глава 14. Создание приложений ASP.NET
567
Таблица 14.4. (окончание)
Элемент
управления
MultiView
Wizard
Описание
Используйте этот элемент управления тогда, когда вы хотите обеспечить
пользователю несколько представлений (в зависимости от выбора
пользователя или от состояния системы) Например, вы можете реализовать
представление "только для чтения" и представление для редактирования этих же
самых данных. Каждое представление требует перетаскивания элемента
управления View на панель этого элемента управления Затем добавьте в этот
элемент View те элементы управления, которые должны отображаться в
данном представлении Аналогичные результаты можно получить при помощи
нескольких элементов управления Panel. Однако элемент управления
MultiView предоставляет вам дополнительные функции управления
Этот элемент управления аналогичен элементу MultiView Однако он
предоставляет дополнительные возможности, необходимые для мастера, который
переходит с шага на шаг (или с представления на представление) и обратно
Проверяющие элементы управления
ASP.NET имеет целый набор проверяющих элементов управления. Эти элементы позволяют
вам указать, как должна производиться проверка ввода пользователя перед обработкой
страницы. Таким образом, вы сможете обеспечить, что пользователь ввел данные во все
необходимые поля, и проверить, что эти данные соответствуют ограничениям вашего
приложения.
Элементы управления всегда проверяются на сервере и не дадут обработать ASP-страницу,
если проверка не пройдет (см. описание жизненного цикла страницы, обсуждавшееся ранее).
Элементы управления могут выдавать также JavaScript для выполнения на клиенте (свойство
EnableClientScript по умолчанию установлено в значение True). Таким образом, пользователь
уведомляется обо всех ошибках проверки страницы перед отправкой страницы на сервер.
Для использования проверяющих элементов управления перетащите их на вашу форму
точно так же, как и любой другой элемент управления. Лучше всего размещать их рядом с теми
элементами управления, которые они проверяют, поскольку они обеспечивают текстовые
подсказки пользователю в случае проблем со страницей. Стандартный процесс состоит в
размещении элемента проверки справа от проверяемого элемента управления. Затем
настройте свойство ControlToValidate проверяющего элемента на другой элемент управления
вашей формы (тот, который вы хотите проверить).
Затем обычно настраиваются свойства Text и ErrorMessage проверяющего элемента
управления. Свойство Text указывает тот текст, который должен быть показан проверяющим
элементом в случае неудачной проверки. Свойство ErrorMessage указывает сообщение об
ошибке, которое должно быть показано пользователю внутри элемента управления
ValidationSummary данной страницы. ValidationSummary группирует все сообщения об
ошибках в одном месте.
Например, рассмотрим рис. 14.55. Здесь слева в панели инструментов вы видите группу
проверяющих элементов управления. На странице сверху есть элемент управления
ValidationSummary (ниже Edit Customer). Вы видите также, что текстовые поля имени и
адреса электронной почты имеют проверяющие элементы управления. Проверяющий эле-
568
Часть V. Создание промышленных приложений
мент управления для адреса электронной почты выделен. Это элемент управления
RegularExpressionValidator. С его помощью вы можете использовать совпадение шаблонов
для проверки ввода пользователем адреса электронной почты. Справа показаны свойства
элемента управления.
** 327^.4 Micro«5*tV«WBlStMfo
File Edit *'i«v/ Website Euito Debug Format Toe i Test VWndevy
jl • -J ' J J <J * Л*!,***?*' * > 3«ug
rieip
NET
Тсч- йс*
• Standard
> Data
• * X
1^ Pcirter
X, ReqiiiredFieWVahda
*> RangeVaHatcr
*j- FegularExp-ess-oni'
^ Cc-npareValidatcr
v> CustamVel dator
_J ValidetionSunnmir/
login
WebParts
/UAXExtemtora
Reporting
HTML
General
Edit Customer
Fhar sJiune;
jiip<RsgularExore
Г" customer has eop'cved rontact vie eriioil
Г custome- hes aop'oved phone contact
t4 ZZf J2s *$88&СЙ$8« I
Properties »M
RegutarExpreuionValidatorl S/5ten »
:\ /I i «
BordetvVdth *
Disp ay Static
ErrorMesrage Please enter a u
ForeColor Ped
Text
J TextBoxEma ▼
Enabled' srrtScnp ""rue
Eiabi^d ~titt
Enat eThetri nc Trje
EiiahleVietvState Trje
ce^FocjsOrE'tci False
S^.-UD
ToolTip Email address n<
v4 8llC8l|OExpf«5 \W*<[ +.'J\W*)" ,
ControfToValktate
1С of ihe .ontiof tc validate
У Тосюе* ^ Deiign ' ~ Split
«wciP.egt-a'-bp-esa ► **Fioe#rties J^t
Ready
Рис. 14.55. Использование проверяющих элементов управления ASP NET
В табл. 14.5 перечислены имеющиеся в ASP.NET проверяющие элементы управления
(вместе с кратким описанием каждого).
Таблица 14.5. Стандартные элементы управления
Элемент управления
RequiredFieldValidator
RangeValidator
RegularExpressionValidator
Описание
Используйте этот элемент управления для необходимых полей
вашей страницы. Вы можете комбинировать данный элемент с
другим элементом из этого списка
Используйте этот элемент для проверки ввода пользователя на
определенный диапазон значений. Используйте свойство Туре
для того, чтобы указать тип диапазона значений строковый,
целый, двойной точности, дата или валюта
Используйте этот элемент для проверки шаблона вводенных
пользователем данных Для этого вы указываете допустимое
регулярное выражение в свойстве ValidationExpression Кроме
того, в Visual Studio имеются встроенные регулярные
выражения. Щелчок по кнопке с многоточием этого свойства позволит
вам настроить стандартные регулярные выражения для таких
вещей, как почтовые коды, адреса электронной почты и номера
телефонов
Глава 14. Создание приложений ASP.NET
569
Таблица 14.5 (окончание)
Элемент управления
CompareValidator
CustomValidator
ValidationSummary
Описание
Используйте этот элемент для сравнения ввода пользователя. Вы
можете сравнить ввод со статическим значением, другим
элементом управления, а также типом данных Сравнение с типом данных
позволяет вам обеспечить ввод пользователем такого значения,
которое можно преобразовать в заданный тип данных Для
настройки этого сравнения используйте свойство Туре
Используйте этот элемент для создания вашего собственного
проверяющего элемента управления. Вы можете написать
проверку на стороне сервера и выдавать JavaScript для проверки на
клиенте
Используйте этот элемент для получения сводки по всем
ошибкам проверки на данной странице. Здесь окажется значение
свойства ЕгтогМеззаде для каждого проверяющего элемента
управления, проверка которого закончилась неудачно
Элементы управления входом в систему
ASP.NET имеет встроенный набор элементов управления входом в систему. Эти элементы
предназначены для обеспечения (не требующего или почти не требующего кодирования)
решения по управлению и аутентификации пользователей внутри Web-приложений.
Toolbox
ft.ftJfo^WUIfiW
"d№|
Я Data
;i; ЧЛЫЬп
'♦ Nffription
[АЛ<з& 11'
\ Pointer
**£, Login
^w LaginV»ew
^Ц, PftSswordRecovety
Э^ LoginStatus
^)j LoginNeme
$£ CresteUserWizird
Щ.. ChangePraword
< WebP»m
i AJAXfxteraimn
? Reporting,
>♦ НШ1
*> Gem**
Рис. 14.56. Элементы управления входом в ASP.NET
По умолчанию элементы управления входом используют то, что называется членством
ASP.NET. Данная функциональная возможность позволяет этим элементам управления
работать с базой данных аутентификации и соответствующими функциями без необходимости
писать код. Членство позволяет создавать пользователей и группы, а также управлять
пользовательскими данными (в том числе и паролями). Сервисы членства внутри ASP.NET мо-
570
Часть V. Создание промышленных приложений
гут работать с базой данных SQL Express или с Active Directory. Вы можете также написать
собственного провайдера, который будет подключен в данную модель.
Мы рассмотрим настройку членства чуть позже. Сначала изучим множество элементов
управления входом. На рис. 14.56 показан список всех этих элементов в панели
инструментов. Каждый элемент управления имеет свою задачу и соответствующее название.
В табл. 14.6 приведен краткий обзор этих элементов управления.
Таблица 14.6. Элементы управления регистрации
Элемент
управления
Login
LoginView
PasswordRecovery
LoginStatus
LoginName
CreateUserWizard
ChangePassword
Описание
Этот элемент управления обеспечивает основной интерфейс для запроса
у пользователя его учетных данных (имени пользователя и пароля) Вы
можете настроить вид элемента управления, а также показать другие
ссылки или сообщения (такие как ошибки аутентификации)
Этот элемент по умолчанию настроен на работу с членством ASP NET
Если вы его сконфигурируете, то вам не придется писать код Однако
если вы хотите написать свой код, то можете использовать событие
Authenticate для создания собственной схемы
Этот элемент управления позволяет вам определить два представления
информации* представление для зарегистрировавшихся в вашем
приложении пользователей и представление для анонимных пользователей
Вы добавляете элементы управления в каждое представление (для того
чтобы определить, что именно видят пользователи в зависимости от их
текущего статуса)
Этот элемент управления используется для восстановления пароля
пользователя Обычно его настраивают на отправку пользователю
пароля по электронной почте Однако имеются и другие варианты
Этот элемент управления показывает статус аутентификации текущего
пользователя Пользователь либо зарегистрировался, либо нет Если он
зарегистрировался, то элемент управления предоставляет ему
возможность выхода Если он не зарегистрировался, то элемент управления
дает ему возможность это сделать
Этот элемент управления показывает имя текущего зарегистрированного
пользователя
Этот элемент управления позволяет пользователям создавать
собственные учетные записи или помогает восстановить пароль Пользователь
может запросить создание учетной записи (и ввести необходимую
информацию) при помощи этого элемента управления
Этот элемент управления позволяет пользователям вводить текущий
пароль и новый пароль. Элемент управления может затем выполнить
проверку пароля и в случае ее успеха произвести необходимые изменения
Настройка аутентификации пользователей
Вы можете создать страницу входа (или элемент управления) путем перетаскивания
элемента входа непосредственно на форму. После этого вы можете начать настраивать свойства,
Глава 14. Создание приложений ASP NET
571
которые определяют безопасность вашего приложения. Пример показан на рис. 14.57.
Обратите внимание, что элемент управления входом дает доступ к ссылке Administer Website.
Эта ссылка приведет вас в инструмент Web Site Administration Tool (WSAT) для
администрирования вашего сайта, где вы можете начать определять вашу аутентификацию.
- \/\. i;.v7<"„"
File Ecff v<iev/ Web
J- __- J d 4
Тсч- Су r -i X
Standard
~ - Data
: > Va&fetkm
> Navigation
loqm
s ^ Poinfer
-4?, Loqm
''' LcginView
LcginStatus
x,k LcqmNan?
\ЛЛ Сгез eUs«t'A'tz
WebParts
■ AJAX Extensions
> Reporting
> HTML
> General
■i'~~i ' ~COl
3reg margir чаг dies to res
• fo ~" " "
rte Euito Debug Fctnat TVble Tco-s "est Wtrdr-л Hep
jC \ ^ *** ' ^J » >* 3eoug - riET ' 2?
logiruasp**
,
.' V
vimmm ^,w- ^><«™ **^
Customer Manager , ,<,l{ !«<-■--i . цс >JS=tJ2SLr5££«*.
XustlructttHt!»
](vstn<ctici$
^M^WIfiT-il^l^^
.... login Tasks
у
r-«»«^« - >-. -
b^1---'
Z0C3 &rod ict c: Cciroso
4 De:iom *~ Scfit " Scarce * -£^Car»er-*Cor*frtl> -э£з Lcyrtlcyi 1>
i2enar3irs Precs SHIFT cCTFi Ln 15 С-117 317
— M 4' '
5
" x X
~;
«
U- >< '2 i
-
>
Рис. 14.57. Элемент управления входом
Примечание
По умолчанию пользовательские данные посылаются от клиента на сервер в
незашифрованном текстовом виде. Поэтому для обеспечения безопасности вашего сайта
вам следует использовать SSL и HTTPS.
WSAT — это Web-инструмент, который позволяет вам настраивать ваш сайт (и в том числе
его безопасность). На рис. 14.58 показана начальная страница этого инструмента. Здесь вы
можете получить доступ к вкладке Security, определить конфигурацию приложения
(например, включить трассировку) и выбрать провайдера администрирования. Провайдер
администрирования по умолчанию — SQL Express. Это то место, где хранятся конфигурационные
(и в том числе пользовательские) данные вашего сайта.
Вы можете использовать WSAT для того, чтобы изменить систему безопасности с Windows
на Internet. Первая лучше в том случае, когда вы работаете в локальной сети. Вторая
требуется для большинства выставленных в Интернете сайтов. После установки типа модели
безопасности в значение Internet ASP.NET переключается на использование своей базы
данных членства (для хранения данных по пользователям).
Внутри WSAT вы можете использовать вкладку Security (показанную на рис. 14.59) для
настройки пользователей, ролей, а также доступа к этой базе данных. Обратите внимание на
три группы в нижней части экрана: Users, Roles и Access Rules. Там имеются ссылки для
572
Часть V. Создание промышленных приложений
управления учетными записями вашей системы. Ваш элемент управления входом будет
автоматически учитывать введенную здесь информацию.
<«fj ASP Net Wso Application Aantnctraticn - Wj^dcvks htevnet гхрЫег ^
*' bttp localhcr. 552754aspneftsv«sfcsdnir^tle5/defijh:eupv'8ppii:atic ■» j *t ' Л '
4" ц$° f Jet Web Apslication АЗгнгд! st-cn
дда1с4соп fto v de-
Welcome to the Web Site Administration Tool
Application •'CustomerManager
Current User Name:CEI DOMAIWMSNELL
Erables >'au tc set jp and edit jse^s, roles, and access pemussions fc your site.
Site a tisng windows authentication iot Jber management.
Erables >'Oti tc maiage your npphration's ccnffg«trstion sett4gs
Arables you to specif лпегв and how to store adv hist'alien data used by you'
Web site
'rusted sites | P-ctected Mcde CKf
мсоч - H
Рис. 14.58. Инструмент Web Site Administration Tool (WSAT)
#? ASP N*t Web uppficatk" Ai^r'itraticn - V» "dcv*s Cntsrret Explorer
l£i|r< .*'<-< http 'Icc«lh3sti53j7§'tspnetwefcedm«r>fii«s secwrty'security »sp:<
^i ASP Net Web Application Admir st it зп
^ ' С • *»
Security
Appicator
Vou can use trie ЛеЬ Site Administration Tool to manage э!1 the security settings For
vcvr application You сзп set up users and passwords (authentication^, create roles
,gicups of users), and oeate petmissicns [rules for controlling access to parts of ■/cur
application)
B/ default, user informahcn is stored in a Miciosoft SQL Server Express database in the
Data folder of voui Web site If you \*«ant to stcre user information in э different
database, use the Provider tab to select a deferent provider
Click me links tn the table to manage the settings for vour application
Existing users 1
Tru;t*dsitej|P-ctect»JMcde Off
k 4»: Ы&Ы
- P««e *■ Toe z. »
w
J
Рис. 14.59. Управление пользователями и ролями вашего сайта
Глава 14. Создание приложений ASP.NET
573
Элементы управления навигацией сайта
В море Web-сайтов легко потеряться. Если вы не обеспечите хорошей навигации, то
пользователи начнут жаловаться (или перестанут заходить на сайт). ASP.NET предоставляет несколько
элементов управления для описания и управления навигацией. Эти элементы включают:
□ Menu — вы можете использовать этот элемент управления для создания меню вашей
страницы при помощи Visual Studio. Меню поддерживают подменю и выпадающие
меню. Вы можете даже привязать ваше меню к источнику данных XML;
Я SiteMapPath — этот элемент управления позволяет вам при навигации пользователей по.
вашему сайту оставлять так называемые "крошки от печенья". То есть вы всегда можете
подсказать им, откуда они пришли и где находятся. При этом пользователи могут
использовать этот список для перепрыгивания обратно в то место, где они только что были;
□ TreeView — этот элемент управления может показывать иерархические данные. Однако
он может быть также привязан к XML-представлению вашего сайта, называемому
картой сайта. Таким способом вы можете быстро описать навигационную структуру
вашего сайта, которая обновляется в единственном месте.
Элемент управления SiteMapPath
Вспомним, что элемент управления SiteMapPath служит для ориентации пользователей на
вашем сайте. Вы управляете этой ориентацией посредством sitemap-файла. Добавьте этот
файл на ваш сайт при помощи диалогового окна Add New Item. Внутри него определите
логическую иерархию вашего сайта (вкладыванием страниц в элементы siteMapNode).
fc L-}tti э«де- Wirdows L-<t*rr«t Ыр\с^г^^^^^^ЩШШШШ
-к 4»i r$ Untitled Page
1 О
J conioso
1 Customer Manager
1 Instructions
I Instructions
f <\C.j:i?'"\ ><-</<v<>'«-
►*r Л - v : Edtt Customer
ь
Edit Customer
Fi'st Heme
Email
jcec®fabr кап can
Address
ICC» Microsoft Ave
'? cu5tciT««r has approved contact via errai
i OiStorrer has approved phone contact
| 5<<w | | С a ice |
:oobf
1 hlto //iocamort*52763/C jstCfvtrManager 'FtnoCu'
*i
f „if >»•*
Last Name
CbstcTer
Phone NLmber
123-123-.234
City
RsdncnC
''Dduct of Cortoso
, f :*- - -
- О v ** '
K^.X
State
[select state)
Trusted wtes | P-ct«cted Mcde- Off
1 ■—* i"'i ^s*?Mi& 1
-*;<.: * * |
Page w Toe* » ]
Postal Cede 1
' 1
\ iso% - 1
Рис. 14.60. Элемент управления SiteMapPath в действии
574
Часть V. Создание промышленных приложений
Например, если пользователи начинают с начальной страницы, то это будет ваш самый
внешний узел. По мере их перемещения по вашему сайту создавайте вложенные узлы.
В листинге 14.3 показан простой пример, который содержит описание трех уровней: Ноте,
Find Customer, Edit Customer. Это определяет логическое прохождение по сайту.
| Листинг 14.3. Sitemap-файл
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0м >
<siteMapNode url="Default.aspx" title="Home" description^'">
<siteMapNode url="FindCustomer.aspx" title="Find Customer" description="">
<siteMapNode url="EditCustomer.aspx" title="Edit Customer"
description="" />
</siteMapNode>
</siteMapNode>
</siteMap>
На рис. 14.60 показан результат — то, что пользователи видят в своем браузере. В данном случае
элемент управления SiteMapPath был добавлен на главную страницу, так что он присутствует на
всем сайте. Этот элемент автоматически подхватывает содержимое файла Web.sitemap.
^Элементы управления данными
ASP.NET имеет полный набор элементов управления, которые вы можете использовать для
работы с данными, их отображения и привязки к ним.
Toolbox |.л[|
1 > Standard ♦
D*t» i
1^ Pointer
Gncjir'ievv
J CstaList
DetailsV ew i
Forrrv'iew
J 't ListV ev/
I Repeater U
; «»/ DataPager i
| . * SqlDataScjrce ' i
i .fr AccessDataSojn.c
{ L'j LinqDetaSouice :
.£ OajfclDataScu'ce H
1 • w- ArrtDat*Sot>rce
. л. Si«MaoDetab3urre
J • Valuation j
l\ > Navigation
i\ i Logsi
< W«i>Parts !
» AJAX Extensions
< Reporting j
' HTMl У
- General , 1
\i
Рис. 14.61. Элементы управления данными в ASP NET
Глава 14 Создание приложений ASP.NET
575
Эти элементы управления должны работать без дополнительного кодирования (или почти
без него). Вместо написания кода вы можете настроить эти элементы управления так, как
вам нужно. На рис. 14.61 в панели инструментов показан список всех элементов управления
данными.
В табл. 14.7 дан краткий обзор каждого из этих элементов управления.
Таблица 14.7. Элементы управления данными
Элемент
управления
GridView
DataList
DetailsView
Form View
ListView
Repeater
DataPager
Data Source
Controls
Описание
Этот элемент управления предназначен для привязки к табличным данным и
работы с ними Элемент работает со многими источниками данных Он
позволяет также выполнять сортировку, разбиение на страницы, редактирование,
добавление и удаление
Вы можете использовать этот элемент управления тогда, когда хотите
управлять тем, как ваши данные отображаются и форматируются Вы можете
использовать этот элемент с шаблонами (для управления условиями и способами
отображения ваших данных)
Этот элемент управления позволяет вам отображать одну строку данных Вы
можете отобразить эту строку как набор редактируемых полей внутри таблицы
Элемент управления DetailsView можно сочетать с элементом GridView для
получения структуры редактирования типа "основные данные — подробности"
Этот элемент управления предлагает те же самые функции, что и элемент
DetailsView, но с дополнительными возможностями можно определить шабло- г
ны, в соответствии с которыми будет отображаться данная строка
Этот элемент управления появился в версии 2008 Он упрощает отображение
повторяющихся данных Элемент ListView управляется пользовательскими
шаблонами Таким способом вы можете настроить поведение вашего
пользовательского интерфейса во время таких операций, как- просмотр, редактирование,
добавление и удаление Кроме того, ListView поддерживает сортировку,
разбиение на страницы и, конечно, привязку данных Подробности по элементу
управления ListView см в главе 1 (см рис 1 14—1 16)
Этот элемент управления является контейнером для повторяющихся данных
Для указания способа отображения содержимого повторяющихся данных
используйте элемент управления Repeater с шаблоном Элемент управления
ListView может быть более удачным вариантом, чем Repeater
Этот элемент управления появился в версии 2008 и позволяет вам управлять
разбиением данных на страницы и связанным с этим разбиением интерфейсом
пользователя Вы можете использовать этот элемент управления как сам по
себе, так и встраивать его в другие элементы управления Этот элемент
управления также обсуждался в главе 1
В ASP NET имеется несколько элементов управления источниками данных Эти
элементы могут быть настроены для работы сданными источников и для
выполнения методов select, update, new и delete Используйте элементы
управления источниками данных для привязки к другим элементам управления
(таким как GridView) Элементы управления источниками данных ASP NET дают
доступ к данным SQL Server, Microsoft Access, к содержащимся в объектах
данным, данным XML, данным sitemap-файлов, а также данным LINQ
576
Часть V. Создание промышленных приложений
Примечание
Способы работы с данными и базами данных мы описываем в разд. "Привязка данных
к элементам управления Web" главы 18.
Пользовательские элементы управления
Если вы по-прежнему не можете найти безупречный элемент управления, то Visual Studio
предоставит вам инфраструктуру для создания ваших собственных элементов управления.
Вы можете пойти легким путем и определить пользовательский элемент управления. Это
файл, который вы можете конструировать как страницу, а затем использовать на других
страницах.
Пользовательский элемент управления добавляется в ваш проект при помощи диалогового
окна Add New Items. Такие элементы управления имеют расширение asx. Определяется
пользовательский элемент управления перетаскиванием элементов формы на страницу. То
есть пользовательские элементы состоят из одного или нескольких существующих
элементов управления ASP.NET. Например, вы можете создать простой пользовательский элемент
управления для выдачи списка стандартных ссылок. Преимущество такого элемента в
возможности его повторного использования. Вы сможете использовать этот элемент на многих
страницах сайта, но управлять им вы будете централизованно.
Кроме того, пользовательские элементы управления видны внутри визуального
конструктора. Так что когда вы перетаскиваете пользовательский элемент из Solution Explorer на
страницу, то видите его представление в панели конструктора. Однако когда на странице
существует пользовательский элемент управления, то вы работаете с ним как с единым
элементом управления. Он также может предоставлять свойства (как и другие элементы
управления). Однако если вам нужно работать с содержимым пользовательского элемента
управления, то вам придется открыть его в визуальном конструкторе.
Пользовательские элементы управления имеют также свой файл выделенного кода (для
обработки их собственных событий). Таким способом вы можете абстрагировать и
централизовать код для пользовательских элементов управления всей вашей страницы.
Примечание
Если пользовательский элемент управления вас все равно не устраивает, и вы хотите
добавить в него поддержку на этапе конструирования для панели инструментов,
настройки и окна свойств, то можете создать нестандартный элемент управления.
Нестандартные элементы работают в той же инфраструктуре, что и существующие
элементы управления ASP.NET. Вы даже можете сделать сабклассинг и расширить
существующий элемент управления для превращения его в ваш собственный
нестандартный элемент.
Резюме
В этой главе мы описали, как создать Web-приложение и построить Web-формы. Кроме
того, мы рассмотрели использование новых функциональных возможностей ASP.NET для
создания согласованного (и иногда настраиваемого) пользовательского интерфейса.
Глава 14. Создание приложений ASP.NET
577
Мы рассмотрели также многие элементы управления ASP.NET. Вот некоторые ключевые
моменты данной главы:
□ вы можете создать Web-сайт при помощи локального встроенного сервера. Вы можете
также создать свой сайт на удаленном сервере при помощи протоколов HTTP (и сервера
IIS) или FTP;
□ страницы свойств проекта Web-сайта позволяют вам настраивать то, что происходит
при запуске вашего приложения из Visual Studio (и не только это);
□ вы можете создавать темы для переключения внешнего вида вашего сайта без
необходимости писать код или перекомпиляции. Темы содержат таблицы стилей, изображения
и файлы обложек;
□ WebParts (Web-части) позволяют вам определять конфигурируемый пользователем
интерфейс пользователя. Вы компонуете этот интерфейс при помощи зон и размещаете
в них WebParts;
□ ASP.NET поставляется с элементами управления входом, провайдером членства и
инструментом WSAT для управления аутентификацией пользователей на вашем сайте;
□ элементы управления данными в ASP.NET облегчают привязку данных, их
редактирование и обновление (часто для этого даже ничего не нужно кодировать).
Глава 15
Создание приложений Windows Forms
Одной из основных целей Visual Studio является обеспечение быстрого создания форм
Windows Forms. При помощи визуального конструктора Windows Forms, панели
инструментов Controls и различных элементов управления общего назначения в этой главе вам будет
дано руководство по созданию богатых приложений на основе форм (при помощи техники
перетаскивания). Точнее, мы рассмотрим, как лучше использовать встроенные возможности
визуального конструктора форм и системы проектов Visual Studio для того, чтобы быстро
создать основу приложения с нуля.
,На данной стадии мы не будем заниматься выделенным кодом формы; вместо этого мы
сосредоточимся на пользовательском интерфейсе и возможностях технологии Rapid
Application Development (RAD) в визуальном конструкторе Windows Forms. Иначе говоря, мы
сосредоточимся на возможностях интегрированной среды, относящихся к стадии
конструирования (а не на тех возможностях форм и классов управления, которые относятся к стадии
выполнения).
Основы конструирования форм
Конструирование приличного пользовательского интерфейса для приложения под Windows
является не только наукой, но и искусством. В мире Windows Forms пользовательский
интерфейс является коллекцией изображений, элементов управления и элементов окон,
которые работают совместно. Пользователи получают информацию через пользовательский
интерфейс, а также используют его как основное средство взаимодействия с приложением.
При создании пользовательского интерфейса перед разработчиком стоит задача соблюдения
баланса: необходимо соблюдать баланс простоты дизайна и тех функциональных возможно-
стей^которые должны быть реализованы в приложении. Сюда же примешивается и
соблюдение стандартов, как формальных, так и основанных на имеющемся опыте.
Примечание
Несмотря на то, что в данной главе мы используем термин "разработчик",
значительная часть дизайна и компоновки пользовательского интерфейса выполняется
дизайнером. Несмотря на то, что многие группы разработчиков не могут себе позволить
роскошь нанять постоянного дизайнера пользовательских интерфейсов (во многих
Глава 15. Создание приложений Windows Forms
579
группах эти обязанности выполняют сами разработчики), этот вопрос быстро
становится ключевым конкурентным признаком, поскольку фирмы по разработке
программного обеспечения пытаются выделить свои приложения и подняться над
конкурентами на уровне восприятия внешнего вида своего приложения.
Конечный пользователь
Вы не сможете начать конструирование вашего приложения, если не понимаете, как оно
будет использоваться и кто является его целевой аудиторией. Приложения, которые
предназначены для хранения медицинской информации, могут иметь совершенно одинаковые
элементы данных и функции, но скорее всего будут иметь разный внешний вид в зависимости
от того, созданы ли они для обыкновенного потребителя или для врача (медсестры)
Исследование практических вариантов применения и удобства использования
приложений — это отличные инструменты для понимания ожиданий пользователя; они дают ценные
данные по соблюдению вышеупомянутого баланса простоты дизайна и функциональности.
•
Местоположение и культура
Местоположение и культура также присутствуют в этом уравнении. Обычное приложение
на основе форм, используемое в Соединенных Штатах, будет ориентироваться на
культурные ожидания американцев (привычка читать слева направо и сверху вниз). В этой среде
самые важные элементы пользовательского интерфейса обычно размещаются на самом
видном месте: в левой верхней части формы. Другие культуры могут потребовать
изменения этой стратегии (вследствие привычки читать справа налево и даже снизу вверх).
Большинство элементов управления Visual Studio 2008 напрямую поддерживает языки с
написанием справа налево при помощи свойства RightToLeft. При помощи установки этого
:войства в соответствующее значение перечисления RightToLeft вы можете указать,
должен ли текст элемента управления идти слева направо или справа налево, либо он должен
идти так, как это настроено для родительского элемента управления. Даже класс Form
поддерживает это свойство.
Кроме свойства RightToLeft некоторые элементы управления предоставляют также
свойство RightToLeftLayout. Установка этого свойства типа Boolean повлияет на общую
компоновку внутри элемента управления. Например, установка свойства RightToLeftLayout в
жачение True для экземпляра Form приведет к зеркальному отображению ее содержимого.
Совет
Более подробную информацию по конструированию приложения для международной
аудитории ищите в MSDN в статье "Best Practices for Developing World-Ready
Applications".
Кроме того, даже на такие простые вещи, как выделяемое для данного элемента управления
пространство, влияет выбор языка. Строка на языке U.S. English может потребовать
значительно больше места после перевода на Farsi. Однако многие элементы управления
поддерживают свойства, предназначенные для преодоления этой проблемы; настройка свойства
\utoSize элемента управления в значение True автоматически расширит клиентскую об-
ггасть элемента управления под содержащийся в ней текст.
580
Часть V. Создание промышленных приложений
Роль стандартов пользовательских интерфейсов
Приложения должны также стремиться к соблюдению соответствующих стандартов,
относящихся к их внешнему виду. Некоторые стандарты документированы владельцами
платформ. Например, фирма Microsoft имеет целый ряд руководств по дизайну
пользовательских интерфейсов, содержащихся в документации MSDN. Опубликованная в издательстве
Microsoft Press книга "Microsoft Windows User Experience" включена в MSDN полностью.
В этой книге рассматриваются такие темы, как "Data-Centered Design", "Input Basics" и
"Design of Graphic Images", которые являются основой дизайна пользовательских
интерфейсов, необходимой для разработчиков приложений под Windows.
Руководства по дизайну и стандарты пользовательского интерфейса часто специфичны для
конкретной платформы. Современный интерфейс приложения Windows ведет свое
происхождение от "нового дизайна", который дебютировал в Windows 95. Windows XP
дополнительно усовершенствовала этот дизайн. А в операционной системе нового поколения
Windows Vista уже имеется совершенно новый набор руководств по среде пользователя.
Visual Studio 2008 реализует некоторые из этих указаний по дизайну и стандартов — для
облегчения разработки соответствующих им интерфейсов. Например, высота кнопок по
умолчанию соответствует рекомендациям стандарта. Visual Studio также помогает
разработчикам при стандартном позиционировании элементов управления относительно соседних
элементов управления — при перемещении элементов управления по поверхности формы
она показывает линии привязки. Мы рассматриваем эту тему более подробно позднее в этой
же главе.
Стандарты "де-факто"
Очень серьезное воздействие на дизайн пользовательских интерфейсов оказывают
некоторые приложения. Один из таких примеров — Microsoft Outlook. Сейчас уже имеется масса
приложений, которые имитируют структуру и компоновку Microsoft Outlook, даже несмотря
на то, что сами по себе они не являются приложениями электронной почты. Дизайнеры
Microsoft Outlook при разработке основной формы "попали в яблочко" (в смысле удобства
ее использования), и теперь другие компании и разработчики используют эти темы в своих
приложениях. То же самое можно сказать и о внешнем виде ленты Ribbon, которая стала
популярна в пакете Microsoft Office 2007.
Несмотря на то, что имеются некоторые ограничения, Visual Studio позволяет
разработчикам создавать такие же качественные пользовательские интерфейсы, как и используемые в
Microsoft Office и прочих популярных приложениях. Если вы посмотрите на официальном
Web-сайте Windows Forms, то увидите демонстрационные приложения (написанные при
помощи Visual Studio), которые показывают, как вы можете разработать копии "фасадов"
приложений Microsoft Outlook, Quicken и даже Microsoft Money (зайдите на страницу
Downloads по адресу http://www.windowsclient.net).
Планирование пользовательского интерфейса
Прежде чем вы приступите к процессу конструирования в Visual Studio, будет очень
разумно сначала создать эскиз общей компоновки формы. Это может быть простой карандашный
набросок; все, что нам нужно — это простой эскизный проект приложения.
Глава 15. Создание приложений Windows Forms
581
В качестве примера рассмотрим приложение Windows Forms, написанное для
представителей отдела работы с клиентами фирмы Contoso. Приложение должно выдавать
иерархический список заказов (размещенных в фирме Contoso) и позволять сотрудникам отдела
делать поиск заказов и редактировать данные.
Предварительный дизайн
Для форм Windows общепринятым (в качестве стандарта "де-факто") является наличие
нескольких основных компонентов: меню, панелей инструментов и строк состояния — все это
стандартные элементы, и их, конечно же, можно использовать в нашем вымышленном
приложении для заказов.
Кроме этих основных элементов вам будет необходимо выводить на экран список заказов и
предоставить область, в которой будут демонстрироваться подробности заказа. Заимствуя
компоновку из Microsoft Outlook, вы можете получить предварительный план компоновки
формы вроде показанного на рис. 15.1.
1 - | ^1тЫ
ЧлЛ
(auto-expand» vertical?)
Data Entry Агез
(expands Ic fl avaHeble ia-m area)
Statu* Bat indicates cumrt app state proceeeng. etc}
Рис. 15.1. Исходный план компоновки
Важно уделить внимание вопросу изменения размера: как составляющие форму элементы
управления отреагируют на изменение пользователем размера формы? Что будет, если
размер элемента управления изменится вследствие изменения языка или отображаемых
данных? Уделив внимание вопросам изменения размера теперь, вы сможете позже сэкономить
огромное количество труда. Эскиз прототипа на рис. 15.1 содержит текст для того, чтобы
напоминать вам о настройке различных областей формы при изменении ее размера.
Создание формы
Несмотря на то, что существует много различных подходов к дизайну формы, в Visual Studio
начальной точкой для всех них является шаблон проекта Windows Forms Application.
582
Часть V Создание промышленных приложений
В диалоговом окне New Project выберите этот шаблон, дайте проекту имя и нажмите
кнопку ОК (рис. 15.2).
Мел Project
£roject types.
Templates.
[jttU Ft amework 3.S ▼ ] ГС (П)
Visual С*
endows
Web
ill
Reporting
WCF
♦VotlrflOA'
Other Languages
Other Project Types
\n idl 'iturjm 1115 dlled ttrr plate;
3vVindow5 Forms Application
L^VVPF Application
^Console Application
^3Windo*vii Service
kfjWPF User Control Library
My Templates
^jJSearch Online Templates .
£]Clas; Library
*"i| WPF Browser Application
"j\ Empty Project
<!•* WPF Custom Control Library
Jj Windows Forms Control Library
A project for creating an application with в «Vindows Forms user interface С NET Framework 3.51
J^anif CcntosoCSR
Location C\.U:tri\lpowerc REDMOND\Document;\Vi5ua! Studio 2008\Projecb
Solution.
Create пел Solution
Solution Магце CcntosoCSR
Vj Create directory Jcr solution
Рис. 15.2. Создание нового проекта Windows Forms
Тип проекта Windows Forms Application
Проекты типа Windows Forms Application состоят по умолчанию из класса формы и
(в случае языка С#) из статического класса Program. После создания проекта вы получаете
пустую форму, открытую в визуальном конструкторе Windows Forms. Для освежения в
памяти основных возможностей и компонентов визуального конструктора Windows Forms
обратитесь к главе 6.
Настройка стартовой формы
Несмотря на то, что проект цо умолчанию создает только одну форму, вы конечно можете в
любое время добавить в него множество форм. После этого возникает вопрос: как на стадии
конструирования указать, какую форму нужно показывать на стадии выполнения первой
(и нужно ли вообще)? Существуют два способа.
□ Для проектов на языке Visual Basic стартовая форма настраивается при помощи
диалогового окна Project Properties. Раскрывающийся список Startup Object этого
диалогового окна содержит все допустимые объекты форм. Вы просто выбираете ту форму,
которую вы хотите запускать при старте — и все готово.
□ Для проектов на языке Visual C# необходим чуть более сложный подход. Понятие
стартового объекта в С# — это любой класс, который реализует метод Main (). В теле
метода Main () вам необходимо разместить строку кода, которая передает экземпляр формы
Глава 15. Создание приложений Windows Forms
583
в метод Application.Run примерно так: Application.Run(new OrderForm()).
Если у вас есть класс, который реализует Main, и код в этом методе Main, который
вызывает Application.Run, то вы можете выбрать стартовый объект при помощи
диалогового окна Project Properties. Класс Program, который создается для вас в процессе
создания проекта, уже реализует метод Main и по умолчанию будет запускать при
старте форму по умолчанию (Forml).
Наследование внешнего вида другой формы
Если ваша форма похожа на другую форму (которую вы уже разработали), то вы можете
визуально наследовать внешний вид другой формы. Visual Studio предоставляет для такого
случая шаблон элемента проекта Inherited Form.
Для создания формы, которая визуально наследует интерфейс от другой, выберите меню
Project | Add New Item. В диалоговом окне Add New Item выберите тип Inherited Form.
В диалоговом окне Inheritance Picker перечислены доступные формы текущего проекта, от
которых вы можете наследовать. Обратите внимание, что у вас есть также и вариант
ручного выбора существующей сборки (если вы хотите наследовать от формы, которой нет в
списке). После того как вы выберете базовую форму, Visual Studio создаст новый класс формы;
его код уже будет отражать происхождение от базового класса.
События и свойства форм
Форма подобна любому другому элементу управления: вы можете использовать окно
свойств Properties в интегрированной среде разработки для управления ее различными '
свойствами. Несмотря на то, что мы не будем рассматривать здесь все эти свойства, в
начале создания новой формы вам будет нелишним обдумать несколько ключевых свойств.
Стартовое местоположение
Для позиционирования окна формы на экране при ее первом отображении используйте
свойство StartPosition, которое принимает значение из перечисления FormStartPosition;
его возможные значения описаны в табл. 15.1.
Таблица 15.1. Значения перечисления FormStartPosition
Значение
CenterParent
CenterScreen
Manual
WindowsDefaultBounds
WindowsDefaultLocation
Описание
Центрирует форму внутри ее родительской формы
Центрирует форму внутри текущего экрана дисплея
Форма позиционируется в соответствии со значением свойства
Form.Location
Позиционирует форму в положение по умолчанию Windows,
границы формы также определяются умолчаниями Windows
Позиционирует форму в положение по умолчанию Windows,
размер формы определяется свойством Form. Size (это
настройка по умолчанию)
584
Часть V. Создание промышленных приложений
Внешний вид
После нашего обсуждения важности дизайна пользовательского интерфейса не следует
удивляться тому, что вид формы является существенной частью пользовательской среды
приложения. Чаще всего значения по умолчанию (свойств внешнего вида) вполне подходят
для типичного приложения. Вы должны настроить свойства ForeColor и BackColor в
соответствии с цветовой схемой вашего приложения. Обратите внимание, что когда вы
добавляете на форму элементы управления, то у большинства из них свойство ForeColor
установлено в то же значение, что и у формы.
Некоторые свойства позволяют вам реализовать более экстравагантный пользовательский
интерфейс. Свойство Opacity позволяет вам реализовать прозрачные или полупрозрачные
формы. Это свойство может быть полезным в таких ситуациях, когда пользователи хотят
видеть ту часть экрана, которая находится за окном формы. В дополнение к свойству
Opacity можно использовать свойство Form.Backgroundlmage для настройки изображения для
фона формы. Это свойство лучше всего использовать для отображения цветовых переходов
или графики (что невозможно при помощи свойства BackColor).
Поскольку мы помним, что нашей целью является быстрое создание форм, то большая часть
описываемых в этой главе действий представляет собой настройку свойств форм в
визуальном конструкторе и добавление элементов управления из панели Toolbox на форму.
События формы
.Формы наследуют ту же самую архитектуру на основе событий, что и прочие элементы
управления. Некоторые публичные события, определенные в классе Form, полезны как
"точки впрыска" в течение всей жизни формы.
Старт
Windows-формы
Загрузка
Активирована
Показана
Деактивировать
FormClosed
Closed
FormClosing
Closing
Завершение
Windows-формы
Рис. 15.3. События в жизни Windows-формы
Глава 15. Создание приложений Windows Forms
585
На рис. 15.3 показаны различные стадии (и соответствующие события) от зарождения
формы и до ее закрытия. Для реагирования на событие формы вам нужно сначала создать
обработчик события.
Создание обработчика ошибок
Окно свойств Visual Studio предоставляет быстрый механизм для описания обработчика
события. Сначала надо выбрать интересующую вас форму. Затем нажать кнопку Events в
панели инструментов окна Properties. Теперь окно покажет вам список всех событий,
определенных на форме. Двойной щелчок по событию создаст пустую процедуру обработчика
события и откроет ее в редакторе кода. Обработчик события будет иметь корректный
список аргументов и соблюдать установленные стандарты именования обработчиков событий
(обычно это объект_имясобытия).
На рис. 15.4 показаны события формы в окне свойств Properties.
Properties
I Forml System.Windows-Forms Form
km®ii' -
DragEnter
DragLeave
DragOver
ErwhledChanged
Enter
FontChanged
FcreCatorChanged
ForrnClaserf
iiSifeS^^^B
GiveFeedback
HelpButtcnQicked
HelpRequested
1 ImeModeChanged
| InputLanguageCham
| InptrtLanguageCham
I KeyDown
FormGosfog
m
w
* 1
_
R
"
f Occurs whenever the us« closes the form, before 1
\ the form has been closed and specif [es the close, i
Рис. 15.4. События формы в окне свойств Properties
Теперь, когда форма у вас уже есть, вы можете начинать размещение элементов управления
на ее поверхности.
Добавление элементов управления и компонентов
Когда вы создаете приложение на базе форм, то для дизайна пользовательского интерфейса
применяются три отдельных инструмента Visual Studio: визуальный конструктор форм
Forms Designer (который обеспечивает основу формы), панель инструментов Toolbox
(содержащую элементы управления, которые будут размещаться на основе) и браузер свойств
(который используется для изменения: формы; ее дочерних элементов управления; внешне-
586
Часть V. Создание промышленных приложений
го вида и поведения). Эта триада инструментов интегрированной среды разработки является
ключом к быстрой разработке форм в Visual Studio (особенно в том, что касается создания
содержимого формы).
Термин "элемент управления" технически обозначает любой объект .NET, который
реализует класс Control. Практически же мы используем этот термин для обозначения
визуальных элементов управления, находящихся в форме. В отличие от них компоненты не
обладают визуальным интерфейсом (хотя имеют множество таких же характеристик, что и
элементы управления). Кнопка — это пример элемента управления, а таймер — это пример
компонента.
И элементы управления, и компоненты обитают в панели Toolbox (дополнительное
описание Toolbox см в главе 6). Добавление на форму элемента управления или компонента
производится перетаскиванием соответствующего элемента из панели Toolbox на поверхность
формы.
После того как вы поместили элемент управления на форму, визуальный конструктор форм
Windows Forms Designer прорисует элемент управления на форме (для того чтобы вы
получили представление WYSIWYG — то, как форма будет выглядеть на стадии выполнения).
Как мы отмечали в главе 5, работа с компонентами производится несколько иначе.
Визуальный конструктор форм имеет специальную область, называемую лотком компонентов
(здесь представлены все размещенные на форме компоненты). Это позволяет вам работать с
компонентами точно так же, как и с элементами управления (просто щелкая по ним), но при
этом на форме не появляется их визуальное представление (поскольку компонент не имеет
визуального представления).
На рис. 15.5 выделена область лотка компонентов визуального конструктора форм.
Г^*я i-o, ( f U сЧ<;
I
> - * ~ И» «* & J £ '* "
~ ^ » Д у farro2ci[De«gnJ
Components
^ Fr. it
jj h!<\, it-ъ., '<!►,'
F) НИ; Л к и *
„J Pnic rwiv* ourtrt
'^ Sefs .K.3f irt, Iff
О "-»«
■ Piwtiog
4 RepOft«Kj
3
! *
*.*}
U!
0<» « df v-
Легок компонентов
Рис. 15.5. Лоток компонентов
Глава 15. Создание приложений Windows Forms
587
Совет
Панель Toolbox можно настраивать: вы можете добавлять и удалять компоненты с
любой вкладки Toolbox. Щелкните правой кнопкой мыши внутри окна Toolbox и
выберите пункт Choose Items. После этого откроется диалоговое окно Choose
Toolbox Items; здесь вы можете выбрать обитающие в Toolbox элементы
управления. Если элемента управления нет на вкладках .NET Framework Components или
COM Components, то вы можете перейти к сборке элемента управления и добавить
его напрямую.
Компоновка и позиционирование элементов управления
Когда на форме находится несколько элементов управления, то визуальный конструктор
форм может помочь автоматизировать некоторые стандартные задачи компоновки, такие
как выравнивание группы элементов управления по вертикали. Мы снова отсылаем вас к
главе 6 за описанием способов использования этих инструментов повышения
производительности. Однако эти функции компоновки хотя и являются удобными с точки зрения
дизайна, но они ничего не дают вам на стадии выполнения.
Как уже отмечалось ранее, поведение элемента управления (внутри его родительской
формы) во время выполнения является важным вопросом (если вы хотите реализовать вашу
форму в соответствии с вашими проектными намерениями). То есть вам не только нужно,
чтобы элементы управления выглядели определенным образом, но они еще должны и вести
себя определенным образом при изменении размеров формы.
Самый простой способ продемонстрировать проблему изменения размеров формы — это
рассмотреть несколько рисунков. На рис. 15.6 показана простейшая форма: метка, текстовое
поле, кнопки ОК и Cancel. Элементы управления формы были тщательно размещены:
выдержаны равные расстояния, элементы аккуратно выровнены по горизонтали и вертикали —
короче говоря, эта форма выглядит именно так, как того хотел разработчик.
и^ Simple Form
labatt |
OK
[ сз | El ||шСЬЛ
| | Caned ! j
Рис. 15.6. Элементы управления на форме выровнены
Но затем в дело вступает пользователь. На рис. 15.7 показаны результаты изменения
размеров формы по горизонтали и вертикали.
Этот вид— совершенно не то, что планировалось получить; четкий и аккуратный дизайн
формы не справился с изменением ее размеров. Возможно, пользователь изменил размеры
формы в попытке получить больше места для ввода в текстовом поле. Либо пользователь
упорядочил все окна приложений в мозаичном порядке, что и привело к изменению размера
окна данного приложения. Какова бы ни была причина, совершенно ясно, что требуется
дополнительное вмешательство разработчика для того, чтобы дизайн стал "правильным"
(и не зависел от размера формы).
20 3ак 3716
588
Часть V. Создание промышленных приложений
$% Simple Form
labeH |
'»',
<Ж |
.
! Qyxret j
Ьш&ЫЕЫ]
Рис. 15.7. Изменение размеров формы сказывается на ее дизайне
При помощи сравнения рисунков до, и после изменения размеров вы можете выработать
стратегию и ответить на вопрос: "Что должно происходить при изменении размера формы
пользователем?" На рис. 15.8 показан снимок идеального варианта; текстовое поле
"последовало" за изменением размера (изменяя свою ширину в горизонтальном направлении).
Командные кнопки сохранили свое выравнивание друг с другом и с текстовым полем, но не
изменили своих общих размеров. Метка осталась в своем исходном положении.
«J Simpte Form
tabeH
OK
IjEiliiLMW:
1 1 Сагн^ ~]
Рис. 15.8. Реакция на изменение размера формы
Каждый объект формы имеет событие изменения размера, которое происходит при
изменении размера границ формы (чаще всего это происходит в результате перетаскивания
пользователем границы формы для увеличения или уменьшения ее размера). Поскольку каждый
элемент управления имеет такие свойства позиционирования, как Top, Left, Height и Width,
то для получения формы, показанной на рис. 15.8, можно было бы применить грубый
силовой подход — написав несколько строк кода для каждого элемента управления, вы могли бы
вручную переместить элементы управления или изменить их размер при изменении размера
формы и положения других элементов управления. Однако такой подход как минимум
трудоемок и дает весьма "хрупкий" код, который необходимо подправлять каждый раз, когда
компоновка и расположение элементов управления модифицируются.
К счастью, визуальный конструктор Windows Forms в Visual Studio (в сочетании с
некоторыми стандартными свойствами элементов управления) позволяет вам учитывать все
возможные оптимизации изменения размера уже при компоновке формы. При помощи
привязки (anchoring) и закрепления (docking) ваших элементов управления вы можете указать их
положение относительно друг друга и относительно границ формы.
Глава 15. Создание приложений Windows Forms
589
Привязка
Привязка— это концепция фиксирования статического (привязанного) положения левой,
верхней, правой или нижней границы элемента управления внутри границ самой формы.
Например, привязка метки к верхней и левой границе формы (так делается по умолчанию)
приведет к тому, что метка будет сохранять свое положение вне зависимости от того, как
будет изменяться размер формы. Свойство Anchor любого элемента управления может быть
настроено на любую комбинацию значений Top, Left, Bottom и Right. Браузер свойств
элемента управления предоставляет удобный виджет редактора свойств (рис. 15.9), который
графически выделяет те стороны элемента управления, которые привязаны.
Properties
£gg
| buttonCancd System.WfndDws.Fornu.Btftton
^MiMrld :
Ш (AppticatianSettings)
|Ш (DeUBmdings)
|i (Name) buttonCancei
AccessibfeDescriptioi
AccessibfeNaroe
AccessibfeRde
AllowOrop
AutoEll
AutoSil
AutoSifm
Backed
Backgrj
Default
Fake
Bottom, Right p] j
BsckgroundlmageL* Ttte
CausesVatidation True
ContextMenuStrip (none)
Anchor
Defines the edges of the container to which a
certain control ts bound. When a control rs anch..
Рис. 15.9. Настройка свойства Anchor
Привязка противоположных сторон элемента управления имеет интересный эффект.
Поскольку каждая сторона должна сохранять свое положение относительно сторон формы,
то сам элемент управления будет растягиваться по вертикали или по горизонтали (в
зависимости от того, какие стороны были привязаны — Тор и Bottom или Right и Left).
Фактически это именно то, что вам нужно для текстового поля: вы хотите, чтобы его ширина
и высота изменялись при изменении размера формы. При привязке всех сторон элемента
управления вы получите поведение, показанное на рис. 15.8; элемент управления
автоматически подстроил свои размеры (при этом от разработчика не потребовалось написания
никакого кода).
Примечание
По умолчанию элементы управления обычно привязываются по верхней и левой
стороне. Вы можете спросить: что же получится, если вообще не делать привязки?
В этом случае элемент управления будет сохранять свое точное положение
независимо от изменений размеров формы. Это фактически то же самое, что привязка
верхней и левой сторон, поскольку точкой отсчета формы является ее самая
верхняя левая точка.
590
Часть V. Создание промышленных приложений
Привязка также решает проблему позиционирования командных кнопок. Если вы измените
их свойство Anchor на Bottom, Right — то они закрепятся к правой нижней стороне формы,
что соответствует их рекомендуемому расположению на форме. Поскольку вы не
закрепляете противоположные стороны элементов управления, то вы не заставляете кнопки
изменять свой размер; они просто перемещаются для сохранения расстояния от правой и нижней
границ формы. Сравните это с привязкой текстового поля: поскольку вы привязали все
стороны, то не только выдерживаете определенное поле между текстовым полем и формой, то
также и растягиваете текстовое поле в обоих направлениях.
Закрепление
Для простой формы, показанной на рис. 15.8, вы можете произвести компоновку при
помощи свойства Anchor. Но если вы посмотрите на общий план экрана (рис. 15.1), то увидите,
что некоторые требования позиционирования очень непросто реализовать при помощи
привязки. Например, область ввода данных формы должна автоматически расширяться по
вертикали и горизонтали для того, чтобы заполнить все свободное пространство между
списком запросов, строкой состояния и панелью команд. И здесь на выручку приходит
концепция закрепления. Закрепление используется либо для приклеивания элемента
управления к краю соседнего элемента (или краю формы), либо для того, чтобы заставить
элемент управления заполнить все имеющееся пространство, не заполненное другими
элементами управления.
1^ак же, как и в случае со свойством Anchor, браузер свойств предоставляет графический
инструмент для настройки свойства Dock элемента управления (рис. 15.10).
Properties
&&
buttonCancel System Windows,Forms.Button -
ki! M* ' '
Cursor
DialogResult
Enabled
IS FlatAppearance
FlatStyle
Ш Font
ForeColor
GenetateMember
Image
ImageAlign
Irnagelndex
ImageKey
ImageList
Ш Location
Locked
Dock
Defines wbcb borders a
the container.
Default
None
None)
[None
1 (none)
MiddleCenter
| tnone)
| (none)
(none)
196.49
False
f the control are
* \
[7
I ,
~~1
И
~ V
bound to
Рис. 15.10. Настройка свойства Dock
Глава 15. Создание приложений Windows Forms
591
Автоматическое масштабирование элементов управления
Ядро Windows Forms поддерживает возможность динамической настройки размеров
элемента управления для сохранения его исходных пропорций. Эта возможность полезна в том
случае, когда форма (или элемент управления) отображается на стадии выполнения в
системе с другими характеристиками дисплея (разрешение, количество точек на дюйм и т. д.),
чем те, которые имелись на той системе, где производилась разработка данной формы (или
элемента управления).
Простой пример: приложение, в котором при его конструировании был использован вполне
приемлемый шрифт размером 9 пунктов, становится практически непригодным при
отображении на системе, у которой размер шрифта по умолчанию больше. Поскольку многие
элементы пользовательского интерфейса автоматически подстраиваются под шрифт
отображаемого в них текста (например, заголовки окон и меню), то это может повлиять
практически на все визуальные аспекты приложения, выполненного на базе форм.
Элементы управления, являющиеся контейнерами (например, производные от класса
ContainerControl, в том числе классы Form и UserControl), начиная с .NET 2.0
поддерживают два свойства, которые позволяют им автоматически справляться с этими
проблемами (без серьезного вмешательства разработчика): AutoScaleMode и AutoScaleDimensions.
Свойство AutoScaleMode указывает значение из перечисления, которое определяет, что
именно должен использовать процесс масштабирования в качестве точки отсчета—
количество точек на дюйм или разрешение. В табл. 15.2 показаны возможные значения
AutoScaleMode.
Таблица 15.2. Значения перечисления AutoScaleMode
Значение
Dpi
Font
Inherit
None
Описание
Масштабировать по разрешению (96 dpi, 120 dpi и т. д )
Масштабировать по размерам используемого шрифта
Масштабировать по значению базового класса AutoScaleMode
Автоматическое масштабирование не производится
к
Свойство AutoScaleDimensions настраивает размеры (при помощи структуры sizeF), с
которыми элемент управления был спроектирован изначально. Здесь может быть указан
размер шрифта или количество точек на дюйм.
Использование контейнеров
Контейнеры — это элементы управления .NET, предназначенные для содержания других
элементов управления. Для создания сложного дизайна вы можете использовать контейнеры
в сочетании со свойствами Anchor и Dock элементов управления. Несмотря на то, что
имеется множество различных контейнерных элементов управления, самыми часто
применяемыми ЯВЛЯЮТСЯ классы FlowLayoutPanel, TableLayoutPanelИ SplitContainer.
Классы TableLayoutPanel и FlowLayoutPanel наследуют от более обобщенного класса
Panel. Этот класс предоставляет возможности очень высокого уровня для группировки
592
Часть V. Создание промышленных приложений
элементов управления. Это полезно для компоновки, поскольку вы можете сгруппировать
несколько элементов управления при помощи размещения их внутри одной панели. После
этого вы можете работать с ними как с одной группой; например, деактивация панели
приведет к деактивации всех ее дочерних элементов управления. Классы TableLayoutPanel и
FlowLayoutPanel используют эту функциональность, а также добавляют возможность
динамически влиять на позиционирование своих дочерних элементов управления.
TableLayoutPanel
Рассмотрим набор меток и текстовых полей для ввода адресной информации. Они обычно
размещаются в виде строк и столбцов. Элемент управления TableLayoutPanel идеален для
реализации такого поведения, поскольку он автоматически обеспечивает упорядочивание в
строки и столбцы для всех элементов управления. На рис. 15.11 показан набор меток и
текстовых полей, встроенных в TableLayoutPanel. Обратите внимание, что изменение размера
формы (и таким образом, и самой панели, которая закреплена для заполнения внутренней
части формы) приводит к автоматическому выравниванию элементов управления панели.
Если элемент внутри одной из ячеек выходит за ее пределы, то он автоматически
переносится внутри ячейки. Это дает вам такие же возможности компоновки, какие предоставляет
HTML для интерфейсов на основе Web-браузеров.
*tl TanleLayout
1 label 1 |
Iabd2
iabeU
1»'£1|£Ы:
«*j Tablelaycut
label 1
I*«I2
labeO
[о Ш\МЫ]
Рис. 15.11. Панель TableLayoutPanel
Примечание
Когда в панель TableLayoutPanel добавляется элемент управления, то он получает
пять дополнительных свойств: Cell, Column, Row, ColumnSpan и RowSpan. Эти
свойства могут служить для изменения положения элемента управления
(строка/столбец) внутри панели на стадии выполнения. Свойства ColumnSpan и RowSpan
используются точно так же, как и их тезки в мире HTML. Те элементы управления
.NET, которые насыщают другие элементы управления дополнительными свойствами,
называются провайдерами расширений.
FlowLayoutPanel
Элемент управления FlowLayoutPanel имеет более простой алгоритм компоновки:
элементы упорядочиваются по вертикали или горизонтали простым переносом элементов
управления по рядам или столбцам по мере необходимости. Два показанных на рис. 15.12 экрана
Глава 15. Создание приложений Windows Forms
593
иллюстрируют эффект изменения размера панели FlowLayoutPanel, содержащей набор
селективных кнопок.
«£ FlowLayout |«;И51|ИИГ
|ф radoSuttonl О <жк>6ийоп2
JO md»Button3 О m*oflutton4
\?J> radtoButtpnS О шИоВиИопб
С mdeW»en7 С> radk)8Utton8
*% HowLayopt [шШУЁЙШ j
|& radtoBusonl «j rado&iton2 > , radtoButtoo3 I
k< ndoButton4 О mtoButtsnS О radoButtonS
О radtaBudon7 П radoButtonS С redtoBUionS 1
О f»*oBuHdo10 j
;Оя*>ви»вл9 О га*)Button 1Q IN |
! П
,' ' i : -г** .—*ш- <ш««-
Рис. 15.12. Панель FlowLayoutPanel
SplitContainer
Элемент управления SplitContainer является гораздо более усовершенствованным
вариантом исходного элемента управления Splitter, который впервые был введен в .NET
1.0/1.1 /Visual Studio 2003. Этот элемент управления представляет собой союз двух панелей и
разделителя; разделитель разделяет две панели либо по горизонтали, либо по вертикали и
позволяет пользователю вручную настроить ту часть пространства внутри общего
контейнера, которую занимает каждая из панелей.
На рис. 15.13 показана универсальность этого элемента управления; два разделенных
контейнера (причем один из них содержится в панели, находящейся в другом контейнере)
используются для того, чтобы обеспечить возможность как вертикального, так и горизонталь*
ного изменения размеров панелей на форме (панель 2 невидима, поскольку это панель-
контейнер для разделенного на панели 3 и 4 контейнера). Перетаскиванием вправо линии
раздела панели 1 вы можете изменить занимаемое ею на форме пространство. То же самое
справедливо и для линии раздела между панелями 3 и 4: перетаскивание этой линии
приведет к изменению относительного размера этих панелей.
^ШР*.*1!Г!
PmtH
|
U, „s,w„v„w ~^wUw
ймме
„,, ,~,^__„,„_.^
pgg::::::
N rtndl
|l—...v ~
! !
i. РмеИ I
i [
■; PwwE |
-J- ~>
Рис. 15.13. Изменение размера для SplitContainer:
горизонтальный SplitContainer встроен в вертикальный SplitContainer
ToolStripContainer
Многие приложения поддерживают возможность перетаскивания и закрепления панелей
инструментов и меню и т. п. к любой стороне формы — верхней, нижней, правой или левой.
594
Часть V. Создание промышленных приложений
Примером такого приложения является сама Visual Studid. Например, вы можете
переместить панель инструментов в Visual Studio к левой стороне формы. Элемент управления
ToolStripContainer позволяет вам использовать эту функциональность в ваших
приложениях; он является комбинацией четырех панелей, каждая из которых размещается на разных
сторонах содержащей их формы. Эти панели используются для элементов управления
ToolStrip (подробнее о них чуть позже) и во время выполнения дают пользователям
возможность перемещать полоски инструментов внутри этих четырех панелей и между ними.
Примечание
Несмотря на то, что ToolStripContainer обеспечивает удобное средство фиксации
полосок инструментов к сторонам формы, встроенной поддержки "плавающих"
полосок инструментов, к сожалению, не существует.
Конструирование простое: вы можете перемещать элементы управления между четырьмя
панелями по вашему желанию. На рис. 15.14 показан ToolStripContainer на стадии
конструирования. Смарт-тег обеспечивает управление видимостью верхней, левой, правой и
нижней панелей. Все панели по умолчанию скрыты. Вы можете щелкнуть по любой стрелке на
сторонах контейнера для разворачивания соответствующих панелей (чтобы получить место
для размещения полосок инструментов внутри панелей).
<./> Conta^oCSR - Micro jDfc Visual Studio
file Edit View Prcject guild Debug Data look
л * _j • ui a ** <. „ - - - -
it^UigM
Toolbox
^ PnntUocument
.Д PrintPieviewConttol
JJ FrintPreviewDnlog
^ Process
. РгодгемВаг
_^P ProptrtyGrid
'»> RadioButlcn
eA RichTectBax
*'\ SaveRleDialog
t/ SertalPort
'*£ ServtceCont/clftf
ГП SplrtCcntainer
♦|* Splrtter
| StalusStnp
TabContfDl
,».; TableLayoLitPanel
«Ы TertBox
0 Timer
■ -> ToolStrip
Tj ToolStripContainer
4j TeolT.p
3 TrackBar
\ TreeVievv
^* X
Window Help
1 - it Debug » Any CPU
i Y5 Я? 'Л 4-1 £* £*
foofi UipCont*fr»ef.cs (Design]
ltt»c? Tr->IStripCr>r(t»nef
о П 1П&Д
--„—.. г ~~.ш ToojstripCont*iner T»$la
Panel УшЬЯКу
tf) Тор
<V] Bottom
fVi Left
f Э1 Right
Ready
Рис. 15.14. ToolStripContainer в режиме конструирования
Несмотря на то, что удобно иметь возможность размещать элементы внутри ToolStripContainer
при помощи визуального конструктора, реальное преимущество этого элемента
управления — это автоматическая поддержка перетаскивания между панелями на стадий
выполнения. Это означает, что без единой строки позиционирующего кода вы получаете функцио-
Глава 15. Создание приложений Windows Forms 595
нальность, которая позволяет пользователям размещать их меню или панели инструментов в
любом месте внутри формы. На рис. 15.15 показана находящаяся в ToolStripContainer
панель инструментов, которая на стадии выполнения была перекреплена от верхней панели к
левой панели.
«3* ToolStripContainer
J
\£$
Г
\J
г
La
La
и*
loiBMfldj
Рис. 15.15. Панель инструментов, перемещенная внутри ToolStripContainer
Внутри любой панели ToolStripContainer может находиться несколько элементов
управления ToolStrip. На рис. 15.16 показано несколько полос команд, размещенных стопкой
внутри правой панели. Как отмечено далее в этой главе, порядок следования элемента
управления по координате Z определяет его место в стопке.
щ} ToolStnpContainer
1 1 j Uwl уцикЛЗ^Д
J j4
_i Ш
У *.r
«J r :
4
^j
Л
Чф
Рис. 15.16. Несколько панелей инструментов стопкой в одной панели
Примечание
Совместное использование пространства внутри контейнера полосы инструментов (по
вертикали или горизонтали) называется рафтингом: элементы управления полосы
инструментов могут свободно плавать внутри панели.
При компоновке и позиционировании форм/элементов управления есть еще несколько прочих
тонкостей, но основы мы уже рассмотрели. При помощи этих концепций и общего дизайна
вашей формы вы можете начинать пользоваться визуальным конструктором Windows Forms.
596
Часть V. Создание промышленных приложений
Внешний вид элемента управления и его поведение
Внешний вид элемента управления настраивается при помощи того же самого набора
основных свойств, который используется для управления внешним видом формы: это свойства
ForeColor, BackCoIor и Font.
Визуальные стили
Однако у элемента управления есть интересная способность автоматически менять свой
внешний вид в соответствии с текущей темой рабочего стола (при работе под управлением
операционных систем Windows ХР или Windows Vista). Эта возможность включается
вызовом метода Application.EnableVisualStyles. Эта строка кода автоматически
включается (по умолчанию) первой строкой в метод Main. Такое расположение идеально,
поскольку этот вызов должен быть сделан до фактического создания элементов управления в
приложении. Если вы удалите этот вызов, то сможете сравнить внешний вид при
включенных и выключенных эффектах. На рис. 15.17 показана форма без визуальных стилей (слева)
и форма с визуальными стилями (справа).
«у VisualStyto
Nan*' j
1? checkBo*!
Г chtdiBml
OK
I i jR|JHHM]
4
i
1
1 c*1cei 1 '
.--.... - - и
I *£ VuualStyta
Name
| fe} checkBood
PcheckBox2
[ OK ~
IulLMMW
НГ~а^»П ;
Рис. 15.17. Эффект использования Application. EnableVisualStyles
Порядок табуляции
По умолчанию порядок, в котором элементы управления получают фокус (порядок
табуляции формы), совпадает с тем порядком, в котором они были помещены на форму. Для явной
установки порядка табуляции всех элементов управления формы интегрированная среда
разработки имеет режим выбора порядка табуляции.
Для того чтобы войти в режим выбора порядка табуляции, выберите в меню View | Tab
Order. Визуальный конструктор Windows Forms пометит номером каждый элемент управления
на форме. Этот номер представляет собой положение элемента управления в
последовательности табуляции формы. Для настройки желаемого порядка табуляции просто щелкните
последовательно все элементы управления — их порядок табуляции будет автоматически
меняться в соответствии с вашими щелчками.
Подсказки
Подсказки ToolTips — это маленькие "воздушные шарики", которые отображают текст
тогда, когда пользователь устанавливает курсор над элементом управления. Обычно они
используются для подсказок или описаний цели элемента управления, его работы и т. д. Эти
подсказки реализованы при помощи класса ToolTip и могут присваиваться элементам
управления на стадии конструирования.
Глава 15. Создание приложений Windows Forms
597
Класс ToolTip является примером провайдера расширений (см. предыдущее примечание о
провайдерах расширений в нашем обсуждении элемента управления TableLayoutPanel).
После добавления на форму компонента ToolTip каждый элемент управления формы
реализует свойство ToolTip, которое используется для присваивания подсказки для данного
элемента управления.
Например, если вы хотите добавить подсказку для кнопки ToolStrip, то вам необходимо
сначала перетащить компонент ToolTip из панели инструментов на вашу форму. Затем надо
выбрать кнопку ToolStrip, к которой вы хотите добавить подсказку, и настроить ее свойство
ToolTip так, чтобы оно ссылалось на экземпляр ToolTip вашей формы.
Работа с элементами управления ToolStrip
Многие основные стандартные визуальные элементы формы реализуются при помощи
элементов управления ToolStrip. Этот элемент работает как контейнер для других элементов
управления, наследующих от ToolStripItem; он может содержать различные типы
элементов управления: кнопки, комбинированные окна, метки, разделители, текстовые поля и даже
индикаторы хода выполнения. Сам класс ToolStrip используется для непосредственной
реализации панелей инструментов на форме, а также работает как базовый класс для
элементов управления StatusStrip и MenuStrip.
Элементы управления ToolStrip имеют впечатляющий список встроенных возможностей.
Например, они поддерживают перетаскивание элемента из одной полоски инструментов в
другую, динамическое переупорядочивание и отсечение элементов при изменении пользог-
вателем размера полоски или ее родительской формы, а также полностью поддерживают
различные темы операционных систем и схемы визуализации.
Все виды элементов управления ToolStrip имеют некоторые общие признаки:
□ смарт-тег времени конструирования предоставляет быстрый и простой доступ к
обычным командам;
□ для дочерних элементов управления поддерживается редактирование "на месте"
(например, добавление, удаление и изменение элементов в ToolStrip, StatusStrip или
MenuStrip производится при помощи мыши);
□ диалоговое окно Items Collection Editor позволяет вам получить более тонкое
управление свойствами дочерних элементов управления, а также позволяет
добавлять/переупорядочивать/удалять дочерние элементы управления;
□ полоски инструментов поддерживают модель визуализации с дополнительными
модулями: вы можете изменить визуализатор полоски инструментов на готовый объект
визуализации или на нестандартный объект— и получить полное управление внешним
видом полоски инструментов.
С самого начала конструирования формы вы уже знаете, что вам понадобятся меню, панели
инструментов и строки состояния — так что элемент управления ToolStrip и его потомки
будут играть важную роль.
598
Часть V. Создание промышленных приложений
Создание меню
Элементы управления MenuStrip дают вам возможность визуально конструировать систему
главного меню формы. Перетаскивание этого элемента управления из панели Toolbox на
пустую форму автоматически прикрепит полоску меню к верхнему краю формы (рис. 15.18).
ЬС,^*»*Е;
*&сря.9&
т
fife £dit View froject fcuild £«bug Djte Format loot Vtfni
ь&ШШ
» Any CPU
П ABWMomForm
lfc P04nt«r
^ BatkgroundWorker
f'ji Bindmgtovtgator
t" BmdtngSource
® Button
0 ChtckBox
jjjjj CheckedLirtBox
'»1 CclorOialcg
£J ComboBox
^ ContouMenuStrip
*J DataGrtdVrew
j?j DataSet
*й^ DateTimePicker
£1 DirectoiyEntry
£Д Directory-Searcher
;. * DomainUpDown
0 ErrorProvider
$ EventLog
^Jj FileSyrtemWatcher
Ready
«ax
FonnLcs(D«ignr^
£*• rr*nuStfipl
jfj 387x24
Рис. 15.18. Меню, размещенное на форме
Pifrffifltt
C<Mtpsoffj^:jM^«>tl
шшм
loiB
FBe £dft irlev Project B_uild gebug Dj.t«
.«* i- « i * л ...I. tvi *i*
Format Took ^Vindo* hjrtp
^ * , Уа > Debug * Arty CPU
Tcotbcx
! J АИ Window* Fwtoj
^ Pointer
У BackgroundWorker
s'pi BindingNavtgator
£y BindtngScurce
© Button
0 CheckBcx
12 CheckedListBox
П ColorDialog
*J ComboBox
^| ContextMenuStrip
jj DataGridView
^ DataSet
<"S! DateTimePicker
2D DirectoryEntry
|Tl Directory Searcher
* DomamUpDown
О ErrorProvider
ijjj EventLog
^ FileSyrtemWatcher
*~ FlowLayoutPanel
-* a X
Forrol.cs [Design]*
iJSdfeffiSL.
fife Edit Tools Help
йк menu$»Kpl
Ready
"h o,o
ifi 387x24
Рис. 15.19. Меню со стандартными пунктами
Глава 15. Создание приложений Windows Forms
599
После того как вы поместили на форму этот элемент управления, выбор элемента
MenuStrip активирует глиф смарт-тега (смарт-теги рассматриваются в главе 8). Щелчок по
смарт-тегу позволяет вам быстро сделать три вещи:
□ автоматически вставить в меню стандартные пункты;
□ изменить для меню свойства RenderMode, Dock и GripStyle;
□ отредактировать элементы меню.
Использование возможности автоматического оснащения полоски меню стандартным
набором пунктов меню экономит несколько минут времени по сравнению с ручным вариантом
выполнения этой работы. На рис. 15.19 показан результат.
Визуальный конструктор добавил не только стандартные пункты меню верхнего уровня
File, Edit, Tools и Help, но и подпункты в каждом меню. В табл. 15.3 показана точная
структура меню, которая получается в результате использования функции Insert Standard Items.
Таблица 15.3. Стандартные пункты меню
Главное меню
File
Edit
Tools
Help
Пункты меню
New, Open, Save, Save As, Print, Print Preview, Exit
Undo, Redo, Cut, Copy, Paste, Select All
Customize, Options
Contents, Index, Search, About
<^ ContosoCSR- Microsoft Visual
File £dit View £roject fiuild fiebug Dfita Format Tools Window Help
L ! J -' -
Teroibc*
- АЯ Windows Form*
i lfc Pointer
'j} BackgrcundWortrer
4}d BindtngNavigator
-f BindingSource
@ Button
Э ChecLBox
i; CheckedLutBc*
vl CctarDtelcq
Tf CcmbeBox
Ц CcntextMenuStrip
(J DataGridView
^j DataSet
7* DateTimePtcker
Ъ\ DirectoryEntry
Q. Director/Searcher
^ DomainUpDown
i$ ErrorProvider
j*) EventLog
^l FileSyrtemWatcher
^ FlawLayoutPaneJ
Ready
- " * ' ^ Debug - Any CPU
?i *• У* У1 Z £ & si
FormLcs [Design}*
F.ie Edit
Iocli fcjelp
My Menu
My Sub Menu
My Sub Menu 2
b Menu
>з- menuStnpl
TJ 0,24
Рис. 15.20. Добавление пунктов меню вручную
600
Часть V. Создание промышленных приложений
Если вы хотите вручную добавить пункты меню в строку меню, то вы можете использовать
местозаполнитель внутри полоски (там, где написано "Туре Неге"). При вводе в местозапол-
нителе становятся видимыми дополнительные местозаполнители, а в строку меню
добавляется новый пункт (рис. 15.20).
Создание панели инструментов
Следующий элемент для формы — это панель инструментов. Панели инструментов в версии
.NET 2.0 и более поздних реализуются непосредственно при помощи элементов управления
ToolStrip. Как уже упоминалось, элементы управления ToolStrip могут содержать
различные дочерние элементы управления; каждый из них наследует от базового класса
Tooistripitem. На рис. 15.21 показаны элементы управления, которые можно реализовать
внутри полоски инструментов.
Фактически интерактивные функции компоновки полоски инструментов работают так же,
как и у полоски меню: перетаскивание элемента управления на форму приведет к тому, что
пустой элемент управления ToolStrip будет прикреплен к верхнему краю формы
непосредственно под меню, и вы сможете быстро добавить в полоску инструментов набор
стандартных элементов (при помощи ее смарт-тега и выбора пункта Insert Standard Items).
ToolStripltem
СО
5
Q)
S
О.
CD
7
C[
ToolStnpButton
ToolStripComboBox
ToolStripDropDownButton
ToolStripLabel
ToolStripProgressBar
ToolStripSeparator
ToolStripSplitButton
ToolStripTextBox
Рис. 15.21. Классы, которые наследуют от ToolStripltem
Примечание
Элементы управления используют концепцию упорядоченности объектов по Z-
координате для определения их "глубины" на форме. Если два элемента управления
Глава 15. Создание приложений Windows Forms
601
занимают на форме одно и то же пространство, то порядок следования элемента
управления по Z-координате определяет то, какой из них находится сверху, а какой
снизу. Управление этими слоями в интегрированной среде производится при помощи
щелчка правой кнопкой мыши по элементу управления и выбора команд меню Send
to Back или Bring to Front.
Порядок по координате Z играет важную роль в размещении прикрепленных
элементов управления. Прикрепленные элементы упорядочиваются на форме по
возрастанию их Z-индекса. Например, если вы выделите ToolStrip и выберете команду Send
to Back, то порядок контейнеров MenuStrip и ToolStrip изменится таким образом,
чтобы поместить ToolStrip первым (наверху формы), a MenuStrip — вторым (сразу
под ToolStrip).
На рис. 15.22 показана разрабатываемая форма с добавленным элементом управления
ToolStrip.
vft ContoscCSR - Microsoft Visual Studio
A file Edit View Erojert guild fiebug Data Format Jools Window Heip
J3" _d' 3 У Ш -> -* : ** " r * * ~ -> ► Debug - AnyCPU
[.** L % J | - «• -j .:. ; <;! л - yt ss % ;> & &: §: ' >
[Toolbox ^^ <» 4~X FormLcslDerignr
4& PrintDocument
1 Д PrintPreviewContrct
.1 ^3 PuntPreviewDialog
H ^ Process
П CD PregresiBar
[1 ^j* PropertyGrid
1 <*) RadioButton .
1 *A RichTexlBox j
1 ^] Savef ileDialog >
J ^ SerialPort
I "J ServiceCcntroller
Q] SphtContamer
4 H* Splitter
L. StatUiStrip
j „ | TabControl
*j -i J TablelayoirtPanel
1 »ы TextBcx
0 Tim"
j± ToolStrip
у j£j ToclStripContainer
!L %). JoorriE L,
*£&№(&
FHe j-drt loots hidp My Menu
Jjyj A 4i u& **
1 U
>~ menuStripl ^* toolStnpl
„
*[Ready tj 15Д5
Ь^«ом».....:...::..лт..1моцГ7.мик «иыж-.а л:::ыхж-.-..ы ~ .*.
E.
- 15
. 'j « St
f^T й j£jf
_^^^^____
D
ь
±•3 403x285
ёЦщ&аГ
-i
~ x
Рис. 15.22. Главная форма с готовым меню и панелью инструментов
Если вы хотите дать пользователям возможность перетаскивать панель инструментов или
меню к одной из четырех сторон формы, то вам необходимо использовать контейнер
ToolStripContainer. Здесь есть короткий путь: вы можете взять любой из находящихся на
форме элементов управления ToolStrip и добавить его в ToolStripContainer несколькими
щелчками мыши. Одним из пунктов, имеющихся в смарт-теге полоски инструментов,
является команда Embed in a ToolStripContainer. Если вы выдадите эту команду для панели
инструментов, которую вы только что добавили на форму, то Visual Studio сделает для вас
две вещи: добавит ToolStripContainer на форму и поместит выбранный вами ToolStrip в
этот контейнер (в верхнюю панель ToolStripContainer).
602
Часть V. Создание промышленных приложений
Создание строки состояния
Строки состояния дают пользователю информацию о текущем статусе приложения, о
продвижении некоего действия, о выделенном на форме объекте и т. д. Элемент управления
StatusStrip обеспечивает эту функциональность, начиная с .NET 2.0/Visual Studio 2005, и
заменяет собой элемент управления StatusBar, имевшийся в предыдущих версиях.
Точно так же, как и другие потомки ToolStrip, элемент управления StatusStrip работает как
контейнер; его способность содержать внутри себя метки, индикаторы выполнения,
выпадающие списки и разделенные кнопки делает его гораздо более мощным элементом
управления, чем StatusBar.
На рис. 15.21 показана вымышленная форма для работы представителей отдела
обслуживания клиентов фирмы Contoso (с элементом StatusStrip, прикрепленным внизу формы).
В режиме конструирования вы видите кнопку раскрывающегося списка, в котором имеется
выбор всех четырех поддерживаемых дочерних элементов управления. В данном
демонстрационном прототипе добавьте метку для общего статуса приложения, а также еще одну
дополнительную метку и индикатор выполнения (на случай, если вы окажетесь в состоянии
длительной операции поиска или редактирования).
У* ContosoCSa - Microsoft Vousi Studifo px &<*$** ; ^ $щ \Ш*ф&Ш
fife £dit #ew Project fiuild Qebug Data Format look Window tfefp
1 Л - -J * ui Я Ф * -fc Z { ** " ™ " *- ' > ► Ddwg ^ ^ • AnyCPU
\';* L i J 1 *<- -J ^ >' *S * i' -** W ?£ 35 I «? H §t 6t I Ч и L
Toaflbex *il Xl
1 _£3 » r«t«.««»»y |
-i& PrinlDocument i
J Д PrmtPreviewCDnirol
I jj] PrintPrewewDtalog
1 J3 Process
II i—) ProgressBar
| *f PrapertyGrtd
1 0 RadioBirttor» J
1 ЛЛ RichTectBo*
1 23 SaveFileDiaiog * f||
I pT SerialPort f
II '*£ ServiceControiler j
I! [TJ SplitCorrtainer \
I *|* Splitter 1
1 L_ StatiftStrip
II " TabConfrol
1 z2 TabteLayoutPanel
1 «Ы TcxtBox i
1 0 Timer
FocmLc* [Dc^gnf
File £drt Tools Help My Menu
j *? ы or a 4* *& i*
f:i „
^ A SUtusLabel
• ' C-" ProgressBar
i i >ja* DropDownButton
II u* ToorStnp !jf
il 13 ToatUnpContainer HI
[3 SpfitButton
pi L_rtatu$Stnpl
jht-.ToolTip ЧН-—
|j Ready
•1Д
^ Sl;
..дГ.8Щ
LeM^M]
i
i
-> x '
M
1
N
i
i
«'
•-
1
Рис. 15.23. StatusStrip в режиме конструирования
По умолчанию дочерние элементы управления будут добавляться внутри StatusStrip путем
упорядочения потоком слева направо. Всего шестью щелчками мыши (по два на элемент)
вы можете добавить эти элементы управления на полоску. Возможности редактирования "на
месте" очень удобны для быстрой настройки внешнего вида полоски; для более тонкого
управления дочерними элементами управления полоски вы можете использовать диалоговое
окно Items Collection Editor.
Глава 15. Создание приложений Windows Forms
603
Совет
Щелчком правой кнопкой мыши по любому дочернему элементу StatusStrip и
выбором пункта Convert To вы можете быстро изменить тип элемента управления
Например, если у вас в строке состояния имеется метка, а вы хотите кнопку
раскрывающегося списка, то вам нужно щелкнуть по метке правой кнопкой мыши и выбрать Convert
То | DropDownButton. Это избавит вас от необходимости удалять старый элемент
управления и добавлять новый.
Редактирование элементов StatusStrip
Для открытия диалогового окна Items Collection Editor используйте смарт-тег SmartStrip и
выберите пункт Edit Items. Редактор обеспечивает прямой доступ ко всем свойствам
вложенного элемента управления, а также позволяет вам редактировать, удалять и
переупорядочивать элементы внутри полоски состояния (рис. 15.24).
Items Collection Etftor
Select item and add to lirt below
L_J Progr«sBar ▼
Members-
1 statusStfipl
A toolStiipStatifsLabell
A toolSunpStatusLabeft
щ ияёвпаяЯ Д—■
ДО
!' ♦ .
i 4
нищ 2£
!
[ U 1<ЙЙ&$ййа
loolStripProgresiBa/ roolStupProgresiBarl
i « Л 1
tlSLiL
AutoSize True *
AutcToalTip Falne
Enabled True
MarqueeAnirnatianSpeed 100 U
Maximum 100 |
Minimum Q 1
Step 10
Style Block , I
ТооГПрТезЛ I
Value 0 I
Visible True ч 1
В Date I
В (ApplicationSrttingi] 1
Tag ||
В Design I
(Name) tootStripProgressBarl w |
• OK Cancel |
__ -^^____ J
Рис. 15.24. Редактор Items Collection Editor
При помощи настройки некоторых имеющихся здесь свойств вы можете улучшить
компоновку и внешний вид ваших элементов. На рис. 15.25 показана компоновка по умолчанию
для добавленных вами элементов управления; в идеале нужно, чтобы индикатор выполнения
и его метка находились в правой части полоски состояния, а метка состояния — в левой ее
части (и занимала все оставшееся пространство).
tDofStripStatusLabett toolStripStatuitebeQ {
Рис. 15.25. Элементы StatusStrip по умолчанию
Для этого вам нужно настроить свойство Spring самой левой метки в значение True. Это
приведет к тому, что метка будет расширяться и сжиматься для заполнения имеющегося в
полоске состояния пространства. Теперь нужно изменить ее свойство TextAlignment для
604
Часть V. Создание промышленных приложений
того, чтобы разместить текст в левой части области метки и изменить свойство Text на что-
то более подходящее.
На рис. 15.26 показаны плоды наших трудов.
Ready. Lwdtng CSRTktofc Щшттжътвщ-
Рис. 16.26. Окончательный вид StatusStrlp
Отображение данных
До настоящего времени мы описывали только те элементы форм, которые обеспечивают
основную навигацию пользователя, статус, команды и т. д. Однако реальная ценность
такого приложения, как наше вымышленное приложение CSR (для отдела обслуживания
клиентов фирмы Contoso), состоит в его способности получать доступ к хранилищу данных
(реляционному или другому), отображать их и редактировать. Мы затронем подробности
работы с базами данных в следующей главе; здесь же мы опишем некоторые из основных
элементов управления, используемых для отображения данных в форме.
Иерархические данные
Элемент управления TreeView идеален для представления данных с иерархическими
связями и поэтому является хорошим кандидатом для хранения списка записей о заказах
(который можно группировать по разным критериям). Сначала надо добавить элемент
управления SplitContainer. Это приведет к разделению оставшегося внутреннего пространства
формы на две отдельных панели. Еще одна панель будет содержать функцию поиска
заказов; она будет прикреплена к верху левой разделенной панели. Элемент TreeView заполнит
собой оставшуюся часть этой левой панели, а в правой панели будут содержаться поля
данных (текстовые поля, метки, селективные кнопки и т. д.) из записи CSR.
Элементы управления TreeView представляют данные как список узлов; каждый узел может
служить родителем для дополнительных узлов. Обычно в приложениях для работы с базами
данных содержимое TreeView создается при помощи привязки к результирующему
множеству из базы данных или при помощи программного перебора результирующего множества
и добавления узлов TreeView (посредством его API). Но вы также можете управлять
содержимым TreeView в визуальном конструкторе (через запуск редактора TreeNode Editor).
Редактор TreeNode Editor
Редактор TreeNode Editor (рис. 15.27) — это диалоговое окно, которое работает во многом
аналогично рассмотренному ранее редактору Items Collection Editor. Оно дает вам
возможность добавлять, редактировать и удалять элементы из элемента управления TreeView. Вы
можете запустить диалоговое окно редактора при помощи выбора пункта Edit Nodes в
смарт-теге TreeView.
Используя кнопки Add Root и Add Child, вы можете вставлять новые узлы в древовидную
структуру данных на любом уровне. На рис. 15.27 показаны вставленные вручную узлы с
Глава 15. Создание приложений Windows Forms
605
тестовыми данными — для того, чтобы вы получили представление о том, как будет
выглядеть список заказов (когда компания используется как родительский узел, а экземпляры 3aJ
казов — как дочерние узлы под компанией). Каждый элемент (или узел) в TreeView состоит(
из двух частей: изображения и текста. Изображение не обязательно; если вы хотите
прикрепить к узлу значок, то сначала нужно присвоить элементу управления TreeView элемент
управления ImageList.
TreeNode Editor
Select a node to edit
I ,-" Company ABC
| Comparr/XYZ
I
;
I
i
I
Addfioot J | AddCJ
.
;3
i'2SJ
1
1
i
'
!
nld
Nodel Bropertiex
t Jl
BackColor
ForeColor
Name
NodeFont
ToclTipTeit
В ftotevfar
Checked
CcntextMenu
ContextMenuStrip
lmagelndex
ImageKey
Tent
The text displayed in
' 9 ^jft^J]
П 1
□
Nodel ■ ■ \
(none) 5
Order 1090081G |
I
False ' I
fnonei
(none)
| | (default)
□ (default)
the label of the tree node.
' OK CanceJ ||
li
Рис. 15.27. Использование визуального конструктора
для редактирования заметок в представлении дерева
Использование ImageList
Элементы управления ImageList работают как провайдер изображений для других
элементов управления. Они содержат коллекцию объектов image, на которые можно ссылаться по
их порядковому номеру или ключу. Любой элемент управления, имеющий свойство
ImageList, может ссылаться на компонент ImageList и использовать его изображения.
Примерами таких элементов управления являются ListView, ToolStrip и TreeView.
Примечание
Visual Studio 2008 поставляется с большой библиотекой изображений, которые вы
можете использовать с TreeView или любым другим элементом управления (таким
как панель управления или меню), которому требуются эти стандартные изображения.
По умолчанию эти файлы изображений находятся в C:\ProgramFiles\Microsoft Visual
Studio 9.0\Common7\VS2008lmageLibrary.
Элемент ImageList не имеет визуального представления на форме; т. е. вы не можете видеть
сам ImageList. Он используется исключительно как "закулисный" компонент, который
поставляет изображения другим элементам управления. Перетаскивание ImageList на панель
визуального конструктора приведет к размещению экземпляра компонента в лотке
компонентов (рис. 15.28). Затем вы можете использовать диалоговое окно редактора Images Collection
Editor для добавления, редактирования и удаления изображений, содержащихся в компоненте.
606
Часть V. Создание промышленных приложений
Изменение изображений, связанных с ImageList приведет к автоматическому изменению
изображений, используемых любыми элементами управления, ссылающимися на ImageList.
»^ ContosoCSR - Microsoft Visua' Studio
Ые £dit View £roj«l guild Qebug Data Formal loots Window Help
iJp" _J» u* У ЙР & *Л „ *? * ч - . ' - i V Debug - Any CPU
J I i I T" .<> 'I V > >U« ^> "t? - Crf (**■ <»
- Э
=* ;
ToaJboy
П АЙ Windows Forres
1^ Pointer
^J BackgrcundWork»
*.<i BindtngNevigator
*.,- BmdingScurce
(*b) Button
И CheckBox
'12 CheckedbstBo*
•£] ColorDialog
*5j ComboBox
tfc ContextMenuStrip
<J DataGridVtew
j£ DataSrt
T* DateTimePicker
J3 Director/Entry
'~l DtrectorySearcher
I DomamUpDown
0 ErrorPravider
s^ EventLog
^yj FileS>stemWakher
*■* FlowLayoutPanel
Ready
* Л X
FormLcs [Design]*[
«s1 fcwni
file £drt loob Help My Menu
J JdJ Л *j Л fc
- Company ABC
Order 1330C81G
Company XY2
| Penefi
Re»dy Processing ^_
мшю|
ll
i
>> nenuStripl -^tDolS'npl I ititLiStn'pi
^imigeLiitl
Рис. 15.28. ImageList, добавленный в визуальный конструктор форм
images Collection Editor
U
Members.
МП Folder.Qpenpng
I Add" ~~] f fcemove
К
Ll
Settings.png properties:
В МЬс
Яг '-Of* lf-?"li tr "*•
Name Settmgs.pr*g
Ш -*V МП т- .я. t .-С *
0^ ]| Cancel |
Рис. 15.29. Редактор Images Collection Editor
На рис. 15.29 показано несколько изображений, добавленных для использования в элементе
управления TreeView. Для того чтобы TreeView смог использовать эти изображения, вам
нужно сделать две вещи:
□ указать в свойстве TreeView.ImageList ссылку на экземпляр компонента ImageList
(в данном случае — imageListl);
Глава 15. Создание приложений Windows Forms
607
□ настроить изображение для узла либо программным способом, либо при помощи
редактора TreeNode Editor.
Теперь, когда компонент ImageList на месте и TreeView перетащен в левую панель
SplitContainer, наша форма с точки зрения конструирования почти закончена. Остались
поля, которые будут отображать данные выделенной в элементе управления TreeView
записи.
Вы можете добавить эти поля при помощи простого перетаскивания текстовых полей и
меток на панель TableLayoutPanel и последующего закрепления их в открытой панели
SplitContainer. Но поскольку вы хотите работать с ними как с единым целым (для
упрощения позиционирования, привязки данных и т. д.), то вместо этого вы создаете
пользовательский элемент управления для отображения записи приложения CSR.
Табличные данные
Элемент управления DataGridView является основным элементом управления Visual Studio
для отображения данных в табличном формате. Он обеспечивает формат в виде строк/
столбцов для отображения данных из различных источников. На рис. 15.30 показан
DataGridView с открытым меню его смарт-тега; это меню дает быстрый доступ к свойствам
столбцов сетки, а также позволяет вам непосредственно привязывать DataGridView к
источнику данных.
V* ContosoCSR Microsoft Visual Studio
File £drt i'iew Eroject EujJd £ebug Data
JJ - -J ' »J «J & * -J - *j , -. „
-» L :- l ~ - -j .i :li л
>Fj DatiGridVlcw-a [Design]*
F£rmat Tools &mdow Help
► Debug - Any CPU
^ ■& ft £1 §: «: Ы "£
- i3
■*-' DataGridView Tasks
ChocseData Source
tdtt Columns
A.id Colurri \
J, Enable Adding
j/. Enable Editing
V Enable Deleting
~~ Enable Column Reordering
Do<kin parent container
!H
Ready
Рис. 15.30. Элемент управления DataGridView
608
Часть V. Создание промышленных приложений
Источники данных
Элемент управления DataGridView поддерживает самые различные источники данных.
Например, поддерживается отображение пар "имя/значение" для коллекций (помимо
стандартной поддержки наборов данных, возвращаемых из реляционных хранилищ данных).
Если вы выберете для сетки источник данных, то в сетку будет добавлен столбец для
каждого имеющегося в источнике данных столбца, а данные строк попадут в элемент
DataGridView автоматически.
Данные в сетке могут отображаться и в режиме "без привязки"; при помощи API сетки вы
можете программным путем определить структуру сетки и добавить в нее данные на стадии
выполнения.
Типы ячеек
Каждая отдельная ячейка в DataGridView работает как встроенный элемент управления.
Каждая ячейка может по-разному отображать содержащиеся в ней данные; флажки,
выпадающие списки, ссылки, кнопки и текстовые поля — все эти типы ячеек поддерживаются.
Кроме возможностей по визуализации данных, каждая ячейка имеет собственный набор
событий, которые можно перехватить в коде. Например, вы можете перехватить события
входа курсора мыши в определенную ячейку и выхода из нее.
Мы подробно описываем этот элемент управления в главе 18.
Создание пользовательских элементов управления
Если ни один из готовых элементов управления .NET не соответствует вашим запросам, то
вы можете создать собственные элементы управления (для использования в формах
Windows Forms) одним из следующих трех способов:
□ вы можете произвести сабклассинг существующего элемента управления и
модифицировать или расширить его поведение и внешний вид;
П вы можете создать пользовательский элемент управления при помощи сочетания двух
или более существующих элементов управления;
□ вы можете создать нестандартный элемент управления с нуля, реализуя ваши
собственные внешний вид и поведение этого элемента.
Сабклассинг существующего элемента управления
Сабклассинг существующего элемента управления является самым лучшим подходом в том
случае, когда ваши потребности лишь незначительно отличаются от одного из стандартных
элементов управления .NET Framework. При помощи наследования от существующего
класса элемента управления вы получаете его поведение и внешний вид; затем вы добавляете в
ваш новый класс элемента управления свой специализированный код.
Предположим, что вы хотите получить текстовое поле, которое становилось бы красным
каждый раз, когда вводится цифровой символ (т. е. неалфавитный символ). Это легко
сделать несколькими строками кода, находящимися в событии Textchanged элемента управ-
Глава 15. Создание приложений Windows Forms
609
ления TextBox, но выделение этого поведения в отдельный класс даст возможность его
последующего повторного использования.
Начать нужно с добавления в проект нового пользовательского элемента управления.
Пользовательские элементы управления фактически наследуют от класса UserControl.
Поскольку вы хотите наследовать от класса TextBox, то вам придется изменить определение
класса при помощи редактора кода. После этого вы можете поместить новый компонент на
форму и использовать его функциональность.
Работа с унаследованным элементом управления
Поскольку TextBox уже имеет пользовательский интерфейс, то вам не нужно ничего делать
по внешнему виду элемента управления. Фактически он будет работать как любое другое
текстовое поле в визуальном конструкторе Windows Forms Designer (рис. 15.31).
Окно свойств Properties элемента управления ведет себя как и ожидается, и двойной
щелчок по элементу управления моментально переносит вас в открытое окно редактора кода.
Короче говоря, среда разработки на стадии конструирования полностью сохраняет свою
работоспособность и не требует от разработчика дополнительных усилий.
<^> ContcsoCSR- Microsoft Visuet Studio
' сз-1 £Р Ь|ЗЫ
£ile fccflt View grpj«ct guild Qebug Dgt* Format loots Window Help
;*a* J*LJf Ы ЙР £ -Лл М •*>•*-' *~--,;)► Debug • Any CPU
ц J. i я! ~ *> ж ! ♦;;-, Ы ч>l * - V: 3r ?~ ilu\ *i I
Fomt2.cs [De4pn]
• 3
Hemfe) Saved
ижгшР
Рис. 15.31. Унаследованный элемент управления на форме
Конструирование пользовательского элемента управления
Пользовательский элемент управления технически является точно таким же классом, как и
любой другой класс, который вы разрабатываете; поскольку пользовательский элемент
управления имеет визуальное представление, то Visual Studio предоставляет визуальный
610
Часть V. Создание промышленных приложений
конструктор (как и для Windows Forms) для содействия в создании такого элемента
управления обычными средствами перетаскивания.
Пользовательские элементы управления— это составные элементы, т. е. они
сконструированы из одного или более существующих элементов управления .NET. Точно так же, как и в
случае унаследованных элементов управления, их пользовательские интерфейсы наследуют
от базовых элементов управления (из которых они состоят), что делает простым их создание
и использование в визуальном конструкторе.
Существуют два подхода к процессу создания пользовательского элемента управления: вы
можете создать отдельный проект типа Windows Control Library или просто добавить
класс пользовательского элемента управления в существующий проект Windows Forms.
Создание отдельного проекта позволило бы пользовательскому элементу управления
существовать в своей отдельной сборке. Если это отдельная сборка, то вы можете обращаться с
пользовательским элементом управления как с черным ящиком, что дает вам большую
гибкость с точки зрения управления исходными кодами и позволяет совместно использовать
данный элемент во многих проектах. Для промышленных сценариев это, безусловно, самый
лучший путь. Однако для создания простых прототипов (как в данном примере приложения
CSR), легкость и простота добавления нового класса в существующий проект делают такой
подход более предпочтительным (чем отдельный проект). Этот класс будет существовать
внутри того же пространства имен, что и класс формы.
Если вам когда-нибудь придется делать переход от прототипа к реальной промышленной
разработке, то ничто не помешает вам сделать рефакторинг элемента управления (при
помощи простого копирования файла класса пользовательского элемента управления и
встраивания его в отдельный проект библиотеки элементов управления).
<л* ContoioCSR - Microsoft Visua Studso
Fife Edii tfiew Project guild Bebug Dflta
J-J'jysl ^ ,.-*.««.
< 1 ; 1 ^-J л! Ймл
V OrdcrOtspbyxs [Design]*;
£' i i
r? '
» i
i
|
1
i i
1 I °
| Ready
с*\&ЫШ*
Format Tool j Window Fjelp
> - ч k Debug - Any CPU - Jfr 'll
K* D>i i+ ' £> £J /s* > \ i .
■w x SoitncT Explorer-СomoscCSR ▼ 3, x ц j
f£'JH id 3£i ~4
'^33 Solution CorrtosoCSR i,\ project) ^
i i- J3 ContovoCSR £
t ^, Prcperties |
* ^ References
< * ^j\ DetaGndView cs
► ^3 FlowLayoutcs
' JJi Forml ci
! ^ Fcrml Designer cs
< ^ Forml res.* [
a
о
i J3 Form2 cs
+ Л OrderDisplay cs
'£ Picgram cs |
+ J~j SplitPanel cs [
; J TabfeLayout cs
JL 1 ToclSlnpCcntainer cs
j _J3 VisuatStyles cs
Г
"L 15.15 ±ij 427x384 j
Рис. 15.32. Визуальный конструктор User Control Designer
Глава 15 Создание приложений Windows Forms
611
После добавления класса пользовательского элемента управления в проект запускается
визуальный конструктор User Control Designer (рис. 15.32). Визуальный конструктор работает
точно так же, как и визуальный конструктор Windows Forms Designer; для создания
пользовательского элемента управления вы перетаскиваете компоненты или элементы управления
из панели Toolbox на его поверхность.
Добавление элементов управления
Очевидно, что элементы управления, которые вы используете для создания вашего
составного элемента управления, будут полностью зависеть от его желаемой функциональности.
Например, для создания элемента управления отображением заказа вам нужно обдумать
структуру данных заказа. Запись о заказе может содержать следующее:
□
номер заказа;
набор дат: дата размещения заказа, дата отправки заказа и т. д.;
список позиций, включенных в заказ;
информация о выставлении счета и адрес доставки;
различные комментарии.
Поскольку этой информации слишком много, чтобы ее удалось втиснуть в один экран, вы
можете обратиться к TabControl. Это еще один контейнерный элемент управления общего
назначения, который позволяет вам организовать контент в несколько страниц, доступ к
которым осуществляется через вкладки. На каждой вкладке вы можете использовать ТаЫе-
LayoutPanel и реализовать большую часть полей заказа при помощи простых пар
"метка/текстовое поле".
ч/* Conta;oCSft - Microsoft Visua. Studio
File Edit £iew Project
Jb-J-uild 0 *
< 1 * ! ~ ►- „
Toolbox
*^ RichTertBox
jfj SaveFileDialcg
tf SerialPort
1 "£ StrviccContToller
I Ш SplrtContdiner
*\* Splitter
1 StatuiSlnp
TabControl
tv j TableLayoutPanel
■Ы 7ех1бод
0 Timer
>- TcolSUip
1 J^| ToolStripCcnrainei
кд ToolTip
) TrackBar
\ TreeVirvv
* VScroltBar
£3 WebBrowier
i-> Common Control*
^ Pointer
lib) Button
| Ready
guild
i .
* a
J -дшуй$& 1P*S ШШШ
gebug Da> look Window Help
X
|
|
w
- , - V Debug - Any CPU
Lxi ч_1, к» 0-.Ч с Л» л'* V > f
OrderDispUy.cs [Design]*
1 Order |«mg jsfcppng]
|i Order Nbr I
i !
;i Date Raced
; DateShpoed ~ f ~
iijCommenli £ ~ "* " " " °"
i!' о
; j
■ i 6..... . .. ._ *. g.j . . _
. Orderllerre I
\[\ j
iHistBoxi
:'•'
;!i
,-ii
' ,1
1'
i;;
"' ■::..:::.ж ишщ
■■шг I'^jflg
- 3
i t -
■•I
.
,1
Д
1
_ _,
ii
;!
'
-■ X
-T
>u
fi>
rn
■c_
1
4:
у
1
? 1
Рис. 15.33. Конструирование пользовательского элемента управления
612
Часть V. Создание промышленных приложений
Весь процесс сбора этих элементов управления в пользовательский элемент управления
работает идентично визуальному конструктору Windows Forms Designer: вы перетаскиваете
элементы управления из панели Toolbox на поверхность конструирования
пользовательского элемента управления. На рис. 15.33 показан пользовательский элемент управления Ог-
derDisplay с завершенным пользовательским интерфейсом.
Встраивание пользовательского элемента управления
Теперь, когда конструирование вашего пользовательского элемента управления завершено,
единственный оставшийся шаг — это встраивание элемента управления в вашу первичную
форму. Если вы откомпилируете проект, то Visual Studio автоматически распознает класс
пользовательского элемента управления и включит в панель Toolbox элемент для него.
Теперь вы можете просто перетащить элемент управления OrderDisplay для его реализации.
На рис. 15.34 вы можете видеть элемент OrderDisplay в панели инструментов, а также и
результат перетаскивания элемента OrderDisplay на поверхность формы.
^* ContoioCSR * Microsoft Yuuti Studio
File £dtt View £roject guild fiebog Date Format look Bfmdow hfelp
Л - .J " fcj? Ы 0 4. ;t L, *J - *4 * '<■ • * ► J?«bug - Anycpu
й Ц j *П ~ ~* А Р,и :h\ 4 \ - - 3? & & \ % £ ft? ** I h -
ForniLc» [Design]*
File Edrt loots Help My Menu
J «J У J & -a & tf
tij Company'ABC
Company ХГ2
Order .e*ng [Sh«»ig
QiderNbr
Date Placed
Date Shaped.
Comments
Ready
Processing.. $
>bf menuStripl ^ toolStnpl I statusStnpl *P imaqeListl
Щ ReBdy
TJ 1*15
Рис. 15.34. Пользовательский элемент управления в панели инструментов и на форме
Создание нестандартного элемента управления
Нестандартные элементы управления имеют максимальную способность к расширению,
поскольку они создаются с нуля. В результате их относительно сложно разрабатывать —
так как вам приходится заботиться не только о функциональности, но и обо всех аспектах
внешнего вида элемента управления. Поскольку физический пользовательский интерфейс
нестандартного элемента управления на 100% должен рисоваться кодом, то процесс соз-
Глава 15. Создание приложений Windows Forms
613
дания нестандартного элемента управления связан с большим объемом самостоятельной
работы.
Поскольку ббльшая часть работы по созданию нестандартного элемента управления
выполняется на уровне кода, то мы не станем подробно заниматься данной темой в этой
книге. Однако необходимо заметить, что процесс начинается точно так же, как и для
других элементов управления: Visual Studio имеет шаблон проекта нестандартного элемента
управления; добавление его в проект даст вам основу для начала разработки. Дальше все
зависит от вас.
Примечание
Событие OnPaint — это то место, где вы размещаете код прорисовки
пользовательского интерфейса вашего элемента управления. Несмотря на то, что так называемые
"рисуемые владельцем" элементы управления могут иметь сложный код прорисовки,
хорошая новость состоит в том, что визуальный конструктор Windows Forms Designer
будет использовать любой размещенный в событие OnPaint код для визуализации
элемента управления на стадии конструирования. Это означает, что вы по-прежнему
можете положиться на конструктор Windows Forms Designer в том плане, что он будет
обеспечивать вам работу в режиме WISYWIG даже с нестандартными элементами
управления.
Резюме
В этой главе мы описали различные возможности, имеющиеся на стадии конструирования в
визуальном конструкторе Windows Forms Designer. Сама форма Windows Form — этр мощ-'
ная технология презентационного уровня, a Visual Studio 2008 предоставляет целый набор
инструментов для быстрого создания впечатляющих, богатых пользовательских
интерфейсов, основанных на этой технологии.
Роль конструктора Windows Forms Designer, панели Toolbox и окна Properties была
представлена в контексте создания современного, хорошо продуманного и основанного на
стандартах пользовательского интерфейса для .NET-приложения под операционную систему
Windows. Используя описанные здесь инструменты, вы сможете выжать максимум из
вашего опыта разработки форм.
Глава 16
Создание богатых и интеллектуальных
пользовательских интерфейсов
С версией .NET 3.0 фирма Microsoft поставляет совершенно новый набор технологий для
презентационного уровня ваших приложений — это Windows Presentation Foundation
(WPF). WPF была создана для использования сильных сторон Windows Forms и Web
Forms. В то же самое время WPF пытается преодолеть многие препятствия, с которыми
сталкиваются разработчики при создании богатых пользовательских интерфейсов
(содержащих средства мультимедиа), а также высокоспециализированных пользовательских
интерфейсов (использующих всю мощность, имеющуюся в современных процессорах и
графических ускорителях).
WPF должна стать унифицированной платформой со встроенной первоклассной
поддержкой привязки данных, аудио, видео, а также двумерной и трехмерной графики. Поскольку
для изучения WPF необходимо потратить значительное количество усилий как новым, так и
опытным разработчикам, то в этой главе мы сначала посвятим некоторое время
обсуждению основ (перед тем как погрузиться в изучение реальной задачи) — как в Visual Studio
использовать инструмент визуального конструктора WPF Designer (известный ранее под
кодовым именем Cider) для создания высококачественных пользовательских интерфейсов
ваших приложений под Windows.
Платформа Windows Presentation Foundation
Будучи принципиально новой инфраструктурой презентационного уровня, WPF принесла с
собой множество новых концепций и новую область программирования — и представляет
собой новый и весьма серьезный материал для изучения. Но давайте же кратко рассмотрим
общую архитектуру платформы WPF, а затем изучим модель программирования.
Физически WPF реализована как три dll-файла:
□ WindowsBase.dll;
П PresentationFramework.dll;
□ PresentationCore.dll.
Глава 16. Создание богатых и интеллектуальных пользовательских интерфейсов 615
Любая инфраструктура презентационного уровня должна в конечном счете рисовать на
экране пикселы, и WPF в этом смысле не отличается. В ее двоичных файлах реализованы
цвижки композиции и визуализации, которые работают с вашим аппаратным обеспечением
через DirectX. В дополнение к уровням отображения имеется также и богатая программная
модель, которая реализована с поддержкой таких вещей, как компоновка, контейнеры
(когда один элемент содержит другой) и отправка событий/сообщений. Короче говоря, она де-
пает всю тяжелую работу для того, чтобы даже очень сложные пользовательские интерфей-
:ы могли отображаться на экране с производительностью достаточной для того, чтобы
удовлетворить потребности широкого диапазона решений.
На рис. 16.1 показана логическая архитектура компонентов WPF. Движок визуализации
содержится внутри компонента Media Integration Layer; PresentationCore занимается
взаимодействием со слоем Media Integration Layer, a PresentationFramework содержит все
остальное, что необходимо для обеспечения работы платформы WPF (компоновка, привязка
данных, уведомления о событиях).
PresentationFramework
PresentationCore
.NET CLR
Media Integration
Layer
Рис. 16.1. Компоненты инфраструктуры презентационного уровня
Примечание
Большая часть самой WPF реализована на управляемом коде .NET. Исключением
является Media Integration Layer. Когда дело доходит до визуализации
пользовательского интерфейса на экране, то главной задачей WPF становится оптимизация
производительности, и поэтому Media Integration Layer реализован на машинном коде.
Все эти компоненты WPF работают сообща для того, чтобы обеспечить впечатляющий
список улучшений дизайна и конструкции презентационного уровня, а также его поддержки в
.NET на стадии выполнения. Вот небольшая выборка:
□ мультимедиа — WPF поддерживает двумерную и трехмерную графику, а также видео
форматов WMV, MPEG и AVI;
□ привязка данных — WPF с самого начала создавалась с полной поддержкой всего
спектра вариантов привязки данных, вплоть до LINQ;
□ взаимодействие с Windows Forms— приложения WPF могут содержать компоненты
WinForms и наоборот. Это удобно, поскольку означает, что разработчикам не придется
Codecs
616 Часть V. Создание промышленных приложений
отказываться от своих приобретенных большими усилиями знаний, полученных в
течение многих лет программирования под WinForms;
□ поддержка документов — WPF имеет несколько собственных конструкций для создания
приложений по работе с документами. Например, имеется класс DocumentReader для
отображения документов фиксированного формата и класс FlowDocumentReader для
отображения документов с динамической компоновкой. Например, газетная статья
может автоматически изменять разбивку на страницы и при этом сохранять структуру
колонок;
□ анимация — разработчики могут создавать анимацию (на основе раскадровок) и
указывать триггеры и таймеры анимации;
□ внешний вид элементов управления— внешний вид элементов управления в WPF
управляется шаблоном, который может быть изменен или заменен разработчиком (для
полной настройки практически любого аспекта "хромировки" элемента управления);
□ текст— в WPF имеется богатая поддержка типографского оформления. Разработчик
может манипулировать массой атрибутов шрифтов (кернингом; такими эффектами, как
свечение, отбрасываемые тени и размытость движущегося объекта; автоматическими
межстрочными интервалами и т. д.). WPF визуализирует текст с использованием
технологии ClearType.
Рис. 16.2. Прототип приложения на основе WPF из области здравоохранения
На начальных стадиях разработки фирма Microsoft выпустила несколько прототипов
приложений для демонстрации новых технологий .NET 3.0 (и в том числе WPF). На рис. 16.2
Глава 16. Создание богатых и интеллектуальных пользовательских интерфейсов 617
показан снимок экрана прототипа приложения из области здравоохранения. Несмотря на то,
что черно-белый снимок не позволяет отдать должное этому приложению, вы вполне
можете оценить его возможности: такой пользовательский интерфейс реализовать при помощи
технологии Windows Forms было бы исключительно трудно.
По большей части разработчик может не беспокоиться о нижнем уровне архитектурных
подробностей технологии WPF; модель программирования и инструменты, которые
помогают использовать эту модель — вот на чем сосредоточено внимание большинства
разработчиков.
Модель программирования
Библиотека классов WPF состоит примерно из 1600 открытых (public) типов и более чем
3500 классов. Поэтому она имеет значительно более обширный интерфейс прикладного
программирования (API), чем ASP.NET или Windows Forms. Как и следует ожидать от
библиотеки классов .NET, происхождение всех этих классов восходит к System. Object. Кроме
того, большинство классов WPF основаны на так называемых "базовых элементах": это
классы UIElement, FrameworkElement, ContentElement и FrameworkContentElement.
Эти классы отвечают за основное представление и компоновку элементов и содержатся в
пространстве имен System. Windows.
В дополнение к этим четырем классам базовых элементов имеется еще несколько важных
базовых классов, которые обеспечивают существенную часть функциональности WPF:
□ visual— этот класс является основным модулем визуализации в WPF; UIElement
наследует от visual — так же, как и классы более высокого уровня (такие как Button);r
□ DispatcherObj ect — этот класс реализует модель многопоточности в WPF;
□ Control — это базовый класс для элементов управления в WPF;
□ Application— класс Application инкапсулирует все приложения WPF; он
обеспечивает сервисы жизненного цикла приложения, в том числе Run (для запуска
приложения) и Exit (для завершения приложения).
Как и следовало ожидать, библиотека классов WPF обеспечивает также все основные
элементы управления, которые обычно имеются в приложениях Windows — такие как кнопки,
метки, списки и текстовые поля.
Следующий фрагмент кода показывает создание экземпляра кнопки WPF и присваивание ей
текста "Push Me". Обратите внимание, что конструкции элементов управления выглядят
знакомыми, но сама объектная модель несколько отличается; объект Button в WPF не
имеет свойства Text, как мы привыкли того ожидать от кнопки в ASP.NET или WinForms.
Вместо этого он предоставляет свойство Content.
System.Windows.Controls.Button btn = new Button();
btn.Content = "Push Me";
Помимо использования процедурного кода (подобного показанному здесь), WPF также
позволяет нам создавать объекты и манипулировать ими декларативным образом — при
помощи разметки, а именно — при помощи XAML.
618
Часть V. Создание промышленных приложений
Язык разметки Extensible Application Markup Language (XAML)
Язык XAML является диалектом XML, который можно использовать для описания
структуры презентационного уровня приложения WPF (например, для создания экземпляров
элементов управления, внешнего вида и компоновки).
XAML — это новый язык, и он является главным средством, при помощи которого
различные инструменты WPF декларативным образом создают объекты и настраивают свойства.
Поэтому возникает соблазн сравнить XAML и HTML: оба они являются декларативными
способами описания объектов. Но XAML фактически тесно связан с .NET Framework.
В действительности XAML является обобщенным способом создания и манипулирования
объектами .NET. Инструменты WPF (такие как визуальный конструктор WPF Designer в
Visual Studio) используют XAML, но строго говоря, XAML не является частью WPF. Вы
можете написать целое XAML-приложение исключительно на вашем любимом
управляемом языке. Но поскольку XAML (как модель программирования) приносит с собой
некоторые важные нововведения, то он очень интенсивно используется всеми инструментами
фирмы Microsoft (и других фирм) не только в области WPF, но и за ее пределами.
Например, он используется также в Windows Workflow Foundation для описания рабочих
процессов.
Точно так же как и раньше, давайте создадим объект Button и присвоим кнопке некий
текст — но на этот раз всю работу сделаем при помощи XAML:
<Button Content="Push Me"x/Button>
](\m\ мы могли бы написать этот код так:
<Button>Push Me</Button>
Примечание
Функциональность XAML является подмножеством того, что можно сделать в .NET
при помощи кода. Иначе говоря, все, что вы можете сделать в XAML, вы можете
сделать также и в коде, но не наоборот.
В типичном WPF-приложений XAML сосуществует с управляемым кодом при помощи все
той же парадигмы частичных классов, введенной в ASP.NET. Иначе говоря, у нас может
иметься файл MainForm.xaml с внешним видом окна и файл MainForm.xaml.vb, который
содержит код, реагирующий на ввод пользователя в этой форме. Мы увидим все это в
действии чуть позже в этой же главе, когда будем подробно рассматривать визуальный
конструктор VVPF.
Если при создании WPF-приложения можно обойтись без XAML, то почему он так
востребован? Поскольку вы можете создавать объекты пользовательского интерфейса как на
XAML, так и на управляемом коде, то зачем вообще XAML нужен? Однако есть несколько
областей, где декларативный синтаксис чрезвычайно важен.
Простота синтаксиса
Как и все языки на основе XML, XAML относительно прост для синтаксического разбора и
понимания в приложении, по крайней мере, по сравнению с управляемым кодом.
Фактически технология WPF была выпущена в свет уже достаточно давно, a Visual Studio только
сейчас получила необходимые инструменты для работы с XAML в режиме WISYWIG. Это
Глава 16. Создание богатых и интеллектуальных пользовательских интерфейсов 619
не остановило развитие WPF, поскольку разработчики либо писали свой XAML вручную в
текстовом редакторе (без сомнения, это не самый эффективный способ, но вполне
возможный), либо применяли другие инструменты (такие как XAMLPad), которые появились как
следствие отсутствия полноценной поддержки в Visual Studio. Это позволило поставщикам
инструментов (и в том числе и фирме Microsoft) быстро выпустить на рынок продукты,
которые понимают XAML. Например, Adobe Illustrator имеет встраиваемый модуль XAML
(который позволяет вам выдавать XAML). И конечно же фирма Microsoft имеет даже не
один, а два инструмента конструирования, которые читают и пишут XAML: Expression
Design и Expression Blend.
Граница между XAML и кодом оказывается также и разделяющей линией между внешним
видом и поведением. При этом XAML используется для создания объектов
пользовательского интерфейса (и общего внешнего вида приложения), а процедурный код применяется
для реализации бизнес-логики и для реагирования на ввод пользователя. Это приводит нас к
еще одному важному преимуществу XAML: совместная работа.
Совместная работа
Если мы разделяем внешний вид и поведение, то мы можем использовать возможности
совместной работы членов команды проекта— а именно дизайнеров и разработчиков. До
WPF дизайнеры работали с растровыми изображениями, созданными в программах для
рисования, либо использовали для создания макетов приложений такие программы, как
PowerPoint. Когда такой дизайн передается для реализации разработчику, возникает
неизбежный разрыв: инструменты программирования не понимают двумерных растровых
изображений или раскадровок из PowerPoint. Они понимают код и объекты. И в обратном
направлении мы имеем ту же самую проблему: инструменты дизайнеров не понимают
управляемого кода. Например, разработчик не может реализовать форму на Visual Basic и
передать ее дизайнеру для проверки и доработки.
Поэтому разработчикам приходится по мере своих способностей воссоздавать картинку,
полученную от команды дизайнеров. Это, определенно, не самый хороший способ для
дизайна и создания приложений. Однако при помощи XAML эта ситуация кардинально
меняется. Поскольку дизайнеры теперь могут использовать инструменты, которые выдают
дизайн в виде XAML (такие как Microsoft Expression Blend), то разработчик может просто
открыть этот XAML-файл и добавить код, необходимый для реализации требуемых
функций. В этом процессе на 100% сохраняется точность исходного дизайнерского решения
(поскольку инструменты разработчика говорят на том же самом языке). Мы имеем также
полное взаимодействие и в обратном направлении: изменения, которые разработчик вносит в
XAML дизайнера, могут быть моментально проверены и подкорректированы при помощи
инструментов дизайнера. Такая простая концепция— совместное использование кода и
языка инструментами дизайна и разработки — является мощным аргументом в пользу
применения XAML в ваших приложениях.
При всем этом важно понимать, что технология WPF сегодня — это самая первая версия
технологии, которая не может сравниться с функциональностью, предлагаемой
встроенными элементами управления технологии Windows Forms, а также с элементами управления,
предлагаемыми сообществом разработчиков. Однако WPF блистает в тех приложениях, где
акцент делается на впечатлениях пользователя. Поэтому мы говорим, что WPF
предназначена для приложений, где "впечатление прежде всего", т. е. тех приложений, в которых лег-
21 Зак 3716
620
Часть V. Создание промышленных приложений
кость совместной работы дизайнеров и разработчиков может привести к созданию
потрясающих интерфейсов.
Теперь, когда мы рассмотрели основы WPF, давайте посмотрим, как мы можем начать
писать WPF-приложения при помощи Visual Studio 2008.
Введение в визуальный конструктор WPF
Впервые мы представили визуальный конструктор WPF в главе 6. Давайте вспомним
основы, а затем перейдем к более углубленному обсуждению визуального конструктора WPF.
Визуальный конструктор WPF — это инструмент Visual Studio, который обеспечивает
поверхность конструирования для создания окон WPF в режиме WYSIWYG. Во многих
отношениях он ведет себя точно так же, как те визуальные конструкторы, которые мы
используем для Web-форм и для форм Windows. Но на деле это совершенно новый инструмент,
имеющий некоторые тонкие отличия от своих собратьев по интегрированной среде
разработки. Для того чтобы увидеть этот визуальный конструктор в действии, создадим новый
проект в Visual Studio. Мы выбираем шаблон проекта WPF Application, который находится
в категории Windows в диалоговом окне New Project (рис. 16.3).
New Project
Eroject type? Iemplates-
Visual C«
Window*
Web
Smart Device
Office
Database
Reporting
WCf
Workflow
Other Languages
Other Project Types
Visual Studio imlalled templates
^Windows Forms Application
1 »*) WPF Application!
O* Coniole Application
j]! Windows Service
i^WPF User Control Library
My Templates
Ol Search Online Templates.,.
Windows Presentation Foundation client application (NET Framework 33}
tjame, WpfApplicationl
LccBbore \Documents\Vrsual Studio 200B\Projects
j Solution. [Create гч» Solution <rj
Solution Nanje. WpfApplicationl
\ _ _ _
- _ _
• >NET Framework 3.5
£3 Class Library
^*| WPF Browser Application
13 Empty Project
** WPF Custom Control Library
^Windows Forms Control Library
•f, Create directory for solution
1 0K [
\ъ:щш
"' ^o
firowse...
Cancel |
Рис. 16.3. Шаблон приложения WPF Application
Этот шаблон позаботится о добавлении всех необходимых пространств имен WPF; в проект
также будет включен файл, который реализует для приложения окно по умолчанию:
Windowl.xaml. Двойной щелчок по файлу Windowl.xaml запустит визуальный конструктор
(рис. 16.4).
Глава 16. Создание богатых и интеллектуальных пользовательских интерфейсов 621
<S> WpfAppfetfoiu - Microsoft Мм»! Studio
"'""тмтъещыт"
...л,, iiiak.
Т^Ж]
F»l« Edit ¥*w Project guild fitbug Dfti Fficrwt look Window tlelp
-I»
Window bcaml'u^^^^^
Г
^ ^;
v
pClD«ign/U i"xAMLL
x»lr*4«"hctp: //schemaa .«ы croaof t. ccs/wiif x/2306/xamJ /preaenration*
JHfclrs:x-*bttp://adbeiua3.i«iicT03ofr c:ит^/wi.г£x/2006/xa'nl',
<Cxid>
Re<dy
Рис. 16.4. Визуальный конструктор WPF
XAML и панели конструирования
Визуальный конструктор WPF предлагает два разных представления: визуальное
представление окна и код XAML (который реализует это окно). Вы можете изменять окно и его
элементы управления либо путем редактирования XAML, либо путем изменения элементов на
поверхности конструирования. В любом случае визуальный конструктор синхронизирует
обе панели между собой.
Вы можете настроить положение и компоновку XAML и панелей управления следующими
способами:
□ кнопка Swap меняет местами панель XAML и панель конструирования;
□ кнопка Vertical Split разделяет панели по вертикали;
□ кнопка Horizontal Split разделяет панели по горизонтали;
□ кнопка Collapse/Expand Pane минимизирует или восстанавливает нижнюю или левую
панель (в зависимости от того режима просмотра, в котором вы находитесь).
На рис. 16.5 показано расположение этих кнопок управления панелями в визуальном
конструкторе.
Совет
Если вам повезло и у вас есть компьютер с несколькими мониторами, то особенно
полезен режим просмотра с разделением по вертикали, поскольку вы можете
просматривать код XAML на одном экране, а поверхность визуального конструирования — на
другом.
622
Часть V. Создание промышленных приложений
<& WofApplicationl Microsoft Viuai Studio
FKe Edit tfew Project guild fiebug Dale Format look Window Help
>J3 ' A ' tJ" У *# v » *i * "? - f4 • *3 - ^ { ►. Debug - AnyCPU
S|j Wmdowb«mi«j^^^^j^i
*l»
j ' Ц Design Г ''тГ Jb^XAML^ "~" ~~""™~ ^— — ~~~ - - — - - -
; p <^tTJeS^xjjJs & 3 л-- "Wpf Appl 3. cat iani . Window 1M
! j x«J'*. -"rttpr/Vachemra.BSicmaoft.ccaj/wn'x/PSCe/xunil/presparat^on"
: I ysili j:x»"nrt:p //асЪеият .aiicrcsoft .crjm/,wirfx/2006/'xa^lH
-,A^n-"Wijndcw2w ЧуА^Кг-я16Эн tf Klt>««313,,>
| к <Cild>
j * ' '" ч
I Window Window ^
м
M
i j:
ii'7
"®
'~4
'
т
►
Ready
Рис. 16.5. Настройка панелей визуального конструктора WPF
Мы работаем с визуальным конструктором точно так же, как и с другими поверхностями
конструирования или редакторами кода: на панель конструирования можно поместить
элементы управления из панели инструментов, а в панели XAML можно работать с кодом
XAML (при полной поддержке технологии IntelliSense и форматирования).
ад» WpfApplication! - Microsoft Visual Studio
£ite fdit Vie* Project fiuild Qtbuq Data Format look Window yelp
3 " J- CJ У Ш & -U 1^ \" ** - £1- ^; ► Debug ^ AnyCPU
Ц 1 p
I Button j»
Q Design \i в хдМ1
I 7 1 }f-MWiadov.l" ч <'^ ="S69" W*'iT,—15">
£ <G*id>
I </Grid>
j Button (button!) Wirvdoft/Grtd/Buttcn
Reedy
ЧЭ
I L
шва
«•,42,70,0" Чч\*«-И1
Рис. 16.6. Индикаторы изменения размера и позиционирования
Глава 16. Создание богатых и интеллектуальных пользовательских интерфейсов 623
По большей части размещение и позиционирование элементов управления работает точно
так же, как и в визуальном конструкторе Windows Forms. Есть несколько небольших
исключений: визуальный конструктор WPF имеет несколько уникальных визуализаций для
отображения линий привязки и установления размеров элементов управления (рис. 16.6).
Окно свойств Property
Как и следовало ожидать, когда вы в визуальном конструкторе выбираете элемент
управления, то вы можете управлять его атрибутами при помощи окна Properties. Это окно свойств
WPF имеет некоторые сюрпризы. Для начала, оно имеет только один режим отображения.
В отличие от окон свойств WinForms или Web-страниц, вы не можете отсортировать
свойства в алфавитном порядке — это окно поддерживает только представление свойств с
разбивкой по категориям. Кроме того, окно свойств WPF имеет область заголовка, которая
используется для именования элементов управления и которую вы можете использовать для
поиска свойств элемента управления (для этого нужно сделать ввод в поле поиска). Во
время вашего ввода в этом поле окно начинает автоматически фильтровать список свойств,
чтобы отображать только те, которые соответствуют вашему критерию поиска. На рис. 16.7
показано изображение окна свойств Properties.
Properties
[. Sy5temAVindo*s.Conira«,bjtBox
[ j_ Natr.ec tstBoxl
Search;!
LEI Apjpeajan^e*
Borde'Thitfcness
Opacity
Visibility
More Pftjpertie*
[ BiimapEffect
| BiimapEffectlnput
| ClipToBounds
SnapsToDevicePixels
0 Krmbe*
Background
P BordefBrush
1 Foreground
[i Cpacit/Mask
Ш Сшшпоп Properlit»
1Ш CoBtettt
|ra *, a ,
idea
I
1
Visible
SI
[ 1
1.1
What
«FF828790
Bieck
ш
r ji
V
II
i
p|i i
i
i
V
jjj
1
A
Рис. 16.7. Окно свойств визуального конструктора WPF
Элемент управления масштабированием
В визуальном конструкторе WPF есть еще один дополнительный элемент: ползунок
элемента управления масштабированием. Этот элемент (находящийся в левом верхнем углу панели
конструирования) можно использовать для изменения масштаба текущего окна от 10 до
2000% реального размера окна. Теневая метка на ползунке показывает 100%, и вы можете
быстро переключиться между 100 и 130 процентами при помощи щелчка по квадратной
624
Часть V. Создание промышленных приложений
кнопке внизу ползунка. На рис. 16.8 показан ползунок элемента управления, а на
рис. 16.9 — наша кнопка Push Me при трехкратном увеличении.
чЛ *Vp*Appl>rstent • Microsoft Vrtoal S**»dio
>J шош
Bte Ы* &«^ 2»ut'Ct &utld i}*&uc{ ^i .-jjrr-'dt 1po4 VVmdow H«.p
-•J'Jli^ bJ *3 ' - ^»! - Г И*ь9 ^ Any CPU
♦ *; -
ч у^н*^1^^^!^^^^^^^
i i
\ / * :! '"Ц* j
Rt*
j i-^-"«indcrwi* '$'it*-c~*l*3« ';/«<.--л-«318*>
Butte»» (buttoal) Wi-wic*>'G4d/auacn >
dy Ln6 C*I8 Ch4
- Л
- >
^i
<"*'&
'*1
!i9
и:
1
i
j
Рис. 16.8. Ползунок изменения масштаба
^ WpfAppiicabo*! - ^O^VsualSt»^
£il« £dtt }fiew Project guild fiebug DiU Ffirmat loo Is Window Jjelp
.i3 * jj ^ yyajflPJ, f, ^■■■■^■■■■.t?...:..?,:..j?.:..: iii J?eb°? * ^2LU™_ „ _
~ - I* t «x. if jjt • " Л I „ AJ 4 н ^ ^j ,. ^ ' ^ e
ta" wiwiowbc^l;^^^,»^^) m _ m _ _
go
£Rea
■
|
Push Me
♦1 i «Я :
1 4mi*v< :x*»"hwt.p://r3sh«nuJ5 .nu
} ^Gri 1>
,*.*• „-,„,, „„, „„ ,»«•. WW, W
9« Wxtftfc=H318w>
10,61" b'aase;-,,fcuttanl,»>Paah t
Ie</Suctcn>
« m
Button (buttonl) W(ndow/Gnd/8uttor) г
dy
Иитмт1]'-|Д|МИ^)
'~
ill
П
I > !
№
I
О :
■
Щ
!<a j:
i
Рис. 16.9. Кнопка при увеличении в 300%
Глава 16. Создание богатых и интеллектуальных пользовательских интерфейсов 625
Совет
Элемент управления масштабированием особенно полезен тогда, когда у вас есть
форма со сложной компоновкой и множеством линий привязки, а также со скоплением
вложенных элементов управления в одном месте. При помощи увеличения этого
места вы можете получить четкое представление о позиционировании элементов, при
этом становится намного легче выбрать или позиционировать именно тот элемент
управления, который вам нужен (а не его соседа). При помощи уменьшения вы
можете получить компактное представление вашего окна— чтобы оценить его общий
внешний вид.
Программирование в WPF
Теперь, когда с основами покончено, настало время для более глубокого обсуждения
различных элементов управления и технологий, с которыми вы столкнетесь при создании
приложений под WPF. После прочного освоения этих тем мы перейдем к созданию от начала и
до конца простого приложения (при помощи визуального конструктора WPF).
Компоновка
Поскольку программному обеспечению необходимо представлять на экране элементы
управления и данные (для визуального "потребления" пользователем), то компоновка
становится важным аспектом дизайна. Системы с хорошей компоновкой не только должны
позволять разработчикам структурировать элементы управления согласованным образом, нд
должны быть также надежными в смысле того, как они обрабатывают изменения размера и
раскладки окон.
В WPF компоновка осуществляется при помощи набора контейнерных элементов
управления, которые называются панелями. Каждая панель приспособлена для определенной
компоновки, а возможность сочетать их друг с другом означает, что компоновочная система
WPF может справиться с большим количеством различных вариантов организации
элементов управления. Главное, что нужно понять про панели, — это то, что в качестве
контейнеров они отвечают за позиционирование (а в некоторых случаях и за размеры) всех
размещенных в них элементов управления. Это означает, что отдельные дочерние элементы
управления не должны быть в курсе относительно конкретной системы компоновки, в
которой они участвуют — а это значительно упрощает и код, и архитектуру.
В табл. 16.1 перечислены имеющиеся элементы управления панелей компоновки.
Таблица 16.1. Панели компоновки WPF
Класс
Canvas
DockPanel
Grid
Описание
Контейнерный элемент управления без встроенной логики компоновки
Панель, которая позволяет выполнять закрепление своих дочерних элементов
Контейнерный элемент управления, который позволяет дочерним объектам
позиционироваться по стблбцам и рядам
626
Часть V. Создание промышленных приложений
Таблица 16.1 (окончание)
Класс
Описание
StackPanel
Контейнерный элемент управления, который реализует для своих дочерних
элементов управления размещение в виде вертикальной или горизонтальной
стопки
Давайте изучим эти элементы управления (и их подтипы) по отдельности.
Элемент управления Canvas
Элемент управления Canvas (холст) уникален среди всех элементов управления
компоновкой, поскольку он единственный не выполняет совершенно никакой компоновки. Его
функциональность похожа на элемент управления GroupBox, который вы, вероятно,
использовали в проектах Windows Forms: дочерние объекты размещаются в элементе управления
Canvas в координатах относительно самого холста. Здесь нет автоматического изменения
размеров, упорядочения потоком, а также позиционирования холстом от имени дочерних
элементов управления. Если необходимо что-то из этого набора, то вам нужно будет
реализовать это самостоятельно. Это подчеркивает цель элемента управления Canvas:
предоставить разработчику абсолютный контроль над позиционированием элементов.
На рис. 16.10 мы имеем элемент управления Canvas с четырьмя кнопками. Они все
позиционированы относительно сторон контейнера Canvas ромбом.
Рис. 16.10. Элементы, прикрепленные при помощи DockPanel
Вот код XAML:
<Window х:Class="ContosoAvalon.Canvas"
xmlns="http: //schemas.microsoft.com/winfx/2006/xamiypresentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Canvas" Height=00" Width=00M>
<Canvas>
Глава 16. Создание богатых и интеллектуальных пользовательских интерфейсов 627
<Button Canvas.Left=02" Canvas.Top=1" Height=3" Name="buttonl"
Width=5">Button</Button>
<Button Canvas.Left=7" Canvas.Top=8" Height=3" Name="button2"
Width=5">Button</Button>
<Button Canvas.Right=6" Canvas.Top=8" Height=3" Name="button3"
Width=5">Button</Button>
<Button Canvas.Left=02" Canvas.Top="99" Height=3" Name="button4"
Width=5">Button</Button>
</Canvas>
</Window>
Обратите внимание, что мы дали координаты относительно указанных сторон холста. Если
мы изменим размер окна, то кнопки соответственно переместятся. Если у вас нет крайней
необходимости указывать положение элементов управления вручную (как это может быть в
том случае, когда вы располагаете элементы управления нестандартным образом или
используете элементы управления для рисования внутри окна), то рекомендуется использовать
одну из других панелей, которая будет автоматически выполнять необходимую вам
компоновку.
Элемент управления DockPanel
Современные бизнес-приложения обычно используют для своих элементов управления
какой-либо вид закрепления: панели инструментов могут быть закреплены наверху или по
сторонам окна, строка состояния может находиться внизу и т. д. DockPanel предоставляет
прикреплять элементы управления к одной из четырех сторон окна.
Если нам нужно создать окно с панелью инструментов, закрепленной в окне сверху и слева,
а остальную часть экрана должен занимать холст, то надо сделать следующее:
<Window x:Class="ContosoAvalon.DockPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="DockPanel" Height=00" Width=00">
<DockPanel Name="dockPanell">
<ToolBar DockPanel.Dock="Top">
<Button BorderBrush="Black">Buttonl</Button>
</ToolBar>
<ToolBar DockPanel.Dock="Left" MaxWidth=5">
<Button BorderBrush="Black">Button2</Button>
</ToolBar>
<Canvas>
<TextBlock>Canvas</TextBlock>
</Canvas>
</DockPanel>
</Window>
628
Часть V. Создание промышленных приложений
При помощи DockPanel вы можете разместить в определенное положение закрепления
несколько элементов. На рис. 16.11 показано шесть закрепленных в окне областей: три из них
прикреплены влево, и три — кверху.
А вот соответствующий код XAML:
<Window x:Class="ContosoAvalon.DockPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="DockPanel" Height=00" Width=00">
<DockPanel Name="dockPanell">
<Button DockPanel.Dock="Left">Left #K/Button>
<Button DockPanel.Dock="Left">Left #2</Button>
<Button DockPanel.Dock="Left">Left #3</Button>
<Button DockPanel.Dock="Top">Top #K/Button>
<Button DockPanel.Dock="Top">Top #2</Button>
<Button DockPanel.Dock="Top">Top #3</Button>
</DockPanel>
</Window>
f I5 DockPanel I«-»| gl (ДЩП
Uft#l
un«
Uft#S
Top*l
Top #2
Top#3
Рис. 16.11. Несколько элементов,
прикрепленных к одной и той же стороне
Размеры всех элементов внутри панели DockPanel изменяются таким образом, что они
остаются прикрепленными в своих назначенных положениях и полностью заполняют ту
сторону окна, к которой они прикреплены.
Элемент управления Grid
Панель Grid используется для расположения по рядам и столбцам (аналогично таблице
HTML или элементу управления TableLayoutPanel в WinForms).
Обычным применением для элемента управления Grid являются диалоги или формы ввода
данных, где метки и значения существуют бок о бок; мы можем использовать столбцы сетки
для выравнивания элементов по горизонтали, а ряды — для выравнивания их по вертикали.
Глава 16. Создание богатых и интеллектуальных пользовательских интерфейсов 629
Столбцы создаются в сетке при помощи элемента Grid.ColumnDefinitions. Например, этот
фрагмент кода XAML создает сетку с тремя столбцами:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinitionx/ColumnDefinition>
<ColuninDefinition></ColumnDefinition>
<ColumnDefinitionx/ColuiraiDefinition>
</Grid.ColurtinDefinitions>
</Grid>
Аналогичным образом, элемент Grid.RowDefinitions определяет ряды внутри сетки:
<Grid>
<Grid.RowDefinitions>
<RowDefinitionx/RowDefinition>
<RowDefinitionx/RowDefinition>
<RowDefinitionx/RowDefinition>
</Grid.RowDefinitions>
</Grid>
Визуальный конструктор WPF имеет также интерактивные свойства, которые позволяют
добавлять и удалять ряды и столбцы, а также производить изменение их размеров. На
рис. 16.12 в окне показана сетка из двух столбцов и шести рядов. Обратите внимание, что
визуальный конструктор показывает линии сетки, разграничивающие ряды и столбцы, и что
слева и сверху элемента управления Grid имеется затененная граничная область. Эта
граничная область не только показывает нам текущий размер (ширину или высоту) столбца или
ряда, но мы также можем использовать эту граничную область для создания новых рядов
или столбцов (простым щелчком в том месте, где мы хотим разместить новый элемент). Мы
можем также перетащить линии границ рядов или столбцов для увеличения или уменьшения
размеров ряда или столбца.
f
г
¥
*
Л
1
►
А
\
*
t
к +
1
Рис. 16.12. Работаем с сеткой Рис. 16.13. Реализация диалога
в визуальном конструкторе при помощи элемента управления Grid
Г* Grid
Name.
Street
Crty:
State:
Postal code:
'Date hired-
r::\
L
с
{Date}
[ OK
i cm I is] |ИШИ
" ]!
_ i
] f Cmcd |
630
Часть V. Создание промышленных приложений
Показанное на рис. 16.13 диалоговое окно легко получить при помощи панели Grid (код
XAML показан в листинге 16.1). Вероятно, элемент управления Grid является самой гибкой
и важной панелью практически для всех вариантов компоновки. Поэтому при добавлении
нового элемента окна в проект WPF это окно будет по умолчанию содержать элемент
управления Grid.
I Листинг 16.1 Реализация диалога при ломощи панели Grid
<Window x:Class="ContosoAvalon.Grid"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Grid" Height=00" Width=00">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="80*"></ColumnDefinition>
<ColumnDefinition Width="*"x/ColumnDefinition>
<ColumnDefinition Width="*"x/ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinitionx/RowDefinition>
<RowDefinitionx/RowDefinition>
<RowDefinitionx/RowDefinition>
<RowDefinitionX/RowDefinition>
<RowDefinitionX/RowDefinition>
<RowDefinitionx/RowDefinition>
<RowDefinitionx/RowDefinition>
<RowDefinitionx/RowDefinition>
</Grid.RowDefinitions>
<Label Grid.Column=" Grid.Row=">Name:</Label>
<Label Grid.Column=" Grid.Row="l">Street:</Label>
<Label Grid.Column=" Grid.Row=">City:</Label>
<Label Grid.Column=" Grid.Row=">State:</Label>
<Label Grid.Column=" Grid.Row=">Postal code:</Label>
<Label Grid.Column=" Grid.Row=">Date Hired:</Label>
<TextBox Margin=,5" BorderBrush="Gray" Grid.Column="l" Grid.Row="
Grid.ColumnSpan="x/TextBox>
<TextBox Margin=,5" BorderBrush="Gray" Grid.Column="l" Grid.Row="l"
Grid.ColumnSpan="x/TextBox>
<TextBox Margin=,5" BorderBrush="Gray" Grid.Column="l" Grid.Row="
Grid.ColumnSpan="x/TextBox>
<ComboBox Margin=/5" Grid.Column="l" Grid.Row="x/ComboBox>
Глава 16. Создание богатых и интеллектуальных пользовательских интерфейсов 631
<TextBox Margin=,5" BorderBrush="Gray" Grid.Column="l" Grid.Row=">
</TextBox>
<Label Grid.Column=Ml" Grid.Row=">{Date}</Label>
<Button Margin=,5" Grid.Column="l" Grid.Row=,,6">0K</Button>
<Button Margin=M5,5" Grid.Column=" Grid.Row=">CanceK/Button>
</Grid>
</Window>
В этом коде XAML необходимо отметить три вещи.
□ Для выравнивания элементов управления желательным образом мы использовали
концепцию объединения столбцов.
□ Для того чтобы дать каждой метке, текстовому полю (и прочим элементам) некоторое
свободное пространство, мы использовали свойство Margin. Без указания свойства
Margin любой элемент управления автоматически заполнит ту ячейку, в которой он
находится (а это означает, что у нас совершенно не останется расстояния между
элементами управления — как в горизонтальном, так и в вертикальном направлении).
□ В определениях столбцов элемента Grid мы используем звездочку для того, чтобы
указать пропорциональный размер. Иначе говоря, второй и третий столбцы делят между
собой поровну все пространство, которое остается после визуализации первого столбца.
Мы можем также настроить коэффициент "пропорциональности" (для этого надо
указать число, например: ColumnDefinition.Width=*").
Элемент управления StackPanel
Элементы управления StackPanel реализуют компоновку дочерних элементов вертикальной
или горизонтальной "стопкой". По сравнению с элементом управления Grid — это простая
панель, которая поддерживает очень мало настроек: вы можете разместить дочерние
элементы в вертикальную или горизонтальную стопку при помощи свойства Orientation, и
после этого панель сама позаботится обо всем остальном. Размер каждого элемента внутри
панели StackPanel будет масштабирован таким образом, чтобы они разместились в
пределах высоты (если стопка вертикальная) или ширины (если стопка горизонтальная) панели.
Благодаря простоте данного элемента управления его код XAML также прост. Здесь мы
вертикально укладываем несколько флажков, меток, кнопку и текстовое поле (готовый
результат приведен на рис. 16.14):
<StackPanel>
<Label>Format Options:</Label>
<CheckBox Margin=" Height=6" Name="checkBoxl">Perform Fast
Format</CheckBox>
<CheckBox Margin=" Height=6" Name="checkBox2M>Verify After
Format</CheckBox>
<CheckBox Margin=" Height=6" Name=McheckBox3">Enable Large
Partition Support</CheckBox>
632 Часть V. Создание промышленных приложений
<Label>Drive Label:</Label>
<TextBox Margin=0,0" BorderBrush="Gray" Height=M23"
Name="comboBox2" />
<Button Margin="80,20" Height=3" Name="buttonl" >Format</Button>
</StackPanel>
1' StacfcPand
Format Options:
f 1 Perform Fast Format
HI Verify After Format
1 1 Enable Large Partition Support
Dnve Label;
1 [ taro*!
'-i'-'ДД'
1
D
Рис. 16.14. Панель StackPanel в действии
Еще одна аналогичная панель— это WrapPanel: это по существу панель StackPanel с
дополнительным поведением для переноса своих дочерних элементов в другие ряды или
столбцы (если не хватает места для отображения их в пределах панели). На рис. 16.15
показано, как WrapPanel автоматически перестроила группу кнопок при уменьшении размера
своего окна.
Т WrapPanel l«ge П НГД \
fButtonl
(tut***
| Button 7
(Buttonl
:
Button?
•«Поп*
Button3
>1
-яг- —г
Button}] 1
$utter*6 i
ьтщ г
SET \
Рис. 16.15. Панель WrapPanel
Стили и шаблоны
Одним из больших преимуществ, которые WPF дает разработчикам, является возможность
настроить внешний вид элемента управления в WPF без потери встроенной в него
функциональности.
и-
Рис. 16.16. Стилизованный ползунок
* WrapPanel
[fiuttonl
[9«tton6
Button?
Button?
Ls_JILMuii
Buttons | Sukton4J tuttonS]
Button^ &itton9| 8«ttonW'
Глава 16. Создание богатых и интеллектуальных пользовательских интерфейсов 633
Рассмотрим два ползунка на рис. 16.16: верхний имеет стиль по умолчанию, а нижний
является стилизованным ползунком. Функциональность их одинакова. Мы просто изменили
внешний вид элемента управления.
Style — это реальный класс (в пространстве имен System, windows), который
используется в сочетании с элементом управления; он группирует значения свойств для того, чтобы вы
могли один раз настроить их, а затем применять к элементам управления в массовом
порядке (вместо того, чтобы настраивать их отдельно для каждого экземпляра элемента
управления). Предположим, что ваше приложение использует красивый плавно меняющийся серый
фон для кнопок. Кроме того, каждая кнопка имеет белую границу и отображает текст
шрифтом Segoe. Мы можем манипулировать каждым из этих аспектов отображения при помощи
свойств кнопки; но делать это для каждой кнопки вам быстро надоест, style позволяет нам
один раз настроить все эти свойства, а затем дать ссылку в каждой кнопке на эти свойства
(присвоив кнопке данный стиль).
Вот определение style в XAML:
<Style x:Key="GradientButton" TargetType="Button">
<Setter Property=MMargin" Value='7>
<Setter Property="BorderBrush" Value="White" />
<Setter Property="FontFamily" Value="Segoe UI'7>
<Setter Property="FontSize" Value=2px"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Foreground" Value="White" />
<Setter Property="Background" >
<Setter.Value> r
<LinearGradientBrush StartPoint=/0" EndPoint=,1" >
<GradientStop Color="Gray" Offset=.2"/>
<GradientStop Color="DarkGray" Offset=.85"/>
<GradientStop Color="Gray" 0ffset="l'7>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Style>
Присвоить кнопке этот стиль просто:
<Button Style="{StaticResource GradientButton}" Height=8"
Name="buttonl"
Width=00">OK</Button>
Все это очень хорошо работает для наборов свойств. Но что происходит в том случае, когда
мы хотим подстроить атрибут, который не представлен как свойство? Что, если бы мы
захотели придать нашей кнопке овальную форму вместо стандартной прямоугольной?
Поскольку класс Button не предоставляет такого свойства, которое мы могли бы использовать для
изменения формы фона, то у нас вроде бы нет шансов.
Здесь на сцену выходит концепция шаблонов. Шаблоны позволяют полностью заменить
визуальное дерево любого элемента управления, предоставляя вам полный контроль над
634
Часть V. Создание промышленных приложений
всеми аспектами пользовательского интерфейса элемента управления. Визуальное дерево в
WPF— это иерархия элементов управления (наследующих от класса visual), которые
обеспечивают окончательную визуализацию элемента управления. Хороший обзор
визуальных и логических деревьев WPF можно найти по адресу: http://www.msdn.microsoft.com —
ищите "Trees in WPF".
Примечание
Ранее мы упоминали, что элементы управления в WPF не имеют "наружности";
свидетельством этого являются шаблоны. Функциональность элемента управления
существует отдельно от его визуального дерева. Вид по умолчанию для всех элементов
управления обеспечивается целым набором шаблонов, по одному на каждую тему
Windows. Это означает, что элементы управления WPF могут автоматически
участвовать в любой теме операционной системы, которую вы используете.
Шаблоны создаются при помощи класса ControlTemplate. Внутри этого класса (или
элемента, если мы реализуем шаблон на XAML) нам нужно нарисовать визуализации, которые
будут представлять кнопку. Класс Rectangle в WPF может быть использован для
рисования нашей основной формы фона. При помощи настройки свойств Radiusx и RadiusY мы
можем смягчить обычные 90-градусные углы до желаемой эллиптической формы:
<Rectangle RadiusX=5" RadiusY=5" Width=00" Height=0M
Stroke="Black" StrokeThickness="l">
Мы можем также добавить кнопке еще несколько визуальных аспектов (таких как
градиентная заливка):
<Rectangle.Fill>
<LinearGradientBrush>
<LinearGradientBrush.GradientStops>
<GradientStop Offset=" Color="Gray" />
<GradientStop Offset="l" Color=,,LightGray" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Rectangle.Fill>
Совет
Для проверки внешнего вида наберите ХАМL-код формы кнопки в редакторе XAML и
подстройте его как хотите. После того как вас все устроит, вы сможете скопировать
XAML-код в шаблон. Хорошим инструментом для конструирования пользовательских
интерфейсов является Microsoft Expression Blend, но в простых случаях написания
XAML-кода вручную или использования визуального конструктора Visual Studio
должно быть вполне достаточно.
Текст внутри кнопки легко визуализируется при помощи объекта TextBlock:
<TextBlock Canvas.Top=" Height=0" Width=00" FontSize=0"
TextAlignment="Center">OK</TextBlock>
После того как мы удовлетворимся внешним видом, можем "шаблонизировать" его при
помощи вкладывания всего этого внутрь элемента ControlElement.
Глава 16. Создание богатых и интеллектуальных пользовательских интерфейсов 635
Поскольку нам нужно будет в дальнейшем ссылаться на этот шаблон, то мы дадим ему
ключ/имя:
<ControlTemplate x:Key="OvalButtonTemplate">
И наконец, мы встраиваем все это в виде ресурса. Ресурс — это просто объект .NET
(написанный на XAML или на коде), который предназначен для совместного использования
другими объектами. В данном конкретном случае мы хотим иметь возможность использовать
этот шаблон с любой кнопкой. Ресурсы в проекте WPF можно объявлять на любом уровне:
мы можем объявлять ресурсы, которые принадлежат общему окну или любому элементу
этого окна (такому как панель Grid), либо мы можем хранить все наши ресурсы в
ResourceDictionary, чтобы иметь возможность ссылаться на них из любого класса нашего
проекта. Для нашего примера мы остановимся на простом ресурсе, определенном в нашем
родительском окне (в нижеследующем коде это будет элемент Window.Resources).
Все это сведено воедино в листинге 16.2, а на рис. 16.17 показана полученная в итоге кнопка.
Рис. 16.17. Шаблон нестандартной кнопки
| Листинг 16.2. Замена шаблона кнопки
<Window х:Class="ContosoAvalon.CustomLook"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="CustomLook" Height=00" Width=00"
Background="#F8F8F8M>
<Window.Resources>
<ControlTemplate x:Key="OvalButtonTemplate">
<Canvas Width=00" Height=5" Margin=">
<Rectangle x:Name="BaseRectangle" Canvas.Top=" RadiusX=5"
RadiusY=5M Width=00" Height=0" Stroke="DarkGray"
StrokeThickness="l">
<Rectangle.Fill>
<LinearGradientBrush>
<LinearGradientBrush.GradientStops>
<GradientStop Offset=" Color="Gray" />
<GradientStop Offset="lM Color="LightGray" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
636
Часть V. Создание промышленных приложений
<TextBlock Canvas.Top=" Height-'MO" Width=00" FontSize=0"
TextAlignment="Center">OK</TextBlock>
</Canvas>
</ControlTemplate>
</Window.Resources>
<Canvas>
<Button Canvas.Left»9" Canvas.Top=4" Height=8" Name=Hbuttonl"
Width="93" Template="{StaticResource OvalButtonTemplate}" />
</Canvas>
</Window>
Привязка данных
Привязка данных (в ее самом чистом смысле) представляет собой способность элемента
управления быть подключенным к источнику данных таким образом, что данный элемент
управления: отображает определенные элементы из этого источника данных и
поддерживает синхронизацию с источником данных. После выполнения подключения исполняющая
среда делает все необходимое для того, чтобы это работало. Реально не имеет значения, где
и как хранятся данные: это может быть файловая система, коллекция объектов, объект базы
данных и т. д.
Итак, кратко рассмотрим, как мы можем установить подключение привязки данных при
помощи WPF. Ключевым здесь является класс System.Windows.Data.Binding. Он
выступает посредником, отвечающим за связь элемента управления с источником данных. Для
успешного объявления привязки нам нужно знать три вещи:
□ Какое свойство элемента управления пользовательского интерфейса мы хотим
привязать?
□ К какому источнику данных мы хотим привязаться?
□ Какой конкретно элемент или свойство внутри источника данных содержит
интересующие нас данные?
Мы можем привязаться либо к единичным объектам (привязка строкового свойства объекта
к текстовому полю), либо к коллекциям объектов (привязка коллекции Listo к списку).
В любом случае механизм остается тем же самым:
Binding binding = new Binding();
binding.Source = _stringList;
listBoxl.SetBinding(ListBox.ItemsSourceProperty, binding);
Предыдущий фрагмент кода создает объект Binding, настраивает нашу коллекцию
List<string> в качестве источника объекта Binding, а затем для нашего элемента
управления (ListBox) вызывает SetBinding, передавая в него экземпляр объекта Binding и то
свойство элемента управления, к которому мы хотим привязать наш источник данных.
Вы можете также присвоить источники данных специальному объекту, который называется
контекстом данных. Каждый объект FrameworkElement (а также и те, которые наследуют
от этого класса) реализует собственный экземпляр DataContext. Вы можете представлять
Глава 16. Создание богатых и интеллектуальных пользовательских интерфейсов 637
его себе как некую глобальную область, куда элементы управления могут обращаться за
получением своих данных (при участии в цепочке привязки данных).
Это значительно упрощает наш код привязки данных. Мы можем настроить контекст в
конструкторе Window следующим образом:
this.DataContext = _stringList;
Теперь мы просто указываем этот контекст данных при помощи тега в XAML-элементе для
ListBox:
<ListBox Name="listBoxl" ItemsSource="{Binding}" />
Привязывающий объект в этом случае будет автоматически искать объекты, скрытые в
контексте данных где-то внутри дерева объектов. Когда он найдет такой объект, он
автоматически привяжет его.
Это хорошо работает для нашего простого примера List<string>, но что если мы
попытаемся привязать к списку целую коллекцию нестандартных объектов? Если у нас есть
простой класс Employee со свойствами Name и PhoneNbr, то как нам привязать коллекцию этих
объектов и показать имя сотрудника? Процесс останется таким же. Если мы создаем класс
Employee, а затем создаем коллекцию List<Employee>, то весь этот код по-прежнему
работает. Но есть и проблема. Она показана на рис. 16.18.
[ ir DataB.nding I п [ Н Щ|1
jContosoAvalon.Employee I ||
1 ContDsoAv&!ofi.£rnployee '
Рис. 16.18. Привязка к нестандартным объектам
Мы еще не сказали движку привязки, как именно мы хотим представить наши данные в
списке. По умолчанию процесс привязки просто вызовет ToString для каждого объекта.
Быстрым решением этой проблемы было бы просто перекрыть метод ToString:
public override string ToString()
{
return _name;
}
В данном случае это решит проблему. Но более надежный подход потребует использования
DataTemplate. Мы опишем этот подход в разд. "Создание простого приложения для
просмотра изображений" далее в этой главе.
638
Часть V. Создание промышленных приложений
Перенаправленные события
Как классы и элементы управления .NET порождают и обрабатывают события, точно так же
вы будете делать это и в WPF. Но библиотеки WPF принесли важное улучшение
стандартных событий: мы называем их перенаправленными событиями.
Рассмотрим простой пример: у нас есть элемент управления, Button, который состоит из
фонового изображения и некоего текста (рис. 16.19). Если вы вспомните наше обсуждение
шаблона элемента управления и визуального дерева элементов, то это означает, что на
самом деле у нас есть несколько дискретных элементов, которые составляют данную кнопку:
это TextBIock, Image, а также рамка и фон кнопки.
|йу1 Refresh
Рис. 16.19. Кнопка с несколькими элементами
Это отдельные объекты/элементы. Поэтому ситуация с событиями несколько осложняется.
Недостаточно реагировать на щелчок по фону кнопки; нам нужно также реагировать на
щелчок по тексту кнопки или по ее изображению. Именно здесь в действие вступают
перенаправленные события. Перенаправленные события могут вызывать обработчики событий
выше или ниже по визуальному дереву элементов. Это означает, что мы можем реализовать
обработчик события на уровне Button и быть уверенными в том, что щелчок по
изображению или тексту кнопки будет всплывать вверх до тех пор, пока не найдет наш обработчик
события.
Маршрутизированные события в WPF разделяются на три категории: восходящие,
нисходящие и прямые:
□ восходящие — эти события путешествуют вверх по визуальному дереву элементов,
начиная с исходного получающего событие элемента;
□ нисходящие — эти события стартуют с верха визуального дерева элементов и
двигаются вниз до тех пор, пока не достигнут получающего событие элемента;
□ прямые — это эквивалент "стандартных" событий .NET: вызывается только обработчик
события для получающего событие элемента.
Сами по себе события (как и почти все остальное в WPF) могут быть объявлены в XAML
или в коде. Вот кнопка с определенным в ней событием MouseEnter:
<Button MouseEnter="buttonl_MouseEnter" Height=3" Name="buttonl"
Width= 5">OK</Button>
Обработчик события (на языке С#) выглядит так же, как и любой другой обработчик
события .NET:
private void buttonl_MouseEnter(object sender, MouseEventArgs e)
{
MessageBox.Show("MouseEnter on buttonl");
}
Глава 16. Создание богатых и интеллектуальных пользовательских интерфейсов 639
Мы только слегка затронули некоторые основные программные концепции WPF. Однако
теперь вы должны обладать уже достаточными знаниями для того, чтобы суметь написать
простое приложение WPF. Давайте мы именно это и сделаем (используя имеющиеся в
Visual Studio 2008 инструменты).
Создание простого приложения
для просмотра изображений
Для иллюстрации той роли, которую Visual Studio играет в разработке WPF-приложений,
мы создадим приложение с нуля. Исходя из принципа "опыт прежде всего", давайте для
данного приложения выберем то, что может выиграть от использования сильных сторон
WPF (визуализации, компоновки элементов управления и шаблонов).
Рассмотрим приложение для просмотра изображений. Мы можем использовать его для
просмотра списка контрольных изображений, а после выбора контрольного изображения
просмотреть само изображение и даже произвести в нем изменения.
Мы будем стремиться к примерному дизайну, показанному на рис. 16.20.
Fil.M.nu
**
У
У
luttoni for Imag* Editing
Рис. 16.20. Эскиз пользовательского интерфейса приложения для просмотра изображений
Вот наши основные требования:
□ когда приложение загружается, оно производит анализ изображений, содержащихся в
указанном каталоге;
□ в списке будут показаны все изображения; в списке будут показаны только контрольные
изображения (без текста);
□ когда пользователь щелкает по одному из элементов списка, то область просмотра
изображения заполняется выбранным изображением;
□ после этого пользователь может манипулировать изображением: можно сделать его
черно-белым, изображение можно повернуть по часовой стрелке или против нее, его
можно перевернуть или отразить зеркально;
640
Часть V. Создание промышленных приложений
О вообще, мы будем пытаться использовать WPF везде (где это возможно), для того
чтобы приложение выглядело визуально убедительно; стандартное серое приложение —
это не то, чего мы хотим здесь добиться.
Начинаем компоновку
После создания нового проекта WPF мы дважды щелкнем по файлу Windowl.xaml и начнем
дизайн нашего пользовательского интерфейса. Начальную компоновку обеспечат панель
Grid и несколько вложенных контейнеров StackPanel или WrapPanel. Мы можем
использовать элемент управления Grid, который был автоматически помещен в наше окно при
создании проекта. Выделите Grid внутри визуального конструктора; вы можете сделать это
либо при помощи щелчка в визуальном конструкторе, либо при помощи щелчка внутри
элемента <Grid> в панели XAML. Когда элемент управления Grid будет выделен, щелкните
один раз в области границы заголовка для создания границы столбца. Расположите границу
примерно посередине ширины Grid (чтобы она разделила сетку примерно поровну между
двумя столбцами).
Теперь щелкните дважды по левой границе Grid. Это создаст два ряда. Перетащите
разделители таким образом, чтобы наш первый ряд имел высоту примерно 30, а наш нижний
ряд— примерно 40. Ваша поверхность конструирования должна выглядеть теперь
примерно так, как показано на рис. 16.21.
Рис. 16.21. Окно в процессе конструирования
Перетащите в левый столбец среднего ряда ListBox, а в левый столбец верхнего ряда —
элемент управления "меню". Поскольку мы хотим, чтобы наше меню занимало всю ширину
Grid, то нам нужно вручную подстроить XAML — в элементе Menu надо указать: Specify
Grid.ColumnSpan=". Если в элементах Menu или ListBox есть настройки Margin, то их
надо удалить. Это позволит элементу управления Menu расширяться и сокращаться внутри
Grid, а также позволит Menu заполнять все пространство первого ряда Grid. Мы знаем, что
Глаща 16. Создание богатых и интеллектуальных пользовательских интерфейсов 641
нам надо предоставить возможность выбора каталогов, поэтому мы можем назвать главный
пункт меню Folder и включить под ним пункт более низкого уровня с названием Open:
<Menu Grid.Row=" Grid.ColumnSpan=" Height=2" Name="menul"
VerticalAlignment="Top">
<MenuItem Header="_Folder">
<MenuItem Header="_Open..." Click="FolderOpenMenuItem_Click" />
</MenuItem>
</Menu>
Для поля просмотра изображения мы используем элемент управления Image. Перетащите
его в правый столбец второго ряда — и точно так же, как и раньше, удалите все настройки
Margin.
И наконец, перетащите в самый правый столбец третьего ряда элемент StackPanel, удалите
настройки Margin и установите его свойство Orientation в значение Horizontal, а свойство
HorizontalAlignment в значение Center. В эту панель мы поместим наши кнопки
манипулирования изображением, которые вы тоже можете теперь добавить. Перетащите четыре
кнопки на StackPanel и настройте их поля, а также высоту и ширину (чтобы получить
желаемый внешний вид).
Примечание
В большей части этих примеров рекомендуется подстраивать свойства при помощи
панели XAML, но не забудьте о том, что вы можете использовать для этого также и
окно Properties (как и в любом другом типе проекта). Однако после освоения XAML
вам может стать удобнее добавлять или изменять элементы непосредственно в пане-г
ли XAML. Технология IntelliSense значительно ускоряет такой подход к
конструированию пользовательского интерфейса.
Ваше окно теперь должно выглядеть вроде показанного на рис. 16.22; вот так же и наш XAML:
<Window x:Class="ImageViewer.Windowl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Windowl" Height= 64" Width=45">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width=62*" />
<ColumnDefinition Width=61*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height=0" />
<RowDefinition Height=52*" />
<RowDefinition Height=5" />
</Grid.RowDefinitions>
<Menu Grid.Row=" Grid.ColumnSpan=" Height=2" Name="menul"
VerticalAlignment="Top">
<MenuItem Header=" Folder" />
642
Часть V. Создание промышленных приложений
</Menu>
<ListBox Grid.Row="l" Name="listBoxl" />
<Image Grid.Column="l" Grid.Row="l" Name="imagel" Stretch="Fill" />
<StackPanel HorizontalAlignment="Center" Orientation="Horizontal"
Grid.Column="l" Grid.Row=" Name="stackPanell">
<Button Width=0" Margin=0,0">Button</Button>
<Button Width=0" Margin=0,0">Button</Button>
<Button Width=0" Margin=0,0">Button</Button>
<Button Width=0" Margin=0,0">Button</Button>
</Grid>
</Window>
Рис. 16.22. Эскизная компоновка
Хранение изображений
Теперь, когда элементы пользовательского интерфейса находятся на своих местах, мы
можем перейти к вопросам привязки данных (к шлифовке пользовательского интерфейса мы
вернемся чуть позже). Первая задача — сохранить файлы в некоей коллекции. Оказывается,
в System.Windows.Media есть класс BitmapSource, который подходит для наших целей.
В качестве коллекции подойдет объект List<BitmapSource>, но нам нужен способ
заполнения списка. Давайте создадим класс-оболочку, который загружает список и предоставляет
его как свойство. Добавим в проект новый класс при помощи следующего кода:
public class DirectorylmageList
private string _path;
private List<BitmapSource> _images = new List<BitmapSource>() ,
Глава 16. Создание богатых и интеллектуальных пользовательских интерфейсов 643
public DirectoryImageList(string path)
{
_path = path;
Loadlmages();
}
public List<BitmapSource> Images
{
get { return _images; }
set { _images = value; }
}
public string Path
{
get { return _path; }
set
{
_path = value;
Loadlmages();
}
}
private void Loadlmages()
{
_images.Clear();
Bitmap Image img;
foreach (string file in Directory.GetFiles(_path))
{
try
{
img = new BitmapImage(new Uri(file));
_images. Add (img) ;
}
catch
{
// empty catch; ignore any files that won't load as
//an image...
}
i
644 Часть V. Создание промышленных приложений
Метод Loadimages в предшествующем коде— это то место, где сосредоточена большая
часть самой важной программной логики; он пересчитывает файлы внутри заданного
каталога и пытается загрузить их в объект Bitmapimage. Если это получается, то мы знаем, что
это файл изображения. Если не получается, то мы просто игнорируем исключительное
состояние и продолжаем дальше.
В нашем классе windowl нам нужно создать несколько закрытых (private) полей для
экземпляра этого нового класса, а также для текущего выбранного пути. Именно это может
изменить пользователь при помощи диалога, запускаемого через пункт меню Folder | Open.
Вот эти поля:
private DirectoryImageList _imgList;
private string _path =
Environment.GetFolderPath(Environment.SpecialFolder.MyPictures) ;
Обратите внимание, что в качестве пути по умолчанию мы приняли каталог Pictures. Для
загрузки объекта списка мы напишем метод ResetList в нашем классе windowsl (в файле
выделенного кода imgList объявлен как наш локальный экземпляр Directory ImageList):
private void ResetList()
{
imgList = new DirectorylmageList(_path);
}
[ * , Window! Ir-.jffnjjjyyj
/ I fcfcfer |
j/PictLwes/Forwljpg
|/P.-ctureb/Frangipani Flowers - < II
j/'P-ctu'-es/Frangipani Flowers jp
I/Pictures/Green Sea Turtle - Cc
/P-ctures/Creefl See Turtfejpg
|/P.-ctuf«s/bunr»poa« vVh&e - С I j
|/Pscttttes/HurnpbackWh«ejpg I]
tej/P^tiirev'msejcpenseeiTorjpg I!
f|/P*clurei/opiions bg >mage.pg ]
j/P-ctures/Oryx Ante'ope • Cop} I
j/Psctunts/Orj'jt Ante ope-jpq I
|/PctL,»es/Toco Toucan - Copyj j
j/PtctLines/Toco Toucan jpg j
/P-ctuies/Tre* - Copyjpg |
/P^tureyTree^pg
1/P.rturej/wyv Sogojpg J j I
/PKtures/Waterfail - Copyjpg j
/PscturesAYaierfaJijpg 4
j/PfCtL»es/Wint2r Leaves - Сори t I
/Pktiires/Winter Leaves jpg LJ 1
I* <« » j I!
[fottj ЁцЛ] (вам* [м»|
Рис. 16.23. Начальная привязка
Вспоминая наше более раннее обсуждение привязки данных, мы добавим несколько строк
кода в конструктор windowl: начальный вызов ResetList, а также вызов для присваивания
контекста данных свойству Images экземпляра DirectorylmageList.
public Windowl()
{
InitializeComponent();
Глава 16. Создание богатых и интеллектуальных пользовательских интерфейсов 645
ResetList();
this.DataContext = _imgList.Images;
}
Если мы теперь запустим это приложение, то увидим знакомую картину (рис. 16.23):
привязка данных работает, но не совсем в том формате, который нам нужен для представления.
Привязка к изображениям
Поскольку наш предыдущий фокус с перекрытием ToString не дает нам нужного
представления данных (потому что изображение — это не строка), то нам надо применить
шаблоны данных. Класс DataTemplate используется для того, чтобы указать элементу
управления, как именно вы хотите отображать его данные. При помощи шаблона данных внутри
дерева элементов вы имеете полную свободу в представлении привязанных данных.
В нашем приложении мы ищем изображения в ListBox. Это очень легко. Создайте в XAML
элемент Windowl. Resources и создайте шаблон DataTemplate, который настраивает
нужную нам визуализацию:
<Window.Resources>
<DataTemplate x:Key="ImageDataTemplate">
<Image Source-"{Binding UriSource.LocalPath}" Width=25" Height=25M />
</DataTemplate>
</Window.Resources>
Затем присвойте ListBox шаблон DataTemplate: '
<ListBox Grid.Row="l" Name="listBoxl" ItemsSource="{Binding}"
ItemTemplate="{StaticResource ImageDataTemplate}"/>
В нашем шаблоне данных элемент Image ждет указания URI для каждого изображения.
Поэтому мы используем UriSource. LocalPath объекта BitmapSource.
Щелчок по контрольному изображению в списке должен привести к показу выбранного
изображения в центральном элементе управления Image. Создав обработчик события
SelectionChanged и подключив его к ListBox, мы можем соответствующим образом
обновлять свойство Image. Source.
Событие объявляется в элементе ListBox вполне ожидаемым образом:
<ListBox SelectionChanged=HlistBoxl_SelectionChanged" Grid.Row="l"
Name="listBoxl" ItemsSource="{Binding}"
ItemTemplate="{StaticResource ImageDataTemplate}"/>
А для обработчика события мы приведем тип Selectedltem из ListBox к его родному
представлению BitmapSource и присвоим его нашему элементу управления:
private void listBoxl_SelectionChanged(object sender,
SelectionChangedEventArgs e)
{
imagel.Source = (BitmapSource)((sender as ListBox).Selectedltem);
}
646
Часть V. Создание промышленных приложений
Обработчики событий кнопки и эффекты изображения
После того как изображение успешно загружено в список и показано в центральном
элементе управления Image, мы можем заняться нашими четырьмя эффектами (опциями
редактирования):
□ черно-белый фильтр;
□ размытость;
□ вращение;
□ переворот.
Поскольку эти четыре функции управляются четырьмя кнопками, то нам нужно будет
добавить соответствующие изображения кнопок и события; мы не будем описывать здесь
стилизацию кнопок, поскольку для нее необходимы внешние графические ресурсы, но вы можете
взглянуть на их окончательный вид на моментальном снимке экрана в конце данной главы
(или скачать исходный код с Web-сайта этой книги).
Теперь — код для событий. Во-первых, XAML-объявления событий каждой кнопки:
<Button Click="buttonBandW_Click" Margin=M20,0,0,0м Height=3"
Name="buttonBandW" Width=0">Button</Button>
<Button Click=MbuttonBlur_Click" Margin=0,0,0,0" Height=3"
Name=MbuttonBlur" Width=0">Button</Button>
«<Button Click="buttonRotate_Click" Margin=0/0,0,0" Height=3"
Name="buttonRotate" Width=0">Button</Button>
<Button Click="buttonFlip_Click" Margin=0,0,20,0" Height=3"
Name="buttonFlip" Width=0M>Button</Button>
Обратите внимание, что по мере того как вы вводите эти события щелчков в панели XAML,
редактор XAML выдает вам подсказки IntelliSense, которые не только дописывают наши
объявления Click, но и создают соответствующие обработчики события в нашем классе
выделенного кода (рис. 16.24)!
<IiacBox 'Jr-О. R^-"!" Nasrt,--,,li3cBc>tIH 'iъwлЗ'z-,lc*^ш■'^^Ъi.r^.dl.г^q^^
<1хл<?е Oii'i ;:iuw»l» С^Л Чг*~" Мздо-яы&адс!" Strftcr-"F:
CButton :iacx""fcacrcnfiandl^CIick*' M-»ysir.-',20, 0,0, 0" vn > с
<В«гт;ся Ci?c<—"rmt.ccrSepia_Ciick:" Marcrr<-0, 0,0,0" ^-iq^r
cSutfjn Cliw>c"bu::te-J?o£atte_Cliclc« Y\rq*?—20,0,0 r Э
<B>ttt:oii CI i к<-« J"^, ц\?~"™€..0.»2?/ °" i<fiuxt-t,23n -U:s —"b«itt|
■</?%;acVFin<ri> "'
/Grti>
neinv,>
JL
if FcWerOpenMemikem_Click
a? buttonB*ndW_Cliclc
tit buttor\Sepw_C!iclc
uj* buttonRotate.Click
d* buttonFlip_Chcfc
Bind event to a newly created И
IttonFSp) Windo*</Gnd/St«c&P<jr>el/BuUon
Рис. 16.24. Технология IntelliSense в действии внутри редактора XAML
Для манипулирования изображением мы используем преобразование: манипуляцию
двумерной поверхностью для вращения, перекашивания и прочих изменений внешнего вида
поверхности.
Глава 16. Создание богатых и интеллектуальных пользовательских интерфейсов 647
Мы можем выполнить нашу функцию вращения непосредственно при помощи
RotateTransf orm следующим образом:
private void buttonRotate_Click(object sender, RoutedEventArgs e)
{
CachedBitmap cache = new CachedBitmap((BitmapSource)imagel.Source,
BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
imagel.Source = new TransformedBitmap(cache, new RotateTransform(90));
}
Наша функция переворота так же просто реализуется при помощи преобразования
ScaleTransform:
private void buttonFlip_Click(object sender, RoutedEventArgs e)
{
CachedBitmap cache = new CachedBitmap((BitmapSource)imagel.Source,
BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
ScaleTransform scale = new ScaleTransform(-1,-1,imagel.Source.Width/2,
imagel.Source.Height / 2);
imagel.Source = new TransformedBitmap(cache, scale);
}
Размывание изображения достигается при помощи другого механизма, известного как
растровый эффект. При помощи создания нового экземпляра BlurBitmapEf f ect и
присваивания его нашему элементу управления изображением WPF применит соответствующий
алгоритм к растровому изображению для размывания картинки:
imagel.BitmapEffeet = new BlurBitmapEffect () ;
Выбор пути в обычном диалоговом окне
Последнее, что нам надо сделать — это дать пользователю возможность изменить путь к
файлам картинок. Сама WPF не имеет для этого никаких встроенных классов, но
пространство имен System.windows .Forms обладает как раз тем, что нам нужно,— классом
FolderBrowserDialog. Он запускается из обработчика нашего события щелчка
FolderOpenMenuItem:
private void FolderOpenMenuItem_Click(object sender, RoutedEventArgs e)
{
SetPathO ;
}
private void SetPathO
{
FolderBrowserDialog dig = new FolderBrowserDialog();
dig.ShowDialog();
path = dlg.SelectedPath;
ResetList();
}
648 Часть V. Создание промышленных приложений
На рис. 16.25 показано диалоговое окно в действии.
Browse For Folder
1
'
j
Л
\
\- Bl) Contacts,
Щ Desktop
. Щ Documents
ffff
& New Folder
t Щ* Pictures
J$j Saved Games
^ ЩВ Searches
t ju Tracing
Bate New FoJdef | | OK
H£H]
" 1
i
j ]
--
j
j
L
E
] ! Cancel
i
1
И
Рис. 16.25. Диалоговое окно поиска каталогов
Когда пользователь выбирает каталог, мы соответственно обновляем наше внутреннее поле,
перезагружаем новый путь в класс DirectorylmageList, а затем сбрасываем свойство
DataContext нашего окна. Это превосходный пример того, насколько просто использовать
внутри WPF другие технологии и библиотеки классов .NET. При помощи добавления в наш
проект соответствующих пространств имен и ссылок мы просто создаем экземпляр этого
класса точно так же, как и любого другого класса в нашем решении.
Рис. 16.26. После нанесения завершающих штрихов
Глава 16. Создание богатых и интеллектуальных пользовательских интерфейсов 649
Совет
Поскольку в WPF и WinForms существует большое количество элементов
управления, имеющих одинаковые имена (один такой пример— это ListBox), то (если вы
будете использовать классы из библиотек System, windows, controls и
System.windows.Forms) вам придется указывать полностью квалифицированные
имена некоторых объектов (во избежание использования неверного класса).
Теперь наше приложение функционально завершено. Текущее состояние кода XAML и
файла выделенного кода мы приводим в листингах 16.3 и 16.4 соответственно. Однако если
вы действительно хотите подробно исследовать это приложение, то вам следует скачать его
исходный код с Web-сайта данной книги. Это позволит вам увидеть все улучшения,
сделанные при помощи графических ресурсов, которые привели к окончательной версии,
показанной на рис. 16.26.
<Window х:CIass="ImageViewer.Windowl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Windowl" Height=64" Width-45">
<Window.Resources>
<DataTemplate x:Key="ImageDataTemplate">
<Image Source="{Binding UriSource.LocalPath}" Width=25"
Height=25" />
</DataTemplate>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width=50" />
<ColumnDefinition Width=78*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height=0" />
<RowDefinition Height=52*" />
<RowDefinition Height=5" />
</Grid.RowDefinitions>
<Menu Grid.Row=" Grid.ColumnSpan=" Height=2" Name="menul"
VerticalAlignment="Top">
<MenuItem Header="_Folder">
<MenuItem Header="_Open..." Click="FolderOpenMenuItem_Click" />
</MenuItem>
</Menu>
<ListBox SelectionChanged="listBoxl_SelectionChanged" Grid.Row="l"
Name="listBoxl" ItemsSource="{Binding}"
650
Часть V. Создание промышленных приложений
ItemTemplate="{StaticResource ImageDataTemplate}"/>
<Image Grid.Column="l" Grid.Row="l" Name="image1" Stretch="Fill" />
<StackPanel HorizontalAlignment="Center" Orientation="Horizontal"
Grid.Column="l" Grid.Row=" Name="stackPanell">
<Button BorderThickness=" Click="buttonBandW_Click"
Margin=0,0,0,0" Height=3" Name="buttonBandWM Width=0">
Button
</Button>
<Button Click="buttonBlur_Click" Margin=0,0,0,0" Height=3"
Name="buttonBlur" Width=0">Button</Button>
<Button Click="buttonRotate_Click" Margin=0,0,0,0" Height=3"
Name="buttonRotate" Width=0">Button</Button>
<Button Click="buttonFlip_ClickM Margin=0,0,20,0" Height=3"
Name="buttonFlip" Width=0">Button</Button>
</StackPanel>
</Grid>
</Window>
j Листинг 16,4. Файл выделенного кода на языке С#
<using System;
using System.Collections.Generic-
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Forms;
using Systern.Windows.Input;
using Systern.Windows.Media;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace ImageViewer
{
/// <summary>
/// Логика взаимодействия для Windowl.xaml
/// </summary>
Глава 16. Создание богатых и интеллектуальных пользовательских интерфейсов 651
public partial class Windowl : Window
{
private DirectorylmageList _imgList;
private string _path =
Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
public Windowl()
{
InitializeComponent();
ResetList() ;
this.DataContext = _imgList.Images;
)
private void FolderOpenMenuItem_Click(object sender, RoutedEventArgs e)
{
SetPathO ;
}
private void SetPathO
{
FolderBrowserDialog dig = new FolderBrowserDialog();
dig.ShowDialog() ;
path = dlg.SelectedPath;
ResetList() ;
}
private void ResetList()
{
if (IsValidPath(_path))
{
lmgList = new DirectorylmageList(_path);
1
this.DataContext = _imgList.Images;
}
private bool IsValidPath(string path)
{
try
{
string folder = System.10.Path.GetFullPath(path);
return true;
22 3ак 3716
652
Часть V. Создание промышленных приложений
}
catch
{
return false;
}
}
private void buttonBandW_Click(object sender, RoutedEventArgs e)
{
BitmapSource img = (BitmapSource)image1.Source;
image1.Source = new FormatConvertedBitmap(img, PixelFormats.Grayl6,
BitmapPalettes.Gray256, 1.0);
}
private void buttonBlur_Click(object sender, RoutedEventArgs e)
{
if (imagel.BitmapEffeet != null)
{
// Если текущий эффект — размытие, удалить
imagel.BitmapEffeet = null;
}
else
{
// В противном случае добавить в изображение размытие
imagel.BitmapEffect = new BlurBitmapEffect();
}
}
private void buttonRotate_Click(object sender, RoutedEventArgs e)
{
CachedBitmap cache = new CachedBitmap ( (BitmapSource) image 1. Source,
BitmapCreateOptions.None,
BitmapCacheOption.OnLoad);
imagel.Source = new TransformedBitmap(cache, new RotateTransform(90) ) ;
}
private void buttonFlip_Click(object sender, RoutedEventArgs e)
{
CachedBitmap cache = new CachedBitmap( (BitmapSource) imagel.Source,
BitmapCreateOptions.None,
BitmapCacheOption.OnLoad);
ScaleTransform scale = new ScaleTransform(-l, -1,
Глава 16. Создание богатых и интеллектуальных пользовательских интерфейсов 653
imagel.Source.Width / 2,
imagel.Source.Height / 2);
imagel.Source = new TransformedBitmap(cache, scale);
}
private void listBoxl_SelectionChanged(object sender,
SelectionChangedEventArgs e)
{
imagel.Source = (BitmapSource)
((sender as System.Windows.Controls.ListBox).Selectedltem);
}
}
}
Резюме
В этой главе вы получили краткое введение в новую инфраструктуру презентационного
уровня Windows Presentation Foundation от фирмы Microsoft. Мы исследовали общую
архитектуру этой инфраструктуры и ее модель программирования, в том числе и новую
концепцию использования декларативной разметки для дизайна и компоновки пользовательского
интерфейса клиентских приложений WPF. Мы видели, как визуальный конструктор WPF в»
Visual Studio можно использовать для того, чтобы быстро начать создавать впечатляющие
пользовательские интерфейсы (применяя те же самые процессы разработки, которые мы
используем при создании приложений Windows Forms или даже ASP.NET).
Мы потратили некоторое время на обсуждение основ компоновки элементов управления
(это центральная тема WPF) и на описание той первоклассной поддержки привязки данных,
которую предоставляет WPF.
Те разработчики, которые стараются изучить WPF, скоро понимают, что это весьма объемная
тема. Мы настоятельно рекомендуем вам потратить некоторое время на изучение ресурсов
MSDN (таких как центр разработчиков WPF по адресу: http://www.msdn.niicrosoft.com/wpf), а
затем вернуться к этой главе для того, чтобы получить полное представление о навыках и
знаниях, необходимых для того, чтобы успевать за развитием WPF. Также очень рекомендуется
попрактиковаться в работе с инструментами дизайна (имеются бесплатные ознакомительные
версии). Дополнительную информацию ищите по адресу: http://www.microsoft.com/expression.
Глава 17
Создание богатых приложений
на основе браузера
Visual Studio 2008 имеет свой ответ на то, что называется Web 2.O. Web 2.0 объединяет
дизайнеров и разработчиков. В этой новой сети вы должны предоставить пользователям
богатые возможности взаимодействия с вашим сайтом. Простые сайты с текстом, графикой и
гиперссылками (которые обновляются при каждом щелчке мыши) перерабатываются для
того, чтобы обеспечить пользователю большие возможности взаимодействия, аналогичные
работе в операционной системе Windows. Новые сайты при помощи этих новых технологий
размывают границы между сетью и операционной системой Windows, а также используют
их для того, чтобы выделиться.
В этой главе мы опишем три технологии на основе браузеров, которые вы можете
использовать в Visual Studio 2008 для создания сети следующего поколения. Сюда входят ASP.NET
AJAX, приложение браузера WPF XAML (ХВАР) и Microsoft Silverlight. При помощи AJAX
вы можете создать богатую среду, которая нацелена на использование стандартных
браузеров всех платформ. Приложения браузеров WPF позволяют вам использовать внутри
браузера практически всю мощь Windows Presentation Foundation. Конечно, это подразумевает
наличие на клиенте операционной системы Windows. Наконец, приложения Silverlight могут
работать внутри подключаемого модуля для браузера и обеспечивать богатую среду,
сравнимую с приложениями WPF. Кроме того, подключаемые модули браузеров имеются почти
для всех браузеров и почти на всех платформах.
Создание активных клиентских приложений
в стандартных браузерах
При помощи Visual Studio 2008 вы можете легко обеспечить высокую степень
интерактивности пользователя внутри ваших приложений ASP.NET. Имеющиеся инструменты
включают в себя: набор элементов управления, библиотеку кода и доступ к набору инструментов;
все это помогает вам встраивать JavaScript на стороне клиента в ваш пользовательский
интерфейс. Этот JavaScript может обеспечить богатую пользовательскую среду, которая
включает в себя модальные диалоги, уведомления о ходе выполнения, частичные обновления
Глава 17 Создание богатых приложений на основе браузера
655
страниц и многое другое. Эта технология известна как Asynchronous JavaScript and XML
(AJAX).
AJAX пытается разрушить барьер между тонким (и очень "тупым") клиентом и сервером.
Он дозволяет большую степень интерактивности пользователя и в то же время несколько
разгружает сервер. Многие действия можно выполнить на клиенте без нагрузки на сервер.
Кроме того, при частичных обновлениях страниц на сервер посылается (и с сервера
приходит) только часть обновляемой страницы. Это может увеличить эффективность запроса и
ответа.
Технология AJAX позволяет вам также продолжать использовать сделанные вами в
разработку ASP.NET вложения. Приложения AJAX построены на том же самом наборе элементов
управления ASP.NET, к которому вы уже привыкли. AJAX выступает просто дополнением к
этим элементам управления. Кроме того, поскольку JavaScript является стандартом
(ECMAScript), то он является частью всех современных браузеров (IE, Firefox, Safari),
работающих на всех платформах (Windows, Mac и т. д.). Поэтому создаваемые с его помощью
Web-приложения будут кросс-платформенными и кросс-браузерными.
Примечание
Многие элементы управления ASP.NET для улучшения взаимодействия с
пользователем уже давно используют JavaScript на клиенте. Сюда входят* элементы управления
проверкой на стороне клиента, элементы управления Web Parts для перетаскивания
Web-частей между зонами, элементы управления меню, элемент управления Tree-
View для открывания и просмотра узлов, элемент управления "календарь" и др.
Элементы управления AJAX и набор инструментов AJAX Toolkit — это просто формали-'
зация того направления, в котором Web-разработка двигается уже многие годы
Элементы управления AJAX в ASP.NET
Элементы управления AJAX в ASP.NET — это набор из четырех базовых элементов
управления, которые служат одной главной цели: частичному обновлению страниц. Частичные
обновления страниц позволяют создать для пользователя более комфортную среду, т. к. по
каждому запросу пользователя не нужно выполнять обновление всей страницы целиком.
Вместо этого данные элементы управления работают совместно для того, чтобы части
страницы могли отправляться и обновляться независимо. Элементы управления ASP.NET
управляют этим процессом частичного обновления.
Вы можете использовать элементы управления ASP.NET AJAX при создании Web-страницы
в визуальном конструкторе Web-форм. Вы можете перетащить их из панели Toolbox на
вашу форму и работать с ними точно так же, как и с другими элементами управления. На
рис. 17.1 показан список элементов управления AJAX, имеющихся внутри панели
инструментов Toolbox в Visual Studio.
В табл. 17.1 приведен список элементов управления AJAX и описание каждого из них. Это
просто краткое справочное руководство для того, чтобы вы могли понять особенности
каждого элемента управления. Мы опишем их более подробно в последующих разделах.
656 Часть V. Создание промышленных приложений
С .'mL!uuJi)iiJiJHiiimii[i»^nnfiriifaMMtatomi8»to '»* < wntutmd
UocrfboK ТЯИЕ4^ Ш
|:[ Ъ SfMMfenS ИЗ
1:1 S B»i# И
I] w Validation ||
| J mj Navigation I
& WebParts
L[n ЛМХExtension* 1J
II ^ Pointer 1
III Ш Script Manager Jl
III *Ш ScriptManagerProxy 11
I © Timer I
I §] UpdatePanel I
I <Q UpdeteProgress I
I Ш fapofttag 1
J Ш HTML I
I &J General l
I 1
[В§^гусг1^1в^1 ^ Toolbox I
Рис. 17.1. Элементы управления AJAX
внутри панели Toolbox в Visual Studio
Таблица 17.1. Элементы управления AJAX в ASP.NET
Элемент
управления
ScriptManager
ScriptManagerProxy
UpdatePanel
Описание
Всем страницам AJAX (которые вы будете писать при помощи
стандартных элементов управления, перечисленных здесь) требуется один
элемент управления ScriptManager на каждой странице. Он используется
ASP.NET для управления другими элементами управления на странице,
а также для обработки визуализации страниц по частям, глобализации,
локализации и т д
Страница может содержать только один элемент управления
ScriptManager. Поэтому если у вас есть страница, на главной странице
которой уже определен ScriptManager, то вы можете использовать на
дочерней странице элемент управления ScriptManagerProxy (если вам
необходимо добавить скрипт с дочерней страницы).
ScriptManagerProxy может также использоваться и на
пользовательских элементах управления
Используйте UpdatePanel тогда, когда вы хотите сгруппировать
элементы для частичного обновления страницы. Элементы внутри
UpdatePanel, которые производят обратную передачу на сервер, делают
это только для панели (но не для остальной части страницы). Таким
образом, вы получаете легкую модель для обновления только некоторых
частей вашей страницы с сервера (без выполнения полного обновления
страницы в браузере)
Глава 17. Создание богатых приложений на основе браузера
657
Таблица 17.1 (окончание)
Элемент
управления
UpdateProgress
Timer
Описание
Элемент управления UpdateProgress позволяет вам обеспечить
пользователя информацией по обработке на сервере частичного обновления
страницы. UpdateProgress используется в сочетании с элементом
управления UpdatePanel. Когда начинается обратная передача части
страницы на сервер, то пользователю выдается индикация состояния
процесса Когда возврат завершен, пользователь уведомляется еще раз
Элемент управления Timer предоставляет таймер на стороне клиента,
который позволяет вам выполнять обратную передачу содержимого
UpdatePanel через установленные интервалы времени
Создание страницы AJAX
Вы скоро поймете, что процесс создания страниц AJAX очень похож на создание
стандартных страниц. Есть только несколько вещей, о которых необходимо помнить. В этом разделе
мы проведем вас по примеру создания частичного обновления страницы. Затем вы сможете
использовать этот пример для того, чтобы выдавать в браузер пользователя уведомление о
состоянии процесса на сервере. Давайте же начнем.
Частичное обновление страницы
Частичное обновление страницы позволяет вам отправить на сервер только часть страницы,
обработать ее и обновить в браузере пользователя только эту часть страницы. Это сокращает
накладные расходы и обработку на сервере, а пользователи получают улучшенную среду.
Обновляется только та часть страницы, с которой они работают. Это и естественно, и быстро.
В этом примере мы создадим Web-страницу, которая позволяет пользователям выполнять
поиск заказов клиентов. В качестве источника данных мы будем использовать базу данных
Northwind. Мы создадим такую страницу, чтобы при отображении результатов пользователь
мог их пролистать по страницам. Страницы данных будут реализованы как страницы с
частичным обновлением. Это обеспечит отсутствие у пользователей ощущения выполнения
нового поиска при каждом выборе новой страницы данных.
Для начала создайте простой Web-сайт ASP.NET. По умолчанию сайты ASP.NET уже
поддерживают AJAX. Поэтому вам не нужно делать ничего особенного, кроме создания
простого сайта ASP.NET (дополнительную информацию по созданию Web-сайтов см. в главе
14). Для настройки страницы Default.aspx на сайте нашего примера необходимо выполнить
следующие шаги:
1. Добавить на страницу ScriptManager. Вы можете считать ScriptManager общей
логикой, требуемой в UpdatePanel для обработки частичного обновления страницы.
2. Добавить на страницу UpdatePanel. Этот элемент управления будет содержать ту часть
страницы, которую вы хотите частично обновить. Помещенные в UpdatePanel элементы
будут переданы обратно на сервер независимо от остальной части страницы (и таким
образом, независимо обновлены). Пользователь не увидит полного обновления страницы.
658
Часть V. Создание промышленных приложений
3. Следующий шаг— выполнить компоновку той части страницы, которая находится вне
UpdatePanel. Сюда входят: заголовок страницы, некие указания, текстовое поле для
ввода пользователем части имени клиента и кнопка поиска.
Ваша страница должна теперь выглядеть вроде показанной на рис. 17.2. Обратите
внимание, что в верхней части страницы находится ScriptManager. Элемент управления
UpdatePanel расположен ниже текста "Search results...". Этот текст и все то, что
находится выше него, будет делать полную отправку страницы. Все, что находится внутри
UpdatePanel, будет выполнять частичную отправку страницы.
^ 1727Jf -MicrosoftVisualirfTj
File Edit " View Pioject Build Debug Format Table Tools Te&t Window Help
> J'Jii J , > & ** ~ - £] - ' ► Debug - Any CPU
U Defaittaspx*
4\
ScriptMwvKier - ScriptMariBgerMain
[rd tide
Find Customer]
Enter a portion of the customer's name and hit the 'Find' button.
Customer Name:
Search msulLs.
L
H'.\
-i Design П Split Л Source {« .^h^m'^j <body>j <fofm*torrnl>] <div> < table > *.tr>^<tctitl<>'
Ready
Рис. 17.2. Начальная стадия страницы с частичным обновлением
4. Следующий шаг— настроить элемент управления GridView для доступа к данным. Для
этого перетащите элемент управления GridView (из группы элементов управления Data
в панели Toolbox) на поверхность конструирования внутрь UpdatePanel. Вы можете
использовать совмещенное представление для проверки того, что элемент управления
попал внутрь UpdatePanel.
5. Используйте стрелку задач в правой верхней части элемента управления GridView для
настройки источника данных. Используйте опцию Choose Data Source и выберите
новый источник данных. Следуйте за подсказками мастера: выберите опции базы данных
для источника данных и создайте подключение к базе данных Northwind.
Когда вы дойдете до опции Configure the Select Statement, выберите переключатель
Specify a Custom SQL Statement or Stored Procedure и нажмите кнопку Next. Вы
можете использовать инструмент Query Builder для создания оператора SQL, который
соединяет таблицы Customers и Orders. Пример дан в следующем коде. Обратите внимание,
Глава 17. Создание богатых приложений на основе браузера
659
что оператор where использует параметр @cust и ключевое слово like для определения
указанного пользователем значения для поиска.
SELECT Customers.ContactName, Customers.CompanyName, Customers.Phone,
Orders.OrderDate, Orders.RequiredDate, Orders.ShippedDate,
Orders.ShipAddress, Orders.ShipCity, Orders.ShipVia,
Orders.Freight, Orders.OrderlD
FROM Orders INNER JOIN Customers ON Orders.CustomerID =
Customers.CustomerlD
WHERE (Customers.ContactName LIKE @cust + '%*)
ORDER BY Customers.ContactName, Orders.OrderDate
После определения запроса нажмите в мастере кнопку Next. Теперь вы должны
оказаться на странице Define Parameters. Здесь вы можете определить источник
параметра, который вы создали в предыдущем операторе SQL. Для этого примера укажите,
что: источником является Form, a FormField— это ваше текстовое поле,
используемое для ввода данных (укажите TextBoxCustomer). На рис. 17.3 показан пример такой
настройки.
ip- ■-
Define Parameters
The wiiard ha* detected one or more parameters in your SELECT statement For each parameter in the 5EL£CT statement, rheose a
source for the parameter'; value
Parameters;
Name Value
тшшшшшжшввт
Parameter source
Form
FormField
TertBc^ustcmer
DefaurtValue
5ho»v ndvanced properties
SELECT statement
SELECT С ustometbContacttame, Customers Company Name, CuilomervPhorte, Ctders.QrderD.Jte. OrdervRequiredDate, *
Orders ShippedDate, Orders.ShipAddrws. Otders Sbiptrry, Orders.ShtpVia, GrdersFieicjht, Orders OidedP FROM OrdersTNNEF
JOIN Customers ON Orders С urtomedD = CurtomervCmtomerlD WHERE (Customers.ContactName LIKE Ocust ♦ %)ORDER -
Рис. 17.3. Определение параметра источника данных
6. Следующий шаг— настроить разбивку на страницы для элемента управления GridView.
Вы можете сделать это из смарт-тега; выберите флажок EnablePaging.
7. В качестве необязательного шага вы можете несколько улучшить отображение
GridView. В смарт-теге выберите AutoFormat для применения формата к сетке. Вы
можете также использовать ссылку Edit Columns для запуска редактора столбцов. Здесь вы
сможете изменить текст заголовка любого столбца, изменить порядок следования
столбцов и настроить форматирование значений дат и валют.
660
Часть V. Создание промышленных приложений
Вот и все. Теперь у вас есть страница, которая показывает пользователю результаты поиска
клиентов и заказов. Когда пользователь щелкает по одной из кнопок номеров страниц, то
страница частично обновляется. Запустите приложение и введите несколько букв в поле
TextBoxCustomer, а затем щелкните по кнопке Find. Мы сделали это на рис. 17.4. Когда вы
выбираете ссылку на страницу (внизу данной страницы), то происходит обновление сетки.
kt,#- Ды^^.^^у.ШВДИИИИИИИДИО ЩЩЩЩ
I W <Л>
3$ Untitled
Page
1 Find Customer
j Enter a
J Custom
Search
Order
ID
10031
1 1O909
I 11015
I 10324
1 J0393
Ijavascrrpt..
portion of the customer's na
er Name. io
restfts...
««не
Jonas
Bergulfsen
Jonas
a-rguifsen
Jonas
Sergulfben
Jose
Havarotti
Jose
Pavarotti
Company
Sante
Gourmet
Sante"
GDurniet
Sante
Gourmet
Save-a-fct
Markets
Save a-lot
Markets
1 4> -©*«*>* i
me and hit the 'Find* button
| Find |
Phone Ordered Required «hipped д^^»' ^
07-9в92 Ef,inQ
"' 1/14/1990 2/11/199G 1/23/1990 Sfcakkes oate StavBrn
3* 78
„ 2/26/1998 3/26/1998 3/10/1938 Sfcakkas gate Stavern
ib 78
07-ВД 92 Er,ir<9
"' 4/10/1998 4/24/1998 4/20/1998 Skakkes aate Stavern
ib 78
[?'L; «W6 11/5/1996 10/10/1^96 ,18/Sjff0,k Ro.se
2?L* 12/25/1996 1/22/1997 1/3/1997 j187 Suffolk Bote
_ctoPort&*ckl'GndViewl '.'PagrfS') / Trusted sites | Protected Mode 04
q* Page » „ j? Teoh ▼ 1
1
1
Shipper Freight
2 $72.19
i |l
i 1
2 $53 05 '1
2 S4 62 1
1 $2K ?7 I
3 S126 56 ||
\100X * §
Рис. 17.4. Частичное обновление страницы в действии
Отображение для пользователя состояния обработки на сервере
Пользователи чувствуют себя гораздо уютнее тогда, когда они получают немедленную
реакцию после нажатия какого-либо элемента Web-страницы и запуска некоего действия.
Конечно, выполнение многих серверных операций может занимать довольно длительное
время. Если вы запрашиваете страницы, которые срабатывают медленно (примерно за секунду
или более), либо работаете через медленную сеть, то будет лучше дать пользователю знать о
том, что вы работаете над его запросом.
Элемент управления ASP.NET Update progress делает именно это. Когда пользователь
щелкает для выполнения частичного обновления страницы, то вы можете выдать
уведомление об ожидании или анимированный рисунок в формате GIF. Затем (после завершения
страницы) уведомление об ожидании исчезает и происходит частичное обновление
страницы. Давайте рассмотрим, как встроить все это в страницу нашего примера.
В предыдущем примере вы реализовали частичное обновление страницы для страниц
Grid View. В этом примере вы обеспечите пользователей индикатором хода выполнения
перелистывания страниц. Для начала вы будете использовать страницу, созданную ранее.
Глава 17. Создание богатых приложений на основе браузера
661
Далее указаны все шаги, которые необходимо применить к этой странице для реализации
уведомления о ходе выполнения.
1. Первый шаг— перетащить на страницу элемент управления UpdateProgress. Поместите
этот элемент управления ниже элемента GridView, но вне элемента управления Update-
Panel. В этом примере мы будем отображать индикатор хода выполнения под разбивкой,
на страницы. Таким образом, пользователь будет видеть индикатор хода выполнения
там, где сосредоточено его внимание.
Вы можете поместить элемент управления UpdateProgress в любом месте страницы, но
не внутри самой панели UpdatePanel. При запуске частичной обратной передачи
страницы клиент немедленно сбросит уведомление о выполнении.
2. Затем вам необходимо настроить несколько свойств элемента управления UpdateProgress
для страницы. Вам нужно настроить свойство AssociatedUpdatePanellD, чтобы связать
элемент управления UpdateProgress с элементом управления UpdatePanel. Именно так
они связываются. Поскольку данная страница может иметь несколько элементов
управления обновлением, то настройка этого свойства просто необходима.
Вы можете также настроить в свойстве Display After то количество миллисекунд,
которое клиент должен ждать до отображения уведомления. В этом примере настройте
небольшое значение B50 — это четверть секунды).
3. Последний шаг— настроить сообщение, которое демонстрируется пользователю во
время ожидания. Вы можете поместить в элемент управления UpdateProgress любой
HTML-код или разметку. Вы можете сделать это при помощи перетаскивания элементов
на элемент управления в представлении визуального конструктора. В представлении
исходного кода вы должны создать для вашей разметки узел ProgressTemplate.
В нашем примере вы можете разместить текст "Please wait...". Если у вас есть анимиро-
ванный gif-файл, который работает в цикле, то вы также можете добавить его здесь.
Разметка UpdateProgress должна выглядеть примерно так:
<asp:UpdateProgress ID="UpdateProgressResults" runat="server"
AssociatedUpdatePanelID="UpdatePanelData" DisplayAfter=00"
DynamicLayout="true">
<ProgressTemplate>
<div class="title" style="text-align: center; font-size: 10pt;M >
<img src="images/rotation.gif'' alt="waiting" />
Please wait ...
</div>
</ProgressTemplate>
</asp:UpdateProgress>
4. Необязательно: если вы выполняете этот пример локально, то можете практически
ничего не заметить во время ожидания. Поэтому следует создать время ожидания (просто для
того, чтобы его увидеть). Конечно, в реальном приложении вы никогда не будете этого
делать. Для этого добавьте код в событие PagelndexChanged элемента управления .
GridView (для перевода выполняющегося потока в состояние неактивности).
662
Часть V. Создание промышленных приложений
Следующий код внесет задержку в четыре секунды:
protected void GridViewl_PageIndexChanqed(object sender, EventArgs e) {
System.Threading.Thread.SleepD000);
}
Теперь вы можете запустить приложение. Когда вы щелкнете по номеру в списке страниц, то
должны будете увидеть сообщение "Please wait...". На рис. 17.5 все это показано в действии.
* tortitled Page - Widows intetrvet Елркйес
frW ■&) «a£W
«в i '& Untitled Page
*i w CC ~ <» * _• p«g« * *ч Jaoii w
Find Customer
Enter a portion of the customer's name and hit the 'Find' button
Customer Name* jo I Find I
Search results _
0«ler«d lUaquired Shipped
«*» Гагсш мХГ Ж*"- ?П«™ MM ««»» ™*«* **.
Fsvatc:t!
Jase
Pavarctti
'3se
Fevar с .ti
Mb-lets
Save a-tot
Markets
«•dve-i-iat
Мв'Мь
3097
B08^ 555-
8097
C^rj»; ^-
8097
t Shipper freight
$48 77
$144 03
SU/4»
10657 ** H. f^T^ Ж555" 9/4/1997 10/2/1997 9< 15/1997 ,167 ? Лв,к So.Se
FdVdrctt» Md'kels 8097 ' Ln
4'i* Please wait.
, * Trusted sites | Protected Mode OH \ 100%
Рис. 17.5. Уведомление о ходе выполнения AJAX, работающее в браузере
Библиотека с открытым исходным кодом
ASP.NET AJAX Control Toolkit
Для того чтобы ввести первую версию AJAX в версиях Visual Studio 2003/2005, фирма
Microsoft сотрудничала с сообществом разработчиков. Этот проект назывался ATLAS. Из
этих зачатков вырос инструментальный набор AJAX Control Toolkit. Вероятно, этот набор
представляет собой один из наиболее успешных проектов программного обеспечения с
открытым исходным кодом, над которым совместно работала большая компания и
сообщество разработчиков.
Внутри этого инструментального набора находятся нестандартные элементы управления
AJAX, которые обеспечивают большое количество динамических действий пользователя
внутри браузера. Там имеются элементы управления для всевозможных функций, в том
числе: автоматическое дописывание для пользователя, поля редактирования текста с
шаблонами, проверка силы пароля, модальные окна диалогов и многое другое. Вы можете скачать
Глава 17. Создание богатых приложений на основе браузера 663
эту коллекцию элементов управления в виде исходного кода или в виде двоичного файла.
Затем вы можете использовать эти элементы управления в ваших приложениях.
Примечание
Мы обсуждаем здесь ASP.NET Control Toolkit потому, что он стал частью реальности
разработчика, использующего Visual Studio. Вы можете найти учебные пособия и
обсуждения на сайте фирмы Microsoft по адресу: http://www.asp.net. Вы можете
получить исходный код по адресу: http://www.codeplex.com Кроме того, в документации
MSDN обсуждаются сами элементы управления и описано, как нужно работать с этим
инструментальным пакетом.
Приступаем
Исходный код инструментального пакета AJAX Control Toolkit и двоичные версии имеются
по адресу: http://www.codeplex.com. Там есть версии под различные версии .NET
Framework. Последняя соответствует версии .NET 3.5. Вы можете скачать исходный код или
выбрать версию без исходного кода. Давайте воспользуемся именно ею (поскольку мы не
будем описывать здесь этот исходный код).
После скачивания zip-файла и его разворачивания вы получаете несколько вещей. Первое —
это сам инструментальный набор. Вы найдете его в каталоге SampleWebSite\Bin. Это
единственный dll-файл, в котором содержатся элементы управления. Сам пример Web-сайта
является работающим примером и содержит документацию на каждый элемент управления
инструментального набора. Наконец, имеется также vsi-файл для инсталляции
дополнительных шаблонов Visual Studio (для создания новых элементов управления на основе
инфраструктуры инструментального набора). На данный момент мы эти шаблоны пропустим!
Вместо этого давайте рассмотрим, как вы можете использовать эти элементы управления
внутри Visual Studio. Вот шаги, которые необходимо сделать для того, чтобы начать их
использовать:
1. Создайте новый сайт ASP.NET, с которым вы будете работать. Либо вы можете
использовать созданный для предыдущего примера.
2. Вам нужно добавить элементы управления в панель Toolbox для того, чтобы вы могли
использовать их в вашем Web-сайте. Однако сначала надо щелкнуть по панели
инструментов правой кнопкой мыши и выбрать пункт Add Tab. Это даст вам новое место в
панели инструментов, в котором вы сможете расположить элементы управления из AJAX
Control Toolkit. Назовите эту вкладку AJAX Toolkit или как-то похоже.
3. Затем щелкните правой кнопкой мыши внутри новой вкладки и выберите пункт Choose
Items. Это позволит вам выбрать элементы управления для добавления на эту вкладку.
Внутри окна Choose Toolbox Items нажмите кнопку Browse. При помощи диалога Open
перейдите в тот каталог, куда вы развернули архив с инструментальным набором.
Перейдите в подкаталог Bin внутри каталога SampleWebSite. Здесь вы увидите файл
AJAXControlToolkit.dll. Выберите его и нажмите кнопку Open, а затем кнопку ОК. Это
приведет к импорту элементов управления в панель инструментов Toolbox.
Элементы управления из инструментального набора теперь готовы для использования. На
рис. 17.6 показаны элементы управления внутри панели Toolbox. Обратите внимание, что
здесь перечислено множество элементов управления. Большинство этих элементов предо-
664
Часть V. Создание промышленных приложений
ставляет достаточно специфические функциональные возможности — так что вы сможете
узнать их по названию. Изучение примера Web-сайта также поможет вам понять их
возможности.
* AJAX Toolkit
! ^ Pointer
ЛЦ Accordion
Wj Accordion Pane
^ AlwaysVisibleControlExtender
*£ AnimationExtender
jd AutoCamptettExttnder
T] CalendarExtender
*3* CascadingDropDown
j3 CallapsiblePanelExtender
Ф] ConfirmButtonExtender
«J> DragPancIExtendw
tp\ DrcpDawnExtender
-J DrcpSh&dowExtender
*Z3 DynamicPopulateExtender
^| FilteredTextBoxExtender
$£j HoverMtnuExtendti
:Д ListSearchExtender
m MaskedEditExtender
""" MaskedEdrtValidator
3 ModalPopupExtender
Q| MutualryExdusiveChecfcBoxExtender
фЭ NoSot
f 0 NumencUpDownExtender
:E PagmgBuIletedLrsfcExtendr/
ч~£ PasswordStrength •
#J PopupContratExtrnder
ft* Ratmg
«H ReorderList
"^2 ResizableControlExtender
U RoundedCornersExtender
Lj SliderExtendcr
if? SHdeShowExtender
i *"| TabContainer
Q TertBoxWatermarkExteruter
^ ToggleButtonExtender
C3 ToottcitScriptManager
^ UpdatePaneiAnimationExtender
L;j ValidatorCaltoutExtendcr
(j Gimrrai __.
^ Server EitptorVr | *£• Tooibox |
Рис. 17.6. Инструментальный набор AJAX Control Toolkit
в панели инструментов Toolbox
Элементы управления инструментального набора AJAX Control Toolkit
Как вы уже видели, элементы управления AJAX Control Toolkit имеют полную поддержку на
стадии конструирования. С ними можно работать и перетаскивать их из панели Toolbox на
ваши формы. Конечно, важно знать, как можно использовать каждый элемент управления.
Глава 17. Создание богатых приложений на основе браузера
665
В табл. 17.2 дан обзор некоторых элементов управления инструментального набора.
Помните, что эти элементы управления выполняют ббльшую часть своих функций на клиенте. Это
дает пользователю более интерактивную среду. Используйте список табл. 17.2 как
справочную информацию и стартовую точку при встраивании этих функций в ваши приложения.
Таблица 17.2. Элементы управления ASP.NET AJAX Control Toolkit
Элемент управления
Accordian
CollapsiblePanelExtender
AutoCompleteExtender
CalendarExtender
FilteredTextBoxExtender
HoverMenuExtender
LIstSearchExtender
MaskedEditExtender
Описание
Используйте элемент управления Accordian для отображения
нескольких блоков информации (или панелей), которые имеют
заголовок и содержимое. Однако в каждый момент времени открыт
только один блок Accordian. При открытии нового блока текущий
блок закрывается (что и дает пользователю впечатление как от
аккордеона)
Позволяет вам легко определить на вашей форме панель, которую
пользователь может открывать и закрывать. Панель имеет
заголовок с кнопками разворачивания и сворачивания
Может реагировать на ввод пользователя и подсказывать ему
варианты заполнения. Он делает это при помощи прикрепления к
элементу управления TextBox и предоставления всплывающих
панели со списком. Вы наполняете этот список в зависимости от
ввода пользователя (обработка ведется на сервере). Например, вы
можете искать имена клиентов при вводе пользователем заказа
Используйте элемент управления CalendarExtender для
прикрепления выбора календарной даты к любому текстовому полю
ASP.NET. Этот элемент управления позволяет пользователю пе- f
релистать календарь и выбрать дату для заполнения текстового
поля. Элемент управления "календарь" появляется тогда, когда
пользователь выделяет текстовое поле или нажимает кнопку
После выбора пользователем даты календарь исчезает
Позволяет вам указать тип данных, которые пользователь может
ввести в данное текстовое поле. Например, вы можете ограничить
ввод только цифровыми символами, только буквами, только
буквами нижнего регистра и т. д.
Предоставляет пользователям небольшое меню с действиями
(в зависимости от положения курсора мыши на странице)
Например, при выборе элемента списка вы можете дать меню с
командами редактирования, удаления и модификации. Вы прикрепляете
HoverMenuExtender к элементу управления на странице. Таким
образом, вы можете получить контекст того места, где находился
пользователь при выборе действия
Позволяет пользователю ввести букву в ListBox или
DropDownLlst и немедленно выбрать первый элемент списка,
начинающийся с этой буквы
Прикрепляется к текстовому полю ASP.NET и используется для
предоставления пользователям помощи при вводе данных и для
ограничения типа вводимых ими данных. Например, пользователь
должен ввести номер телефона в определенном формате, таком
как (код региона)-индекс-номер MaskedEditExtender может.обес-
печить соблюдение этого формата
666
Часть V. Создание промышленных приложений
Таблица 17.2 (окончание)
Элемент управления
ModalPopupExtender
ConfirmButtonExtender
PasswordStrength
ReorderList
SliderExtender
TabContainer
Описание
Позволяет вам создавать окно, которое всплывает в зависимости
от действий пользователя Это окно будет на вашей странице
модальным То есть страница будет деактивирована и пользователю
придется отреагировать на диалоговое окно для того, чтобы
получить возможность продолжить Этот элемент управления отлично
подходит для подтверждения запросов пользователя и позволяет
реализовать сложные варианты ввода данных, когда необходима
дополнительная форма
Это еще один всплывающий элемент управления Используйте его
тогда, когда вы хотите определить кнопку, действие которой
требует подтверждения пользователя (см пример далее в этой же главе)
Прикрепляется к текстовому полю и визуально указывает
пользователю силу пароля во время его ввода Вы можете использовать
этот элемент управления для того, чтобы настроить минимальную
длину пароля, потребовать наличия нетекстовых символов и т д
Создает привязанный к данным список элементов, который
пользователь может переупорядочить внутри браузера Пользователь
выбирает элемент и перемещает его вверх или вниз относительно
других элементов (конечно, это делается без доступа к серверу)
Пользователь может также добавлять в список новые элементы
Работает с текстовым полем ASP NET для перехвата ввода
пользователя. Пользователь передвигает графический элемент вверх-
вниз или справа налево (в пределах определенного диапазона)
При перемещении ползунка текстовое поле обновляется
Позволяет вам группировать функциональность страницы в
логические вкладки После этого пользователь может щелкнуть по
вкладке и увидеть функционал вкладки без получения обновлений
с сервера Каждый TabContainer содержит элемент управления
TabPanel На панели TabPanel вы размещаете элементы
управления ASP NET
Использование элементов управления инструментального набора
на странице
Обратимся к табл. 17.2. Обратите внимание, что большая часть элементов управления
данной таблицы имеет суффикс Extender. Это означает, что данный элемент управления
расширяет существующий элемент управления ASP.NET. Точнее говоря, данный элемент
управления для обеспечения своей функциональности работает с другим элементом управления.
Например, CalendarExtender работает с элементом управления TextBox. Те элементы
управления, которые не имеют этого модификатора, существуют в библиотеке как
самостоятельные элементы управления.
Инструментальный набор AJAX Toolkit значительно облегчает работу с элементами
управления, а тем более с расширяющими элементами управления. Для того чтобы получить
расширяющий элемент для элемента управления ASP.NET, вы можете использовать смарт-тег
для данного элемента управления.
Глава 17 Создание богатых приложений на основе браузера
667
Далее описаны основные шаги для добавления всплывающего окна подтверждения для
кнопки:
1. Создайте новую страницу. Убедитесь, что в верхней части вашей страницы имеется
элемент управления ScriptManager. Подобно прочим элементам управления AJAX,
инструментальному набору требуется ScriptManager.
2. Добавьте на страницу кнопку. Вы можете дважды щелкнуть кнопку для добавления
обработчика событий. В обработчике событий вы можете настроить свойство Text кнопки
на что-нибудь другое (просто чтобы убедиться, что отмена пользователем работает). Вот
пример:
protected void ButtonSave_Click(object sender, EventArgs e) {
ButtonSave.Text = "Saved";
}
3. В представлении визуального конструктора выберите кнопку и ее смарт-тег. Вы увидите
здесь пункт Add Extender. Эта опция добавлена в Visual Studio инструментальным
набором AJAX Control Toolkit. Пример показан на рис. 17.7. Выберите этот пункт.
Fife Edit View Projrct Build Debug Format Table Tools Test Window Help
Jb -J ' J Я *P * -^ & ■'>•*'• ,2 - ' ► Debug - Any CPU
£j WebFormTooJkitj^px* j
I New Customer Order
h !sp:button£satcf&«|s inside the steps listed betow.
Add Lrtender {
Add [/tender
_^y»
4 Design □ Split id Source
i j <h£ml>I * body > *io\r-<*tctml "> <4&p>'3utton button#Button».>
Drag margin handles to resne margins. Press SHIFT or CTRL for more options.
Рис. 17.7. Смарт-тег Add Extender
4. Теперь вы должны увидеть диалог Choose an Extender (рис. 17.8). Здесь вы увидите
список всех расширяющих элементов управления. Выберите ConfirmButtonExtender
Обратите внимание, что ID для элемента управления устанавливается автоматически (по
расширяемому элементу управления). Нажмите кнопку ОК для продолжения.
5. Данный элемент управления не имеет визуального представления, поскольку он просто
расширяет кнопку. Поэтому вам придется либо искать его в окне свойств, либо переклю-
668
Часть V. Создание промышленных приложений
чаться в совмещенное представление. Настройте в свойстве ConfirmText сообщение для
подтверждения операции пользователя. Обратите также внимание, что TargetControlID
расширяющего элемента управления был автоматически установлен в ID расширяемого
элемента управления (в данном случае — ButtonSave).
1 '"¥?
1 sTsii' Choose an Extender
Choose the function*^ to add to BuHonSavei
J r % q.
1 AlweysViitb AnimaticnE «щМШгдМ DragPanelE.
1 Description:
I Specify an ID for the extender
1 BurtonSave_ConrtrmButtonExtrnder
Drop Down
_J
DropShado
"Tl %E\
DynamicPo. HoverMen
t OK
s
1
:3 ■
ModalPop Pc 1
i |
9
| Cancel |
Рис. 17.8. Выбор расширяющего элемента управления
ТШШИКЗ
& U^jttert Pege - W ntikm* fotsmet ts&oter
\i li ' £_ http/,1oca&ost5930e/WebFormTooJfcit «px
■ '«£ #( =<£ Untitled Page
New Customer Order
Enter the order details inside the steps listed below
Save
WiMtotfs internet Explorer
D^tore
$
L-°L-i LJg^J
j WebFor mTooJkit.aspx
У Trusted site* | Protected Mcde. Off
Рис. 17.9. Элемент управления ConfirmButtonExtender в действии
Глава 17. Создание богатых приложений на основе браузера
669
Теперь запустите приложение. Вы должны увидеть вашу форму в том виде, который вы
хотели получить. Нажмите кнопку Save и вы получите диалог подтверждения (рис. 17.9).
Нажатие кнопки отмены произведет отмену обратной передачи. Нажатие ОК приведет к
завершению обратной передачи на сервер.
Мы рассмотрели основы AJAX, которые встроены в Visual Studio 2008, а также и те,
которые имеются в составе инструментального пакета ASP.NET AJAX Toolkit. Наша основная
цель — помочь вам использовать элементы управления AJAX для создания среды
пользователя. Конечно, для тех из вас, кто хочет создавать собственные элементы управления AJAX,
есть еще много материала для изучения.
Так же, как и для серверных элементов управления ASP.NET, фирма Microsoft предоставила
аналогичные средства и для создания серверных элементов управления ASP.NET AJAX. Для
начала в Visual Studio имеется шаблон ASP.NET AJAX Server Control. Вы можете
использовать его для создания серверных элементов управления, которые работают с
ScriptManager и выдают свой собственный JavaScript-код клиенту. Этот процесс требует
большого количества кодирования.
Кроме того, Visual Studio поставляется с библиотекой Microsoft AJAX. Эта библиотека
обертывает JavaScript в легкую для использования объектно-ориентированную структуру
(для тех, кто хочет встроить JavaScript в свои элементы управления и страницы). Библиотека
поставляется в отладочной и окончательной версиях. Отладочная версия важна потому, что
в Visual Studio 2008 есть отличная поддержка отладки клиентских скриптов.
Для тех, кто создает свои элементы управления ASP.NET AJAX, существует также мощная
поддержка сообщества разработчиков. Дополнительную информацию ищите по адресам:
http://www.asp.net и http://www.codeplex.com.
Создание уникальных и богатых сред
на платформе Windows при помощи браузера
В главе 16 мы рассмотрели процесс создания приложений Windows Presentation Foundation
(WPF) при помощи Visual Studio 2008. Как вы помните, эти приложения основаны на
XAML, который интерпретируется в WPF, а затем отображается на экране. WPF позволяет
вам создавать пользовательские интерфейсы, которые используют такие вещи, как
векторная графика, масштабирование и трехмерные эффекты для создания уникальных
пользовательских сред под Windows. Обсуждавшиеся в главе 16 приложения предназначены для
инсталляции в качестве независимых приложений, которые работают в среде операционной
системы Windows. Однако аналогичные приложения WPF могут развертываться и для
выполнения в Web-браузере пользователя.
WPF-приложения для Web-браузера называются также ХВАР (XAML browser application).
ХВАР может быть развернут при помощи простого указателя информационного ресурса для
ClickOnce и выполняться внутри браузера пользователя (приложение нЬ покидает браузер).
Поэтому приложения ХВАР работают в "безопасной песочнице" с ограниченным доверием.
Например, они не имеют доступа к таким вещам, как файловая система пользователя.
670
Часть V. Создание промышленных приложений
Примечание
ХВАР на основе WPF может выполняться как внутри Internet Explorer, так и внутри
Firefox. Это обеспечивает большую универсальность вашего приложения, поскольку
огромное большинство пользователей использует один из этих двух браузеров.
Однако для ХВАР требуется наличие на клиенте Windows и .NET Framework. Если вам
нужно полностью кросс-платформенное решение, то вам придется основываться на
ASP.NET или Silverlight.
Выбор между независимым приложением
WPF и WPF ХВАР
Есть некоторые ситуации, в которых приложение ХВАР имеет преимущества перед
приложениями ASP.NET, WinForms или стандартным приложением WPF. Например, вы можете
использовать ХВАР для легкого создания пользовательских сред, которых не бывает в
приложениях браузера. Сюда входят: меню наподобие тех, которые есть в Windows,
контекстные меню (по щелчку правой кнопки мыши), интерактивный анализ данных, проверка
правописания в режиме реального времени, элементы управления редактированием, прокрутка
списков данных, клавиши быстрого вызова, управление пользовательским курсором и
многое другое. Такая богатая пользовательская среда обычно характерна для клиента под
операционную систему Windows. Однако при помощи ХВАР вы можете запускать клиента с
такими возможностями внутри браузера. Таким образом, вы получаете дополнительные
преимущества легкого развертывания (и обновления), использования "безопасной
песочницы" браузера, а также обмена с вашим сервером (и Web-сервисами) через HTTP. И если вам
это нужно, то ваше ХВАР-приложение может получить доступ к изолированному
хранилищу на компьютере пользователя для сохранения и выборки данных (причем безопасным
образом).
ХВАР-приложение является одним из типов приложений WPF. Оба они основаны на одном
и том же коде .NET Framework. Однако у них есть как сходства, так и различия. Вам нужно
понимать их при создании вашего пользовательского интерфейса. Таблица 17.3 должна
помочь осветить имеющиеся возможности в сравнении друг с другом.
Таблица 17.3. Элементы управления ASP.NET AJАХ
Функциональная
возможность
Инсталляция
Доступ
пользователя
Хост/процесс
WPF
Обычно инсталлируется на
компьютере пользователя при помощи
msi-пакета или ClickOnce. Может
деинсталлироваться при помощи
Add/Remove Programs
Пользователь может получить
доступ через меню Start, ярлык на
рабочем столе и т. д Ехе-файл
инсталлируется в каталог Program
Files
Работает в собственном процессе
Windows
ХВАР
Инсталлируется внутри кэша
браузера (а не напрямую на
компьютере) при помощи ClickOnce URL
По HTTP через ярлыки браузера
(Избранные) Ехе-файл находится в
браузере
Работает в процессе Web-браузера
Глава 17. Создание богатых приложений на основе браузера
671
Таблица 17.3 (окончание)
Функциональная
возможность
Безопасность
Поддержка WCF
Новые окна
Обновление
Автономный
режим
WPF
Обычно работает на компьютере
пользователя в условиях полного
доверия Это означает наличие
доступа к реестру, файловой
системе и устройствам вроде
принтеров
Может полностью обмениваться с
сервисами WCF
Создает новые дочерние окна
аналогично любому приложению
Windows
Требуется разработать некую
стратегию для получения обновлений
клиентом или для запроса
обновлений клиентом
Пользователь обычно имеет доступ
к запуску приложения даже при
отсутствии подключения к серверу
ХВАР
Работает в песочнице с частичным
доверием По умолчанию не имеет
доступа к удаленному выполнению,
отражению, файловой системе,
принтерам, сервисам WCF,
реестру и т д.
Не может вызывать сервисы WCF
из приложения браузера
Перемещение по новым окнам
происходит в браузере, и они не
всплывают подобно окнам
приложения Windows
Легко обновляется при обращении
пользователя к серверу Новую
версию можно развернуть на
сервере, после чего все клиенты будут
обновлены
Только в состоянии подключения
Требуется подключение к серверу
Создание WPF-приложения для браузера
Создание WPF-приложения для браузера— это почти то же самое, что и создание
самостоятельного WPF-приложения. Конечно, имеется несколько таких вещей, которые
необходимо учитывать для того, чтобы ваше приложение было правильно настроено для
развертывания и выполнения в качестве приложения Web-браузера. В этом разделе мы изучим
основные шаги по созданию, настройке и отладке ХВАР. Здесь же мы обсудим также
соображения безопасности и развертывания.
Для начала вы создадите простое WPF-приложение для браузера. Мы не будем обсуждать
основы дизайна, компоновки и кодирования пользовательских интерфейсов (поскольку они
уже обсуждались в главе 16). Первый шаг— создание проекта WPF. В Visual Studio 2008
есть специальный шаблон для ХВАР-приложений. Этот шаблон называется WPF Browser
Application. Использование этого шаблона дает вам основу для настройки вашего
приложения под работу в браузере. На рис. 17.10 показано диалоговое окно New Project с этим
выделенным шаблоном.
Когда вы создаете WPF-приложение для браузера, то получаете проект, который создан по
шаблону, похожему на стандартное приложение WPF. Сюда входят: файл для формы WPF
по умолчанию и app.xaml для конфигурации. В приложении WPF среда Visual Studio обычно
называет ваши новые файлы WindowJf.xaml (где X представляет число). В ХВАР среда
Visual Studio называет ваши WPF-формы страницами (PageXxaml).
672
Часть V. Создание промышленных приложений
Project types.
Templates
,Ш Framework 3,5
^3"
Visual С*
Windows
Web
Smart Device
Offfce
Database
Reporting
Test
WCF
Workflow
Other Languages
Other Project Types
Test Projects
Visual %/rJin щ«41Ы t£ff pldtti
3 3 Л
Windows
Forms Ap
«SON
J§fl
Windows
Service
Class Librarv WPF
Applicctior
,*c* *c*|
WPF Custom WPF User
Control Lib Ccrrtrcl
My Template*
3
Search
Online Те*,
Г5
WPF Browser
Application
*• ••■
,l£2
Windows
Forms ^
5Я
Console
Application
13
Empty
Project
Windows Presentation Foundation browser application (NET Framework3.5)
Name* UnleashedWpfBiowserApp
Location: C.\Userc\msnell\Document5\Visua» Studio 2008\Projerts
Solution Name: UnleashedWpfBrowserApp
jjj Create directory tor solulton
/ j Add to Source Control
Рис. 17.10. Создание WPF-приложения для браузера
Все эти файлы построены на разных базовых классах. Например, файл окна наследует от
^System. Windows. Window, а файл страницы строится на классе
System.windows.Controls.Page. Конфигурационный файл app.xaml является хорошим
местом для указания той страницы, которая должна быть показана при первом запуске
приложения пользователем. Здесь имеется атрибут startupUri узла Application. Вы
устанавливаете в нем имя стартовой формы вашего приложения, как это показано в следующей
разметке из файла App.xaml:
Application x:Class="WpfBrowserWorkQueue.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Main.xaml">
</Application>
Следующий шаг — создание вашего приложения WPF точно так же, как и любого другого
приложения. Однако надо обратить пристальное внимание на ограничения "песочницы
безопасности", в которой будет работать ваше приложение (см. далее). Для компоновки
вашего пользовательского интерфейса вы можете использовать множество элементов
управления WPF, в т. ч. меню, контекстные меню, клавиши быстрого вызова и многое другое.
Вы можете выполнять и отлаживать ваше ХВАР-приложение так же, как и любое другое
.NET-приложение. Просто настройте точки останова и нажмите кнопку Start Debugging
(или Run). При этом произойдет запуск вашего приложения в браузере. На рис. 17.11
показан начальный вариант системы для отслеживания работы справочного стола, которая
работает как WPF-приложение для браузера. Заметьте, что приложение выполняется в IE. Также
обратите внимание и на использование меню, строки состояния, панели инструментов,
контекстных меню и соответствующих функций Windows.
Глава 17. Создание богатых приложений на основе браузера
673
После того как вы будете удовлетворены вашим ХВАР-приложением, вы наверняка
захотите развернуть его для доступа пользователей на Web-сервере. Скоро мы рассмотрим этот
процесс. Однако сначала вам нужно знать о системе безопасности, которая окружает
созданное вами ХВАР-приложение.
CVUsmVnsnelU)«uro*j
'штшшшшшш
] C\Ow»\msnd^«wmer^\Vtfu^Srudieajfl6\Proj«l*UVpf8ro Ч *f X | *й? S*-*<-np 7x itt
U >'£ $ Wpffirowfte^MkQtieutubap
F«fe but V.** Hctp
1U S—CZZZZI4.
g3 w <Й№ * L- j4 P»9« ** £| Tools ч
•* \iVorfc Queue
C'rticai A)
Support imiff D)
Security issue C)
Feature request (8)
С osed, to be venf ed A1)
New, to be tnaged f2)
* Sucpo't Personnel
MaryC2)
;aso*i @)
Jane @)
Richard E)
William A*
' Knovvledqe Base
FAQs
User Mumjah
Troubfeshoottiig tips
Pncr requests
Ready
Unassigned Support Issues D)
titer Phone Srotfl
ism* 123-123-1234 jsmttHflcontosc coir
iyi|I.U«UlH«UL«.lll.l.lil.,IJ.U..U.l.n
(powers 123-123-1234 lpowers©contosoc<
гите'! 123-123-1234 nrtsnel Я>соп*о$о coi
Date
6/18/2008
Tftlft
App not responding
Assign item
broad User |\
Close Item
Re-classify
\ flickering
too slc»v
Tred vO log in;o my email this rrorn ng and the соп-puter froze
ft Ccmputer | Protected Mode- Off
Рис. 17.11. Приложение WPF ХВАР, работающее в браузере
Соображения безопасности
WPF-приложение для браузера инсталлируется с Web-сервера. По умолчанию приложения с
Web-серверов доверием не пользуются (и не должны). Доверие в данном случае относится к
соглашению между приложением и пользователем относительно компьютера пользователя
и его устройств. Например, вы не должны позволять приложениям из Интернета иметь
доступ к вашей файловой системе. Поэтому WPF-приложения для браузеров выполняются в
так называемой "песочнице".
Эта "песочница" управляется системой безопасности вашего браузера. По умолчанию
ХВАР-приложение выполняется в так называемой интернет-зоне. Это зона с низким
доверием и с высокими требованиями к безопасности. На рис. 17.12 показана интернет-зона с
точки зрения Internet Explorer. Таким образом, ХВАР имеет такие же права, как и любое
приложение, происходящее из Интернета.
Нажатие показанной на рис. 17.12 кнопки Custom level выдает диалоговое окно Security
Settings для данной зоны. ХВАР-приложения имеют собственные базовые настройки. Они
выделены на рис. 17.13. Вы можете отключить ХВАР-приложения или задать пользователю вопрос
перед их выполнением. По умолчанию они включены для интернет-зоны в Internet Explorer.
674
Часть V. Создание промышленных приложений
'General Security Privacy j Content j Come;: bona j Programs j Advanced
Select a zone to view or change secuirty settings,
О
ГКЯ Local intranet Trusted sites Restricted
sites
H
This zone is fbr Internet websites,
except those fcsted in trusted and
restricted zones.
Secui ity level for this zone
Allowed levels for the zone. Medium to High
Medium-high
Appropriate fbr most webates
l— • Prompts before downloading potentially unsafe
' content
- Unagned ActiveX controls vu1 not be downloaded
j/. Enable Protected Mode (requres restartng Internet Explorer)
[ Custom leveL.. ] [V*.*'*. J
Reset afl zones to default ievd
Рис. 17.12. Интернет-зона в Internet Explorer
Security Setting; - Intenwt2x>rte
Htt
Setfangs
«£ Loose XAML
( i Disable
(Sr Enable
Г? Prompt
^ XAML browser applications
! Disable
<к Enable
Prompt
J* VPS documents
\ t usable
;»* Enable
U Prompt
^ Г<ЕТ Frame^o'-k-reliant components
^ Permissions for components лчЙ1 manifests
Takes effect after you restart Internet Explorer
Reset custom settings
R«et to- [MedKjm-htgh {default} ^1
Cancel
Рис. 17.13. Настройки системы безопасности для ХВАР-приложений
Когда вы выполняете (или отлаживаете) ваше ХВАР-приложение и оно пытается выйти за
пределы песочницы, то возникает исключительное состояние системы безопасности.
Пользователь увидит сообщение вроде показанного,на рис. 17.14.
Глава 17. Создание богатых приложений на основе браузера
675
^Щц^ёуЬар Щ^^^^^^|
К^
£, http.//l««»»o$t/MyWebSfte/Wpf8rav»e(WoffcQu«uejcb«p
^ f •*■ 111 ~'*~«СГ^'£ГСГ>'«.?е£? tv'^'v <^ ^
~» <& i^http;//loc»thost'MyWfrbSitftAWpfBrc%¥»etWorkQ...
£1 • Ш « в» ^ ." р*з« '
liust Not Granted
If -1 app cation ca vjot be ctep-oyc<J t?f csu&p t
* ret trusted and pesj Dly<- nsafe
Cpeo Егтзг tog
Trusted sites | Protected Mode- Off
Рис. 17.14. Сообщение "Trust Not Granted"
Возможности вашего ХВАР определяются зоной, в которой оно находится. Для интернет-
зоны это означает, что вам нужно при создании вашего приложения избегать всего
нижеследующего:
□ удаленного выполнения;
□ приватного отражения;
□ доступа к драйверам устройств (вроде принтеров);
□ доступа к реестру;
□ взаимодействия с другим кодом (не платформы .NET);
□ вызовов сервисов WCF (HTTP и вызовы Web-сервисов разрешаются);
□ доступа к файловой системе (вы можете написать безопасную отправку данных вроде
отправки Web-страницы; кроме того, на клиенте имеется изолированное хранилище).
Если вам нужен доступ к любому из этих элементов, то лучше рассмотреть возможность
использования других стратегий развертывания. Например, вы можете перейти к
использованию WPF-приложения, которое развертывается при помощи браузера (и ClickOnce), но
инсталлируется на компьютере пользователя (а не просто работает в браузере). Таким
образом, ехе-файл будет скопирован на компьютер пользователя и инсталлирован как
обладающий доверием (с доступом к только что перечисленным элементам).
Однако необходимо отметить, что можно выполнять ХВАР-приложение в браузере и при
полном доверии. Это означает выдачу вашему приложению прав для зоны Local Intranet.
Пользователь получит предупреждение, но после его подтверждения приложение получит
полный доступ из браузера к компьютеру пользователя. В общем случае этого следует избе-
676
Часть V. Создание промышленных приложений
гать (для соблюдения лучших практик по безопасности). Если же вы это используете, то
следует ограничить это интранет-приложениями.
Вы можете использовать окно свойств Properties для управления безопасностью вашего
WPF-приложения. Для этого надо щелкнуть правой кнопкой мыши по проекту и выбрать
пункт Properties. При этом в Visual Studio 2008 появится редактор свойств. На рис. 17.15
показана вкладка Security этого окна. Обратите внимание, что вы можете переключиться
между полным доверием (самостоятельное приложение WPF) и частичным доверием (ХВАР).
Вы можете также указать зону, в которой приложение будет выполняться по умолчанию.
<& WjMBfow*<HWorfe$w> ШДО50П У&Ш Sfrtfifc
1^<Ш S3 Г
File Edit View Project Build Debug Data Tools Test Window. Help
Л'-И'-/У£ ^ * Л ■** ' * " £Ь ^ ► D'kmg^ , Any CPU
fcjj WpfBro¥rarWiHlcQueMc>*ytoOT*4roJU&.<Mutbmntf i
m
Application
Build
Build Evenfe
Debug
Resources
Services
Settings
Reference Paths
Signing
Security'
PubVh
Specify thecode access security permissions that усь г Cite kCrtce application requires in order to run
^ear ■> mqre асю n ~ati» access >ec jr rv
"</} Enable СИсЮпсе Security Settings
This « a full trust application
O. Thrsts a partial trust application
CiicfcQnce Security Permissions
Zone your application will be instated from:
Internet ▼
Permissions required by the application:
Permission
FileDialogPermission
FilelOPermisston
Setting
(Zone Ddeurt)
(Zone Defaurt)
(Lant Default)
*
-
▼
Includec
a
1 j ^ErcrList
Ready
Рис. 17.15. Вкладка Security для WPF-приложения для браузера
Безопасность и навигация по сайту
Вы должны знать о том, как работает навигация по контенту в вашем приложении, а также
по Web-сайтам и вашему приложению. Каждый вариант имеет свои ограничения по
безопасности.
Во-первых, безопасностью навигации приложения называются настройки безопасности,
применяемые при навигации вашего приложения от одной страницы (xaml-файла) к другой.
Такой тип навигации дозволяется без дополнительных требований к безопасности.
Например, вы можете создать новую xaml-страницу и перейти на нее в коде:
Раде2 р = new Раде2();
this.NavigationService.Navigate(p);
Вы могли бы написать код подобного типа в ответ на такое действие пользователя, как
выбор пункта меню или нажатие клавиши. Либо вы могли бы использовать элемент
Глава 17. Создание богатых приложений на основе браузера
677
Hyperlink для того, чтобы дать пользователям некое подобие Web-навигации при
перемещении между страницами вашего сайта. Вот пример разметки:
<Hyperlink NavigateUri="Main.xaml">
Back to Main
</Hyperlink>
Другой тип безопасности навигации называется безопасностью навигации браузера. Это
относится к навигации, которая происходит между Web-сайтом и вашим приложением.
Такой тип навигации дозволяется при условии, что она была инициирована пользователем
через гиперссылку на Web-сайте или в вашем WPF-приложении. В этом случае контент, на
который указывает ссылка, должен находиться в той же самой зоне.
Развертывание WPF-приложения для браузера
Пользователи получают доступ к WPF-приложениям для браузера из своего Web-
браузера. Поэтому вы должны развертывать их на Web-сервере IIS. Затем вы можете дать
гиперссылку на ХВАР из стандартного HTML или страницы ASP.NET. После этого
приложение будет инсталлировано в браузере при помощи ClickOnce. Вот список шагов
процесса развертывания:
1. Когда вы будете готовы к развертыванию, то первым шагом нужно выполнить сборку
вашего приложения. При этом обычно нужно указать состояние сборки Release (для
того, чтобы не включать без нужды отладочный код).
о From s vVeb »<tt
Specrfy the UPL
hUp//|ocalhost/THvWebSite'' | &*Qw$e
From a UNC path or file share
From a CD-ROM or DVD-ROM
•• Pre*!*»» i Next > j Finush Certcd
Рис. 17.16. Мастер Publish Wizard в Visual Studio
2. После сборки приложения вы должны увидеть несколько файлов вашего приложения в
каталоге bin\release. Эти файлы представляют собой то, что вам надо развернуть. Однако
вы не можете просто скопировать эти файлы на ваш Web-сервер. Вам нужен файл раз-
678
Часть V. Создание промышленных приложений
вертывания. Для получения этого файла вам следует запустить в Visual Studio мастер
Publish Wizard, доступ к которому вы можете получить через меню Build | Publish.
Первый шаг данного мастера— это указание каталога, в котором вы хотите
опубликовать свое приложение. Пока оставьте его как publishV При этом в вашем приложении
будет создан каталог и в него будут помещены все необходимые файлы. После этого вы
можете скопировать его на ваш Web-сервер. Следующий шаг этого мастера — указать,
как пользователи будут инсталлировать приложение. Здесь важно указать From a Web
Site. Пример показан на рис. 17.16. Последующие шаги для ХВАР-приложений не имеют
значения; просто нажмите кнопку Next, а затем Finish.
3. Затем перейдите в каталог, созданный на предыдущем шаге (...\publish) для того, чтобы
посмотреть на его содержимое. В этом каталоге вы увидите несколько файлов и каталог,
содержащий другие файлы. Вот их описание.
• Publish.htm — это HTML-файл, который содержит гиперссылку для инсталляции
вашего приложения. Вы можете использовать этот файл для тестирования публикации
вашего приложения. Однако развертывать этот файл обычно не нужно. Пример файла
показан на рис. 17.17.
^Щ^т^т^^^г\^^^-^Ы(т9ЬШШЬ^^т<х ''^^^^^»:^^^Ш^^^ш,
CjS^jL' \'<& С\Wsenftmsn^Docwnesnt$W«uelStudio2008\Prpj«cts\Wp*8rDw« ▼[**I^,Ж"**.**?!.'^?.?..^..
П7
I
>U lS WpIBrowfcrtVcrkQufcUe i & ' У "* '*** * „
^^^31Щ
WpfBrowserWorkQueu
Name. VVp^rowserWorkQueue
Version. 1.0 0.0
Publisher
Rur i
ffiffiWiMMilM»^^
|PiPNPPr<w
%(lll A
$1 Computer | Protected Mode Off
vtX31СЁ!! 1ш|3ш|
* Pag* ▼ ;,^- Tooli ▼
j
Рис. 17.17. HTML-страница для запуска вашего ХВАР
AppIicationName.xbap— этот файл называется файлом манифеста ХВАР, причем
здесь ApplicationName — это имя вашего проекта Visual Studio. Данный файл
используется для развертывания вашего ХВАР-приложения. Для ссылки на этот файл вы
создаете Web-страницу (аналогичную publish.htm). После этого IIS передает его в
ClickOnce для инсталляции приложения.
Глава 17. Создание богатых приложений на основе браузера
679
• Application F\\es\ApplicationName_version\ApplicationName.dep\oy — это файл
развертывания для ClickOnce. Этот файл содержит ваш ехе-файл.
• Application F'i\es\ApplicationNamejversion\ApplicationName.man'\fest — это файл
манифеста для вашего приложения, он содержит метаданные вашего приложения.
4. Следующий шаг— создание страницы ASP.NET или HTML для инициирования
инсталляции пользователем. Здесь важно то, что страница содержит гиперссылку на xbap-файл.
Вот пример:
<а href="WpfBrowserWorkQueue.xbap">Launch the Work Tracking System</a>
5. Следующий шаг— убедиться, что IIS настроен правильно. Если у вас уже используется
версия 1IS 7, то ничего делать не надо. Однако если вы используете более старую версию
IIS, то вам нужно зарегистрировать типы MIME в IIS (как показано в табл. 17.4). На
рис. 17.18 представлен пример добавления типов MIME в IIS.
Таблица 17.4. Требуемые для ХВАР типы MIME
Расширение файла
application
deploy
manifest
xaml
bap
xps
Тип MIME
application/x-ms-application
application/octet-stream
application/manifest
application/xaml+xml
application/x-ms-xbap
application/vnd ms-xpsdocument
€Ь% « $ ► LAPTOP00288 » Web Sites ► Default Web Site ► MyWebSrte ►
File View Help
ittMWMKttom
ij LAPTOP00288 (CELDOMi
,JSf Application Pools
i *i Web Sites
л Ф Default Web Bite
aspnet_client
Jf MyWebSite
SI MIME Types
ill JE.
4 #-
Use this feature to manage the list of file name extensions and
associated content types that are served as static files by the Web
server
6rcup<
ml4
mlv
,m3u
man ]
man iff!
map I
jndp ]
me )
mht
mhtmt
mtd
midi
.mix
l^irtrririirf t rtiiiiij^mrmrriiijiiiiiiiiiiiiiiiii
Add tofttPTfli» lll1ltiig|IM
FtleName Extension
J manifest
1 MIME Type,
9 applicatiaryx-ms-manrfest
' °*
message/rfcfJ22
audio'mid
audio/mid
applicabon/octet -stream
'if
Ы&^Е1шИ
1
Cancel j |
, t „i i t j Features View * Content View
Configuration' 'l&calhost' applicationHert conf ig or rcot «>>eb.config, < location path= 'Default Web Srte/MyWebSrte >
Рис. 17.18. Добавление типов MIME в IIS
680
Часть V. Создание промышленных приложений
6. Следующая задача — убедиться, что вы создали Web-сайт для вашего приложения. Это
можно сделать при помощи создания виртуального каталога в I1S.
У •'"* &* jg^UntrtJerfPage
iH Untitled Page -Wndtowiinte^t
К J\ * * 8 £, http;//lo<BlhostMyWebSfce/
.v^ ^^js.^ -
fa тшш
Ш *• **> " и* р*«*" <i Ti»Qfe"
Work Queue Tracking System
Welcome to the Work Queue Tracking System Thts application is designed for the help desk to track and
manage user help-desk requests. To get started with the application simply click the link beJcw.
Launch tne УУогк Tracking System
from Visual Stuido 2008 Unleashed
Trusted s*es | Protected Mode Oft
*HQ0%
Рис. 17.19. Страница запуска для ХВАР-приложения
|£, rmp://t«ilho5t'MyV*'ebSrte/WpfBrow«WorkQuewejlb4|)
mm
U <U J ^ htt^'/IOcelbosVMyWcbStoWpiefwmoV/orltq...
File Ш View Help
*Л " E * «P • d"p«9« * ^Toote ^
У Search [
* Лек Q<jeu«
j Critcs!{i)
Support if f u« D)
Security issue C)
j Feetjre request (ci
Closed, tobeverrfed(ll)
I New to be fringed B)
i * Si.ifortPdiiiinr1
Mary B)
. Jasor @1
1 )are (C)
; Richard E)
William A)
* Kncwled je !>ase
FAQs
Lsei Manuals
Troufa «hootirg tos
Pnoi 'equests
Ready
Unassigned Support Issues D)
ЬМЙ (fete TM*
limith 123-123 1234 jsrr th$cor!Gso.coTi 6/12/2008 App net responding
(powers 123-123-1234 IpowersQcontosc com 6/4/200B Vwi'tor flickering
mine*! 123-123-^234 rrs^ellScontosocom ' 6/21'2008 Mouse too slew
Notes
Tned te log irto my e-iail thi: morning and the compute' *rore
/ Trusted sites | Protected Mode- Off
Рис. 17.20. ХВАР-приложение, развернутое с Web-сервера
Глава 17. Создание богатых приложений на основе браузера
681
7. Конечно же, созданный вами на предыдущем шаге виртуальный каталог соответствует
физическому каталогу (обычно это C\metpub\wwwroot\SiteName\). Вам нужно перейти
обратно в каталог публикации, скопировать оттуда файлы и вставить их в физический
каталог для виртуального каталога вашего Web-сайта. Вам нужно также вставить ваш
HTML-файл (default.htm) в этот же самый каталог.
Все, что осталось сделать, — это запустить ваше приложение в браузере. Когда вы это
сделаете, вы должны будете получить файл по умолчанию для сайта (обычно это default.htm для
default.aspx). На рис. 17.19 показана страница запуска по адресу: http://localhost/IVIyWebSite/.
Нажатие гиперссылки в центре страницы приведет к инсталляции WPF-приложения в
браузере пользователя (индикатор состояния процесса обеспечивается ClickOnce). На рис. 17.20
показано приложение, которое развернуто с этого URL и выполняется.
Кросс-платформенные интерактивные среды
Фирма Microsoft работает над тем, чтобы помочь разработчикам и дизайнерам создавать в
Web-браузерах гораздо более богатые среды (аналогичные WPF), чем традиционные
решения на базе ASP.NET, сайтов HTML или даже JavaScript. Эта новая технология называется
Silverlight. С ее помощью вы можете создавать богатые мультимедийные сайты, которые
содержат интерактивные игры, новые возможности для покупок, интерактивное обучение, а
также видео и аудио. Она была создана для того, чтобы позволить вам создавать
действительно богатые и действительно уникальные пользовательские среды для работы в сети.
Поскольку Microsoft Silverlight нацелена на Интернет, то она была создана для работы на
разных платформах и с различными браузерами. Это означает, что она работает и под
операционной системой Мае, и под Windows XP/Vista (сообщество разработчиков даже ведет
проект под Linux). Кроме того, она работает со всеми современными браузерами, включая
IE 6 и 7, Firefox 2 и Safari. Во всех случаях она является дополнительным модулем браузера.
Дополнительный модуль Silverlight запускает мини-версию .NET Framework. Таким
образом, ваша среда разработки аналогична среде .NET. При этом наличия .NET Framework на
компьютере не требуется. Все, что требуется, имеется в дополнительном модуле.
Вы можете писать приложения Silverlight аналогично тому, как вы пишете WPF-
приложения. Пользовательский интерфейс создается при помощи XAML-разметки, а
выделенный код пишется на С# или VB. Вы можете также использовать AJAX, Python или Ruby
(и прочие) для работы с элементами управления Silverlight внутри Web-сайта. В этом
разделе мы напишем простое приложение Silverlight. Затем мы встроим это приложение как часть
Web-сайта. Давайте же начнем.
Начинаем работать с Silverlight
Первая версия Silverlight уже выпущена, однако инструменты пока еще отстают. Это
означает, что в Visual Studio 2008 нет встроенной поддержки Silverlight. На начало 2008 года
существовали альфа- и бета-версии новой исполняющей среды и набора инструментов
Silverlight. Здесь мы будем обсуждать то, что есть в наличии. Эти элементы также служат
основой содержимого данного раздела. Когда вы будете готовы приступить, то сможете
проверить наличие новых версий.
682
Часть V. Создание промышленных приложений
Ваш первый шаг в построении приложений Silverlight состоит в настройке вашей среды
разработки. Последние версии инструментов для дизайна и разработки лучше всего искать по
адресу: http://www.silverlight.net. На этом сайте вы найдете ссылки для скачивания
последних версий исполняющей среды, инструментов конструирования, шаблонов разработки и
инструментальных наборов для разработки программного обеспечения (SDK). В примерах
данной книги это следующий набор инструментов:
□ Microsoft Silverlight 1.1 Alpha September Refresh — это альфа-версия новой A.1)
исполняющей среды Silverlight. Эта исполняющая среда требуется для использования
инструментов Tools Alpha для Visual Studio 2008;
□ Microsoft Silverlight 1.1 Tools Alpha for Visual Studio 2008— это альфа-версия
инструментов Silverlight для Visual Studio. Здесь имеются шаблоны проектов и
соответствующая поддержка отладчика;
□ Microsoft ASP.NET Futures (июль 2007)— представляет собой набор элементов
управления ASP.NET на базе Silverlight, которые вы можете встроить в ваш Web-сайт;
□ Microsoft Silverlight 1.1 Software Development Kit Alpha September Refresh— это
инструментальный набор (SDK) для разработки приложений Silverlight;
□ Expression Blend 2.0 — этот инструмент предоставляет дизайнерскую поддержку для
создания приложений Silverlight и WPF. Предназначен для дизайнеров. Существует
также и версия 1.0. Однако для создания приложений Silverlight необходима версия 2.0.
Примечание
Не все эти инструменты являются окончательными версиями продуктов. Они могут
стать ими к тому времени, как вы будете читать это примечание, в таком случае вы
можете его просто пропустить Однако на момент написания эти продуты являются
ранними версиями, которые содержат ошибки. Они не являются такими отлаженными
инструментами, к использованию которых вы, возможно, привыкли. Поэтому вам
потребуется терпение для того, чтобы заставить их работать.
Для проработки последующих страниц вам потребуется скачать и инсталлировать все
элементы предыдущего списка. Это несложно и не должно вызвать у вас серьезных затруднений.
Создание приложения Silverlight
Важно отметить, что существует множество способов использования Silverlight. Вы можете
создать полноценное приложение Silverlight. В этом случае приложение запускается внутри
Web-браузера и выполняется независимо. Либо вы можете создать Web-страницу, в
которую Silverlight встроен как часть страницы. Так может быть сделано ради видео или для
использования элемента управления Silverlight. Мы опишем оба варианта. В этом разделе мы
сосредоточимся на создании приложения Silverlight.
Определение нового проекта Silverlight
Ваш первый шаг в создании приложения Silverlight— это создание проекта Silverlight.
В предыдущих главах мы обсудили способы взаимодействия разработчика и дизайнера,
которые теперь стали возможными при помощи Visual Studio и продуктов линейки
Expression. Silverlight является частью этого взаимодействия. Поэтому вы можете начать
ваш проект Silverlight в том инструменте, который больше подходит для вашей ситуации:
Глава 17 Создание богатых приложений на основе браузера
683
Silverlight в том инструменте, который больше подходит для вашей ситуации: Visual Studio
2008 или Expression Blend 2.
В Visual Studio 2008 вы просто следуете стандартному варианту: меню File | New Project.
Если вы инсталлировали все из предыдущего раздела, то должны увидеть узел Silverlight в
диалоговом окне New Project (как для VB, так и для С#). Пример показан на рис. 17.21.
Здесь вы можете выбрать Silverlight Project для создания приложения, либо Silverlight
Class Library для создания элементауправления или другой библиотеки для использования
в приложении Silverlight.
Ь Project types Templates j .NET Ft»mtvtork 3,5
Visual C*
Web
Smart Device
Office
Database
Reporting
Silveilight
ТеЛ
vVCF
Worieflc*
OtherLanguages
Other Project Types
Test Projects
Vibinl 4udin initiiled template
53 Sil
Silver light Silverlight
Project Class Library
i My Tenplates
Я
Search
i Online Те
|i A project foi creating a Silveitight assembly which uses WPF/t < NET Framewoji 3 5»)
I Name: MySilverlightProject2
I Location :жта!ШВт1ша^М!»2ша8
I
I Solution Create new Solution »• /j Create director/for solution
1 Solution Name: MySilverhghlProjecti ' ] Add to Source Control
Рис. 17.21. Создание проекта Silverlight
Expression Blend также имеет шаблон проекта Silverlight, который работает как с VB, так и с
С#. Здесь вы можете создать новый проект или использовать Expression Blend для того,
чтобы открыть созданный вами в Visual Studio проект (или xaml-файлы). Для создания нового
проекта в Expression Blend опять используйте меню File | New Project. При этом вы
получите диалоговое окно New Project (рис. 17.22). Обратите внимание, что вы можете
использовать эту версию инструмента для создания как приложений Silverlight I.0, так и приложений
Visual Studio 2008 (Orcas), предназначенных для более новой версии Silverlight (на
рисунке— l.l, но к тому времени, как вы будете это читать, уже должна быть выпущена версия
2.0). Обратите также внимание, что вы можете выбрать С# или VB.
Шаблоны проекта, которые создаются этими двумя инструментами, очень похожи. Они оба
создают файл решения и файл проекта. Они оба ссылаются на один и тот же набор
библиотек Silverlight. Кроме того, они оба включают в себя файл Silverlight.js, который содержит
JavaScript для работы с вашим приложением Silverlight. И они оба имеют файл Page.xaml
как стартовую точку, а также HTML-файл для запуска файла Page.xaml. На рис. 17.23
показаны одновременно оба шаблона проекта.
23 3ак 3716
684
Часть V. Создание промышленных приложений
Рис. 17.22. Создание нового проекта Silverlight в Expression Blend 2
Рис. 17.23. Шаблоны проекта Silverlight
в Visual Studio 2008 и Expression Blend 2
Создание приложения
При создании вашего приложения используйте xaml-файл разметки для написания вашего
интерфейса пользователя и вносите весь необходимый код в файл выделенного кода. Этот
процесс должен быть вам хорошо знаком. Однако в текущей версии инструментов Visual
Studio не имеет визуального конструктора для Silverlight XAML. Это означает, что нет ни
элементов управления в панели инструментов Toolbox, ни редактора в режиме WYSIWYG.
Глава 17. Создание богатых приложений на основе браузера
685
Вместо всего этого в редакторе есть технология IntelliSense. Хорошая новость состоит в
том, что Expression Blend имеет визуальный конструктор.
Конечно, мы начнем в Visual Studio. В этом примере мы создадим простое приложение в
виде слайд-шоу. Оно позволяет пользователю при помощи Silverlight пролистывать набор
изображений вперед и назад. При этом изображения просто визуализируются (без
обновлений страниц). Для создания этого приложения выполните следующие шаги:
1. Сначала создайте новый проект (как описано в предыдущем разделе).
2. Внутри файла Page.xaml добавьте три элемента TextBlock и элемент Image. Эти три
элемента TextBlock будут представлять собой заголовок, а также ссылки на предыдущее и
последующее изображение. Элемент Image должен представлять изображения для
слайд-шоу. В листинге 17.1 показано то, как должен выглядеть ваш XAML.
\ Листинг 17.1. Разметка пользовательского интерфейса ш файле PagejtamI
<Canvas x:Name="parentCanvas"
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Loaded="Page_Loadeci"
x: Class="MySilverlightProj ect2.Page;assembly=ClientBin/MySilverlightProj ect2.d
11"
Width=00"
Height=00"
Background="White">
<TextBlock x:Name="Title" Text="Image Slide Show" FontSize=n18"
Canvas.Left=0" Canvas.Top=0"x/TextBlock>
<Image x:Name="SlideImage" Source="" Canvas.Left=0" Canvas.Top=5"
Height=50"x/Image>
<TextBlock x:Name="Previous" Text="\\ Previous" FontSize=2"
Canvas. Left=" 10" Canvas .Top=00"x/TextBlock>
<TextBlock x:Name="Next" Text="Next //" FontSize=2"
Canvas.Left=50" Canvas.Top=00"x/TextBlock>
</Canvas>
3. Для данного примера мы будем использовать изображения, которые поставляются в
комплекте с Windows. В операционной системе Vista их можно найти в каталоге Sample
Pictures. Создайте в вашем решении каталог изображений и скопируйте эти изображения
в данный каталог.
686
Часть V. Создание промышленных приложений
4. Затем добавьте обработчики событий, которые реагируют на нажатие пользователем
элементов Next и Previous. В XAML добавьте соответствующий атрибут для каждого
элемента TextBlock:
<TextBlock x:Name="Previous"
MouseLeftButtonDown="Previous_MouseLeftButtonDown" ...
<TextBlock x:Name="Next"
MouseLeftButtonDown="Next_MouseLeftButtonDown" ...
5. Теперь мы добавим код в файл выделенного кода для реакции на эти события. На уровне
класса мы будем отслеживать изображения в строковом массиве, а также индекс
выбранного изображения. Мы проинициализируем первое изображение при загрузке
страницы и при каждом событии TextBlock будем менять изображение. В листинге 17.2
показан код, который необходимо для этого написать.
\ Листинг 17.2. Выделенный код Page.xaml i
Li iiii uA У„, iiii iiiiii.U <„<„.«*.« uAKiiXiiiiiiiitiiiiViiiii iiii^vWwwii^tttoii™^^^ ,.i.t,..™flh«>..#iS
using Systems-
using System.Windows;
using System.Windows.Controls;
using Systern.Windows.Documents;
using Systern.Windows.Ink;
using System.Windows.Input;
using Systern.Windows.Media;
us ing Systern.Windows.Media.Animation;
using Systern.Windows.Shapes;
namespace MySilverlightProject2 {
public partial class Page : Canvas {
// Список изображений
string[] _images = new string[] {"Autumn Leaves.jpg", "Creek.jpg",
"Desert Landscape.jpg", "Dock.jpg", "Forest Flowers.jpg",
"Forest.jpg" };
// Используется для отслеживания текущего выбранного изображения
int _selectedlndex = 0;
public void Page_Loaded(object o, EventArgs e) {
// Необходимо для инициализации переменных
InitializeComponent();
// Установить начальное изображение
SetUri();
}
Глава 17. Создание богатых приложений на основе браузера
687
void Previous_MouseLeftButtonDown(object sender, MouseEventArgs e)
// Проверить предыдущее значение
if (_selectedlndex -1 >= 0) {
_selectedlndex = _selectedlndex - 1;
}
// Перейти к предыдущему изображению в списке
SetUri();
void Next_MouseLeftButtonDown(object sender, MouseEventArgs e) {
// Проверить следующее значение
if (_selectedlndex + 1 < _images.GetLength@)) {
_selectedlndex = _selectedlndex + 1;
}
// Перейти к следующему изображению в списке
SetUri () ;
private void SetUri() {
Uri u = new Uri("images/" + _images[_selectedlndex], UriKind.Relative);
Slidelmage.Source = u;
3?\'F\
f\ W Ф !$Stfvedigbt Project Test Page
$$ Siiverfigbt Project Tetf Page - Wndowsfoternet Explorer
{_}{>} * | '& С \Uier$\m$ndB4Do«urnenis\Vtsuel Studio 20u8\Project^MySSK'«rlig: »j •** x lu* sl**?^ z-wiais r/>«JV P ▼ Ц
Г»* *■ E3 "* W * Ы P*9* w \$ Toot* *
Image Slide Show
^ Internet! Pfotccteci Mod*. On
^100% - |
Рис. 17.24. Пример Silverlight, работающий в браузере
688
Часть V. Создание промышленных приложений
6. Запустите приложение для того, чтобы увидеть, как оно работает в вашем браузере.
Обратите внимание, что вы можете установить точки останова в файле выделенного кода и
отладить ваше приложение точно так же, как и любое другое. На рис. 17.24 показан
пример приложения, выполняющегося в IE.
7. Когда вы создавали файл Page.xaml, то вы были ограничены визуальным конструктором
Visual Studio. Вспомните, что взаимодействие между дизайнером и разработчиком
состоит в том, что дизайнер оформляет приложение, а разработчик выполняет разработку.
Теперь вы можете передать xaml-файл дизайнеру для "наведения красоты".
На этом шаге вы сами будете играть роль дизайнера. Вы можете щелкнуть правой
кнопкой мыши по xaml-файлу в Visual Studio для того, чтобы открыть его в Expression Blend
2. На рис. 17.25 показан пример этого процесса.
**»**^
File Edit View Project Build Debug Data Tools Test Window Help
щ
~-J
PaoajamL«| PjfflffltHlif
*J MySilverlightProject2 Page ▼ #*_setect«dlndeK
'■ ua^ng Syatsn.iiindova.Shapes;
11<| naeeapace My3llvezlio;ntPxoject2 {
1-Й public partial class 5&з« : feivss {
/l.s'- '."Г LwjH*
string[] _iaages - new string!) {"Autusn Ь
""jsrd zz zz&zk •-JTrt'nti/ selected imag»
lrt _selectedladex - 0;
puDiic void Page_Loeded(object o, l,fiz*'j
/' f-quired *c liiidalixe viriaX'iej*
InitializeCanponent<);
//S«t aUif. jZbbQt
SetUriO;
-1*1
i M.-4i4*T^frRn-trnT>r»wri lnhi»rr '
^3 Solution 'MySrfverlightPioject2' A project)
4 43 My$ft»*fightPrejert2
Ш Oi Properties
tli [*Э References
i+j L3 images
® Ca video
щ н»«кНЯВ5Яа _
£] CJ | Open
a 4
Ш
;
*
-u
X
, s<^
^Solution. IUI||I
Open With...
"
Open in Expression Blend
View Cede
^
Exclude From Project
Run Custom Tool
Cut
Copy
Delete
Rename
Properties
'" T» """
1 И"* »'"
icT|
jjj Ere f List
Ready
Рис. 17.25. Загрузка xaml-файла в Expression Blend из Visual Studio
На рис. 17.26 показан файл Page.xaml, открытый в Expression Blend. Обратите внимание,
что открыт весь проект. Это позволяет дизайнеру выполнить приложение (для того
чтобы увидеть результаты изменений). Обратите также внимание на совмещенное
представление разметки и визуального конструктора.
8. Теперь вы можете использовать инструменты визуального конструктора для изменения
разметки XAML. Выберите элемент в визуальном конструкторе и щелкните по панели
Properties (вверху справа). Здесь вы можете манипулировать цветом, шрифтами,
визуализацией и т. д. Вы можете также при помощи визуального конструктора
позиционировать элементы относительно границ и друг друга.
На рис. 17.27 показан пример. Здесь мы изменили заголовок TextBlock так, чтобы он
отображался под углом, имел градиентную заливку и накладывался на изображения.
Обратите также внимание на следующий и предыдущий элементы TextBlock. Они также
Глава 17. Создание богатых приложений на основе браузера
689
накладываются на изображения. Для случаев нависания над ними мы настроили курсор в
виде руки. Все это было настроено при помощи панели Properties.
Рис. 17.26. Разметка Silverlight внутри Expression Blend
V«Hp Show
4Te>tSlcck forejrounr>
.if U.t.-ft 5,1"
«iradicr.t&tip . >l »*«F*eEiD*3"
Рис. 17.27. Переделанная разметка Silverlight внутри Expression Blend
690
Часть V. Создание промышленных приложений
Сохраните файл и закройте Expression Blend. Вернитесь в Visual Studio, и она должна
будет соответственно обновить вашу разметку. Новая разметка должна выглядеть вроде
показанной в листинге 17.3.
<Canvas x:Name="parentCanvas"
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Loaded="Page_Loaded"
x:Class="MySilverlightProject2.Page;
assembly=ClientBin/MySilverlightProject2.dll"
Width=57"
Height=54"
Background="White">
<Image x:Name="SlideImage" Source="images/Autumn Leaves.jpg"
Width=37" Height=37" Canvas.Left=0" Canvas.Top=4"/>
<TextBlock x:Name=MPrevious" Text="<< Previous" FontSize=4"
Canvas.Left=0" Canvas.Top=00"
MouseLeftButtonDown="Previous_MouseLeftButtonDown"
Foreground="#FFFFFFFF" FontWeight="Bold" Cursor="Hand"x/TextBlock>
<TextBlock x:Name="Next""Text="Next >>" FontSize=4"
Canvas.Left=86.663" Canvas.Top=00"
MouseLeftButtonDown="Next_MouseLeftButtonDown"
Foreground="#FFFFFFFF" FontWeight="Bold" Cursor="Hand"x/TextBlock>
<TextBlock x:Name="Title" Text="Image Slide Show" FontSize=6"
Canvas.Left="l0.385"
Canvas.Top=7.542" RenderTransformOrigin=.5,0.5" Width=51.884"
FontStretch="Expanded" FontStyle="Normal" FontWeight="Bold">
<TextBlock.Foreground>
<LinearGradientBrush EndPoint=.5,1" StartPoint=.5, 0">
<GradientStpp Color="#FF0E2DF8" Offset="/>
<GradientStop Color="#FFFFFFFF" Offset="l"/>
</LinearGradientBrush>
</TextBlock.Foreground>
<TextBlock.RenderTrans form>
<Trans formGroup>
<ScaleTransform ScaleX="l" ScaleY="l"/>
Глава 17. Создание богатых приложений на основе браузера
691
<SkewTransform AngleX=M0" AngleY='7>
<RotateTransform Angle="-7.595"/>
<TranslateTransform X=" Y='7>
</TransformGroup>
</TextBlock.RenderTransform>
</TextBlock>
</Canvas>
И наконец, запустите приложение в Web-браузере. Вы должны получить новый внешний
вид и новое поведение, которое вы определили при помощи Expression Blend. На рис. 17.28
показан пример приложения, выполняющегося в IE.
$$ CAUft^mswftOttumfK&Wisucf Studio2(K»\Proj«i*\MyS»rVerK9 »j *? X I iк « :
V* <& !jj$SllvertigMP«$ertT**P«ge
Slid* Show
$$ Internet | Protected Mode On
Рис. 17.28. Переделанный Silverlight, работающий в Web-браузере
Использование Silverlight на Web-странице
В предыдущем примере вы создали отдельную xaml-страницу, которую можно выполнить в
браузере при помощи дополнительного модуля Silverlight. Этот же самый XAML можно
использовать внутри HTML- или aspx-страницы. Данный раздел проведет вас по процессу
встраивания нашего предыдущего примера в страницу на Web-сайте ASP.NET. Вот шаги
этого процесса:
1. Создайте приложение Website (в меню File | New Project). Вы можете сделать это в том
же самом решении, что и ваше приложение Silverlight. Таким образом, вы сможете их
связать.
692
Часть V. Создание промышленных приложений
*** \^№ф*Рггф&2 Uxmx&k Vtiu^ Stirfb
©' U !
File Edit View Project Build Debug Formrt Took Test Window Help
J'J'Jdl^ 4 J *, ^ ' '' " ; - " — * D*iig - AnyCPU
Ш
DefoutLaspx
X WtiHcn hp-lofir-WebApafitationllirf^hu/- ^ U X
Unking to *SilYert.ght project wllkopy the output of theprojert
to e (Mimed folder In the web
Silverhght project to link:
Output pith in target Weir
<ProjectRoot>
erli9htPrcject2' B projects)
tjceml cs
||htjS
|e html
KptJonSltdeShcw
fa
H&iftg
Ы£
i Л De*gn j =3 Split Я Source |^![<fe^n>»forril>]^div> [► ^Solution Explorer '^Marrc f*r<3ref ij^Pfearrtr |
U>tic»Urt
Reedy Lnl3 Col 5 Ch5
Рис. 17.29. Добавление связи Web-сайта с проектом Silverlight
2. Затем вам нужно создать связь (похожую на ссылку) с вашим приложением Silverlight.
Щелкните правой кнопкой мыши по вашему новому Web-сайту и выберите для этого
Add Silverlight Link. При этом запустится диалоговое окно Add Silverlight Link (рис. 17.29).
Связывание двух проектов укажет компилятору на необходимость перенести изменения
проекта Silverlight в проект Web-сайта. Проекту Web-сайта требуется реальная копия
вашего приложения Silverlight. Если вы их не свяжете, то можете просто скопировать
файлы на Web-сайт.
3. Запуск приложения Silverlight на вашей Web-странице требует наличия на клиентской
стороне небольшого скрипта JavaScript. К счастью, приложение Silverlight имеет весь
необходимый вам код.
Вернемся к решению Silverlight. Обратите внимание на файл Silverlightjs. Он должен
быть скопирован на ваш Web-сайт (об этом должна была позаботиться ссылка). Затем
посмотрите на страницу TestPage.html. Она содержит файл выделенного кода с именем
TestPage.html.js. Внутри него имеется автоматически сгенерированный JavaScript-код,
который загрузит ваш файл Page.xaml при помощи содержимого Silverlight.js. Этот код
показан в листинге 17.4.
Скопируйте этот код. Создайте новый файл в вашем Web-сайте с именем Default.aspx.js
и вставьте в него этот код.
Листинг 17А Функция cr<aatesilv«rlight в скрипте JavaScript
function createSilverlight()
{
Silverlight.createObjectEx({
Глава 17. Создание богатых приложений на основе браузера
693
source: "Page.xaml",
parentElement: document.getElementByld("SilverlightControlHost"),
id: "SilverlightControl",
properties: {
width: 00%",
height: 00%",
version: .1",
enableHtmlAccess: "true"
},
events: {}
});
// Перенести по умолчанию фокус клавиатуры
//на элемент управления Silverlight
document.body.onload = function() {
var SilverlightControl = document.getElementByld('SilverlightControl');
if (SilverlightControl)
SilverlightControl.focus();
}
}
4. Теперь вам нужно связать этот JavaScript-код с вашей Web-страницей (Default.aspx).
Кроме того, вам необходимо определить хост для Silverlight XAML. Для этого добавьте
следующие теги скрипта и стиля тег в раздел <head> вашей разметки: г
<script type="text/javascript" src="Silverlight.js"x/script>
<script type="text/javascript" src="Default.aspx.js"x/script>
<style type="text/css">
.silverlightHost { width: 357px; height: 354px; }
</style>
5. И наконец, вам нужно скомпоновать остальную часть вашей страницы ASP.NET.
Возможно, это будет заголовок, другие элементы управления и т. д.. Однако где-то на
странице вы напишете вызов метода createSilverlight внутри файла Default.aspx.js. Это
укажет то место, куда вы хотите встроить Page.xaml. В листинге 17.5 показан пример
простой разметки (здесь элемент управления Silverlight встраивается внутрь таблицы).
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="Default.aspx.cs"
Inherits="WebApplicationSlideShow._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtmll/DTD/xhtmll-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Headl" runat="server">
694
Часть V. Создание промышленных приложений
<title>My Silverlight Page</title>
<script type="text/javascript" src="Silverlight.js"x/script>
<script type="text/javascript" src="Default.aspx.js"x/script>
<style type="text/css">
.silverlightHost { width: 357px; height: 354px; }
</style>
</head>
<body style="font-family: Verdana; font-size: 12pt">
<form id="forml" runat="server">
<table>
<tr>
<td colspan=">
<div style="font-size: 18pt; color: Blue">
The Slide Show Viewer
</div>
</td>
</tr>
<trxtd colspan="xhr /x/tdx/tr>
<tr>
<td valign="middle">
1 <p>This Silverlight application allows you to traverse
a set of images forward and backward.</p>
<p>Use the buttons at the bottom of the image to move
Next and Previous through the images.</p>
</td>
<td>
<div id="SilverlightControlHost" class="silverlightHost" >
<script type="text/javascript">
createSilverlight();
</script>
</div>
</td>
</tr>
<trxtd colspan="xhr /x/tdx/tr>
<tr>
<td colspan=">
<div style="font-size: 9pt; text-align: right">
from Visual Studio 2008 Unleashed
</div>
</td>
</tr>
</table>
Глава 17. Создание богатых приложений на основе браузера
695
</form>
</body>
</html>
Вот и все. Теперь вы должны запустить Web-сайт и увидеть Silverlight, который встроен в
страницу. Это показано на рис. 17.30.
Щ^Ш
ШШ&ШШтЩШ
|«_ http'/fowfcoitt&»/0*f*ulU*px
И*£Цр&4
» *MXliMSew rny, zt'iby МГЛ
P -
W St ЦМу5йу**И$ДОР«*
^ *■ £3 * m * \s Peg* * Ji Tco»* *
The Slide Show Viewer
p s\H* 4bnW
This Silverlight application allows you to
traverse a set of images forward and
backward.
Use the buttons at the bottom of the image
to move Next and Previous through the
images.
from Visual Studio 2008 Unleashed
,' Trusted sites | Perfected Mode. OR "*ч 100% ▼
Рис. 17.30. Запуск Silverlight-приложения, встроенного в ASP.NET Web-страницу
Резюме
В этой главе мы описали множество новых опций для создания богатых возможностей
взаимодействия с клиентской частью внутри Web-браузера, в т. ч.: создание стандартных
Web-страниц, которые используют AJAX; создание при помощи WPF богатых
пользовательских интерфейсов наподобие Windows внутри Web-браузера, работающего под
управлением Windows; создание кросс-платформенных решений на основе дополнительного
модуля Silverlight для браузера. Какую из них вы будете использовать в своем следующем
приложении — зависит от вашего контента и вашей целевой аудитории. Самый широкий
охват пользователей дает ASP.NET, затем Silverlight и, наконец, WPF. Однако убывание
уровня интерактивного взаимодействия с пользователем идет в обратном порядке: WPF,
Silverlight, а затем AJAX. Вам придется тщательно подумать перед тем, как начинать ваш
следующий проект пользовательского интерфейса на основе браузера. Хорошая нойость
состоит в том, что при помощи этих технологий вы можете обеспечить своим
пользователям новые возможности.
Глава 18
Работа с базами данных
Данная глава о том, как вы можете управлять базами данных и создавать при помощи Visual
Studio 2008 и SQL Server приложения, которые могут работать с данными.
Пять различных инструментов Visual Studio позволяют вам взаимодействовать с базами
данных и помогают создавать приложения, которые используют данные из баз данных:
□ Solution Explorer;
□ Server Explorer;
tl Database Diagram Designer;
□ Table Designer;
□ Query and View Designer.
Эти пять инструментов называются Visual Database Tools (визуальными инструментами баз
данных). Некоторые из этих инструментов мы уже представили вам в главе 5. Теперь у нас
есть возможность исследовать то, как разработчики могут использовать эти инструменты
совместно для создания решений по работе с базами данных.
Мы начнем с изучения того, как при помощи инструментов Visual Database Tools создаются
базы данных и их объекты. После этого мы сможем описать специфику создания
приложений для работы с данными, которые имеют привязанные к данным элементы управления.
Создание таблиц и связей
Основными элементами любой базы данных являются ее таблицы. Таблицы состоят из
структуры и данных. Server Explorer — это инструмент Visual Studio, который
используется для определения (или редактирования) структуры или данных любой таблицы в
подключенной базе данных. Фактически при помощи Server Explorer можно создать новый
экземпляр базы данных SQL Server с нуля.
Глава 18. Работа с базами данных
697
Примечание
Как мы отмечали в главе 5, в версиях Express и Standard интегрированной среды
разработки Visual Studio инструмент Server Explorer называется Database Explorer. Для
простоты мы будем в данной главе всегда называть это окно Server Explorer.
Создание новой базы данных SQL Server
Подключения к данным — это физические подключения к базам данных. В Server Explorer
в узле Data Connections есть список всех установленных подключений к базам данных. Для
запуска процесса создания базы данных щелкните правой кнопкой мыши по узлу Data
Connections и выберите пункт Create New SQL Server Database. В появившемся диалоговом
окне (рис. 18.1) вам будет необходимо указать имя сервера, данные учетной записи, а также
название новой базы данных.
После этого будет незамедлительно создана указанная база данных и добавлено
подключение к этой новой базе данных (в узле Data Connections). На рис. 18.2 показана только что
созданная база данных Contoso, добавленная в список подключений.
Create New SQL Server Database > *-*
„ -
Enter information to connect to a SQL Server
name of a database to create.
Server name
SRV1
Log on to the server
J ф Use ^tfndows Authentication
'} Use SjJL Server Authentication
New database name:
* ContDso
с
__.
c»tl
GJC
then
Tc
- „
i!
шмм
specify the
Refresh
Ctncd
J
г
H
1 г
1
Server explorer
ll ^Л%
i] jj Data Connections
3 ^EEESSSJ
[ .i' Ш Database Diagrams
X u2 Tables
'♦, uJ Views
[ ♦ ^ Stored Procedures
f 'L i-JI Functions
4 ? CA Synonyms
*j Я L3 Types
ft I LJ Assemblies
| щ Щ Servers
4 _ и
В
;|
Рис. 18.1. Создание новой базы данных Рис. 18.2. Новая база данных,
SQL Server добавленная к подключениям данных
Добавление существующей базы данных
Конечно, вы можете также установить подключение и к существующей базе данных. Для
этого опять щелкните правой кнопкой мыши по узлу Data Connections; но на этот раз
выберите пункт Add Connection. Диалоговое окно Add Connection (рис. 18.3) аналогично
диалоговому окну для создания новой базы данных: для подключения к базе данных вы
указываете источник данных, имя сервера, данные учетной записи, а также имя базы данных/имя
файла базы данных.
698
Часть V. Создание промышленных приложений
Ackl Connection ^ж^ииииц^^^^ДИтоГ^
1 Enter information to connect to the selected data
choose в different data source and-'or provider
Data lource-
M icrosoft SQL Server (SqlC Kent)
Server name:
srvl
Log on to the server
&■ Use Windows Authentication
' "■ Use SQL Server Authentication
Connect to a database
Or Select or enter a database name
Courseware
N /■ Attach a database file:
У
1 Jest Connection | |
щи*»»1'-"' I # ^£ЗщИ
source or click "Change' to Щ
j Change... |
- | 8*r«h |
И
'
t("
Advanced...
R
OK | | Cancel j 1;
Рис. 18.3. Подключение к существующей базе данных
Под каждым подключением имеются каталоги для следующих классов объектов баз данных:
□ диаграмм баз данных;
□ таблиц;
□ представлений;
□ хранимых процедур;
□ функций;
□ синонимов;
□ типов;
□ сборок.
Эти каталоги являются стартовой точкой для создания внутри базы данных
соответствующих объектов.
Определение таблиц
Визуальный конструктор Table Designer— это инструмент Visual Studio, который вы
используете для определения или редактирования определения таблицы. В окне Server Explorer
в существующем подключении щелкните правой кнопкой мыши по каталогу Tables и выбе-
Глава 18. Работа с базами данных
699
рите пункт Add New Table. После этого в главной панели документов интегрированной
среды откроется визуальный конструктор Table Designer.
Этот конструктор реализован в табличном виде; в нем вы добавляете строку для каждого
столбца, который вы хотите определить в таблице. Для каждого столбца таблицы вы
указываете имя, тип данных, а также допустимость использования значений типа null. Помимо
табличного интерфейса имеется также еще и окно Properties, которое предоставляет
полный доступ ко всем разнообразным свойствам каждого столбца таблицы (рис. 18.4).
В дополнение к этому Table Designer позволяет вам определить столбец или группу
столбцов в качестве первичного ключа для таблицы (или как часть индекса).
\** ContosoCSR - MJcrcsoft Vi-syeJ Studio
Т^Тэ
File £drt ¥*w guild Qebug
J) ' " bJ У 0 A ^ 1
, <& < *§ ^ * -а еа s
k* Servw Eipiorer ■»• $
* а чч
\4 - \p Date Connections
£, jy srvl Contoso dbo
ts 2J Database Diagrams
**< _u Tables
•&. ^i Views
i i U Stored Procedures
i- „J Functions
+ -J Synonyms
♦- JJ Type
,♦! J Assemblies
■i- ^ Servers
Data Table Designer
Ready
Iools Window
^ Debug
Help
- Mixed Platforms
dbo.Tablel:Tabt«{iTvlXontoso)* ^йРвдл"
Column Name Data Type Allow Nulls
Column Properties
^Шй^ш
timesframp
tinyint
uniqueidentiber
varcinaryE0)
varbmary(MAX)
E)
- »
ffoa^bi<)^M
varcbar(MAX)
xml
-
""
В {General)
(Name)
Allow Nulls
Data Type
(General^
cla;s_code
Yes
л char
Рис. 18.4. Определение столбцов таблицы
Установка первичного ключа
При активном Table Designer становится доступным новое меню верхнего уровня Table
Designer. Вы можете использовать это меню (или контекстное меню, которое отображается при
щелчке правой кнопкой мыши внутри Table Designer) для доступа к целому списку полезных
действий. Например, для создания первичного ключа таблицы необходимо выделить столбец
(или столбцы, которые составляют ключ), а затем выбрать в меню конструктора пункт Set
Primary Key. Все первичные ключи таблицы будут помечены значком с ключиком.
Создание индексов, внешних ключей и ограничений целостности
Индексы, внешние ключи и ограничения целостности создаются при помощи того же
самого интерфейса и процесса: выберите необходимое действие в меню Table Designer; исполь-
700
Часть V. Создание промышленных приложений
зуйте диалоговое окно настроек для добавления индекса, ключа или ограничения; затем
настройте его свойства в сетке свойств. Например, для создания индекса по одному или
нескольким столбцам таблицы выберите пункт Indexes/Keys в меню Table Designer. В
диалоговом окне Indexes/Keys (рис. 18.5) вы можете добавить новый индекс, а затем настроить
его свойства в сетке свойств.
Indexes/Keys
Selected Ртнпагу/Untque Key or Index:
flXJabtel*
!
_. . _.
1 grfd ] | getet* |
Editing properties for new unique key or index
В (General}
Columns id (ASC)
is Unique No
Type index
В Identity
Description
В Table Designer
Create As Clustered No
Ш Data Space Specification PRIMARY
ffl Fill Specification
ф У£^^ ]
n II
1
I'
1.
1
*
"~ \
Г ' £ЬмГ
x i
Рис. 18.5. Создание индекса
иацц
Specify the columns and sort order (or this index
Column tome Sort Order
Ascending
class_code
id
Рис. 18.6. Входящие в индекс столбцы
Входящие в индекс столбцы настраиваются при помощи свойства Columns индекса;
отдельное диалоговое окно Index Columns (рис. 18.6) позволяет вам изменить входящие в
него столбцы и указать порядок сортировки для каждого столбца.
Использование визуального конструктора диаграмм баз данных
Вышеупомянутые Table Designer и диалоговые окна позволяют вам определять таблицы и
относящиеся к ним конструкции отдельно для каждой таблицы. Визуальный конструктор
Глава 18. Работа с базами данных
701
диаграмм баз данных Database Diagram Designer предоставляет такую же
функциональность в более наглядном виде. Он позволяет вам создать диаграмму всей базы данных с
указанием таблиц, столбцов, ключей и связей между таблицами, а также создать любой из этих
элементов внутри конструкюра Diagram Designer.
Подобно конструктору Table Designer, конструктор Database Diagram Designer реализован
в панели документов интегрированной среды разработки. Он имеет свое собственное меню
и панель инструментов, вы можете получить доступ ко многим командам меню и панели
инструментов через контекстное меню конструктора (при помощи щелчка правой кнопкой
мыши внутри конструктора).
Совет
В диаграмме вы можете изменить стиль представления отдельно для каждой
таблицы. Щелкните правой кнопкой мыши таблицу и выберите одно из имеющихся
представлений Table: Standard (отображаются названия столбцов, тип данных и
дозволяются значения типа null), Column Names, Keys, Name Only и Custom (вы сами
выбираете отображаемые данные). Представление Name Only особенно полезно в
том случае, когда вы хотите увидеть всю диаграмму базы данных целиком для того,
чтобы получить представление об имеющихся связях (без ненужных подробностей
самих таблиц).
Создание диаграммы базы данных
Для создания диаграммы базы данных щелкните правой кнопкой мыши по узлу Database
Diagrams в окне Server Explorer и выберите пункт Add New Diagram. Откроется пустар
диаграмма, и визуальный конструктор незамедлительно покажет диалоговое окно для
добавления таблиц на диаграмму (рис. 18.7).
После того как вы добавите несколько таблиц, диаграмма покажет графическое представление
столбцов таблиц и всех имеющихся между таблицами связей. Диаграмма полностью
интерактивная; вы можете напрямую редактировать определения столбцов, ключи, связи и т. д.
Tf
Tables
CountryRegton (Person)
CountryRegionCurrency (Sales)
CreditCard (Sales)
Culture (Production)
Currency (Sales)
CurrencyRate (Sales)
DatebaseLog
Department (HumanResources)
Document (Production)
Employee (HumanResourcei)
Г 1 лла »u p
J&ffcfsn
£lfl?e
Рис. 18.7. Добавление таблиц в диаграмму
702
Часть V. Создание промышленных приложений
Совет
Вот как можно быстро добавить группы взаимосвязанных таблиц: добавьте в
диаграмму таблицу, выделите ее и щелкните по кнопке Add Related Tables в панели
инструментов конструктора. При этом в диаграмму добавятся все те таблицы базы
данных, которые имеют связи с выделенной таблицей.
Модификация определений таблиц
Таблицы можно редактировать прямо внутри диаграммы. Для изменения столбца нужно
щелкнуть по таблице, а затем: ввести имя столбца; или изменить тип данных, либо правило
использования значений типа null. Для добавления столбца просто заполните новую строку
в представлении таблицы в диаграмме.
Создание связей между таблицами
Связи между таблицами можно легко определить прямо внутри диаграммы: надо просто
перетащить столбец первичного ключа из одной таблицы в столбец внешнего ключа другой
таблицы. При этом автоматически появятся два диалоговых окна: Foreign Key Relationships
и Tables and Columns (это те же самые диалоговые окна, которые используются для
создания внешних ключей в конструкторе Table Designer). На рис. 18.8 показано создание
обычной связи "один-ко-многим" между таблицей категорий и таблицей заказов. Таблица заказов
имеет столбец идентификатора категории, который будет внешним ключом для первичного
ключа таблицы категорий.
Tables and Column* mpppuwn"; {VJg&m
Relationship flame
■*шШШ£шшш1
£rimary key table
(prod««*Cat«0wy (PtofcirtKw)
PfoductCategoryTO
Foretgnkey table
* ] P roduct (Production)
ProductSubcetegoFvID
OK
| Cancel . У
Рис. 18.8. Создание внешнего ключа
После фиксации назначений столбцов вы завершаете создание связи при помощи изменения
(при необходимости) свойств самой связи в диалоговом окне Foreign Key Relationships
(рис. 18.9).
Связи на диаграмме изображаются в виде линии между двумя таблицами. Линия обозначает
направление связи ключиком на стороне первичного ключа и символом бесконечности на
Глава 18. Работа с базами данных
703
стороне внешнего ключа (сторона "многие"). На рис. 18.10 показана связь между таблицей
категорий заказов и таблицей самих заказов (в таком виде, как она выглядела бы в
визуальном конструкторе Database Diagram Designer).
~w~w~
ППййяГ
» Foreign Key Relationship
ielected Relationihip
Editing properties for new relationship The Tables And Columns
Specification property needs to be hlled in before the new reletionship лпП be
accepted'
B! (General),
Check Existing Date On Creerio Yes
13 Tables And Columns Speciftcat
В Database Designer
Enforce For Replication Yes
Enforce Foreign Key Constraint Yes
ffl INSERT And UPDATE Specificat
В Identity
(Name)
Description
Ff_Product_ProduclCalegory
Рис. 18.9. Создание внешнего ключа
Product (Production)ч
SrzeUnitMeasureCode
WeightllnitMeasureCade
Weight
DaysToManufjcture
ProductLtne
' Class
1 Style
ProductSubtategorylD
1 ProductModellD
SeJIStartDate
Product Category (Proc '
S ProductCategorylD i
Name !
rewguid |
ModifiedDate i
Рис. 18.10. Две таблицы со связью в визуальном конструкторе Database Diagram Designer
Примечание
По умолчанию связи поддерживают ссылочную целостность. То есть они
предотвращают любое действие (вставку, обновление, удаление), которое могло бы привести к
несовпадению ключей двух связанных таблиц. Сюда входят: вставка такого значения
внешнего ключа, которое не существует как первичный ключ связанной таблицы;
изменение такого значения первичного ключа, на которое есть ссылка как на значение
внешнего ключа и т. д.
Вы можете управлять ссылочной целостностью при помощи настройки значения
Enforce Foreign Key Constraint, которое имеется в диалоговом окне Foreign Key
Relationship Связи, которые не обеспечивают ссылочной целостности, изображаются в
визуальном конструкторе Diagram Designer как линии с каемкой (а не сплошные).
Необходимо также отметить, что Diagram Designer будет показывать только те связи,
которые были явным образом определены (так, как это было описано в предыдущих
704
Часть V. Создание промышленных приложений
разделах). Если дать внешним и первичным ключам аналогичные названия, то это не
приведет к автоматическому созданию связи.
Кроме связи модин-ко-многим" в визуальном конструкторе Database Diagram Designer вы
можете создать связи "один-к-одному", "многие-ко-многим" и рефлексивные.
Связь "один-к-одному"
Связь "один-к-одному" создается точно так же, как и связь "один-ко-многим". Разница вот в
чем: связь "один-к-одному" устанавливается между двумя первичными ключами (а не
между первичным и внешним ключами). Если вы перетащите столбец первичного ключа из
одной таблицы на столбец первичного ключа другой таблицы, то это автоматически создаст
связь "один-к-одному". Такие связи обозначаются значками ключиков на обоих концах
линии связи.
Связи "многие-ко-многим"
Связь "многие-ко-многим" создается при помощи объединяющей таблицы. Если вам нужно
создать связь "многие-ко-многим" между таблицей заказов и таблицей позиций (заказ может
иметь много позиций, а позиция может принадлежать многим заказам), то вам сначала
нужно добавить в базу данных третью таблицу для внешних ключей этой связи.
После добавления объединяющей таблицы вы должны будете установить связи "один-ко-
многим" между таблицами заказов и позиций заказов, а также между таблицами позиций и
позиций заказов. Последний шаг — определить многостолбцовый первичный ключ для
объединяющей таблицы. На рис. 18.11 на диаграмме показаны результаты.
item
1 GataaiSteKt
: Ч <
ztacXjzxtjif_stT
mm*
fec-xix»
vnjmUjtr
\ <
ZXmTy*
■Tt
«•***£)•
«T*r-ST.
»*cA«(aW;
Л
r«<
«*»*,*]
П
П
□
П
П
П
n *|
R
ordertbem
Cos*rti Четх
'x *<fcr_>3
Г"
art*'y?« я*** *ы ^
* П \
* г vi
Рис. 18.11. Связь "многие-ко-многим"
Рефлексивная связь
Рефлексивная связь — это связь между таблицей и этой же самой таблицей. Типичным
примером для иллюстрации рефлексивной связи является таблица запчастей, которая
устанавливает связь сама с собой (что отражает тот факт, что запасная часть может быть
Глава 18. Работа с базами данных
705
сделана из других запасных частей). В этом случае таблица запчастей может иметь поле
parent_part_id, которое должно быть внешним ключом для первичного ключа таблицы
служащих.
Для создания рефлексивной связи выделите столбец первичного ключа и перетащите его на
ту же самую таблицу. Настройка ключей и связи такая же, как и для любой другой связи. На
рис. 18.12 показана диаграмма рефлексивной связи.
CoMmNacne
«J
pe*ent_partjd
description
wettfitjoz
finished
assembJy_dra¥*
OaJfcType
mt
Jnt
vardw(SO)
smaftnt
bt
varcharE0)
Alow...
П
П
П
П
П
П
П
Рис. 18.12. Рефлексивная связь
Работа с операторами SQL
В наборе инструментов Visual Database Tools имеется полная поддержка создания и выпол-*
нения операторов SQL по подключенной базе данных, в т. ч.: поддержка компиляции
операторов SQL в виде хранимых процедур, создание представлений и триггеров, написание
пользовательских функций.
Написание запроса
Основной инструмент для разработки операторов SQL — это конструктор Query/View
Designer, который является графическим инструментом, позволяющим вам создавать запросы
при помощи простой работы мышью. После создания запроса этот инструмент позволяет
вам просмотреть полученные в результате выполнения запроса результаты, а также и
работать с ними.
Теперь вы готовы приступить к работе с этим инструментом.
Для создания нового запроса выборки по таблице нужно просто выделить базу данных в
Server Explorer, а затем в меню Data выбрать пункт New Query. После этого вы получаете
список таблиц, представлений, функций и/или синонимов, которые можно использовать в
качестве целей запроса (рис. 18.13).
После выбора объектов для запроса откроется конструктор запросов Query Designer. Как
показано на рис. 18.14, в конструкторе имеется четыре разных панели:
О панель критериев позволяет вам выбрать: столбцы данных для включения в оператор
выборки; сортировку; а также имена алиасов;
706
Часть V. Создание промышленных приложений
панель диаграммы аналогична диаграмме в конструкторе Database Diagram Designer;
она графически изображает связи между объектами базы данных. Это сводит создание
соединений к использованию имеющихся связей либо созданию новых в этом же
инструменте;
после выполнения запроса в панели результатов содержатся данные результата.
Обратите внимание, что эта панель оборудована элементами управления навигацией (для
листания больших результирующих наборов данных);
АШТаЫе
Tables Vtew* J Fynctiom j Sjfnenyms.
1ШЯ^ДМ
AddressType (Person)
AWBuildVenion
BMOfMjterials (Production)
Contact (Person)
ContactCreditCard (Sales)
ContactType (Person)
CountryRegion (Person)
CountryRegicnCurrency (Sate)
CredrtCard (Sates)
Culture (Production)
Currency (Sates)
1 Г ..---.О-.. ГС.1-.Л
\JLM&d'
is
i
| Refresh | Add j got* | |
Рис. 18.13. Добавление таблиц в запрос
Query!; QueryUrvlAdventureWorJo)
Щ Cwnwt fe<ff**»*tf jj
[I ]A (All Columns)
f NameStyle
I jTitle
Г FirstName
1
d
jJSlropfoy«ft{Haruu}$U ^
a
* (All Columns)
NalionellDNumt
"CcntactlD
, LogtnlD
\> Панель
диаграммы
Oirtp.,, Sort Type
Ш
m
N.
Пан «ль
критврим
jSELECT
IFROM
Person Contact INNER JOIN
HumanPesources.Employee ON Person Contact,ContactID = HurnanResources Employee ContactID INNER JOIN
HurnanResources ErnployeeDepartmentHistcry ON "V^ ' j
HurnanResources Employee. Em ployeeJD = HurnanResources EmployeeDepartmentHistory.EmplcyeelD Ari* ПаНВЛЬ SQL
HumanRe$ources.Employee.Empk>yeeID = HurnanResources EmpIoyeeDepartmentHlstory.EmplcyeelD j
v./,
Паиел*
jptjynbTatoa
Рис. 18.14. Конструктор Query/View
Глава 18. Работа с базами данных
707
□ панель SQL содержит реальный синтаксис SQL, используемый для реализации запроса.
Вы можете модифицировать оператор при помощи ручного ввода в этой панели, либо
использовать конструктор и позволить ему написать для вас код SQL в соответствии с
введенными вами в панелях диаграммы и критерия данными.
Каждая из этих панелей может быть показана или скрыта. Щелкните правой кнопкой мыши
в любом месте конструктора и в меню Рапе выберите видимые панели.
Тонкая настройка оператора SQL
При составлении оператора выборки вы можете указать, какие столбцы каких таблиц вы
хотите получить (для этого надо поставить галочку около столбца в панели диаграммы).
Панель критерия вы используете для указания: порядка сортировки, алиасов
возвращаемых столбцов, а также для настройки фильтра результирующего набора данных. По мере
того как вы выбираете эти опции, конструктор превращает их в код SQL, который виден в
панели SQL.
Query!- QuefybrvlAdventweWorks) j
] Title
j^FirstName
[ JMiddleName
;? LastName
[ I Suffix
4
J
*" Ш ft?!?**?"8 Iftfoyfe. >=J i \
VacattonHours
i SickLeaveHourc
CurrentFlag
;re*guid
ModrfiedDate
^l
I
J
\.
P'» {AH Columns)
f j Employees)
[*j Departments)
l 1Я
Us
zl
Column
BirthDate
HireDate
SalariedFlag
Table
Employee
Employee..
Employee
Outp... Sort Type
I
Person ContactFirstName, Person ContactLastName. Penon Contact EmailAddress, Person.Ccmtact Phcne, HumanResources Ei
HumanResources Employee BirthDate, HumanResources Employee HireDate, HumanResources Employee.SalanedFlag
HumanResources EmployeeDepartmentHistory Oepartmentro
Person.Contert INNER KIN
HumanResourcei.Employee ON Person.Corvtacl CcntactID = HumanReiources.Employee ContactID INNER JOIN
HumanResources EmployeeDepartmentHistory ON
FirctWam* LastName
<" wle' Fet^e/ald
Ebu Zi%zi
EmailAddress
garylC-d.f-iH,
-■■«irlKC&iidve
eorcO£ advent
Phone LcqinJD
ПС С-СЛ Cii' ecbnt» '? vvcciu
;0:-!c.S-Ci27 adventt >* wcf<>... .0 23-197512 3
BirthDate
. .'i''96:i?w
Of75 ► M :
Cell is Read Only.
Рис. 18.15. Запрашиваем информацию по заказам из базы данных AdventureWorks
Примечание
Для большей части примеров данной главы мы используем базу данных
AdventureWorks из SQL Server 2005. Если вы хотите следить за нашим изложением, то
можете скачать копию этой базы данных (и других) по адресу: http://www.codeplex.com/
MSFTDBProdSamples. Многие образцовые базы данных были обновлены под версию
SQL Server 2008; вы можете получить доступ к различным образцовым базам данных
под разные версии SQL Server при помощи щелчка по ссылке All Releases в правой
708
Часть V. Создание промышленных приложений
части экрана CodePlex. База данных AdventureWorks используется также и в системе
интерактивной помощи SQL Server 2005 Books Online.
На рис. 18.15 показан законченный запрос "Employee", его результаты видны в нижней
панели.
Указываем соединения и типы соединений
Когда вы добавляете несколько связанных таблиц в конструктор Query Designer, то
конструктор использует связи их ключей для автоматического создания оператора join для
запроса. У вас также есть возможность создавать соединения по столбцам таблиц, которые не
имеют связей. Это делается точно так же, как вы указываете связи в конструкторе Database
Diagram Designer: вы выделяете и перетаскиваете столбец из одной таблицы в другую
(в пределах панели диаграммы). Соединяемые столбы должны иметь совместимые типы
данных; например нельзя соединить столбец типа varchar со столбцом целых чисел.
Соединения создаются при помощи оператора сравнения. По умолчанию это оператор
равенства; иначе говоря, возвращаются те строки, где значения столбцов одинаковы (по всему
соединению). Но вы можете управлять реальной операцией сравнения, используемой в
соединении. Например, возможно, вы хотите, чтобы результирующий набор включал те
строки, в которых значения таблицы А больше значений таблицы В в соединяемых столбцах. Вы
можете щелкнуть правой кнопкой мыши по линии соединения в панели диаграммы и
выбрать пункт Properties для того, чтобы увидеть свойства соединения; щелчок по панели
Многоточия в свойстве Join Condition and Type выдаст диалоговое окно Join (рис. 18.16).
ш ЕаЖ
Table
Employe* (HumanResourc EmployeeDepartmentHistc
Column:
HumanReiowces. Employe
Hum*nR£K>urces.Empioye
{<
<
Include rows: ;>
[V] &И rows from Employee (Htm«
'"j All tows from EmployeeDepaitmentHrstory (HumanResources)
fces)
Рис. 18.16. Настройка типа соединения и оператора
Другие типы запросов
По умолчанию создание запроса из Server Explorer приведет к созданию запроса выборки
select. Однако конструктор Query Designer достаточно сведущ и в построении запросов
других типов. Например, если вам нужен запрос вставки, то вы можете изменить тип
запроса, загруженного в конструктор. Для этого надо выбрать Query Design | Change Type.
В табл. 18.1 показаны различные типы запросов, поддерживаемые конструктором.
Глава 18. Работа с базами данных
709
Совет
Если вы хотите быстро увидеть содержимое любой заданной таблицы, то можете
щелкнуть правой кнопкой мыши по таблице внутри Server Explorer, а затем выбрать
Show Table Data. Это приведет к запуску нового конструктора Query/View с
оператором select * для заданной таблицы. По умолчанию видна только панель
результатов. Эта функциональность идеальна для такого тестирования, при котором вам
нужно быстро редактировать данные в базе данных или наблюдать за воздействием
операторов SQL на таблицу.
Таблица 18.1. Поддерживаемые типы запросов
Тип запроса
Select
Insert Results
Insert Values
Update
Delete
Make Table
Комментарии
Возвращает данные из одной или нескольких таблиц или представлений;
это SQL-оператор SELECT
Вставляет новые строки в таблицу посредством копирования их из другой
таблицы; это SQL-оператор INSERT INTO . . . SELECT
Вставляет новую строку в таблицу с использованием указанных значений и
целевых столбцов; это SQL-оператор INSERT INTO . . . VALUES
Обновляет значения существующих в таблице строк или столбцов; это SQL-
оператор UPDATE ... SET
Удаляет одну или несколько строк из таблицы; это SQL-оператор DELETE
Создает новую таблицу и вставляет в нее строки результата запроса
выборки; это SQL-оператор SELECT . . . INTO
Создание представлений
Представления— это виртуальные таблицы. Они выглядят и работают как таблицы базы
данных, но на самом деле являются операторами выборки, которые хранятся в базе данных.
Когда вы смотрите на содержимое представления, то на самом деле вы смотрите на
результирующий набор оператора выборки.
Поскольку представления реализованы как операторы выборки, то вы создаете их при
помощи визуального конструктора Query/View. В Server Explorer щелкните правой кнопкой
мыши по каталогу Views под той базой данных, для которой вы хотите создать
представление. Оператор выборки создается здесь точно так же, как и любой другой оператор SQL.
Сохранение представления приведет к обновлению в базе данных оператора выборки для
представления.
Разработка хранимых процедур
Хранимая процедура — это оператор SQL (или набор операторов), которые
откомпилированы и хранятся в базе данных. Для SQL Server хранимые процедуры состоят из 1<ода на
языке Transact-SQL (T-SQL), причем они могут содержать многие языковые конструкции,
710
Часть V. Создание промышленных приложений
которые обычно не встречаются в типичных запросах. Например, в хранимой процедуре вы
можете реализовать процедуры обработки ошибок и даже вызывать функции операционной
системы при помощи так называемых "расширенных" хранимых процедур.
Для заданной базы данных щелкните правой кнопкой мыши по каталогу хранимых процедур в
Server Explorer и выберите пункт Add New Stored Procedure. В редакторе SQL Editor
откроется шаблон для хранимой процедуры. Редактор SQL Editor является близким
родственником редактора кода Visual Studio; несмотря на то, что в нем нет технологии
IntelliSense, он поддерживает синтаксическое раскрашивание, точки останова, а также
обычные функции редактирования текста (вырезать-скопировать-вставить, перенос слов и т. д.).
На рис. 18.17 показано начало создания хранимой процедуры в окне редактора SQL Editor.
tic £dit ^iew Project guild
3 • Л d J ' 4 -a
i'ServwHxplctfr
- ji Data Connections
Ccfcug Djt3 Jools Window Ц-ёр
*? - « < * ' j fr Debug r Mixed Platforms
~_ ^ ,>i,> ;
▼ ^ X dboStoredProced-AdventureWorW
CkEME PROCCITJFE dbcT. ScoredTrосеdlrel
t-j fc sal AaventureWorks dbo
i _J Database Diagrams |
♦; _J Tables
*, uJ Views j
-, uJ Stored Procedures
Л uspGetBillOfMatenats • j
J) ^] uspGetEmployeeManagers j
Ш JT] uipGetManegerEmployeei jj
Ш ^ uspGetWhereUsedProducllD
iti H] uipLogEn-cr '
.•J ИЗ uspPnntError
*l Tl uspUpdrteEmploveeHitelnfo j,
,*j tTl uspUpdatcEmployccLcqin (Hi,1
H IZ1 uspUpd3teEmployeePericnatf j
V k-J Functions
t C.J Synonyms
♦ iU Types
t >-J Assemblies
to Jk. srvl.Contoso dbo
Щ Servers
pa I all -i el.
M
Ready
Рис. 18.17. Начало создания новой хранимой процедуры
При наличии загруженного в SQL Editor шаблона написание хранимой процедуры сводится
к вводу строк кода и SQL, которые будут выполнять требуемые действия. Но разработчики
хранимых процедур не были оставлены без поддержки со стороны Visual Studio. Вы можете
использовать мощь визуального конструктора Query/View для написания некоторых частей
ваших хранимых процедур.
Использование редактора SQL Editor и конструктора Query/View
По мере создания тела процедуры окно редактора будет выделять и заключать в рамку
определенные части процедуры. Эти части в рамке представляют собой операторы SQL,
которые можно редактировать при помощи Query Designer. Рассмотрим хранимую
процедуру на рис. 18.18.
Глава 18 Работа с базами данных
711
Данная процедура (из базы данных AdventureWorks) по существу состоит из двух запросов
обновления. Оба они выделены синей рамкой в окне редактора SQL Editor. Таким образом,
редактор указывает, что он распознал в процедуре оператор SQL, который можно
конструировать при помощи конструктора Query/View. Если вы щелкнете правой кнопкой мыши
внутри рамки, то в контекстном меню вы увидите пункт Design SQL Block. Если вы его
выберете, то в отдельном диалоговом окне откроется конструктор Query /View.
HunumReKMtrceb_Adventure Wor ks)
~Z3
BEGIN
SET KOCG'JNT ON;
BEGIN TRY
EEGIN TRANSACTION;
JJFDATE [FumarRtsaurces}.[Ercplcyee]
SET {Tide} -• STitle
,[FireDate] — 3HixeDate
,[CurrentFlag] - gCurrertFlag
WHERE {ErcployeeXD) - SEnsployeeirfT"
JlNSERT INTO [H^JTvanRescurces] . [EmployeePay^
I [EitployeelD]
,[RareChanjeDace]
, ; RareI
, [PayFrequency] \
VALUES (SEffiployeelD, SFateCiiangeDate, 8Rate
CCMHIT TRANSACTION;
END TRY
2EG1S САТСЧ
I»
Рис. 18.18. Операторы SQL в хранимой процедуре
* (All Columns) j
Employees V_
L_j NatiorwIIDNumber
I "iContartID
Column
| Title
Table
Employee.
New Value
©Title
UPDATE HumanResources.Employee
|SET Title = ©Title, HireDale = ©HireDate, CurrentFlag = eCurrentFlag
|WHERE (EmployeeTO = ©Employee!!))
jpecute Query
Xalidete Query
Рис. 18.19. Конструирование запроса для хранимой процедуры
На рис. 18.19 показан первый из двух операторов обновления. Используя тот же самый
процесс для написания запросов (который уже был описан ранее), вы можете создать SQL,
пользуясь роскошью перетаскивания в конструкторе Query/View. Нажатие ОК в диалого-
712
Часть V. Создание промышленных приложений
вом окне конструктора сохранит запрос в хранимой процедуре (при этом обновится код в
окне редактора).
Обратите внимание, что конструктор Query Designer полностью поддерживает
использование параметров. Когда вы заполните имена параметров в столбце New Value (см. панель
критериев на рис. 18.19), то конструктор сможет создать соответствующий SQL-оператор.
Примечание
Возможность создавать и редактировать хранимые процедуры поддерживается
только для Microsoft SQL Server. Например, вы не можете использовать инструменты
Visual Studio для создания процедуры в базе данных Oracle.
Конструктор Query Designer можно также использовать для вставки новых блоков SQL в
хранимую процедуру (а не только для редактирования уже существующих операторов SQL).
Сначала в окне SQL Editor надо щелкнуть правой кнопкой мыши по той строке процедуры,
в которой вы хотите разместить новый запрос. В появившемся меню надо выбрать пункт
Insert SQL. Теперь для создания соответствующего SQL-кода можно использовать
конструктор Query/View. После того как нажатием ОК вы закроете диалоговое окно, новый SQL-
оператор будет вставлен в процедуру и может быть сохранен в базе данных.
Отладка хранимых процедур
В дополнение к кодированию хранимых процедур вы можете использовать Server Explorer и
для помощи в их отладке. Когда хранимая процедура открыта в окне SQL Editor, вы можете
настроить в ней точку останова (щелчком в поле индикаторов, подробнее см. в главе 6).
File Edit Vnew §uttd Debug Data loots Window Help
JJ- " xj ad 0 $4* % <-* ' r< ' ;*'* i ►. Debug » Mixed Platforms
.:. \.>- •** „i ~j** * *j -^jVJ_
HvrwaniU»vrc«t__AdvcMurcWorksJ
■s
i yj Data Connections
r' • jfc srvl.AdYentureWQrks.dbo
' '+ ZJ Database Diagrams
IS 2U Tables
ф uJ Views
L-. ^Л Sored Procedures
л ZJ uipGetBillOfMaterials
'* ZJ ittpGetEmphjyeeManjgere
: % Zl uspGetManagerEmployees
! i- Zl uspCetWhereUsedProducdD
<L Zl uspLogError
( t !T1 uspPrintError
'±>- Z3 usplipdateFmployerLogin (И
♦ ^3 uspUpdateEmplcyeePersona
it _J Functions
i+j ZJ Synonyms
A ~J Types
£ Jj Assembles
< Ut lit srvl.Contoso dbo
v *S| Servers
Ready
A3
BEGIN
SET ЖКХЛ1Г ON;
BEGIN TRY
BEGIK TRANSACTION;
▼ X
~zj
[9 PEAT E [HunanResouxces] . [Employee}
{Title) - 8Ticle
,(HireDate) - 8Rixe3ate
, [CurrentriagJ - 8CuzrentFlag
WHERE [EmployecIDl - gEirployeellfc
JlNSEKT INTO JHunanResourcea] [EapioyeePayH
Add New Stored Procedure
Open
Execute
Step jnto Stored Procedure
Copy
Eetete
Refresh
Properties
eelD]
pageDate]
диег.су] f
loyeelD, SRaceChancjeDace,
Li(
ппгиЯшгГпгППТГТ m»nriml»MH»r
Рис. 18.20. Отладка хранимой процедуры
Глава 18. Работа с базами данных
713
После этого вы можете щелкнуть правой кнопкой мыши по названию хранимой процедуры
в дереве Server Explorer и выбрать пункт Step into Stored Procedure (рис. 18.20).
Отладчик SQL умеет работать также и с параметрами. Если хранимая процедура использует
параметры, то отладчик покажет диалоговое окно для ввода значений параметров
(рис. 18.21).
Вы можете быстро пробежать по списку параметров и задать соответствующие значения.
После нажатия кнопки ОК хранимая процедура будет выполнена. Если вы настроили точку
останова, то выполнение на ней остановится (для указания текущей выполняющейся строки
в редакторе используется желтая стрелка — точно так же, как и в окне редактора кода). При
остановленном выполнении вы можете использовать окна Locals и Watch для отладки кода
процедуры. Более подробное описание окон Locals и Watch как инструментов отладки
Visual Studio см. в главе 10.
Меню Debug используется для управления выполнением и его ходом. Если вы выберете
Continue, то процедура продолжит выполнение до следующей точки останова (если она
есть).
Run Stored Procedu*e
ТКе itored procedure
i following parameter»
i Type
int
rwarctur
datetime
ditelime
i money
tinyint
btt
i_
£ , *
efHum4nResources].[u*plFpd»teErnpfoyeeHfreinlo]
Direcbon
In
In
In
In
In
in
In
Name
©EmptcycelD
©Trtle
©HireDete
©RateChangeDate
©Rate
©Pay-Frequency
ffCurrentFlag
\
_ , =«
HMtf]
» requires the
Value
109
1ШЙЯиИ
<DEFAULT>
< DEFAULT*
<DEFAULT>
'DEFAULT"»
<DEFAUIT>
OK """] . Cancel j
»""~ -^
Рис. 18.21. Ввод значений параметров в SQL Debugger
Создание триггеров
Триггер — это тип хранимой процедуры, предназначенной для запуска при модификации
данных таблицы или представления. Триггеры прикрепляются к таблице; когда запрос
(обновление, вставка или удаление) приводит к изменению данных, то триггер выполняется.
Поскольку триггер — это фактически хранимая процедура с управляемым временем
выполнения (отсюда и название — триггер), то он может иметь в своем составе очень сложные
операторы SQL и сложную логику выполнения.
Для создания триггера используйте Server Explorer — найдите таблицу, к которой его
необходимо прикрепить. Щелкните правой кнопкой мыши по имени этой таблицы, выберите
пункт Add New Trigger, а затем используйте редактор SQL Editor для написания SQL-
триггера. Когда триггер будет сохранен в базу данных, то он будет виден под своей табли-
714
Часть V. Создание промышленных приложений
цей в Server Explorer (рядом со столбцами таблицы). На рис. 18.22 показан простой
триггер, предназначенный для генерирования ошибки в случае изменения оператором
обновления столбца Availability таблицы Location.
frte £drt ¥«ew Eroject fiutrd Eebug
3 ' ' iJ mJ &\ & -J - ** '
^ - Pi? ° '4 4 .
»,<■ Server Ebpfcer •» Д X
4 4
H-t _J CountryRegion (Person)
Ш Z3 StateProvince (Person)
П Hi BillOfMatenab (Productior
U " Culture (Production)
c.J .13 Document (Production)
tvJ 12 Illustration (Production)
ri J3 Location (Production)
3 LocattonJD
J] Name
3 CoitRirte
JJ Avattability
^3 MadifiedDate
♦J -3 Product (Production)
♦i H3 ProductCategory (Product
ь 3 ProductCcstHistory (Prodi
(i J^3 ProductDescrtption (Produ
jj ^} ProductDocument (Produt
+< J3 Productlnventory (Product
v Щ ProductbstPriceHirtory (Pi
+! _D ProductModel iProductior
+1 Л} ProductModellJIustraticn (
Pita Tcofs Window Help
-£-!•» ^ Debug »• Mwrd Platforms
ProductioikTrigg-AdvetitureWoria)*
.REATE TRIGGER Trigger.
ON Production.Location
FOR 'Jpdate
I? ^PSATE (Availabilit/)|
BEGIN
RAISKRROR ('Iva11tb11i z
■^
Ready
Рис. 18.22. Создание триггера
Создание пользовательских функций
Пользовательские функции— это блоки кода/SQL, предназначенные для повторного
использования самыми различными потребителями: хранимыми процедурами, приложениями
и даже другими функциями. В этом отношении они не отличаются от функций, написанных
на языке С# или Visual Basic. Это процедуры, которые могут принимать параметры и
возвращать значение. Пользовательские функции возвращают скалярные значения (например,
единственное значение) или результирующий набор данных (содержащий строки и столбцы
данных).
Примером пользовательской функции может служить функция, которая принимает дату, а
затем определяет, какой это день — рабочий или выходной. Хранимые процедуры или
другие функции базы данных могут затем использовать эту функцию как часть своей
обработки.
Поскольку пользовательские функции содержат операторы T-SQL и имеют формат,
который аналогичен хранимым процедурам, то основным инструментом для их написания
является опять-таки редактор SQL Editor. Для каждого имеющегося в Server Explorer
подключения к данным в каталоге Functions будут содержаться все существующие функции. Для
создания новой функции вы можете щелкнуть правой кнопкой мыши по этому каталогу,
Глава 18. Работа с базами данных
715
выбрать пункт Add New, а затем указать тип создаваемой функции. Здесь имеются три
варианта:
□ Inline Function (Встраиваемая функция) возвращает значения как результирующий
набор данных; этот набор создается из результатов запроса select;
□ Table-valued Function (Возвращающая табличное значение функция) возвращает
значения как результирующий набор данных; этот набор формируется посредством
программного создания внутри функции таблицы, которая затем заполняется при помощи
запросов insert into);
□ Scalar-valued Function (Скалярная функция) возвращает единственное значение.
После выбора соответствующего типа функции в новом окне редактора SQL Editor
появится код шаблона для данной функции. Вы можете использовать визуальный конструктор
Query/View Designer для того, чтобы конструировать SQL внутри этой функции.
За подробностями по написанию функций и их наилучшему использованию в базе данных
обратитесь к документации по вашей базе данных.
Использование проектов баз данных
До настоящего момента мы обсуждали использование инструментов Visual Database Tools
вне контекста решения или проекта Visual Studio. Теперь давайте исследуем роль проекта
типа Database. Проекты баз данных содержат в себе подключение к базе данных
(называемое также ссылкой на базу данных), а также скрипты или запросы SQL, которые относятся к
этой базе данных. Преимущество хранения скриптов в таких проектах состоит в том, что
они могут храниться в системе управления исходным кодом.
Примечание
Скрипты — это просто операторы SQL, хранящиеся в файле. Они полезны, т. к. могут
выполняться в пакетном режиме для реализации таких вещей, как создание таблиц
новой базы данных или добавление заготовленного набора хранимых процедур в базу
данных. Поскольку это просто файлы, то их можно переносить с компьютера на
компьютер (что позволяет вам без труда воспроизводить структуру базы данных на
других компьютерах).
Скрипты SQL в проекте базы данных могут создавать многие объекты баз данных, которые
мы уже обсудили: таблицы, представления, триггеры, хранимые процедуры и т. д. Запросы,
которые разработаны при помощи визуального конструктора Query/View Designer, могут
быть также непосредственно сохранены в проекте базы данных. Короче говоря, вы
используете инструменты Visual Database Tools в сочетании с проектом базы данных для создания
и сохранения скриптов и запросов SQL.
Создание проекта базы данных
Для создания проекта базы данных выберите в меню File пункт New Project, а затем
посмотрите в категории Other Project Types диалогового окна New Project (рис. 18.23).
24 3ак 3716
716
Часть V. Создание промышленных приложений
New Pioject
, £roject types
Visual C#
Other Languages
Other Project Types
Setup and Deployment
Database
Extensibility
Visual Studio Solutions
IempJates:
Visual litudio installed templates
J> Database Project
My Templates
£j3 Search Online Templates...
.NET ЬагоаиугМЗ ~ | ПЗ (g
Create a new database project aflowmg direct manipulation of thr database objects and data
tlame AWScripts
iccation:
Solution:
I Create new SoJutioft
' Solution Naffi« AVVScnpts
cNusersMarsVDocumentsWisual Studio 2008\Projecfc\
w j V Create directory for solution
§rawse~.
Рис. 18.23. Проект типа "база данных"
Мастер создания проекта сначала запросит у вас ссылку на базу данных для добавления ее в
проект; это можно сделать при помощи того же самого набора диалоговых окон, которые
используются в Server Explorer для добавления подключений данных (см. рис. 18.3).
После создания проект по умолчанию будет иметь структуру, показанную на рис. 18.24.
Как видно из этой структуры проекта, он имеет определенные каталоги для хранения
скриптов, запросов и ссылок на базы данных.
Solution Explorer - AWScripts
в
^3 Solution 'AWScripts' A project]
у СЛШШШШ
Qj Change Scripts
C3 Create Scripts
fcj Queries
В £jM Database References
^3 srvIAdventureWorks.dbo
Рис. 18.24. Структура проекта базы данных
Скрипты добавляются в проект двумя способами. Вы можете использовать традиционный
процесс добавления нового элемента (точно так же, как и в любом другом проекте).
Выберите тип элемента (рис. 18.25), и скрипт (или запрос) будет добавлен в проект, причем в
файле уже будет содержаться стандартный скелетный код шаблона. Более легкий путь соз-
Глава 18. Работа с базами данных
717
дания скриптов состоит в том, чтобы позволить инструментам для работы с базами данных
выполнить за вас эту работу.
Add Ne» Iter» - AWScrpts
Categories
| Database Project Jtems
i
ч
j
Creates a new query m the Query Designer.
1 ы»«п« ПШ
[emplates:
Visual Studio installed templates
«St)SQL Script
$5p Database Query
Q) Stored Procedure Script
ьЦТаЫе Script
Q^ Trigger Script
^Й View Script
My Template;
J Search Online Templates...
j ££T
•
| $ hhftfeaall
ГЯ(П
:
ij
j [ Cancel
Рис. 18.25. Элементы проекта базы данных
Автоматическое генерирование скриптов
Существуют два основных типа автоматически генерируемых скриптов: скрипты создания и
скрипты изменений. Скрипты создания используются для создания нового объекта базь*
данных: таблицы, хранимой процедуры и т. п. Скрипты изменений применяются для
обновления существующего объекта базы данных.
Создание скриптов
При помощи Server Explorer вы можете сгенерировать скрипт создания для любого объекта
базы данных. Например, для генерирования скрипта создания таблицы BillOfMaterials базы
данных AdventureWorks вы должны щелкнуть правой кнопкой мыши по таблице и выбрать
пункт Generate Create Script to Project. Весь SQL, необходимый для создания таблицы
(и всех связанных с ней объектов, таких как ключи, индексы и т. п.) будет записан в файл
каталога Create Scripts текущего проекта базы данных.
Одним щелчком вы можете даже создать скрипт для целой базы данных: вместо выделения
отдельной таблицы выделите в Server Explorer узел базы данных, а затем выберите
команду Generate Create Script to Project.
После того как скрипт будет создан, двойной щелчок по нему в проекте приведет к запуску
редактора SQL Editor с содержимым скрипта.
Примечание
Для того чтобы представить себе количество сэкономленного ручного труда, учтите
следующее: скрипт создания таблицы BillOfMaterials состоит более чем из 120 строк
кода SQL.
718
Часть V. Создание промышленных приложений
Скрипты изменений
Концепция скриптов изменений аналогична, но есть два отличия: скрипты изменений могут
автоматически генерироваться только для таблиц, и скрипт будет учитывать только
изменения в таблице (саму таблицу создавать не будет). Конструктор Table Designer обеспечивает
генерирование скриптов изменений. После выполнения изменений таблицы внутри
визуального конструктора выберите Table Designer | Generate Change Script. Скрипт будет создан
и помещен в каталог Change Scripts текущего проекта.
Примечание
Поскольку Visual Studio генерирует скрипт изменений при помощи отслеживания
ваших действий по редактированию и сравнения их с существующей в базе данных
структурой таблицы, то вы можете сгенерировать скрипт изменений только до того,
как ваши изменения будут сохранены в базе данных.
Выполнение скрипта
После создания скрипта вы можете прогнать его по базе данных. Запустите скрипт в
Solution Explorer при помощи щелчка правой кнопкой мыши по файлу скрипта. В
появляющемся меню имеются два варианта запуска скрипта: команда Run и команда Run On. Команда
Run прогонит скрипт по базе данных, указанной в ссылке на базу данных по умолчанию.
Команда Run On позволяет вам вручную указать (в списке ссылок на базы данных) ту базу
данных, которая является целью вашего скрипта.
Ссылки на базы данных
Если вы помните, то в мастере Database Project Wizard у вас спрашивают ссылку на базу
данных для включения в проект. Но проекты баз данных могут иметь не одну такую ссылку.
Если у вас есть более чем одна ссылка, то вы можете указать, какая из них является ссылкой
по умолчанию. Для этого надо щелкнуть по ней правой кнопкой мыши в Solution Explorer и
выбрать пункт Set As Project Default.
Создание в управляемом коде
объектов баз данных
Объекты баз данных обычно реализуются на определенном диалекте языка SQL. Это
справедливо и в случае SQL Server. Однако в SQL Server 2005 была введена возможность
создания объектов SQL в управляемом коде. То есть вместо использования Transact-SQL вы
можете писать хранимые процедуры, запросы, представления и т. п. на вашем любимом .NET-
языке.
Для этого в Visual Studio используется проект SQL Server Project (его не следует путать с
уже обсуждавшимся здесь проектом базы данных Database Project). Этот проект является
специфичным для языка программирования типом проекта, который предоставляет
шаблоны классов для реализации процедур баз данных на управляемом коде.
Глава 18 Работа с базами данных 719
Начинаем проект SQL Server Project
В диалоговом окне Add New Project проекты SQL Server находятся в категории Database
для каждого языка. Создание нового проекта SQL Server выдает то же самое диалоговое
окно Add Database Reference, которое вы уже видели в Server Explorer и в проекте
Database Project, созданная мастером нового проекта структура показана на рис 18.26.
Рис. 18.26. Проект SQL Server
Проект SQL Server поддерживает создание следующих объектов баз данных'
□ хранимые процедуры,
□ триггеры,
□ агрегаты,
□ пользовательские функции;
□ пользовательские типы
В следующих разделах мы рассматриваем создание простой хранимой процедуры.
Создание хранимой процедуры на языке С#
Сначала вы добавляете хранимую процедуру в ваш проект (при помощи использования
меню Project и выбора пункта Add Stored Procedure). В проект будет добавлен новый класс.
В листинге 18 1 показан базовый код, который имеется в файле нового класса. Вы можете
добавить свой код в статическую процедуру UpdateEmployeeLogin
using System;
using Systeir. Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
720
Часть V. Создание промышленных приложений
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void UpdateEmployeeLogin()
{
// Здесь вы можете разместить свой код
}
};
Все объекты управляемого кода (в проекте SQL Server) для выполнения своей работы
используют классы данных .NET Framework (т. е. ADO.NET). Это означает, что написанные
вами хранимые процедуры приведут к созданию и использованию экземпляров таких
классов, как SqlConnection и SqlCommand. Код, который вы пишете, идентичен коду доступа к
данным, который вы писали бы в любом другом типе проекта .NET: библиотеке классов,
Web-проекте или проекте Windows-форм. Поскольку общим знаменателем является
использование классов ADO.NET, то разработчикам не нужно изучать других языков (вроде Т-
SQL) для работы с базой данных.
Примечание
В задачи данной главы не входит рассмотрение преимуществ и недостатков
написания объектов баз данных на управляемом языке по сравнению с T-SQL. Обратитесь к
докладу фирмы Microsoft с названием "Using CLR Integration in SQL Server 2005",
который имеется в MSDN. Несмотря на то, что он достаточно старый (написан в ноябре
2004 года), в нем хорошо изложена данная тема, и мы настоятельно рекомендуем его
прочитать.
В листинге 18.2 показана процедура на языке С#, которая обновит таблицу Employee базы
данных AdventureWorks информацией для входа в систему. Этот код несложен и понятен
для любого, у кого есть опыт доступа к данным при помощи языка С#.
. Листинг 14МЁ, Управляемый ко&дгш обпшпвшттнфщт^щ^гш шжощш систему
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void UpdateEmployeeLogin(Sqllnt32 employeeld,
Sqllnt32 managerld, SqlString loginld, SqlString title,
SqlDateTime hireDate, SqlBoolean currentFlag)
Глава 18. Работа с базами данных 721
{
using (SqlConnection conn = new SqlConnection("context connection=true"))
{
SqlCoinmand UpdateEmployeeLoginCoramand = new SqlCoramand();
UpdateEmployeeLoginCoramand. CoinmandText =
"update HumanResources.Employee SET Managerld = " +
managerld.ToStringO +
", Loginld = '" + loginld.ToStringO + "'" +
", Title = ,M + title.ToStringO + ",M +
", HireDate = •" + hireDate.ToStringO + "'" +
", CurrentFlag = " + currentFlag.ToString() +
" WHERE Employeeld = " + employeeld.ToString();
UpdateEmployeeLoginCommand.Connection = conn;
conn.Open();
UpdateEmployeeLoginCommand.ExecuteNonQuery();
conn.Close();
}
}
};
Одна строка кода заслуживает более подробного объяснения. Объект SqlConnection
создается следующим образом:
SqlConnection conn = new SqlConnection("context connection=true")
Строка подключения "context connection=true" говорит движку провайдеров данных о
том, что подключение должно быть создано в том же контексте, что и вызывающее
приложение. Поскольку эта процедура будет работать внутри базы данных, то это означает, что
вы будете и подключаться к базе данных хоста в контексте (транзакционном и прочем)
вызывающего приложения, и работать в нем. Поэтому вам не нужно жестко прописывать здесь
полностью всю строку подключения SQL.
Для сравнения в листинге 18.3 показан тот же самый запрос обновления на языке T-SQL.
ALTER PROCEDURE [HumanResources].[uspUpdateEmployeeLogin]
GEmployeelD [int],
@ManagerID [int],
@LoginID [nvarchar]B56),
@Title [nvarchar]E0),
@HireDate [datetime],
@CurrentFlag [dbo].[Flag]
722
Часть У. Создание промышленных приложений
WITH EXECUTE AS CALLER
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
UPDATE [HumanResources] . [Employee]
SET [ManagerlD] = @ManagerID
,[LoginID] = @LoginID
,[Title] = @Title
,[HireDate] = @HireDate
,[CurrentFlag] = @CurrentFlag
WHERE [EmployeelD] = @EmployeeID;
END TRY
BEGIN CATCH
EXECUTE [dbo].[uspLogError];
END CATCH;
END;
Создание и развертывание хранимых процедур
Когда вы делаете сборку проекта SQL Server, то происходит обычная компиляция. Если
сборка прошла успешно, то вы можете поместить полученную сборку в базу данных. Для
доступа к команде Deploy используйте меню Build.
После размещения сборки вы можете ее протестировать — для этого нужно вызвать ее из
приложения или из окна запроса. За подробной информацией по вызову управляемых
сборок и их созданию обращайтесь к системе документации SQL Server Books Online.
Привязка элементов управления к данным
Теперь вы видели все возможные способы использования Visual Studio для создания и
управления базами данных. В следующих разделах рассматриваются инструменты, которые
можно применять для получения данных в формах Windows и Web-приложениях.
Введение в привязку данных
Приложения, которые работают с базами данных, имеют одну общую проблему и
соответствующую ей схему решения. Обычно данные необходимо выбрать из базы данных в
приложение, а пользовательский интерфейс приложения должен быть обновлен для
соответствующего отображения данных. Для больших баз данных на сцену выступает концепция
разбивки на страницы. Поскольку неэффективно загружать набор данных размером скажем
в 100 Мбайт, то необходимо использовать механизм разбивки на страницы (для того чтобы
пользователь мог перемещаться взад и вперед по "потоку" данных). После того как данные
Глава 18. Работа с базами данных
723
благополучно доберутся до пользовательского интерфейса приложения, необходимо
заняться движением данных от приложения к базе данных. Любые изменения в данных должны
быть согласованы и зафиксированы в базе данных.
Привязка данных — это термин для реализации проектной схемы, которая обрабатывает все
аспекты этого цикла обработки данных, начиная от структуры данных до элементов
управления приложения и обратно (рис. 18.27). Несмотря на то, что структура данных — это чаще
всего база данных, она может быть также контейнерным объектом любого типа (таким как
массив или коллекция). .NET производит дальнейшее разделение концепции привязки
данных на простую и сложную привязку данных. Оба этих термина относятся к внутренним
возможностям элемента управления в более широком контексте процесса привязки данных.
ЕЗойюп (qjT|
ttarol
item 2
Ittro 3
^
to Memory
Date Storage
WT
Upd
Del
-
•-
ReconJ
Record
fl»oorj
Retcord
Record
Рис. 18.27. Процесс привязки данных
Простая привязка данных
Простая привязка данных — это способность элемента управления привязаться к
единственному элементу данных из большого набора данных и отобразить его. Элемент
управления TextBox является отличным примером часто используемого при простой привязке
данных элемента. Например, вы можете использовать TextBox для отображения фамилии
служащего в том виде, в каком она хранится в таблице служащих внутри базы данных.
Поддержка простой привязки данных имеется в элементах управления как форм Windows,
так и Web-форм. Когда вы используете встроенные возможности визуального конструктора
Windows and Web Forms Designer, то добавить группу элементов управления на форму и
сделать простую их привязку к набору данных очень просто (об этом чуть позже).
Сложная привязка данных
Термин "сложная привязка данных" относится к способности элемента управления
отображать одновременно множество элементов данных. Вы можете считать это способностью к
724
Часть V. Создание промышленных приложений
"многострочности": если элемент управления можно использовать для просмотра
множества строк данных одновременно, то он поддерживает сложную привязку данных.
Элементы управления DataGridView (для форм Windows) и DataGrid (для Web-форм) —
это основные примеры элементов управления, которые были созданы специально для
обработки табличных (многострочных и многостолбцовых) данных.
Внутренние механизмы реализации привязки данных запутанны, сложны и трудны для
понимания, однако по большей части инструментам Visual Studio удалось абстрагировать
реализацию привязки данных до уровня приятного и простого процесса перетаскивания.
Давайте же теперь рассмотрим, как быстро создать поддержку привязки данных.
Автоматическое генерирование привязанных элементов
управления Windows Forms
Несмотря на то, что в Visual Studio существуют различные способы реализации
привязанных к данным элементов управления, все они содержат одни и те же два шага:
1. Определить источник данных.
2. Установить соответствие между членами источника данных и элементами управления
(или их свойствами).
После этого визуальные конструкторы Form Designers могут генерировать правильные
элементы управления и размещать их на форме. Для вас создается весь код привязки данных;
все, о чем вам нужно позаботиться, — это компоновка, позиционирование и аспекты
пользовательского интерфейса элементов управления.
Ваша форма может иметь элементы управления, которые используют простую или сложную
привязку данных (либо и ту, и другую одновременно). Теперь вы готовы изучить шаги
создания элементов управления, в которых будет использоваться и простая, и сложная привязка
данных для отображения информации из таблицы Employee базы данных AdventureWorks.
В этом примере вы будете работать с визуальным конструктором для Windows Forms.
Визуальный конструктор для Web Forms в ASP.NET работает аналогично, и через некоторое время
вам представится случай изучить привязку данных (при помощи обычного перетаскивания) и в
Web-среде. Как мы уже упоминали, первым шагом является выбор источника данных.
Выбор источника данных
Убедитесь в Visual Studio, что вы работаете в проекте Windows Application, после чего
используйте окно Data Sources для выбора источника данных. Если это окно не видно, то в
меню Data интегрированной среды разработки выберите пункт Show Data Sources. Если в
вашем проекте нет ни одного определения источника данных, то вам нужно будет его
создать. Нажмите кнопку Add New Data Source на панели инструментов окна для запуска
мастера Data Source Configuration Wizard. На первой странице этого мастера (рис. 18.28)
выберите тип источника данных. Здесь есть три варианта:
□ Database — источник данных является таблицей в реляционной базе данных;
□ Web Service — источник данных является Web-сервисом, который будет выдавать
данные, привязываемые к элементам управления формы;
Глава 18. Работа с базами данных
725
□ Object— источник данных является объектом, который будет обеспечивать данные
(это полезно в тех случаях, когда за поставку данных в форму отвечает бизнес-объект из
другого слоя приложения).
Data Source Configurator Wizatd
J Choosa a Data Source Type
;4§P
ДОете *■ the appBcatfen get tab from?
II * ik
i Ш2Ш9 Web Service Object
Lets you connect to • databese and choose the database objects f o? your
Г'
[ Mextv
ippficatron This
_J
option
'
ULUS^^
creates a dataset
Cent** | |
Рис. 18.28. Выбор типа источника данных
Поскольку концепции привязки данных легче всего понять в контексте базы данных, то мы
в данной главе будем использовать в качестве типа источника данных именно базу данных.
I ft Щ3^~
Data Source Configuration Witard
*-fc
Choose Your Data Connection
Whkh deb connection should yourappfcaHon me to connect to the database?
«с -. «.<?„< i .hi* „ r '/', -. 'П.
О Connection jtrmg
Data Source=flvl;InrtM( Catelo5=AdventureWorb;lntegrated Secunty=True
I <£пмем ' Й«Л>
New Connection».
Рис. 18.29. Выбор подключения
726
Часть V. Создание промышленных приложений
Если вы выбрали тип Database источника данных, то на второй странице мастера
производится выбор подключения для базы данных. Здесь в раскрывающемся списке будут по умолчанию
показаны все ранее установленные подключения как для других источников данных, так и для
использования в Server Explorer (рис. 18.29). У вас также есть возможность указать новое
подключение. Если строка подключения к базе данных имеет такую конфиденциальную
информацию, как пароль пользователя, то вы можете исключить его из строки.
Следующий шаг мастера позволяет вам сохранить информацию строки подключения в
локальный файл конфигурации вашего приложения. Сохранение этой информации обычно
является хорошей идеей, поскольку это позволяет вам при необходимости модифицировать
строку (например, при изменении базы данных). Однако необходимо соблюдать
осторожность в том случае, если вы решили сохранить в строке конфиденциальную информацию
(см. описание предыдущей страницы мастера).
На последней странице мастера (рис. 18.30) вы указываете, какой из объектов базы данных
должен использоваться как источник данных. Вы можете выбрать любой элемент данных,
имеющийся в любой таблице, представлении, хранимой процедуре или пользовательской
функции базы данных. Для нашего примера выберите из таблицы служащих несколько
интересующих нас столбцов данных: Employee ID, Title, BirthDate, Gender, HireDate и Modi-
fiedDate.
После завершения работы мастера ваш источник данных будет виден в окне Data Sources
(рис. 18.31).
Примечание
"За кулисами" Visual Studio использует собранную в мастере Data Source Configuration
Wizard информацию для создания типизированного набора данных. Этот набор
данных затем хранится в текущем проекте как элемент проекта.
Dale Source Configuration Wizard
I Choost Your Database Objaxti
' It, 4;
jVhich database objects do you флтЛ. ir> your dataset?
■ T3 Employee (HuminResources)
i^ill EmployeelD
[ D WrtJonallDNumber
V2 CcntactlD
\L 3 LoginID
i 3 ManagerlD
Г 3 Title
( „Zl BirthDate
( ' 2 MantalStatus
l_ j3 Gender
k Л HireDate
H~ ID SalariedFlag
L, 13 VacationHours
( s jH SickLeaveHcuri
, 3 CurrentFlag
W* J rov»guid
r —1 . . . ,
QataSet name
4dventureWorlcsEmployeef>ataSet
< £f&vtaus '
,«_yyi
' '
Finish Cancel
Рис. 18.30. Выбор объектов источника данных
Глава 18. Работа с базами данных
727
Data Sources |£g
| Ы ълЗ AdventureWorksEmployeeDataSet
| {ш EmployedD
У («ы LoginID
I IS HireDate
| jabf rowgutd
I 1$ BirlhDate
I 0 SalariedFlag
Л f«M VacationHours
I [abl SIckLeaveHours
0 CurrerrtFlag
Рис. 18.31. Окно Data Sources
Теперь вы готовы перейти к следующему шагу: установлению соответствия между
элементами источника данных и элементами управления вашей формы.
Установление соответствия между источниками данных
и элементами управления
Для того чтобы действительно легко и быстро создать привязанные к данным элементы
управления, нужно позволить Visual Studio сделать это за вас. В окне Data Sources нажмите
кнопку раскрывающегося списка возле имени источника данных (для того чтобы получить
меню — рис. 18.32). г
Data Sources
1 dffaVj ifc
m
p 3 \sM AdventureWorksEmptayeeDataSet j|
Rt^BBSBB3Li!„.._.
1 jj^j DataGridView
Щ °**h
1 ф [None]
i | Customize...
L \wjm^mim*my*
i yiblj VacationHours
К >bi] SickLeaveHours
| 0 CurrentFlag
i
!
i
Рис. 18.32. Изменение соответствия таблицы данных
Это меню позволяет вам настроить параметры генерирования элементов управления, а
также отвечает на вопрос: какие элементы управления вы хотите сгенерировать на основе
таблицы источника данных? Если вы укажете здесь DataGridView, то сможете сгенерировать
элемент управления DataGridView для просмотра и редактирования вашего источника
данных. Настройка Details позволяет вам генерировать последовательности простых
(привязанных к данным) элементов управления для просмотра или редактирования данных в ис-
728
Часть V. Создание промышленных приложений
точнике данных. Для нашего примера выберите Details, а затем перетащите сам источник
данных из окна Data Sources на пустую форму.
V» Adventur-WoricjDB - Microsoft Vssuai $tudto^
| Fife Edit Jfcv» Project guild Eebug Ojta loots Vgirtdow fcfelp
. $:^\9 Ц#. > p : *.....*-r - irj 4 Lit"9 .
j "ji ^ j ;- ' < [r-1 '& \ „ ;-> j*> *f Ф
«Jfc**-* .... ^
it
Any CPU
ь ;'~>
■. a!] AdventureWottaDataSet
•Ы EmployeelD
•M NationafJDNumber
•bf CcntactK)
«ы LoginID
•ы, ManagerlD
-•EL T,tle
-g| BirthDale
ч»ы- MaritalStatus
•M Gender
•"? HrreDate
0 SatwiedFlag
i«bi t/acatronHcun,
"•Ы SickLeaveHourc
[3 CunrntFtag
•ы- rowgiiid
■»* ModrfiedDate
!♦, ^ Employee
JJ Data Sources ^Тв«1Ь«яГГ
hem(s) Saved
! *sf ftlrmt
N * о
of{0} ►
BnpfayeelD 0
ftataial iDnurrcw «
Contact ID ■
.LogmlO ■
Manager ID i
Ttte i
"arthDate •
. Mafltal Status '
Gender
Hk%0ote ■
» '
• Tuetday
_, ^
i Tuesday
I e Ш1 Si s*
►I -fr X У
"-
December 18 2037
December 18 2007
. - ш
iL ,
0
>r,
■
, T
■
- ,-p-!
. ?
■
Ф'
. ■
!>■
&'
m
~ ф'
■
Q-«
«■■
д£ aoVentureWorksDataSet '-i'employeefirndingSeurce
i *J «TfiployeelableAaaptsr >r i^ table AdapterManager
Рис. 18.33. Автоматически сгенерированные
элементы управления' просмотр данных о служащих
fBFiS
Ed« £dit V«w firojecf guild JJebug Dit* Format Toots Tfifmdow ttelp
Oat» Soutt«a.
SrvtAiHU'i-ShrfUSJ
. j?J AdvwtureWefVsDataSet
j jj Employee [V]
«Ы EmployeelD
•Ы NationallDNumber
<tf* CcntacdD
-•Ы LoginID
>W ManagerlD
•M Title
""* BirthDate
•bt MarrtafStatin
,tf4 Gender
^ HtreDate
0 Salaried Flag
•W VacationHours
•Й SrekLeaveHcurs
[v] CurrentFlag
<|Ы' rowgurd
|| ModiftedDate
t*j 'j|J Employee
FoffflZxs (Deogn);
"^ШШ
И ^ 0
oMO) ► И
X У
c>S adve ntureWorksOaUSet -iy errployeefi indmgSoti rce
^«n»ployeeT«bleAd*plef jr 23tableAdapttrMan*ger
Рис. 18.34. Автоматически сгенерированный DataG rid View
Глава 18. Работа с базами данных
729
Результаты показаны на рис. 18.33. За два простых шага Visual Studio сделала для вас
следующее:
□ автоматически сгенерировала набор элементов управления Label, TextBox и DateTime-
Picker;
□ автоматически сгенерировала панель инструментов с элементами управления для:
навигации между записями источника данных; сохранения изменений, произведенных в
записи; удаления записи, а также вставки новой записи;
□ создала "за кулисами" весь необходимый выделенный код для: установления
подключения к источнику данных; чтения из источника данных, а также фиксации изменений в
источнике данных.
По существу вы без всякого кодирования создали с нуля целое приложение для работы с
данными.
Использование простой привязки данных может плохо сочетаться с требованиями к дизайну
пользовательского интерфейса, поэтому вы всегда можете начать работать со сложной
привязкой данных (с помощью DataGridView). На рис. 18.34 показан результат
автоматического генерирования экземпляра DataGridView (при помощи того же самого процесса).
Настройка соответствий источников данных
Вернемся еще раз к рис. 18.31 и рассмотрим отдельные элементы данных, которые видны в
источнике данных Employee. Каждый из них отображается с именем и значком. Имя — это
название элемента данных (как оно определено в базе данных).
Environment
Projects and Solutions
Source Control
Tea Editor
Database Tools
Debugging
Device Tools
HTML Designer
Office Tools
Tr*t Trmplating
Windows Forms Designer
General
D»t4 Ul Customization
Workflow Designer
Datatype
Associated controls»
IT) CheckBox (default)
[ =/] RadroButton
.Vj ComboBox
1 Textfl ox
Vj Label
J Chart
П CheckedListBox
] DateTimePicfcer
_J DomainUpDown
~j Image
{Line
rJ LinfcLabel
Г J Let
SlearDefewft
Lr-лт how to edd cjjstem controls _.
Рис. 18.35. Настройка соответствий между данными и элементами управления
Значок указывает соответствие по умолчанию этого типа данных элементу управления
.NET. Например, полю Title соответствует элемент управления TextBox, а полю BirthDate
соответствует элемент управления DateTimePicker. Visual Studio старается, обеспечить
самый лучший элемент управления для каждого типа данных. Но вы можете вручную указать
730
Часть V. Создание промышленных приложений
конкретный элемент управления, который вы хотите использовать. Если вы хотите
отображать значение столбца Employee ID в метке, а не в текстовом поле (чтобы подчеркнуть тот
факт, что вы не можете редактировать это значение), то это будет совсем несложно
изменить перед генерированием элементов управления. Для этого нужно выделить столбец
Employee ID в окне Data Sources, а затем щелкнуть по стрелке раскрывающегося списка и
выбрать Label (вместо TextBox).
Кроме изменения соответствий между типами данных и элементами управления в каждом
отдельном случае вы можете также изменить общие соответствия по умолчанию — для
этого надо выбрать вариант Customize в этом же выпадающем меню. После этого появится
диалоговое окно Options интегрированной среды с выбранной страницей Windows Forms
Designer. Используя имеющиеся здесь настройки (рис. 18.35), вы можете указать для
каждого типа данных тот тип элемента управления, который вы хотите применять по умолчанию.
Редактирование типизированных наборов данных
В Visual Studio имеется визуальный конструктор, предназначенный исключительно для
редактирования (и создания) типизированных наборов данных: это DataSet Designer. Этот
визуальный конструктор запускается автоматически тогда, когда вы открываете элемент
проекта DataSet (такой как файл AdventureWorksEmployeeDataSet.xsd, который мы только
что создали при исследовании привязки данных).
Примечание
Типизированные объекты DataSet могут очень существенно повысить
производительность по сравнению с нормальными наборами данных: вместо использования
индексов коллекций вы можете ссылаться на таблицы и столбцы по их реальным именам.
Кроме того, технология IntelliSense работает с членами типизированных DataSet, что
значительно облегчает кодирование больших иерархических объектов данных.
Конструктор DataSet Designer можно легко использовать для настройки наборов данных
(путем изменения любых их компонентов, в том числе и запросов для заполнения
наборов данных). На рис. 18.36 показан открытый в DataSet Designer созданный ранее
Adventure WorksEmployeeDataSet.
Обратите внимание, что здесь визуально представлен каждый элемент набора данных и для
выполнения изменений мы можем взаимодействовать с этими элементами. Например, если мы
хотим изменить запрос, который изначально создали при помощи мастера Data Set Configuration
Wizard, то мы должны просто щелкнуть правой кнопкой мыши по таблице Employee на
поверхности конструирования и выбрать Configure для повторного запуска редактора запросов.
В обсуждаемом нами сценарии мы подключаем набор данных напрямую к результатам
запроса SQL — но мы также можем использовать конструктор DataSet Designer для создания
новых, "непривязанных" наборов данных. Добавление элемента проекта DataSet в наш
проект позволит нам начать с чистого листа, добавляя в набор данных таблицы, запросы и т. п.
для удовлетворения потребностей нашего приложения в данных. Это особенно полезно для
тех приложений, которые читают и пишут данные, но не обязательно взаимодействуют с
базой данных. Такие файлы наборов данных могут использоваться как простой способ
хранения. Затем они могут быть легко привязаны к реляционной базе данных.
Глава 18. Работа с базами данных
731
<S> AJv«rtureWc-fcsDB - Microsoft V sua! Studio
file Edit View grojert guild
Tec-bos -г Д X }
J DaUSet _ __
^ Pointer ',\
^J, TableAdepter i
Ф Query
,^} DataTable
•tj Relation .
.z! General '
There are no usable controls
in this group Drag an item !
onto this tr*t to add it to the
tool bo*. >
fiebug Da.u loots Window Jjeip
*} - • * I.. - J! ► Debug
AdventiireWoriuFmployreDataSetjrcd
- Any CPU
- I»
«<шааайй~
EmployeelD
NationaQDNumber
ContactID
LogtnID
ManagerlD
Title
BtrthDate
MantalStatus
Gender
HireDate
SalariedFlag
VscattonHours
\Ш FiltGetDateO
Ready
Рис. 18.36. Конструктор DataSet Designer в Visual Studio
Ручная привязка элементов управления
Windows Forms
Будет много таких ситуаций, когда вы не захотите, чтобы Visual Studio создавала для вас
привязанные к данным элементы управления, либо вам может понадобиться привязать к
источнику данных уже существующие элементы управления. Привязка данных в этих
случаях— точно такая же простая задача, которая начинается с того же самого шага: создание
или выбор источника данных. Некоторые элементы управления (такие как DataG rid View)
имеют смарт-теги для выбора источника данных. Другие не имеют встроенных диалоговых
окон для выбора данных, но могут быть так же легко привязаны к данным при помощи окна
Data Sources.
Привязка DataGridView
Захватите в панели Toolbox элемент управления DataGridView и перетащите его на
поверхность формы. После создания элемента управления выделите глиф его смарт-тега и
используйте раскрывающийся список в верхней части списка задач для выбора источника
данных, к которому вы будете привязываться (рис. 18.37).
После того как вы выберете источник данных, вы опять получите полнофункциональное
приложение, имеющее двухсторонний доступ к базе данных. Весь код для заполнения сетки
и для сохранения изменений в базу данных был написан для вас интегрированной средой
разработки.
732
Часть V. Создание промышленных приложений
File fdft Jpew Project
^ * _J • &r У dP j #
Tcolbo* ■» J
■ AflWedowiForo»
guild
<4l
Djebug Data Format Tocrs Window Help
, ^-i" > ;]- > Debug - Any CPU
I rdi ** * Л ^ ♦£ '* л}* &♦ >*** < "^ '-И
Form2.cs (Design)*
^ Pointer
^ BackgroundWcrker
?yi BindingNavigator
£*/ BindmgSource
(*b) Button
E3 ChetkBox
i*j Chr^edlistBox
'«j ColorDiatog
ff ComboBox
^ ContertMenuStnp
>J DataGridView
^ DataSet
Тл| DateTimePiclcet
~tt\ DirectoryEntry
4^, DirectorySearcher
%3 DomainUpDown
О ErrorProvtder
^ EventLog
4,5 FileSyrtemWitcher
Read)
p*»^
ffOabGridViewTiel»
Choose Data Source
fj) \J «nployeeBindingScurce
U jj Other Data Sources
~ *•$ Project Data Sources
- ia3 AdventureWorksDataSet
Щ fc'np oy«*
+< ^ Fermi List Instances
j Add Psoject D.»ta jou'ce
Selecting a project data source creates an
instance on the form and binds to it throu
RS
aj adventureWcrksDataSet V employeeBin JingScjrce
У» er*ployeerableAdaptet jLj lab-ieAriaptef Menage
Рис. 18.37. Выбор источника данных для DataGridView
Настройка редактирования ячеек
Мощь DataGridView состоит в его способности быстро привязаться к данным и отобразить их
в табличном формате, а также в обеспечении хорошо настраиваемых возможностей
редактирования. В качестве небольшого примера возможностей редактирования ячеек рассмотрим
таблицу Employee. Когда вы автоматически сгенерировали элементы управления формы для
редактирования таблицы Employee, то получили элемент DateTimePicker для данных дат и
времени этой таблицы. В элементе DataGridView редактирование ячеек выполняется как
простое текстовое редактирование: каждая ячейка содержит текст, и вы можете редактировать
текст и сохранять его в базе данных. Но вы можете предоставить и более специализированные
возможности редактирования. Вы можете использовать различные готовые элементы
управления (такие как DataGridViewButtonColumn, DataGridViewComboBoxColumn, а также
прочие, наследующие от DataGridViewColumn; см. главу 15) для отображения данных в столбцах
сетки.
Например, вы можете использовать класс DataGridViewComboBoxColumn для
редактирования столбца Gender при помощи выпадающего списка. Для этого вам нужно сначала
изменить тип столбца по умолчанию. Выберите сетку, откройте глиф смарт-тега и выберите
действие Edit Columns. В диалоговом окне Edit Columns найдите столбец данных с полом
служащего и измените тип столбца на dataGridViewComboBoxColumn (рис. 18.38).
После изменения типа столбца вам нужно указать, как сетка должна получать возможные
значения для отображения в раскрывающемся списке; сетка достаточно интеллектуальна
для того, чтобы использовать уже имеющиеся в таблице значения пола. Вы можете жестко
закодировать возможные значения в столбце (см. свойство Items на рис. 18.38), либо вы
Глава 18. Работа с базами данных
733
можете приспособить отдельный запрос (нечто вроде select distinct (Gender) from
Employees) — чтобы он выдал вам список возможных значений. Поскольку
конструирование дополнительного запроса или источника данных несложно и не приводит к ненадежным
вариантам с жестким кодированием, то именно такой подход мы и будем здесь изучать.
Чтобы создать запрос для заполнения столбца поля со списком, вы можете зайти в окно
Data Sources, выбрать действие Add New Data Source и выполнить все те же шаги, которые
вы выполняли ранее для добавления источника данных Employee. На этот раз выберите
только столбец Gender.
Selected Columns;
ibij EtrpbyeelD
•MJ NatisnadDNunber
•bj! ContactID
•M loginID
i «И ManagerlD
Щ Title
■ы| BirtbDate
i«bii MaritalStatus
•Ы! H.reDate
0 SelanedFlag
• »ы Vacation Hours
A
*
"
I *1
&dd..
Bemove
Bound Column Properties
E3*H
DataSource
DrsplayK4ember
Items
VslueMember
, (Name)
(none) *
(none!
[Collection}
(none)
dataGndVfewTeytBoxCclkjm
DataGndYiewComboBoxCol к
JUyout
■< AutoSceMode
: DividerWidth
NotSet
0
; СЫшппТуре
The DataGfidViewColumn type
Рис. 18.38. Изменение типа столбца
После создания источника данных щелкните его правой кнопкой мыши и выберите пункт
Edit DataSet with Designer. Для модификации нашего запроса мы будем использовать
визуальный конструктор DataSet Designer. В визуальном конструкторе (рис. 18.39) вы видите
запрос Fill и TableAdapter, используемый для заполнения набора данных. Если вы
щелкнете запрос (т. е. щелкнете последнюю строку таблицы в окне конструктора), то увидите окно
Properties, в котором можно напрямую редактировать SQL запроса. Внеся сюда
соответствующий код вроде select distinct, вы сможете получить допустимые значения пола для
включения их в сетку.
Результаты наших трудов показаны на рис. 18.40. Если вам нужно реализовать такой
элемент управления для редактирования в ячейке, который пока не существует, то вы можете
создать свой собственный — для этого нужно наследовать от базового элемента управления
DataGridViewColumn. Этой сетке для показа служащих очень пригодился бы элемент
управления DateTimePicker для данных даты и времени (таких как дата рождения и дата
найма).
Примечание
Если вы заглянете в документацию MSDN, то там имеется конкретный пример
создания элемента управления DataGridViewDateTimePickerColumn и подключения его к
сетке. Ищите по фразе "How to: Host Controls in Windows Forms DataGridView Cells".
734
Часть V. Создание промышленных приложений
* Ad**ntUTeWori«0E Microsoft Mamf S.todx>
Щ$
1^1Ш
fife Edit itew Erojeet fiuild fiebug Data Ioolv Window t|dp
JD-^-^fclflPU^Jal4' • ♦ • ' ► Debug
Ready
«- Any CPU
Fie Query
' a
CommandType
ExecuteMade
FtflMethodModTfier
FillMethodName
GenerateMethods
GetMrt hod Modifier
GetMethodName
Parameters
''* X A
SELEa DISTlNCTCGendefl „J
Tert Г
Reader —
Public
m
Beth
Public
GetData
(Collection)
CommandText
The query or stored procedure to be executed against
the Database
Рис. 18.39. Изменение запроса для источника данных
<з* F«m2
| И * 2
I I'D
I pure-works
I ► Jure works
ft tune-woks
Щ jtunnArodc*
I lure-works
I hrs-works
I Jureworks
1 ture-wotks
I jturv-woricc
■ J'!lilHHia»
of290 > H J- X У
TUe BothDate
" Production Tech 5/15/1972
.Marketong Assistant S/3/1977
Enojneemg Man 12У111Э64
Senior Tool Deal 1/23/1965
ToolDe*onw 8/29/1949
.Markehng Manager Vl9/1965
Prcductlon Super 2'16/1946
• Production Tech 7/ЕЛ946
'OeaignEnojrw 10/79/1942
Marital Status
M
S
M
'S
M
1s
!s
IM
Im
i«:
Gender
I"
m
M
И
M
M
F
F
F
ацд
F
▼
»
-
-
•
*
^
rtre «1
7/31
Z'2£
12/1
1/5/
I'll
1/2U
1/26
2/6/
2'Б/ J
► J
Рис. 18.40. Раскрывающийся список в DataGridView
Привязка других элементов управления
Для других элементов управления (которые не имеют удобного доступа к привязке при
помощи своего смарт-тега) вы можете использовать окно Data Sources. Перетащите источник
данных из окна Data Sources на существующий элемент управления. Визуальный
конструктор создаст новый источник для привязки, настроит его соответствующим образом, а затем
сделает запись в коллекции DataBinding данного элемента управления. Если вы
попытаетесь перетащить элемент данных на такой элемент управления, который ему не
соответствует (например, перетаскивание символьного поля на флажок), то операция перетаскивания не
будет разрешена.
Глава 18. Работа с базами данных
735
Привязка данных к элементам управления Web
Несмотря на то, что общие концепции сохраняются, привязка данных к Web-элементам
управления несколько отличается от того, что происходит в мире форм Windows. Первое
очевидное отличие состоит в том, что источники данных для Web-форм реализованы
элементами управления источником данных в пространстве имен
System.Web.ul.WebControls; для Web-приложений не существует концепции окна
Data Sources. Поэтому вместо того, чтобы начинать с источника данных, вам придется
начинать с элемента управления данными, а затем прикреплять этот элемент управления к
источнику данных.
Выбор элемента управления данными
Существует пять основных элементов управления, с которыми вы будете работать в Web-
приложении для обеспечения функциональности привязки данных:
□ GridView — дает табличное представление, аналогичное элементу управления
DataGridView;
□ DetailsView— отображает единственную запись из источника данных; при помощи
элемента управления DetailsView каждый столбец в источнике данных будет виден как
строка в элементе управления;
□ FormView — работает так же, как и элемент управления DetailsView, за следующим
исключением: в нем нет встроенного способа по умолчанию для отображения данных.
Вместо него вам придется предоставить шаблон, который точно укажет элементу
управления, как вы хотите визуализировать данные на Web-странице;
□ Repeater — просто визуализирует список отдельных элементов, полученных из
прикрепленного источника данных. Детали этой визуализации определяются шаблонами;
□ DataList— отображает строки информации из источника данных. Детали отображения
полностью настраиваются и имеют верхний и нижний колонтитулы.
В демонстрационных целях мы продолжим работать с таблицей служащих базы данных
AdventureWorks и посмотрим, как мы можем реализовать привязанную к данным Web-
страницу для просмотра записей по служащим.
Использование GridView
Сначала в открытом Web-проекте перетащите элемент управления GridView из панели
Toolbox на пустую Web-страницу. Первое, что вы заметите, — это то, что меню смарт-тега
GridView так же удобно, как и меню DataGridView. После того как вы перетащили элемент
управления на поверхность Web-страницы, вы сразу же получаете запрос для выбора (либо
создания и выбора) источника данных (рис. 18.41).
Выбор варианта <New data source...> приведет к появлению аналогичного мастера
источника данных (см. рис. 18.28) для сбора информации по вашему источнику данных и
добавления его в проект.
736
Часть V. Создание промышленных приложений
Поскольку в визуальном конструкторе имеется поддержка привязки данных, то теперь у вас
есть полностью функциональное приложение (и для этого вам не пришлось написать ни
одной строки кода). На рис. 18.42 показана эта (откровенно говоря, уродливая) Web-
страница с оперативными данными о служащих.
LHfef*
Erf* £drt fciew £roj«ct fiuild fiebug Format Table Toots Window H,elp
JP* J>u3 tfj&j * -4 Л "} Г^ ' :•' - ► &*"9 - Any CPU
» -vi J iF ** Ж ~ XHTML 1Л Transition; ■» Щ \ Sjtyle Application: Manual -
<>Sfep4*rd
::j Data
It Painter
j^J GndView
(Ncne)
|li
I ^J DalaLrrt
'/J DetatlsView
;J FormVicw
*~j LirtView
I ", Repeat»
«a» DataPager
jj SqlDataSource
ijp AccessDalaSource
{J} LmqData Source
1$ ObjectDataSource
^ XmlDataSource
!^j SrteMapData Source
Auto Hon»*»..
Choose Dat3 Source; (Monet
Ldit Cokimns
Add New Cc'ur»n„
tan Terpplstes
ft Login
♦' W«br»rte
^jblctfcn Explorer^ ТоогЬсх |
Read/
? Design | a SpJit «D Source 4J <drv> <asp Sndtf esv*<indViewl >
Рис. 18.41. Выбор источника данных для GridView
PUr
v>
£te
\3?
trite*
|d'rt
Ф
Employ
I
2
3
4
5
6
Done
Page - Windows internet h&wtt
|# httfr//localhosL527SS/
&., Шм,Ж
Й'-ед* favorites Tools йеф
^UntvflfdPsge
eelD Tide
Producbon
Technician -
WC6G
Marketing
Assistant
Engineering
Manager
Senior Tool
Designer
Tool Designer
Marketing
Manager
Production
BirthDate
515-1972
1200.00
AM
6-3/1977
12Ю000
AM
1213/1964
1200-00
AM
b'23'1965
120000
AM
8'29.'1949
12-00-00
AM
4/19'1965
12.0000
AM
2-16/1946
^
>-
.J
Gender HireDate
M
M
M
M
M
M
~ r-r
--'31 1996
12-0000
AM
2<26'1997
120OO0
AM
12 12'1997
12 0000
AM
1''5-1998
120СНЮ
AM
1/11'1998
12-0000
AM
b'20'1998
12ЧХЮ0
AM
l.'26'199S
- *,|x|W^
ft " 63 " «ж *•
ЫЖкШв'
p -
J^ £age v iji Tgols »
SalariedFlag^ acatto&Hours SickLeaveHoors {
21
42
2
48
! 9
40
*\ Local intranet j Protected Mode On
10
41
2i
80
24
40
-
*U00% "
Рис. 18.42. Записи по служащим в GridView
Глава 18. Работа с базами данных
737
Честно говоря, можно без особого труда навести в этом окне красоту. При помощи меню
смарт-тега GridView вы можете выбрать опцию Auto Format для применения нескольких
видов украшений (рис. 18.43). И конечно, вы можете изменить вид страницы при помощи
применения таблицы стилей.
AutoFonrjt
Select » аФтя. Prew**
Remove Formatting
I дщд
Оик
ism*
, PrafesMnaJ
Autiinn
1 Occ mca
j Brown Sugar
i ^^
| Sand «Sky
Rarty Day
1' 5rto*v P«w
{ Uses h Mst
MBbdc&Bluel
|JB*d(&aue2
1 Oo.tr ftrtd
JArpteOrdwd
Mod*
1
Г
пврмляяпкяяяняшя
■1Ш1ПШ1ДП1МШШ|МиШ
12-18-2007
0 abc 12-00-00 abc
AM
12'1&'20СГ
1 1 abc 12СКЮ0 abc
AM
1248/2007
2 abc 120000 abc
AM
12'18 2007
3 abc 120000 abc
AM
12 1S>2007
4 abc 12-0000 abc
ишяя
12'1B<2007
12O000
AM
12'18'20O7
120000
AM
12'18'2007
12 00-00
AM
1218-200"
12Ю0О0
AM
12/18 200"
120000
ЛшШ
1ШШШПШШШШШВШ1'
ШШЩШЕжшштшШШ
Г 0 0
Р 1 1 И
< 1
Г 2 2 1
1
Р 3 3 j
г 4 4
[ с* 1 1 canori ] 1 йяуу _
Рис. 18.43. Опции автоматического форматирования
для элемента управления GridView
Обновление данных при помощи GridView
Создание сетки было простым и вам даже не понадобилось кодировать доступ к данным.
Однако здесь не хватает одной вещи: как обновить данные в базе данных? Имеющийся у вас
GridView очень хорош для статического отчета, но что если вам понадобится редактировать
данные внутри сетки (точно так же, как вы делали это в приложении Windows Forms)? Ответ
здесь— набор свойств GridView: AutoGenerateEditButton и AutoGenerateDeleteButton.
Когда вы устанавливаете эти свойства в значение True, то GridView автоматически добавит
ссылки Edit и Delete. Ссылка Edit имеет готовый код визуализации, так что при ее нажатии
данная конкретная строка сетки станет редактируемой. На рис. 18.44 обратите внимание,
что после установки свойства AutoGenerateEditButton в значение True и щелчка по одной
из ссылок редактирования вы получаете полностью интерактивный набор столбцов,
которые вы можете использовать для модификации данных в записях.
После изменения данных в одном или нескольких столбцах вы можете нажать ссылку
Update для отправки данных обратно в базу данных. Однако для того чтобы обновление
работало, вам нужно явно указать элементу управления источником данных (в данном случае это
элемент SqIDataSource) тот запрос, который должен использоваться для обработки
обновлений. Это делается при помощи свойства SqlDataSource.UpdateQuery. Указав в этом
свойстве параметризированный запрос update, вы полностью проинформировали источник
данных о том, как нужно обрабатывать обновления. Для написания этого запроса вы можете
еще раз воспользоваться окном Query Builder: выделите элемент управления источником
данных на Web-форме и в окне Properties выберите свойство UpdateQuery. Это приведет к
738
Часть V. Создание промышленных приложений
запуску окна Query Builder и позволит вам сконструировать параметризированную команду
обновления (рис. 18.45).
^ Urtrtled Page - Y/'ndaws Ыеггж* (xpxxtr * ^ ^
\ л i \p http-//toc#tho$t62755/Default.aspx
v~/ 4~*" .-л*.,.
filt J-tfai itfew Ftvortte loolsr £|ф
w Ji" $ Untitled Pag*
*& w Ш ш П w i.
. ^HQl)
P J
J- gage т J Taol* " V>
Edit Delete 1
Edit Delete 2
EdilDekte 3
Edit Defete 4
Edit Delete 5
Production 5 15 1972 7 31 1996
Technician- 12 0000 M 120000
WC60 AM AM
Matketnig
Assistant
63-1977 2 26499"
12 00.00 M 12 00 00
AM AM
12'' 13/1964
logmen* 120000
Manager
Senior Tool
Design»
1 2V1965
12 0000
AM
8 29'1949
Tool Designer 1200.00
AM
Marketm«
4 19/1965
12124997
M 120000
AM
i'5i°9S
M 12 OOtfO
AM
1411998
M 12 0000
AM
1<20''19Q8
42
48
*fl local intranet | Protected Mode: On
30
%№% »
Рис. 18.44. Редактирование записи в GridView
fritybytb (Ны*»аг>Яе*$к»г ,-j
[ iLoginlD
I JManagerlD
[£ Title
[£j BirthDate
[~?]MafitalStatus
-J
d
Column
BirthDate
MaritalStatus
Table Set New Value
Emplo>'e« "j) ©Birthdate
Employee.. V] ' 8>MarrtalS„
UPDATE HumanResources Emplcye*
SET Title = ©Title, BirthDate = ©Birthdate, MarrtalStatus = ®MarrtalSfcatuj
| Execute Query j
I OK J [ Caned ~)
Рис. 18.45. Указываем запрос UpdateCommand
Глава 18. Работа с базами данных
739
После этого последнего завершающего штриха у вас получился элемент управления "сетка",
который разбивает данные из базы данных на страницы, а также фиксирует изменения в
базе данных.
Примечание
Для реализации возможности удаления записи вы должны выполнить все те же
самые шаги при помощи свойства DeleteQuery и настройки свойства AutoGenerat-
eDeleteButton в значение True.
Элементы управления источниками данных
Как уже упоминалось, источники данных проявляются при помощи элементов управления
источниками данных, которые размещаются на Web-форме. В примере GridView
визуальный конструктор фактически добавляет для вас на форму элемент управления
SqlDataSource (как следствие создания вами нового источника данных на основе базы
данных). Но ничто не мешает вам добавить один или несколько элементов управления
источниками данных непосредственно на Web-страницу. Просто перетащите элемент управления
из панели инструментов Toolbox на поверхность формы. В табл. 18.2 перечислены
имеющиеся элементы управления источниками данных.
После настройки источника данных вы можете перейти к любому способному работать с
данными элементу управления и привязать его к источнику данных.
Таблица 18.2. Элементы управления источниками данных,
Элемент
управления
ObjectDataSource
SqlDataSource
AccessDataSource
XmlDataSource
SiteMapDataSource
Описание
Предоставляет другие классы как источники данных
Предоставляет реляционную базу данных как источник данных Доступ к
базам данных Microsoft SQL Server и Oracle можно получить по "родным"
протоколам; поддерживаются также ODBC и OLE DB
Предоставляет базу данных Microsoft Access как источник данных
Предоставляет XML-файл как источник данных
Специальный источник данных, который предоставляет карту сайта
ASP NET как источник данных
Объектно-реляционная проекция
Большую часть данной главы мы посвятили "стандартному" процессу создания .NET-
приложений, которые читают и пишут данные, находящиеся в базе данных. Несмотря на то,
что Visual Studio и сами библиотеки ADO.NET делают многое для того, чтобы
абстрагировать сложные элементы этого процесса, некоторые проблемы все же остаются. Фактически
существует одна общая проблема, с которой сталкиваются разработчики приложений для
740
Часть V. Создание промышленных приложений
работы с данными: различие между объектно-ориентированной моделью программирования
приложения (реализованной на языках С# или Visual Basic) и реляционной моделью
программирования (реализованной в основном на SQL в базах данных или наборах данных).
В мире объектно-ориентированного программирования мы манипулируем объектами
посредством их методов и свойств, и каждый такой объект может быть (и часто является)
родителем или контейнером для других объектов. Мир реляционных баз данных гораздо
проще: объекты реализованы как таблицы из строк/столбцов и каждая "ячейка" таблицы
содержит простое скалярное значение. Основная проблема состоит в том, что вы должны
менять модель программирования при переходе от работы с внутренней инфраструктурой
приложения к работе с реляционной базой данных (используемой в качестве хранилища
данных приложения). А такой переход является непростой задачей.
Простой пример: строки из таблицы счетов легко выбрать в объект набора данных
(используя уже обсуждавшиеся ранее различные инструменты привязки данных и классы). Но для
получения из набора данных "родного" объекта Invoice потребуется выполнить вручную
двустороннюю трансляцию и обработку (для того чтобы транслировать основные значения
через эту границу объект/реляционность). Так появляется несколько проблем: откажетесь ли
вы от подхода на основе наборов данных и будете читать напрямую из базы данных в
объекты вашего приложения? Воздержитесь ли вы от объектного подхода и попытаетесь
использовать компонент DataSet во всех уровнях вашего приложения? Или лучше
использовать комбинированный подход — поддерживая строго типизированные коллекции объектов
в дополнение к наборам данных?
Й идеале разработчики приложений должны были бы иметь возможность работать с
объектами в объектной модели программы и автоматически сохранять эти объекты и их
изменения в базе данных (при минимальном своем участии). При этом внимание сосредоточено на
основных и хорошо изученных шаблонах конструирования объектов, и, кроме того,
разработчик может работать на своем основном языке программирования (без необходимости
изучать SQL). Реализация этой цели совершенно очевидным образом потребует
стандартизированного подхода и поддержки инструментальными средствами (для установления
соответствия между объектами и их эквивалентами в реляционной базе данных). Именно это
делают инструменты отображения объектности/реляционности.
Термин "объектно-реляционная проекция" (O/R mapping) используется для обозначения
этого общего процесса трансляции объектов в базы данных и обратно. Инструменты
объектно-реляционной проекции присутствуют на рынке уже много лет и (к счастью) фирма
Microsoft, наконец, встроила поддержку этой проекции непосредственно в .NET Framework
и Visual Studio. Эта технология называется LINQ для SQL. Давайте же кратко обсудим
концепцию LINQ для SQL, а затем рассмотрим инструмент Visual Studio — конструктор O/R
Designer, который помогает решать эту задачу.
Обзор LINQ
Как обсуждалось в главе 3, LINQ — это сокращение от Language Integrated Query
(встроенный язык запросов). Это компонент .NET Framework 3.5, который добавляет объектам .NET
способность выполнять запросы типа запросов SQL. Точнее говоря, он расширяет основные
.NET-языки (Visual Basic и С#) и исполняющую среду таким образом, чтобы уничтожить
Глава 18. Работа с базами данных
741
этот барьер между объектом и объектом базы данных. Языки Visual Basic и С#
поддерживают новые операторы запросов, которые работают с объектами аналогично тому, как SQL
работает с таблицами базы данных.
Например, вы можете запросить все объекты утвержденных счетов следующим образом:
var approved = from invoice in invoices
where (invoice.Approved) == true
select invoice;
foreach (Invoice invoice in approved)
{
// Что-то здесь делаем
}
А исполняющая среда имеет поддержку для физической трансляции объектов и методов в
эквивалентные им объекты базы данных (в основном при помощи использования атрибутов
кода, как вы скоро увидите) и обратно. Вот простой пример метода класса,
спроецированного на хранимую процедуру SQL Server:
[Function(Name="HR.uspDeleteEmployee")]
public int uspDeleteEmployee([Parameter(Name="EmployeeID", DbType="Int")]
System.Nullable<int> employeelD)
{
IExecuteResult result = this.ExecuteMethodCall(this,
((Methodlnfo)(Methodlnfo.GetCurrentMethodO)), employeelD);
return ((int)(result.ReturnValue));
}
LINQ имеет несколько разновидностей, причем каждая нацелена на конкретную проблему
проецирования:
□ LINQ to SQL — позволяет вам проецировать объекты на объекты баз данных;
□ LINQ to XML — позволяет вам делать запросы к XML-документам и проецировать
объекты на элементы XML-документов;
□ LINK to Objects — позволяет писать запросы по коллекциям объектов (как в нашем
предыдущем примере с утвержденными счетами).
LINQ — это очень обширная технология и ее подробное описание выходит за рамки данной
книги. Однако мы изучим основной инструмент Visual Studio, который используется для
создания приложений с использованием LINQ для SQL: конструктор O/R Designer.
Проецирование при помощи конструктора O/R Designer
Первый шаг создания приложения LINQ для SQL обычно представляет собой
конструирование объектной модели, которая основана на определении базы данных. Именно это и
является задачей O/R Designer: он позволяет вам выбрать базу данных и сгенерировать объ-
742
Часть V. Создание промышленных приложений
ектную модель, которая соответствует структуре базы данных. В табл. 18.3 показано, как
компоненты базы данных проецируются на компоненты объекта.
Таблица 18.3. Соответствия по умолчанию между базой данных и объектами
База данных
Table
Table Column
Foreign Key Relationship
Stored Procedure/Function
Объект приложения
Class
Class Property
Association
Class Method
Добавление объектов базы данных
Конструктор O/R Designer— это поверхность конструирования для элементов проекта,
которые известны как LINQ to SQL Classes, поэтому первым шагом в использовании
конструктора является добавление в проект нового элемента проекта типа LINQ to SQL Class. На
рис. 18.46 в диалоговом окне Add New Item показано, где находятся эти элементы проекта.
£ategones
Visual С* Items
Code
General
ЛеЬ
Wtndows Forms
WPP
Reporting
Worfcflo*'
Iempletes
i V'cual Sludin installed ten plates
jjJlDataSet
;J Local Database
,J Service-based Database
Л XML Schema
j My Templdies
ч J Search Online Templates
!
\ «ыШ2. Ut!2Lcif!*5.£!J
^Local Database Cache
_*] XML Ftle
J XSLT File
i™0
LINQ to SQL classes mapped to relational objects,
i^amr DataClarsesl.dbml
Рис. 18.46. Добавление элемента типа LINQ to SQL Class
После того как вы выбрали элемент типа LINQ to SQL Class и добавили его в проект, сразу
же запускается визуальный конструктор O/R Designer (рис. 18.47).
Здесь пока ничего нет, поскольку мы не выбрали те объекты базы данных, которые хотим
представить в нашей объектной модели. Для этого нужно использовать второй основной
инструмент для выполнения проецирования — Server Explorer.
Выделив источник данных в Server Explorer, мы можем просто перетащить таблицу на
левую сторону (сторону классов данных) визуального конструктора O/R Designer (рис. 18.48).
Глава 18. Работа с базами данных
743
file £drt yi«v £roject guiW £ebug Data Tcols Window JHelp
ill- -J- ij У *P * 4j * fi - ' * :l * Debug - Any CPU
D.UO*ss«btbr»< Sfe^Jsafl
п:и1Гг -rroU;
■• S<4w t-"/f>loi>T t Ipnlbox / <''
'SfllSL
Rndy
Рис. 18.47. Поверхность конструктора О/R Designer
Ш
AdveoturtWoriaAdrnw - Microsoft Удиа?S)^bJ
file Edit i"«w Erojert fiuild Eebug Data Iools Window jjeip
;J3 ' -J ' Li У tf Л -Л ^ | «0 - * * ;" " ' * D'bug
Any CPU
Employee
"? РгорегЬя
IZ2* tmplcyeeJD
'3* NaJonallDNurnber
Г34 ConiactID
13* LoginID
IS* ManagerD
!f Title
2P Birth Da»e
"?* MantslStatUi
_j Gender
^S* H.reDate
ZT SalariedFlag
!2f Vacation Hours
"*? SickieaveHours
2? CurrentFJag
!2i rowguid
2f ModifiedDate
*1
7Г
лай
Ready
Рис. 18.48. В конструктор О/R Designer добавлен элемент
Несмотря на то, что после перетаскивания таблицы ничего особенного не происходит
(кроме ее появления в конструкторе), на деле были автоматически сгенерированы тысячи строк
744
Часть V. Создание промышленных приложений
кода для реализации такой структуры класса, которая имитирует структуру таблицы. Кроме
того, были реализованы все необходимые атрибуты для того, чтобы ядро LINQ могло
распознать и обработать обновления между объектом класса и строками/столбцами таблицы.
Для создания методов в нашей объектной модели используется точно такой же процесс.
Например, мы можем перетащить хранимую процедуру на правую панель конструктора
(панель методов) для проецирования метода нашей объектной модели на хранимую
процедуру (рис. 18.49).
*S> AfoenforgWorjatAjlpft Miawgoft
Ш31ШШ*
File Edit \fiew Project guild Debug DjU
3* _J'C3aJ & * 1* % «!**•-<
1 ^ DataCbnetLdbnri" J£g|£gg&]
ft
IS.
jjf
i*
: *l i
."ft
Is
I
j
—, -_
Employ** '—'
я Properties
v< ГЭ* EmployeeTO
223* NaticnallDNunber
223* CcntaciID
223* LcgirvID
23* ManagerlD
23* BirthDate
22f WarikalSvaftjs
'23* Gender
d? HireOete
223* SalariedFleg
23Г VacationHouri
223* SickLeaveHoure
23* CuirentHag
223* rowguid
Г? ModifiedDal*
i
!
? »
♦ lit I
|i Rtaty
i.^^S^&rf
loots Window tfelp 1
»- > Debug - Any CPU ' {39 si
ш -* щ
5
' 1
г
1трЛоу*щ j
•=• Pisper
«•«S
*
^H'iOTffl-M'IfflqaiWttto^^
•
;<(""<«"... ►
i& 11
3
11
'lJ
3$ 1
з 1
Рис. 18.49. Метод в конструкторе О/R Designer
Код LINQ
Давайте же подробно изучим, что произошло "за кулисами" в результате перетаскивания из
Server Explorer в конструктор O/R Designer.
Во-первых, в файл app.config (или web.config) автоматически записывается строка
подключения, которая необходима для того, чтобы открыть подключение к выбранной базе данных.
Она будет использоваться LINQ для выполнения вызовов базы данных (по мере
необходимости). Кроме того, был определен новый класс. Вот фрагмент класса Employee, в котором
показан его конструктор:
public Employee()
this._Employees
new EntitySet<Employee>
(new Action<Employee>(this.attach_Employees),
new Action<Employee>(this.detach_Employees));
Глава 18. Работа с базами данных
745
this._Employeel = default(EntityRef<Employee>);
OnCreated() ;
}
Примечание
Визуальный конструктор O/R Designer автоматически приводит имена объектов к
единственному числу. Например, во многих кадровых базах данных имеется таблица
служащих с названием "employees", поскольку она содержит записи более чем об
одном служащем. Для сокращения разночтений между объектной моделью и моделью
данных конструктор O/R Designer создаст класс Employee (а не Employees). Это
гораздо лучше соответствует смыслу класса (который должен содержать единственную
строку таблицы, а не всю таблицу целиком).
Вы видите, что LINQ помечает объектную модель атрибутами для выполнения связывания
объектов и базы данных: при помощи атрибута Table этот класс был идентифицирован как
соответствующий таблице HumanResources.Employee.
Каждый столбец таблицы Employee был также реализован как свойство класса Employee.
Следующий фрагмент показывает свойство EmployeelD:
[Column (Storage=,,_EmployeeID"/ AutoSync=AutoSync.OnInsert,
DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
public int EmployeelD
{
get
{
return this._EmployeeID;
}
set
{
if ((this._EmployeeID != value))
{
this.OnEmployeelDChanging(value);
this.SendPropertyChanging();
this._EmployeeID = value;
this.SendPropertyChanged("EmployeelD");
this.OnEployeelDChanged();
}
}
}
Кроме объекта Employee имеется также код, сгенерированный для контекста данных. Вот
фрагмент определения класса, созданного для нас автоматически:
[System. Data. Linq. Mapping. DatabaseAttribute (Name="AdventureWorks") ]
public partial class DataClasseslDataContext : System.Data.Linq.DataContext
{
746
Часть V. Создание промышленных приложений
private static System.Data.Linq.Mapping.MappingSource mappingSource =
new AttributeMappingSource();
#region Extensibility Method Definitions
partial void OnCreated();
partial void InsertEmployee(Employee instance);
partial void UpdateEmployee(Employee instance);
partial voi'd DeleteEmployee (Employee instance);
#endregion
public DataClasseslDataContext(string connection) :
base(connection, mappingSource)
{
OnCreated();
}
public System.Data.Linq.Table<Employee> Employees
{
get
{
return this.GetTable<Employee>();
}
}
}
Вы можете представлять себе DataContext как менеджер LINQ: он обрабатывает
подключение к базе данных, управляет находящимися в памяти объектами, маршалирует вызовы
для обновлений данных, а также занимается всеми проблемами, которые могут возникнуть
вследствие параллелизма и конфликтов блокировок. Для того чтобы все это работало, было
сгенерировано более 500 строк кода. Итак, как же использовать объект LINQ внутри вашего
приложения? Читайте дальше.
Работаем с объектами LINQ
Цель LINQ — простота: классы LINQ выглядят и ведут себя точно так же, как любые другие
классы нашей объектной модели. Мы можем создать объект нового служащего и настроить
его свойства следующим образом:
Employee emp = new Employee() ;
emp.BirthDate = new DateTimeA965, 4, 4) ;
emp.Gender = 'F';
emp.LoginID = "templogin";
emp.MaritalStatus = 'M1;
emp.Title = "Project Resource Manager";
Глава 18. Работа с базами данных
747
Для сохранения этого нового объекта Employee в таблице Employee нам нужно добавить
этот объект в коллекцию Employees, имеющуюся в нашем контексте данных, а затем
вызвать метод Submitchanges. Помните, что этот тип — это просто имя по умолчанию,
данное нашему классу контекста данных конструктором O/R Designer; мы можем изменить его
на что угодно.
DataClasseslDataContext db = new DataClasseslDataContext();
db.Employees.InsertOnSubmit(emp);
db.SubmitChanges();
Аналогичным образом служащие могут быть удалены из коллекции (а затем и из базы
данных):
db.Employees. DeleteOnSubmit (emp) ;
db.SubmitChanges();
Здесь мы только слегка затронули все сложности разработки приложений при помощи
LINQ. Надеемся, что этот обзор конструктора O/R Designer может послужить стартовой
точкой для ваших исследований объектно-реляционного проецирования в Visual Studio.
Резюме
В этой главе вы прочитали о той обширной поддержке, которая имеется в Visual Studio 2008
для создания и управления базами данных. Мы обсудили имеющийся в интегрированной
среде разработки Visual Studio набор инструментов, которые работают совместно друг с
другом и с различными визуальными конструкторами Visual Studio для того, чтобы
обеспечить возможности написания запросов, создания структур таблиц и составления хранимых
процедур. Мы исследовали также новую поддержку для написания процедур и функций баз
данных SQL Server полностью на управляемом коде.
Мы потратили некоторое время на обсуждение основ привязки данных — почему она
является основной проблемой для многих приложений и как визуальные конструкторы и
элементы управления Web-форм и форм Windows предоставляют первоклассную поддержку
привязки данных (как простой, так и сложной). В частности, мы изучили ту роль, которую
визуальные конструкторы играют в привязке данных, позволяя разработчикам быстро
создавать приложения на основе форм для сложной работы с данными (и без необходимости
писать код вообще).
И наконец, мы изучили встроенную поддержку, которую Visual Studio предоставляет для
проецирования объектной модели на базу данных (при помощи визуального конструктора
O/R Designer и технологии LINQ).
Мы надеемся, что, познакомив вас со всеми этими замечательными встроенными
инструментами, мы показали вам путь повышения эффективности использования Visual Studio при
работе с базами данных.
25 3ак 3716
Глава 19
Ориентированные на сервис приложения
Сервисы трансформировали наше представление об Интернете и о том, как его использовать
для создания программного обеспечения. До сервисов Интернет был в основном средством
размещения кросс-платформенных пользовательских интерфейсов с низкой стоимостью
развертывания. Конечно, это было большим достижением (и остается таким) как для интернет-,
так и для интранет-приложений. Сервисы имеют аналогичный потенциал в плане изменения
способа построения наших приложений (как для Интернета, так и для локальных сетей).
По своей сути сервис представляет собой интерфейс (или набор методов), который является
/'черным ящиком" доступа (при помощи обычных форматов и протоколов) к совместно
используемым функциям. При таким определении сервис должен быть слабо связан со своими
клиентами и работать с пересечением границ. Эти границы в течение длительного времени
мешали применять возможности многократно используемых компонентов приложений
(таких как сервисы). Работая с пересечением таких границ, как процессы, компьютеры, языки
и операционные системы, сервисы могут использоваться многими потенциальными
клиентами сегодняшнего и завтрашнего дня. Visual Studio 2008 и .NET Framework 3.5 позволяют
разработчикам создавать ориентированные на сервис приложения без необходимости
углубляться во внутренние подробности SOAP, HTTP, удаленного взаимодействия и WDSL.
Вместо этого вы можете сосредоточиться на создании сервисов, которые решают ваши
конкретные бизнес-проблемы. После этого вы можете позволить Framework позаботиться о
ваших потребностях (в отношении форматов и протоколов).
В этой главе мы сначала опишем фундаментальные концепции основанных на сервисах
приложений. Затем обсудим две основные технологии сервисов, которые встроены в Visual
Studio: Web-сервисы ASP.NET и Windows Communication Foundation (WCF). Первая из них
позволяет создавать стандартные Web-сервисы, работа которых обеспечивается ASP.NET.
Последняя является новой сервисной инфраструктурой фирмы Microsoft, которая позволяет
вам настраивать хостинг ваших сервисов и доступ к ним. Для каждой из них мы опишем и
создание сервисов, и написание клиентов для их использования.
Фундаментальные основы сервиса
Сервис определяет контракт между вызывающим клиентом и самим сервисом. Этот
контракт утверждает нечто такое: "если вы пришлете мне данные в таком-то формате, то я их
Глава 19. Ориентированные на сервис приложения
749
обработаю и верну вам результаты в таком-то формате". Формат этих данных и
коммуникационные параметры этих вызовов основаны на таких открытых стандартах, как XML и
SOAP. Аналогичные стандарты позволяют клиенту "обнаружить" Web-сервис и его
контракт, а затем и работать с ним. Эти стандарты сервисов пересекают границы технологий и
поэтому делают сервисы очень привлекательными для обмена данными между
разнородными средами.
Для уяснения преимуществ сервисов полезно думать о них в контексте тех проблем, для
решения которых они были созданы.'Например, многие большие компании имеют
множество приложений, которым нужен доступ и обновление одной и той же информации. Для
работы им могут требоваться записи с данными клиентов из системы обслуживания клиентов,
приложение для обработки заказов, инструмент для отгрузок, финансовая система и пакет
отчетности. При таких условиях данные клиента дублируются во всех системах. Это
означает, что данные в любой системе могут быть противоречивыми (или устаревшими). В таких
организациях могут иметься вспомогательные решения (вроде систем пакетной обработки),
которые стараются ежедневно поддерживать синхронность данных. На рис. 19.1 показан
пример такой проблемы.
Система обслуживания
клиентов
Инструмент для
отгрузок
Обработка заказов
Система отчетности
Финансовая система I
В
Рис. 19.1. Самые обычные потребности, разнородные приложения
И что еще хуже — в компании могут быть две системы с одинаковой функциональностью
(например, две системы обслуживания клиентов). Такое может случиться тогда, когда
укрупнение компании произошло путем приобретения или слияния с другой компанией,
либо если разные отделы в свое время выбрали для работы разные системы. Даже в том
случае, когда все эти приложения были написаны с нуля в самой компании, вы часто видите
в разных приложениях аналогичные фрагменты кода, которые делают одно и то же.
Конечно же, этот код нужно поддерживать, а вносимые в него изменения часто имеют
непреднамеренные последствия для других систем.
Именно с этими проблемами и должны справиться ориентированные на сервис решения.
Учтем также, что каждое приложение из предыдущего примера могло бы работать на
разных серверах и под управлением различных операционных систем. В них даже часто
используются различные технологии баз данных. Поэтому нелегко создать многократно ис-
750
Часть V. Создание промышленных приложений
пользуемый компонент, который можно было бы встроить в любое приложение. И даже
если бы его можно было создать, то все равно осталась бы необходимость централизовать
эту информацию в единое представление. Например, обновление записи о клиенте в одной
системе нужно как-то внести и в другие системы.
Для решения такого типа проблемы необходим общий, совместно используемый интерфейс
для централизованного представления клиента. Этот интерфейс должен уметь работать
через границы приложений (такие как протоколы, типы данных и процессы). Программные
архитекторы осознавали эту проблему, но до появления Интернета не видели для нее
жизнеспособного решения. В Web-технологиях протокол HTTP стал вездесущим. Серверы смогли
взаимодействовать между собой. Затем пришел стандарт XML для описания сообщений.
При помощи этих двух технологий (HTTP и XML) выполнявшиеся на разных платформах
приложения получили способ обмена между собой. Они смогли посылать и получать
структурированные сообщения по общему протоколу — так родились Web-сервисы.
Почему именно Web-сервисы ASP.NET и WCF?
Web-сервисы по-прежнему удерживают доминирующее положение при создании сервисных
приложений. Они замечательно подходят для обмена через Интернет. Однако они не всегда
являются самым эффективным средством обмена. Например, если клиент и сервис
основаны на одной и той же технологии (или даже на одном компьютере), то они часто могут
согласовать более эффективный способ для обмена (такой как Remoting — удаленное
взаимодействие). Разработчики сервисов сталкиваются с теми же проблемами, которых они
пытались избежать. Теперь им нужно выбирать между созданием эффективных внутренних
сервисов и возможностью получить к ним максимально широкий доступ через Интернет.
И если нужно поддерживать и то, и другое, то, возможно, им придется создавать несколько
версий (или, по крайней мере, прокси) для своего сервиса. Эту проблему фирма Microsoft
решила при помощи технологии Windows Communication Foundation (WCF).
При помощи WCF вы можете создавать ваш сервис без учета границ. После этого WCF
позаботится о выполнении вашего сервиса самым эффективным образом (в зависимости от
вызывающего клиента). Для решения этой задачи WCF вводит концепцию конечной точки.
Ваш сервис может иметь множество конечных точек (настроенных во время
программирования или после развертывания). Каждая конечная точка указывает, как именно сервис
поддерживает вызывающего клиента через Интернет, через Remoting, через MSMQ и т. д. WCF
позволяет вам сфокусироваться на создании функционала вашего сервиса. Она сама
позаботится о том, как максимально эффективно обмениваться с вызывающими клиентами. Один
сервис WCF может эффективно поддерживать много различных типов клиентов.
Рассмотрим один из предыдущих наших примеров. Данные клиентов совместно
используются разными приложениями. Все приложения могут быть написаны под различные
платформы и находиться в разных местах. Вы можете вынести интерфейс клиента в сервис
WCF, который обеспечит доступ к совместно используемым данным клиента. Это
централизует данные. Кроме того, при помощи WCF вы можете настроить конечные точки, чтобы
они работали таким образом, который имеет смысл для вызывающего клиента. На рис. 19.2
показан наш пример с централизованным в сервисе WCF доступом к данным клиентов.
Глава 19. Ориентированные на сервис приложения
751
Система обслуживания
клиентов
HTTP
Обработка заказов
Инструмент для
отгрузок
MSMQ
Remoting
Remoting
HTTP
Система отчетности
Финансовая система
Рис. 19.2. Ориентированное на сервис представление данных клиента
В последующих разделах мы опишем создание как Web-сервисов, так и сервисов WCF.
Visual Studio 2008 и .NET Framework делают многое для того, чтобы абстрагировать
тонкости создания сервисов от каждодневных задач программирования. В результате получается
более производительная среда разработки. Вы тратите меньше времени на раздумья о том,
как создать правильное сообщение SOAP или установить канал обмена, и больше — на
разработку ценных для вашего бизнеса вещей.
Приложения Web-сервиса ASP.NET
Перед тем как начать, разработчику важно понять ключевые концепции и стандартные
термины Web-сервисов. Эти знания обеспечат понимание вами того, что происходит в вашем
приложении. Они также помогут вам при чтении документации .NET и статей о создании
приложений Web-сервисов. Поэтому мы составили следующий глоссарий ключевых
терминов, имеющих отношение к Web-сервисам.
□ Web-сервис представляет собой цельный набор.логики приложения, которая выполняет
действия и предоставляет данные. Web-сервис группирует эту логику в виде методов,
которые можно вызвать по HTTP. He все сервисы являются Web-сервисами; таковыми
считаются только те, которые работают через Интернет.
□ Метод Web-cepeuca (или Web-метод) представляет собой метод, предоставляемый
Web-сервисом. Web-метод может принимать параметры и возвращать ответ.
□ XML (Extensible Markup Language, расширяемый язык разметки) используется для
представления и описания данных независимым от платформы образом. XML может
применяться для представления как простых, так и сложных элементов данных и связей.
Именно стандарт XML делает Web-сервисы возможными.
П WSDL (Web Service Description Language, язык описания Web-сервиса) служит для
описания содержимого Web-сервиса и его Web-методов. WDSL обеспечивает контракты
сообщений данных, которые позволяют клиентам работать с сервисом.
752
Часть V. Создание промышленных приложений
□ XSD (XML Schema Document, документ схемы XML) содержит набор
предопределенных типов (строковых, десятичных и т. д.) и стандартный язык для описания ваших
собственных сложных типов. Документ схемы XML (называемый также XSD) использует
эти типы для описания (и ограничения) содержимого XML-сообщения.
□ SOAP (Simple Object Access Protocol) — это основанный на XML протокол для обмена
между клиентом и Web-сервисом. Можно считать, что SOAP представляет формат
сообщений при их передаче по проводам. SOAP обертывает XML-сообщения для
передачи через Интернет. Большая часть сообщений SOAP посылается по HTTP. Однако они
могут также посылаться по транспортным протоколам (таким как SMTP или FTP).
□ HTTP (Hypertext Transfer Protocol) представляет собой протокол обмена, используемый
Web-сервисами для передачи отформатированных (или закодированных) протоколом
SOAP сообщений. HTTP также является способом реализации стандартных запросов
(get и post) для Web-страниц.
□ UDDI (Universal Description, Discovery and Integration) используется для определения
реестра Web-сервисов. Эта возможность полезна для публикации сервисов (чтобы
разработчики могли их найти и воспользоваться ими).
□ URI (Uniform Resource Identifier) обеспечивает средство локализации в Интернете.
В большинстве случаев URI — это URL, которые указывают на сервис.
□ DISCO (Discovery Document) — файл DISCO предоставляет информацию, которая
связывает с ключевыми элементами Web-сервиса (это ссылки на XSD, привязки SOAP, a
также пространства имен). Программы могут использовать файл DISCO для
определения того, как надо работать с данным Web-сервисом.
□ WS-* представляет общие стандарты Web-сервисов.
□ WSE (Web Service Enhancements)— это реализация стандартов WS-* фирмой Microsoft.
Последняя версия — это WSE 3.0. Она реализует транзакции Web-сервисов и
улучшенную систему безопасности. WSE можно скачать, она работает как надстройка для Visual
Studio.
Visual Studio делает создание Web-сервисов похожим на разработку других классов и
компонентов. Таким образом, сложные аспекты SOAP, WSDL, XSD (и прочего) абстрагируются
(и автоматически генерируются данным инструментом). Вы по-прежнему имеете доступ к
этим элементам и управление ими (если они вам нужны). Однако по большей части вы
определяете Web-сервис точно так же, как создаете класс. Затем вы определяете Web-
методы (аналогично тому, как вы определяли бы методы класса). Visual Studio создает
соответствующий контракт схемы для сигнатур ваших методов и описывает ваши Web-сервисы
в терминах WSDL. Затем .NET Framework позаботится о надлежащей упаковке ваших
данных в сообщение SOAP и передаче их по HTTP.
Web-сервисы в .NET создаются и предоставляются в той же самой инфраструктуре, которая
предоставляет Web-сайты ASP.NET. Это означает, что Web-сервисы используют ту же
самую серверную технологию (Internet Information Services, или IIS) и те же самые объекты
(такие как Application, Session и Context). Таким образом, те разработчики, которые знакомы
с изготовлением приложений ASP.NET, могут использовать этот опыт для Web-сервисов.
Вы можете использовать встроенное управление состоянием, сервисы аутентификации и
производительность ASP.NET.
Глава 19. Ориентированные на сервис приложения
753
Web-сервис в .NET— это просто Web-адрес файла Web-сервиса, имеющего расширение
asmx. Сервис имеет стандартный адрес http://.... Этот файл используется как UR1 для Web-
сервиса (аналогично Web-странице). Вы пишете ваш выделенный код для этого файла, а
Visual Studio и .NET делают все остальное (прикрепляют соответствующий WSDL и
активируют вызовы SOAP no HTTP). Давайте более подробно рассмотрим использование Visual
Studio и ASP.NET для предоставления Web-сервисов.
Шаблон проекта ASP.NET Web Service Project
Web-сервис можно добавить в любой Web-проект ASP.NET. Visual Studio предоставляет
также и специфичный для Web-сервиса шаблон проекта. Этот шаблон полезен тогда, когда
вы хотите создать целый слой сервисов или отделить ваши сервисы от любых элементов
пользовательского интерфейса. Проект из этого шаблона вы создаете точно так же, как и
другие Web-проекты: выбор File | New | Website приведет к открытию диалогового окна
Add New Project (рис. 19.3). Здесь вы можете выбрать шаблон ASP.NET Web Service
Application для того, чтобы описать специфичный для Web-сервиса проект.
Как и при описании нового Web-сайта, вы можете указать местоположение Web-сервиса.
Вы можете выбрать местоположение в файловой системе или указать Web-сервер
(работающий по протоколу HTTP), либо использовать FTP для указания места хранения Web-
сервиса. Кроме того, вы можете задать язык по умолчанию, на котором должен
программироваться Web-сервис.
Project types'
Visual C#
Windowt
Wfb
Database
Reporting
Siberlight
Test
WCF
Workflow
Other Languages
Other Project Types
lest Projects
Templates;
VisimI Studio installed ternptatet
fc& ASP NET Web Apphcation
13 ASP.NET A1AX Server Control
& ASP NET Server Control
My Templates
%j3 Search Online Templates..
Ж1 FwroewcrUJ ^J П1 {ГЦ
Ш AsKNEfTrVeb SeYVtct Ap рбсМюц
<£9 ASP NET AJAX Server Control Extender
Щ WCF Service Application
1
\
'
i
!
A project lor creating XML Web services {МП Framework 3.5)
Name CurtomerProfile
Location; C:\Uier5\msneR\DocumentsSVisual Studio 20Q8\Projects\972719
Рис. 19.3. Создаем новый проект Web-сервиса
Файлы Web-сервиса
Реальный проект Web-сервиса (который создается по шаблону Web-сервиса) содержит
только один сервис, конфигурационный файл и набор стандартных ссылок. Ссылка на сер-
754
Часть V. Создание промышленных приложений
вис дается как ссылка на asmx-файл. Этот файл используется как URI (и URL) для Web-
сервиса. Фактическое содержимое этого файла показано на рис. 19.4.
Файл с расширением asmx на этом рисунке имеет представление конструктора для
добавления компонентов, представление разметки для описания сервиса ASP.NET, а также
представление выделенного кода (или просто кода). Вы можете переключаться между
представлениями щелчком правой кнопки мыши по asmx-файлу. Представление разметки показывает
единственную директиву WebService. Она означает, что файл Web-сервиса является
указателем на код сервиса. Атрибут CodeBehind указывает на файл кода с именем
Servicel.asmx.cs; это файл выделенного кода, который показан под файлом Service 1.asmx в
Solution Explorer. Именно здесь находится логика сервиса. Наконец, в этой директиве
используется атрибут Class для указания класса, содержащегося внутри Service l.asmx.cs; этот
класс является Web-сервисом. Методы этого класса являются Web-методами.
File Edit View Project Build Debug Tods Test Window Help
JP ' 21 ' J A & ! * АЛ "Л > " ♦ ♦" « " | ► Debug
=ervlcel esaar
ь*;
^Solution^'mi' (fproject)""
~< uf CustomerProfBe
.*\ & Properties
*l ini References
-»i App_DaU
^ Servicel asmx.cs
^ Web config
':fv3 Solution Ежр,.. ОГмасгё frpto 1
J4 feiur I (St
Reedy
Рис. 19.4. Проект Web-сервиса
Примечание
Вы можете описать Web-сервис одним файлом. В этом случае директива и код
хранятся вместе (а не так, как в модели выделенного кода).
На рис. 19.5 показано содержимое Service l.asmx.cs. Прежде всего обратите внимание на то,
что этот класс является просто стандартным классом С# (он может быть также классом VB).
В нем есть операторы using, определение класса, метод, а также некоторые атрибуты.
Модель программирования Web-сервисов .NET-разработчикам должна быть очень хорошо
знакома.
Глава 19. Ориентированные на сервис приложения
755
Конечно, вы должны дать знать .NET о том, что этот код — Web-сервис. Для этого есть два
способа. В первом используются атрибуты. Класс Servicel на рис. 19.5 помечен атрибутом
WebService. Таким образом, класс определен как Web-сервис. Обратите также внимание,
что метод HelloWorld имеет атрибут webMethod. Этот атрибут указывает, что данный
метод является Web-методом, который может быть вызван для Web-сервиса.
Другой способ указать на класс как на Web-сервис — при помощи наследования. Класс
наследует от System.Web.Services.WebService. На самом деле это не обязательно. Вы можете
описать класс как Web-сервис без наследования от WebService. Однако при помощи этого
наследования класс будет иметь полный доступ к таким функциональным возможностям
ASP.NET, как объекты Session и Context. Доступ к этим объектам обеспечивает
разработчикам Web-сервисов многие хорошо знакомые функциональные возможности ASP.NET.
Debug
View Refector Project
■ ^№ШттШ8Ш$ St>tvkiiL»tmnx% j
rijutairig Systen;
.. I using System.Collections:
1 using Sysceja.CasponsntMsdel;
i using Syswea.Data;
using System.Linq;
j using System.Keb;
using System.Web.Services;
[ using System.Web.Services.Protocols;
1 using Systen.Xml.Lnq;
«j&mm
Tools Test Window Help
'\ > Debug - Any CPU
i) naroesr^nct CuatcRerPzcfile {
.*t-Se~vics (Каляspace - "r.t^^'ifejj»ujpi.trg/"M
f> i^ "ч u5,~.M<*^<ConforiDsIu ■ (<■•" f>"i j.BesicPrcrilel_l) ]
>' To V.l_rf г>аз "**: Service zo ее z\\l»'+ Irci sci^pt, us---:
public class .}•!''_->1 • Systen. Web. Services. «?=..* r . :t I
[*»^i» t]
public strlAg KelloifarldO {
return "H*llo World';
}
biotuhon bpiotet - %.c u. -r a X
' 1 £H ^ 3 ** Ш
^3 Solution 972719 A prcject)
- ^| CusiomerProfBe
S >ji U Properties
•ffl ^1 References
-,j App_Data
i н У Serviced asmx
[ **J Service! asmx cs
_J» Web config
jc'^J Solulion Ex ^Mactfl tepf
Рис. 19.5. Код Web-сервиса
Создание Web-сервиса ASP.NET
Мы рассмотрели стандартные файлы Web-сервиса, создаваемые в Visual Studio при помощи
шаблона Web-сервиса. Теперь вы готовы исследовать разработку реального Web-сервиса при
помощи Visual Studio 2008. Для примера мы будем разрабатывать Web-сервис CustomerProflle.
Этот Web-сервис будет обеспечивать методы для получения информации о клиентах из
хранилища данных и для сохранения изменений этой информации. Попутно мы рассмотрим более
тонкие моменты разработки Web-сервиса .NET. Вот основные шаги этого процесса:
1. Для создания Web-сервиса добавьте в шаблон ASP.NET Web Service Application новый
Web-сервис. Назовите его CustomerProflle.asmx.
756
Часть V. Создание промышленных приложений
2. Удалите метод HelloWorld и вместо него создайте методы с названиями GetCustomer-
Prof ile, SaveCustomer и DeleteCustomer. Каждый метод должен быть помечен
атрибутом [WebMethod].
3. Добавьте в ваше решение новый проект библиотеки классов. Назовите этот проект
BusinessEntities. Данный проект будет содержать фактическое описание простого класса
Customer с набором свойств. В листинге 19.1 показан пример этого кода.
namespace BusinessEntities {
public class Customer {
public string Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string AddressLinel { get; set; }
public string AddressLine2 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string PostalCode { get; set; }
public string Phone { get; set; }
public bool ContactEmail { get; set; }
public bool ContactPhone { get; set; }
}
}
4. Затем создайте второй проект библиотеки классов с названием EntityServices и добавьте
в эту библиотеку класс CustomerProfile. Пространство имен EntityServices
обеспечит фактическую реализацию кода, который выполняется от имени Web-метода
SaveCustomer данного сервиса. Фактически сервис является прокси для метода
EntityServices. CustomerProfile. SaveCustomer. Этот метод выполняет работу по
сохранению данных о клиенте.
Реализация при помощи прокси не обязательна. Вы можете определить всю логику
выполнения прямо внутри Web-сервиса. Однако мы показываем именно такой пример по
двум причинам. Первая состоит в том, что большинство приложений использует уже
существующий код. Поэтому может быть весьма полезным создание прокси для
предоставления этого существующего кода через Web-сервисы. Вторая состоит в том, что это
пример хорошего дизайна. Наличие кода реализации в отдельном объекте позволяет
использовать его многократно, облегчает модульное тестирование и позволяет применять
более традиционные клиентские конфигурации (и не использовать Web-сервисы).
5. Создайте базу данных, в которую будет считываться и сохраняться информация по
профилю клиента. Это почти не имеет отношения к Web-сервису, но поможет придать за-
Глава 19. Ориентированные на сервис приложения
757
конченность нашему примеру. Таблица клиентов — это все, что нам потребуется. На
рис. 19.6 показан пример таблицы клиентов, добавленной в файл базы данных
Customer.mdf проекта EntityServices.
File Edit View Project Build Debug; Date Table Devgner Tools Test \Artntkrw
Jb _J' J A & * ^ > ^ ' *' ' * ' ~A * ^"9 ' AnyCPU
ft ) > U -t ■ «
Help
Column Name
K?[id __
neme
email
addressLmel
addressLinei
city
state
pcstalCode
phone
contactPhone
contactEmail
i Column Properties
Data Type
i uniqueidentifier
vercharA00j
\archarA50)
varcbarA50)
ver chard 50)
varcharflOO)
v»rchar<50j
varcharilO)
varchar<50)
bit
f '
L
®.
k
k
k'
kj
k
L (Nam el
> (General)
- m
^2 Solution "972719 C projects)
^ .j3 BusinessEntities
U\ jj Properties
'♦« &J Peferences
'^ Customer cs
r„ «^J GrttomeiProf Ac
♦I M Properties
♦i ^t References
^j App_Data
It) *i CustomerProfile asmx
^ Web config
33 FntiryServtcei
>' t^| Properties
s*i sd References
_J> app config
;* JiSSS
'jj^ CustomerProfile cs
1Q Solution Ex ^ Ma.-fi Fyp)
Рис. 19.6. Таблица базы данных по клиентам
6. Теперь вы можете писать методы для получения, сохранения и удаления клиента.
Сначала добавьте ссылку в проекте EntityServices на проект BusinessEntities. Затем добавьте
методы SaveCustomer, GetCustomer и DeleteCustomer В класс CustomerProfile
созданного вами проекта библиотеки классов EntityServices. В листинге 19.2 показан
простой код, который работает с только что созданной вами таблицей базы данных.
f ЛИСТИНГ 19,2, Класс fcnti tyServices«Ctt*t»i№frof il# l
using Systems-
using System.Collections.Generic-
using System.Data.SqlClient;
using System.Data;
using System.Text;
using BusinessEntities;
namespace EntityServices {
public class CustomerProfile {
string _dbConnect =
0"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\.
.\Customer.mdf;
758
Часть V. Создание промышленных приложений
Integrated Security=True;User Instance=True";
ч
public Customer GetCustomer(string customerld) {
StringBuilder sql = new StringBuilder("SELECT id, name, email, ") ;
sql.Append("addressLinel, addressLine2, city, state, postalCode,");
sql.Append("phone, contactPhone, contactEmail ");
sql.Append("FROM customer WHERE id = @id");
using (SqlConnection cnn = new SqlConnection(_dbConnect)) {
SqlCommand cmd = new SqlCommand(sql.ToString(), cnn);
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(new SqlParameter("id", customerld));
cnn.Open();
SqlDataReader dr = cmd.ExecuteReader();
dr.Read();
Customer с = new Customer();
c.AddressLinel = dr["addressLinel"].ToString();
c.AddressLine2 = dr["addressLine2"].ToString();
с City = dr["city"].ToString();
c.ContactEmail = (bool)dr["contactPhone"];
сContactPhone = (bool)dr["contactEmail"];
c.Email = dr["email"].ToString();
с Id = dr["id"].ToString();
с Name = dr["name"].ToString();
с Phone = dr["phone"].ToString();
c.PostalCode = dr["postalCode"].ToString();
c.State = dr["state"].ToString();
return c;
}
}
public void SaveCustomer(Customer customer) {
StringBuilder sql = new StringBuilder();
' SqlCommand cmd = new SqlCommand();
// Определить: обновить или сохранить
if (customer.Id == null) {
// Предположим вставку
sql.Append("INSERT INTO customer (id, name, email, addressLinel, ") ;
sql.Append("addressLine2, city, state, postalCode, phone, ") ;
Глава 19. Ориентированные на сервис приложения
759
sql.Append("contactPhone, contactEmail) ") ;
sql.Append("VALUES(@id, @name, @email, @addressLinel, ") ;
sql.Append("@addressLine2, @city, estate, @postalCode, @phone, ");
sql.Append("@contactPhone, @contactEmail)");
cmd.Parameters.Add(new SqlParameter("@id",
Guid.NewGuidO .ToStringO ) ) ;
} else {
// Предположим обновление
sql.Append("UPDATE customer set name=@name, emai1=0email, ");
sql.Append("addressLinel=@addressLinel, ");
sql.Append(naddressLine2=@addressLine2, city=@city, ");
sql.Append("state=@state, postalCode=@postalCode, ");
sql.Append("phone=@phone, contactPhone=@contactPhone, ");
sql.Append("contactEmail=@contactEmail ");
sql.Append("WHERE id=@id ");
cmd.Parameters.Add(new SqlParameter("@id", customer.Id));
}
// Добавить дополнительные параметры
cmd.Parameters.Add(new SqlParameter("@name", customer.Name));
cmd.Parameters.Add(new SqlParameter("@email", customer.Email));
cmd.Parameters.Add(new SqlParameter("GaddressLinel",
customer.AddressLinel));
cmd.Parameters.Add(new SqlParameter(addressLine2",
customer.AddressLine2));
cmd.Parameters.Add(new SqlParameter("@city", customer.City));
cmd.Parameters.Add(new SqlParameter("@state", customer.State));
cmd.Parameters.Add(new SqlParameter("@postalCode",
customer.PostalCode));
cmd.Parameters.Add(new SqlParameter("@phone", customer.Phone));
cmd.Parameters.Add(new SqlParameter("@contactPhone",
customer.ContactPhone));
cmd.Parameters.Add(new SqlParameter("@contactEmail",
customer.ContactEmail));
using (SqlConnection cnn = new SqlConnection(_dbConnect)) {
cmd.CommandType = CommandType.Text;
cmd.CommandText = sql.ToString();
cmd.Connection=cnn;
cnn.Open();
cmd.ExecuteNonQuery();
760
Часть V. Создание промышленных приложений
}
}
public void DeleteCustomer(string customerId) {
string sql = "delete from customer where id = @id";
using (SqlConnection cnn = new SqlConnection(_dbConnect)) {
SqlCommand cmd = new SqlCommand(sql, cnn);
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(new SqlParameter("@id", customerld));
cnn.Open();
cmd.ExecuteNonQuery();
}
}
}
}
7. Класс EntityServices служит как прокси для Web-сервиса. Теперь вы можете
добавить ссылку в проекте Web-сервиса на проекты BusinessEntities и EntityServices.
8. Последний шаг— написать код для самого Web-сервиса. Здесь будет метод
GetCustomerProfile, который принимает параметр customerld и возвращает
экземпляр Customer. Создайте также метод SaveCustomer, который принимает
экземпляр класса Customer, но не возвращает значения. И наконец, создайте метод
DeleteCustomer, который принимает customerld. В листинге 19.3 показан код
сервиса.
Листинг 1&& Wel^oepBHo пш>фипя клиента
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System. Web;
using System. Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
using BusinessEntities;
namespace CustomerProfile {
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfilel_l) ]
[ToolboxItem(false)]
Глава 19. Ориентированные на сервис приложения
761
public class CustomerProfile : System.Web.Services.WebSefvice {
[WebMethod(Description = "Used to return a customer's profile.")]
public Customer GetCustomerProfile(string customerld) {
EntityServices.CustomerProfile custProfile =
new EntityServices.CustomerProfile();
return custProfile.GetCustomer(customerld);
}
[WebMethod(Description = "Saves a customer")]
public void SaveCustomer(BusinessEntities.Customer customer) {
EntityServices.CustomerProfile custProfile =
new EntityServices.CustomerProfile();
custProfile.SaveCustomer(customer);
}
[WebMethod(Description = "Deletes a customer")]
public void DeleteCustomer(string customerld) { '
EntityServices.CustomerProfile custProfile = new
EntityServices.CustomerProfile();
custProfile.DeleteCustomer(customerld);
}
}
}
Совет
Когда вы создаете Web-сервис, то лучше всего группировать функциональность в
крупноблочные интерфейсы. Нам не нужны такие Web-методы, которые перед
вызовом метода выполняют множество мелких операций (таких как настройка свойств).
Такая болтливость при обмене через Интернет может быть весьма дорогим
удовольствием.
Конечно, такой подход противоречит также и дизайну большинства объектно-
ориентированных приложений. Поэтому использование прокси-объекта с целью
группировки операций для бизнес-объекта является идеальным. Бизнес-объект можно
сериал изовать и передать по проводам. На другой стороне он может быть десериализо-
ван, после чего с ним можно будет работать (внутри процесса, когда многочисленные
вызовы уже не будут дорогим удовольствием).
762
Часть V. Создание промышленных приложений
Теперь, когда вы создали простой Web-сервис, давайте взглянем на то, что определяет этот
класс как Web-сервис. Мы скоро вернемся к этому примеру сервиса.
Класс атрибута WebService
Класс атрибута WebService (называемый также WebServiceAttribute) можно
использовать для предоставления дополнительных подробностей о данном Web-сервисе. Вы можете
применить этот атрибут при объявлении класса Web-сервисом. Однако этот атрибут не
обязателен. Он просто дает контекст Web-сервиса. Например, мы использовали атрибут
WebService в объявлении класса CustomerProf ile (для того чтобы предоставить
подробности о пространстве имен Web-сервиса).
Вот описательные элементы, которые вы можете определить в классе атрибута
WebService*.
□ Description— для определения описания Web-сервиса. Это описание будет
предоставляться пользователям вашего Web-сервиса, а также указываться в соответствующей
документации. Вам следует всегда предоставлять это описание;
□ Namespace — используется для объявления пространства имен для вашего Web-сервиса
(по умолчанию это tempuri.org). Это похоже на пространства имен внутри .NET. Однако
эти пространства имен должны быть уникальными в Интернете. Поэтому здесь всегда
нужно указывать только такое пространство имен, которое принадлежит вам и которым
вы можете управлять. Например, это может быть интернет-адрес компании;
□ Name — используется для определения другого названия для вашего Web-сервиса.
Название вашего Web-сервиса не определяется ограничениями наименований в .NET.
Поэтому вы можете использовать этот параметр для создания нового имени для вашего
Web-сервиса.
Класс WebService
Класс WebService представляет собой базовый класс для Web-сервисов .NET. Его не надо
путать с классом атрибута WebService (см. предыдущий раздел). Вы наследуете от этого
класса для того, чтобы использовать объекты ASP.NET (такие как Session, Application,
Context и т. д.). Однако делать это не обязательно. Visual Studio принудительно реализует
такое наследование при описании вами нового Web-сервиса, но вы можете удалить этот код,
если не собираетесь использовать в вашем Web-сервисе объекты ASP.NET. Если же вы
решили наследовать от WebService, то вы получаете доступ к этим объектам ASP.NET точно
так же, как и в любом другом Web-приложении.
Класс атрибута WebMethod
Класс атрибута WebMethod служит для указания того обстоятельства, что метод вашего
сервиса должен предоставляться через Web-сервис. Это объявление обязательно для всех тех
методов, которые вы хотите сделать доступными через Web-сервис.
При описании Web-метода вы можете настроить различные параметры. Они управляют тем,
как работает Web-метод. Например, для указания описания метода необходимо настроить
Глава 19. Ориентированные на сервис приложения
763
Параметр Description. Далее приведен более полный список параметров атрибута
KebMethod.
□ Description— используется для предоставления описания Web-метода. Это описание
будет видно вызывающим клиентам, а также в документации по данному Web-методу.
□ EnableSession— применяется для указания, нужно ли активировать состояния
сеансов для данного Web-метода. Установка его в значение True позволит вам сохранять и
получать элементы в сеансе. Если вы настроите его в значение True и наследуете от
WebService, то получите доступ к сеансу из объекта Session (WebService . Session).
Если же вы не наследуете от WebService, то по-прежнему можете настроить этот
параметр в значение True. Однако для получения объекта сеанса вам придется пройти по
всему пути HttpContext.Current.Session.
□ CacheDuration— используется для указания, что результаты Web-сервиса должны
кэшироваться в течение определенного промежутка времени. Для этого параметра вы
устанавливаете длительность в секундах. Включение этого кэширования приведет к
кэшированию ответов для каждого уникального набора параметров, переданных в Web-
сервис (аналогично кэшированию вывода в ASP.NET).
□ MessageName— используется для определения алиаса или отдельного имени для
данного Web-метода. Эта возможность полезна в том случае, когда вам нужны
перегруженные методы, которые поддерживаются в .NET, но не поддерживаются Web-
сервисами. Таким образом, вы можете сохранить свои перегруженные методы и
присвоить каждому из них уникальное имя при помощи этого параметра.
П Buf f erResponse — применяется для указания, следует ли весь ответ буферизировать в
памяти сервера перед тем, как передавать его обратно по проводам вызывающему кли-г
енту. Значение по умолчанию этого параметра— True. Если вы установите его в
False, то ответ будет буферизироваться блоками по 16 Кбайт и передаваться клиенту
по одному блоку.
□ TransactionOption— используется для указания, должен ли Web-сервис быть
корнем транзакции. По умолчанию Web-сервисы не могут участвовать в других
транзакциях. Однако они могут вызывать объекты, которые участвуют в транзакции вместе с
Web-сервисом.
Просмотр формального описания Web-сервиса
Visual Studio и .NET Framework позволяют вам просмотреть Web-сервис внутри Web-
браузера. Эта возможность полезна как для тестирования Web-сервиса, так и для
исследования его работы (возвращаемых и требуемых им сообщений). Для доступа к Web-
сервису вы сначала собираете (компилируете) его в Visual Studio, а затем запускаете
asmx-файл в браузере.
На рис. 19.7 показан пример Web-сервиса Customer Prof ile в окне браузера. Обратите
внимание, что все методы сервиса перечислены. Показано также описание каждого метода. Это то
самое описание, которое было указано в определении Web-метода (webMethodAttribute).
Для того чтобы увидеть реальное формальное описание Web-сервиса на WSDL, вы можете
выбрать ссылку Service Description в верхней части страницы (показана на рис. 19.7). Когда
764
Часть V. Создание промышленных приложений
вы нажмете эту ссылку, то внутри QueryString в asmx-файл будет передан параметр
WSDL. Это дает указание ASP.NET вернуть WSDL сервиса.
WSDL будет сгенерирован. Он соответствует стандартам WSDL и поэтому может
использоваться клиентами, которые хотят получить доступ к вашему сервису. Эти клиенты
используют WSDL для того, чтобы понять, как работает ваш Web-сервис.
Примечание
.NET поставляется с инструментом Disco.exe. Visual Studio использует его для
генерирования файлов, относящихся к обнаружению и пониманию Web-сервисов. Вы тоже
можете запускать этот инструмент из командной строки для генерирования таких
документов и сохранения их с целью последующего изучения и использования.
Создаваемые программой Disco.exe документы служат вводными данными для
клиентских приложений, которые пользуются Web-сервисом. Эти клиентские приложения
создаются при помощи инструмента WSDL.exe.
^ CystomerProfile Web Service - Windows Internet Expterer
sT
K^jKJ" •&- http,/''locelho$t51239/C«torn«rProftte.i*rTa
♦> X ' HtMWftWB^
p -'
I jg* CustomerProfile Web Service
Q » Ш " >\}Р*9« w J Took "
CustomerProfile
The following operations are supported. For a formal definition, please review the Service Detrriptio
• DclcteCustomnr
Deletes a customer
• GetC-ustomerPruftle.
Used to return a customers profile
• SaveO»tumcr
Saves a customer
This web service is using http://tempuri.org/ as its default namespace.
Recommendation: Change the default namespace before the XHL Web service is made public
Each XML Web service needs a unique namespace in order for client applications to distinguish it from other services on the
Web. http //ternpun org/ is available far XML Web services that are under development, but published XML Web services should
use a more permanent namespace.
Your XML Web service should be identified by a namespace that you control For example, ycu can use your company s Internet
domain name as part of the namespace. Although many XHL \tfeb service namespaces look like LRLs, they need not point to
actual resources on the Web (XML Web service namespaces are URIs.)
For XML Web services creating using ASP NET, the default namespace can be changed using the WebServtce attribute s
Namespace property The WebService attribute is an attribute applied to the class that contains the XML Web service methods
Below is a code example that sets the namespace to 'http //microsoft com/webservices/'
Г..::...
/ Trusted tut* | Protected Mode: Off
Рис. 19.7. Переход к Web-сервису в браузере
В листинге 19.4 вы можете увидеть полный WSDL для сервиса CustomerProfile. Этот
листинг легче просматривать в браузере (где у вас будут цветовая кодировка и древовидная
структура для перемещения по XML). Однако этот листинг приведен в справочных целях.
При просмотре обратите внимание на описания всех сервисов. Обратите также внимание и
на то, как сложный тип Customer встроен в WSDL. Этот сложный тип был сгенерирован на
основе объекта Customer (BusinessEntities . Customer). Вспомним, что этот тип
является возвращаемым значением для одного метода и параметром для другого. .NET
преобразует все это в тип XML для использования в Web-сервисах.
Глава 19. Ориентированные на сервис приложения
765
[д*и^
Листинг 19А WSDt для Web-сервиса
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tm="http: //microsoft.com/wsdl/mime/textMatching/"
xmlns:soapenc="http://schemas. xmlsoap.org/soap/encoding/"
xmlns :mime="http: //schemas.xmlsoap.org/wsdl/mime/"
xmlns:tns="http://tempuri.org/" xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:soapl2="http://schemas.xmlsoap.org/wsdl/soapl2/"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
targetNamespace="http://tempuri.org/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault="qualified"
targetNamespace="http://tempuri.org/">
<s:element name="GetCustomerProfile">
<s:complexType>
<s:sequence>
<s:element minOccurs=" maxOccurs="l" name="customerId"
type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetCustomerProfileResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs=" maxOccurs="l"
name="GetCustomerProfileResult"
type="tns:Customer" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="Customer">
<s:sequence> '
<s:element minOccurs=" maxOccurs="l" name="Id"
type="s:string" />
<s:element minOccurs=" maxOccurs="l" name="Name"
type="s:string" />
<s:element minOccurs=" maxOccurs="l" name="Email"
type="s:string" />
<s:element minOccurs=" maxOccurs="l" name="AddressLine1"
type="s:string" />
766
Часть V. Создание промышленных приложений
<s:element minOccurs=M maxOccurs="l" name="AddressLine2"
type="s:string" />
<s:element minOccurs=" maxOccurs="l" name="City"
type="s:string" />
<s:element minOccurs=" maxOccurs="l" name="State"
type="s:string" />
<s:element minOccurs=" maxOccurs="l" name="PostalCode"
type="s:string" />
<s:element minOccurs=" maxOccurs="l" name="Phone"
type="s:string" />
<s:element minOccurs="l" maxOccurs="l" name="ContactEmail"
type="s-.boolean" />
<s:element minOccurs="l" maxOccurs="l" name="ContactPhone"
type="s:boolean" />
</s:sequence>
</s:complexType>
<s:element name="SaveCustomer">
<s:complexType>
<s:sequence>
<s:element minOccurs=" maxOccurs="l" name="customer"
type="tns:Customer" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="SaveCustomerResponse">
<s:complexType />
</s:element>
<s:element name="DeleteCustomer">
<s:complexType>
<s:sequence>
<s:element minOccurs=" maxOccurs="l" name="customerId"
type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="DeleteCustomerResponse">
<s:complexType />
</s:element>
</s:schema>
</wsdl:types>
<wsdl:message name="GetCustomerProfileSoap!n">
Глава 19. Ориентированные на сервис приложения
767
<wsdl:part name="parameters" element="tns:GetCustomerProfile" />
</wsdl:message>
<wsdlrmessage name="GetCustomerProfileSoapOut">
<wsdl:part name="parameters"
element="tns:GetCustomerProfileResponse"/>
</wsdl:message>
<wsdl:message name="SaveCustomerSoapIn">
<wsdl:part name="parameters" element="tns:SaveCustomer" />
</wsdl:message>
<wsdlrmessage name="SaveCustomerSoapOut">
<wsdl:part name="parameters" element="tns:SaveCustomerResponse" />
</wsdl:message>
<wsdlrmessage name="DeleteCustomerSoapIn">
<wsdl:part name="parameters" element="tns:DeleteCustomer" />
</wsdl:message>
<wsdlimessage name="DeleteCustomerSoapOut">
<wsdl:part name="parameters" element="tns:DeleteCustomerResponse" />
</wsdl:message>
<wsdl:portType name="CustomerProfileSoap">
<wsdl:operation name="GetCustomerProfile">
<wsdl:documentation xmlns:wsdl=
"http://schemas.xmlsoap.org/wsdl/">Used to
return a customer's profile.</wsdl:documentation>
<wsdl:input message="tns:GetCustomerProfileSoapIn" />
<wsdl:output message="tns:GetCustomerProfileSoapOut" />
</wsdl:operation>
<wsdl:operation name="SaveCustomer">
<wsdl:documentation xmlns:wsdl=
"http://schemas.xmlsoap.org/wsdl/">Saves a
customer</wsdl:documentation>
<wsdl:input message="tns:SaveCustomerSoapIn" />
<wsdl:output message="tns:SaveCustomerSoapOut" />
</wsdl:operation>
<wsdl:operation name="DeleteCustomer">
<wsdl:documentation xmlns:wsdl=
"http://schemas.xmlsoap.org/wsdl/">Deletes a
customer</wsdl:documentation>
<wsdl:input message="tns:DeleteCustomerSoapIn" />
<wsdl:output message="tns:DeleteCustomerSoapOut" />
</wsdl:operation>
</wsdl:portType>
768
Часть V. Создание промышленных приложений
<wsdl:binding name="CustomerProfileSoap"
type="tns:CustomerProfileSoap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="GetCustomerProfile">
<soap:operation soapAction="http://tempuri.org/GetCustomerProfile"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="SaveCustomer">
<soap:operation soapAction="http://tempuri.org/SaveCustomer"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="DeleteCustomer">
<soap:operation soapAction="http://tempuri.org/DeleteCustomer"
style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name="CustomerProfileSoapl2"
type="tns:CustomerProfileSoap">
<soapl2:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="GetCustomerProfile">
<soapl2:operation soapAction=
"http://tempuri.org/GetCustomerProfile" style="document" />
<wsdl:input>
Глава 19. Ориентированные на сервис приложения
769
<soapl2:body use="literal" />
</wsdl:input>
<wsdl:output>
<soapl2:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="SaveCustomer">
<soapl2:operation soapAction="http://tempuri.org/SaveCustomer"
style="document" />
<wsdl:input>
<soapl2:body use="literal" />
</wsdl:input>
<wsdl:output>
<soapl2:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="DeleteCustomer">
<soapl2:operation soapAction="http://tempuri.org/DeleteCustomer"
style="document" />
<wsdl:input>
<soapl2:body use="literal" />
</wsdl:input>
<wsdl:output>
<soapl2:body use="literal" />
</wsdl:output>
* </wsdl:operation>
</wsdl:binding>
<wsdl:service name="CustomerProfile">
<wsdl:port name="CustomerProfileSoap"
binding="tns:CustomerProfileSoap">
<soap:address location="http://localhost:51239/CustomerProfile.asmx" />
</wsdl:port>
<wsdl:port name="CustomerProfileSoapl2"
binding="tns:CustomerProfileSoapl2">
<soapl2:address location=
"http://localhost:51239/CustomerProfile.asmx" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
770
Часть V. Создание промышленных приложений
Просмотр Web-метода
Когда вы щелкаете по названию Web-метода (см. рис. 19.7), то ASP.NET генерирует для вас
Web-форму для тестирования данного метода Web-сервиса. Доступ к этой форме можно
получить через asmx-файл с параметром QueryString, равным ор (от англ. operation). Вы
передаете в этот параметр название Web-метода. Например, рассмотрим Web-метод
GetCustomerProf ile. Эта Web-форма показана на рис. 19.8.
Верхняя часть формы позволяет вам вводить параметры для Web-метода, а затем вызывать
фактический Web-метод при помощи команды POST протокола HTTP. Этот протокол
является всего лишь одним из способов вызова Web-метода. Вспомните, что вы используете
также и SOAP. На этой странице показаны реальные примеры запроса и ответа SOAP (так
же, как и примеры HTTP). Эти примеры могут быть полезны в том случае, если вы хотите
знать, как следует формировать сообщения для этих протоколов.
Для примера в листинге 19.5 показано сообщение запроса SOAP 1.2 для данного Web-
метода. Обратите внимание на то, что в метод необходимо передать элемент
<customerId>. Он имеет тип int.
GetCustomerProftle
Used to return a customer's р'сЫе
Test
To test the operation using the HTTP POST protocol, click the 'Invoke' button
Parameter Valu*
customerld'
SOAP 1.1
The following is a sample SOAP 1.1 request and respcnse. The placeholders sho*n need to be replaced with actual values
POST /CuacoffiexProtlle.asffiX HTTP/1,1
Host: looalhost;
Саосеаъ-Турег texe/xol; cb»xeet--utf-8
Cantenc-Lenetbt length
SOftPAoticn: *fct.tp://teutptszi, arg/GetCuatomerPzcflie*
I
* Trusted sites | Protected Mode: Off \ 100%
Рис. 19.8. Web-метод GetCustomerProf ile
Листинг 18.5. Запрос SOAP 1.2
»&шЯит~ЩИь*4
POST /CustomerProfile.asmx HTTP/1.1
Host: localhost
Content-Type: application/soap+xml; charset=utf-
Глава 19. Ориентированные на сервис приложения
771
Content-Length: length
<soapl2:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soapl2="http://www.w3.org/2003/05/soap-envelope">
<soapl2:Body>
<GetCustomerProfile xmlns="http://tempuri.org/">
<customerId>string</customerId>
</GetCustomerProfile>
</soapl2:Body>
</soapl2:Envelope>
В листинге 19.6 показан соответствующий ответ SOAP после вызова. Обратите внимание,
что результат SOAP содержится в элементе <GetCustomerProf ileResult>.
Листинг 19А, Ответ SOAP 12
НТТР/1.1 200 ОК
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
<soapl2:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soapl2="http://www.w3.org/2003/05/soap-envelope">
<soapl2:Body>
<GetCustomerProfileResponse xmlns="http://tempuri.org/">
<GetCustomerProfileResult>
<Id>string</Id>
<Name>string</Name>
<Email>string</Email>
<AddressLinel>string</AddressLinel>
<AddressLine2>string</AddressLine2>
<City>string</City>
<State>string</State>
<PostalCode>string</PostalCode>
<Phone>string</Phone>
<ContactEmail>boolean</ContactEmail>
<ContactPhone>boolean</ContactPhone>
</GetCustomerProfileResult>
</GetCustomerProfileResponse>
</soapl2:Body>
/soapl2:Envelope>
772 Часть V. Создание промышленных приложений
Вызов Web-метода
Для вызова Web-метода вы вводите значения параметров и нажимаете кнопку Invoke (см.
рис. 19.8). При этом Web-сервис выполняется, и возвращаются результаты. Результаты
отправляются обратно как XML. Помните, что этот вызов— это HTTP POST. На рис. 19.9
показаны результаты из примера.
<ErnaibjaneOcontoso.coin</Email>
<AddressLmel>500 Some Street<MddressLJnel>
<Addr«ssLm«2 vApt. 12n</AddressLme2 >
<City>Los Angles </City>
<State>CA</State>
<PostalCode>1234S</PostalCode>
<Phone >555-1234</Phone>
<Ccnt э с tDnaii >true c/Con ta с tEmail >
cCon ta с LPhone ~A else </Con tac tPhone ->
«./Custojner>
|Done / Tfwtedsites | Protected ^4ode; Off \У»% ~
Рис. 19.9. Результаты GetCustomerProf ile
Примечание
Вы можете использовать этот метод только для вызова тех Web-методов, которые
принимают в качестве параметров простые (примитивные) типы данных. Если ваш
Web-метод принимает сложный тип (например, SaveCustomer), то вы по-прежнему
сможете видеть примеры запросов/ответов, но не сможете вызвать Web-метод таким
способом.
Использование Web-сервиса ASP.NET
Web-сервис можно использовать при помощи любого клиента, который способен вызывать
сервис и управлять его результатами. Visual Studio облегчает эту задачу. Она позволяет вам
настроить сервисную ссылку на любой сервис. Этот процесс аналогичен настройке ссылки
на другую библиотеку .NET или компонент СОМ. После описания такой сервисной ссылки
Visual Studio генерирует локальный класс прокси для использования сервиса. Это позволяет
вам программировать при помощи класса прокси и не беспокоиться о написании кода
сервиса. Служебные ссылки можно настроить внутри почти любого приложения .NET, в том
Глава 19. Ориентированные на сервис приложения
773
числе Windows Forms, WPF, консольных приложений и т. д. Давайте же рассмотрим этот
процесс.
Описание сервисной ссылки
Определите сервисную ссылку для вашего проекта при помощи выбора опции Add Service
Reference из контекстного меню данного проекта. При этом откроется диалоговое окно Add
Service Reference. Используйте это диалоговое окно для перехода к сервису и добавления
этого сервиса в качестве ссылки.
По сравнению с предыдущими версиями Visual Studio это диалоговое окно переделано. Оно
объединяет все сервисные ссылки (включая Web-сервисы ASP.NET и созданные на основе
WCF). На рис. 19.10 показан начальный экран диалогового окна Add Service Reference.
Здесь вы можете ввести URI-адрес вашего сервиса или нажать кнопку Discover для поиска
уже существующих в вашем решении сервисов. После обнаружения сервисов их можно
увидеть в списке слева. Вы можете выбрать интерфейс сервиса и увидеть в правой части его
операции. В нижней части формы можно настроить пространство имен для вашей
сервисной ссылки. Этим определяется пространство имен, которое будет использовать Visual
Studio при генерировании кода прокси для сервиса.
Нажатие кнопки Advanced в нижней части диалогового окна Add Service Reference выдаст
вам диалоговое окно Service Reference Settings (рис. 19.11). Здесь вы можете управлять
тем, как Visual Studio будет генерировать код вашего прокси — указать коллекции и область
видимости методов вашего прокси (открытые или закрытые).
То see a list of available services on a specific server, enter a service URL *nd click Go To brows* tot available
services, click Discover.
Address
httpMocalhost51239'r"CustomerProfile.asmx ▼6» Discover ' -
Services. Operations.
H v*)#> CustcmerPrcrfile asm* j 4>DelrteCusiornef
-; $ CustcmerProfile ij *бе1Си51отегРгоП1е
ГЩДДВЗН j ^Customer
Jl savke(s) found at address 'http//lacBlhost51239/Cu$tomerProfde.asrru
Namespace
CustomerProfileServfce
Advanced.., j CIZ^ 1 [ СЛЛС*'
Рис. 19.10. Диалоговое окно Add Service Reference
Обратите внимание на кнопку Add Web Reference в нижней части окна Service Reference
Settings. Она позволяет вам создать Web-ссылку в старом стиле (в стиле .NET 2.0). Пример
показан на рис. 19.12. До введения WCF это был основной способ настройки сервисной
774
Часть V. Создание промышленных приложений
{SystemAiray
ссылки (поскольку существовали только Web-сервисы). Это тоже приводит к
генерированию для вас прокси-класса, пространство имен которого определяется содержимым
текстового поля Web reference name.
СГ«п1
Access level for generated classes, [РиЫк
Generate asynchronous operations
Data Type
Always generate message contracts
Collection type,
Dictionary collecfcon type:
4 Reuse types in referenced assemblies
9 Reuse types tn all referenced assemblies
Reuse types m specifiedref erenced assembles
] -<J BusinessEntitiei
'-JEntrtyServices
<-J mscorhb *
'' ; '«J System
! <3 System Core
[ ™»-J System Data
i ] -J System.Data.DataSetExtenstons
Compatibility
Add a Web Reference instead of з Service Reference This will generate code based on .NET Framework 2JJ
Web Services technology
System Collections Generic Dictionary
Add Web Reference
Рис. 19.11. Диалоговое окно Service Reference Settings
Возвратимся к примеру. Вы будете привязывать приложение Windows Forms с названием
CustomerManager к Web-сервису ASP.NET с названием CustomerProfile (который вы уже
описали). Для этого примера предположим, что приложение Windows Forms будет
существовать независимо от сервиса (в отдельном процессе) и что Web-сервис будет
использоваться множеством разнородных клиентов.
Примечание
Обратите внимание, что если клиент имел прямой доступ к библиотеке
EntityService, то было бы лучше обойти Web-сервис и сделать прямую ссылку на
EntityServices (и таким образом избавиться от накладных расходов Web-сервиса).
Однако пока мы предположим, что это отдельные процессы, и создадим ссылку на
Web-сервис. При обсуждении WCF мы рассмотрим создание единого сервиса для
эффективной обработки как локальных клиентов, так и тех, которые производят
вызовы извне процесса.
В нашем примере как приложение Windows Forms, так и сервис находятся в одном решении.
Поэтому вы можете использовать диалоговое окно Add Service Reference и нажать кнопку
Discover для поиска сервиса (см. рис. 19.10). Укажите в качестве пространства имен сервиса
значение CustomerProf ileService и нажмите кнопку ОК для того, чтобы закрыть
диалоговое окно и сгенерировать код для ссылки.
Глава 19. Ориентированные на сервис приложения
775
Add Web Reference ,У1^^И^ИДи|^Д^^^Я^^^^^^
Navigate to a web service URL end click Add Reference to add all the available services
URL rittp /,'1ocalhosr51239/CustomerProfile.asm» ■» Л Go
CustomerProfile
The following operations are supported. For a formal
definition, please review the Ыччкг [><чнщлн->и.
• OeleteCubtorner
Deletes a customer
Used to return a customer's profile
• StweCustomer
Saves a customer
This web service is using
http://tempuri.org/ as its default
namespace.
. Web services found at this URL
1 Service Found:
Web reference name,
CustomerProfileServtce
Add Reference
Рис. 19.12. Диалоговое окно Add Web Reference
Просмотр Web-ссылки
Теперь вы можете программировать прокси сервиса, который был сгенерирован для вас. Вы
можете также увидеть сгенерированный код. В Solution Explorer выберите опцию Show All Files.
У File Edit View Refactor Project Build Debug Data Tools Test Window Help 1
Ijp * ~ -jafll * 4i Kb 1 ' ^ • » ' \ ► Debug * AnyCPU * & Ц
Щ
*
[I
I iC
1 2
1*»
|£j
References ~ X \ SoluWm Ь#\ъШ - Sefuttof» WJ?» Г... т ? X|
■*$<\^->'.U-l*.*4t\d$ v.' S'fWI'k'lH » ^4-*ft't >f «." »♦ »F(f 'j »
". | ,' <'*ut!;~3£4erate:i> "*
И;, . .. rj
' шпшеэрасе Cuato»er4anaaer.CuatotierFro£ileService {
j . J-) ua^fig System.Runtime.Serialization;
1 it [- using Systeir;
1 u-
|£
lo
1^
Be
Id
;Ц !
i ' |
1 "! [Syscem.CodeBoiB.Csupiler. *>ir 1Атл"д" ?-*vv.f ^("Syat
1 .. j [Syatean.RunttiM.Serialiiacicn..i'.a'_=~rri.rN- r.t-tiitf
!>' [SyJt».^-**'.L»»*»X*».r*i w(H
1 , i
;;
1 public partial class С л "?"v : cblect, Systea.Runtis
[Syste<B.n >'*?<f»1 к*»«>» «л* ».• •-♦*{))
private System Runtime Serialiiatici <х - • - *'
I
E
private string IdF_e^d;
[Syate-n.Runtme.Ssrlaliiablcn.C' ^->i «'* v» ^
1 1 1j \ private string HaaeField;
I ' « \
I J^ErorU
ш j ►
St
;?ia#
J3 Solution 972719 H projects) * j
(♦} £3 BusinesiEntrues j
-< 51 CustomerManager a
a" ^i Properties 1
i & References I
-, «^ Service References 1
' В 4$ CustomerProfileService 1
4^3 configuration sveinfo 1
1^3 CustomerProfile disco r 1
^3 CustomerProfile wsdl j |
U **l3 Reference svernap ' §
^ CustomerManagerCus 1
^ Reference.Cs 1
± _. bin 1
f \_j obj 1
* 3 AddEdrtCustomer cs 1
^ app.config 1
* £J, CustomerDetaSrtjtsd 1
•», ^] EdttCustomer.ci 1
*j Program cs 1
4 i$| CustomerProfile ■*■ 1
j^ Solution Ex \$M4ctaExpi.. ^P*>pcrt« 1
1 Ready Lnl Coll Chi INS |
Рис. 19.13. Web-ссылка
776
Часть V. Создание промышленных приложений
Затем перейдите в каталог Service References. Здесь вы можете увидеть ссылку
CustomerProfileService. На рис. 19.13 показано все это вместе с открытым в редакторе
классом прокси сервиса. Класс прокси — это класс С#, который представляет сервис.
Назначение этого класса— инкапсуляция и абстрагирование подробностей вызова данного
сервиса. Это позволяет разработчикам работать с сервисом точно так же, как они работают
с любым другим компонентом или классом .NET. Класс прокси содержит методы (которые
имитируют Web-методы) и объекты (которые используются для параметров — такие как
объект Customer в данном примере).
Совет
Если вы модифицируете или обновите ваш Web-сервис, то вам придется обновить
сервисную ссылку. Для этого необходимо щелкнуть по сервисной ссылке правой
кнопкой мыши и выбрать пункт Update Service Reference. При этом Visual Studio получит
указание обновить ссылку и повторно сгенерировать файлы.
Вызов Web-сервиса
Вы можете вызвать Web-сервис точно так же, как и любой другой класс .NET. Эта
возможность имеется благодаря классу прокси, который был для вас сгенерирован. Однако от вас
требуется некоторое понимание WCF, поскольку сгенерированный прокси основан на этой
технологии.
Current Customer List
I «d
[ ЯЭ5еас5*с4МЗ
БЮм62ЫС£4-
23Э04а97«ВД
c95(fab5cM2Gc
fr^EHHH
d3ldQcS3-72b&-
*
name
JaneSmth
MkeSrwl
ftch Customer
Jack Cuetoew
PhipSmft
«m«J
ja wguontpto cow
trike-wmt^cont
inJ J@cortoeo com
joe&ronlMO com
pm*h#=ortoeo
adcfeetUnel
|500Some Stat*
1100 Seme Shut
J1001 Some Street
|l99Son>eSt
laOO Some Street
addre»tUne2
4* 12a
H* 1
|Sule200
I** 1ZW5
c*y
Loa/nglet
PUhbutfi
Chicago
Reoraond
Detent
riatt pc
СЛ 12
PA 15,
IL 001
«A 121
Ml JV
Рис. 19.14. Главная страница CustomerManager
Мы опишем WCF в следующем разделе. Пока же мы сосредоточимся на создании клиента
SOAP для CustomerProfileService. Для этого сделайте ссылку на пространство имен
Глава 19. Ориентированные на сервис приложения
777
CustomerProfileService, а затем создайте новый экземпляр класса
CustomerProfileSoapClient:
CustomerProfileService.CustomerProfileSoapClient cp =
new CustomerProfileService.CustomerProfileSoapClient();
Этот класс даст вам доступ к Web-методам GetCustomerProf ile, DeleteCustomer и Sa-
veCustomer (через прокси). Для подключения этих методов к приложению
CustomerManager мы создадим форму, которая покажет список всех клиентов и предоставит
кнопки Edit, New и Delete. Это показано на рис. 19.14.
Давайте же посмотрим, что происходит при нажатии пользователем кнопки Edit. При этом
будет запущена Windows-форма AddEditCustomer.cs, и в ее конструктор будет передан
выбранный пользователем customerid. Этот метод создает экземпляр класса прокси
CustomerProfileSoapClient, а затем вызывает GetCustomerProf ile. В листинге 19.7
показан конструктор этой формы.
;'"" «..'»«""»««»« ».„.«...«..,,«,„л ».,„-„„»,..,л„.,«м,м „..„.....А.,,,. ,,Ч,„Ш!Г,„Л «№.'«)»««4JfM«W..4«; »»»""«»'»ШМ"Ш»«М« м„.л,,,.л.„.д,„.л„„*,п!?,щг;
\ Листинг 19 J. ВЫЗОВ Web-метода GetCustomerProf lie J
public AddEditCustomer (string customerid') {
InitializeComponent();
_editMode = EditMode.Update;
labelTitle.Text = "Edit Existing Customer";
_customerId = customerid;
// Получить запись клиента
CustomerProfileService.CustomerProfileSoapClient cp =
new CustomerProfileService.CustomerProfileSoapClient();
CustomerProfileService.Customer с = ср.GetCustomerProfile(_customerId);
// Настроить метки текстовых полей
textBoxName.Text = с. Name;
textBoxEmail.Text = с.Email;
textBoxPhone.Text = с.Phone;
textBoxPostalCode.Text = c.PostalCode;
textBoxState.Text = c.State;
textBoxCity.Text = c.City;
textBoxAddressl.Text = c.AddressLinel;
textBoxAddress2.Text = c.AddressLine2;
checkBoxContactEmail.Checked = c.ContactEmail;
checkBoxContactPhone.Checked = c.ContactPhone;
}
778
Часть V. Создание промышленных приложений
Вызовы DeleteCustomer и SaveCustomer очень похожи (вы можете изучить их, если
скачаете коды для этой книги). Делается вызов прокси CustomerProfileSoapClient, после
чего вы работаете с прокси для того, чтобы вызвать соответствующий Web-метод. На
рис. 19.15 приведен конечный результат. Здесь показано диалоговое окно Customer после
нажатия пользователем кнопки Edit. Если пользователь нажмет здесь кнопку Save, то будет
вызван Web-метод SaveCustomer и список клиентов будет обновлен.
Примечание
Для отладки вашего Web-сервиса ASP.NET из клиентского приложения вам нужно
либо запустить сервис в том же самом решении, либо прикрепиться к рабочему
процессу ASP.NET, отвечающему за работу сервиса. Подробности см. в главе 10
lea Is) ЁГ
*J Customer t-Awaqc r
Current Customer List
Рис. 19.15. Сервис профиля клиента в действии
Управление исключительными состояниями
Web-сервисов ASP.NET
В .NET легко забыть о том, что вы вызываете Web-сервис. Когда вы работаете с классами
прокси, то часто привыкаете работать с Web-сервисом так, как будто он не отличается от
других методов. Однако это может быть опасно. Web-методы отличаются. Одним из
существенных отличий является способ запуска исключительных состояний из Web-сервиса.
В следующих разделах объясняется, как нужно запускать исключения.
Глава 19. Ориентированные на сервис приложения
779
Создание исключения Web-сервиса
К счастью, в спецификации SOAP описано, как при помощи этого протокола
исключительное состояние можно передать через Интернет. Эти исключения могут быть
исключительными состояниями бизнес-логики или сгенерированными в .NET при обработке вызова.
Здесь важно то, что если вы надлежащим образом обернете эти исключения, то клиент
должен суметь понять, как ими управлять.
.NET предоставляет объект SoapException для обертывания исключения с целью передачи
его через SOAP. Этот класс имеет несколько параметров, которыми вы, возможно, не
привыкли пользоваться при работе с исключениями.
□ Message — используется для указания описательного сообщения для исключения. Если
вы передаете через SOAP стандартное исключение .NET, то можете установить
свойство Message в значение свойства Message стандартного исключения.
□ Code — используется для указания, была ли ошибка связана с сервером или с клиентом.
Если клиент передал сообщение верно, но сервер не смог обработать запрос (не работал
или был сломан), то вы устанавливаете это свойство в значение ServerFaultCode.
Если клиент передал неверное сообщение или плохие значения параметров, то вы
устанавливаете его в значение ClientFaultCode.
□ Actor— используется для установки значения в URI Web-сервиса. Это код, который
вызвал исключение.
О Detail (не обязателен)— используется для передачи дополнительной информации об
ошибке. Свойство Detail может не содержать ничего, а может содержать столько
подробностей об исключении, сколько вы захотите предоставить.
В листинге 19.8 показана новая версия Web-метода GetCustomerProfile. Эта версия
проверяет существование клиента. Если клиент не существует, то выдается SoapException со
свойством Code, установленным в значение ClientFaultCode.
! Листинг 19.8. Создание исключения SOAP
[WebMethod(Description = "Used to return a customer's profile.")]
public Customer GetCustomerProfile(string customerld) {
EntityServices.CustomerProfile custProfile =
new EntityServices.CustomerProfile();
Customer customer = custProfile.GetCustomer(customerld);
if (customer == null) {
SoapException soapEx = new SoapException("Could not find Customer",
SoapException.ClientFaultCode,
Context.Request.Url.AbsoluteUri.ToString());
throw soapEx;
}
return customer;
}
26 3ак 3716
780
Часть V. Создание промышленных приложений
Приложения сервисов WCF
Подобно Web-сервисам, сервисы Windows Communication Foundation (WCF) имеют
собственный набор терминов. Важно понимать эти термины при обсуждении ключевых
концепций приложений сервисов WCF. Эти ключевые термины сервисов WCF перечислены в
следующем списке.
Примечание
Для работы с WCF понимать все эти термины не обязательно. Однако при создании
или настройке этих сервисов полезно иметь о терминах хотя бы поверхностное
представление.
□ WCF Service (сервис WCF) — это логика, которую вы предоставляете многочисленным
клиентам в виде сервиса. Сервис может иметь одну или несколько операций (методов).
Сервис WCF предоставляется клиентам через одну или несколько конечных точек,
которые определяете вы. Каждая конечная точка имеет привязку и поведение (смотрите
пункт "конечная точка" в данном списке). Таким образом, вы можете создать
единственный сервис и настроить его для эффективной работы с разными клиентами (такими
как HTTP, TCP и именованные каналы).
□ WCF Client (клиент WCF) — это приложение, генерируемое Visual Studio для вызова
сервиса WCF. Вы можете создать клиента WCF при помощи добавления ссылки на
сервис в клиентское приложение. Клиентское приложение — это реальное приложение,
которое будет использовать сервис WCF. Представьте себе клиент WCF как посредника
(прокси), который помогает подключить код вашего клиента к сервису WCF.
□ Host (хост) — это процесс, который выполняет сервис WCF (обеспечивает его работу).
Данный процесс управляет жизненным циклом сервиса. Это аналогично тому, как
ASP.NET обеспечивает работу Web-сервисов. Вы можете написать собственный хост
для сервиса или позволить сервису самому обеспечивать свою работу.
□ Contract (контракт)— контракты определяют ваши сервисы WCF. Это по существу
публичный контракт, который вы гарантируете между вашим сервисом и любыми
клиентами. Существует контракт сервиса, который определяет содержание сервиса (его
операции). Существует также операционный контракт — для каждой сервисной
операции. Этот контракт включает в себя параметры и возвращаемый тип сервисной
операции. Существуют также контракты сообщений, данных и сбоев.
□ Endpoint (конечная точка) — это то место, где отправляются и принимаются сообщения
для вашего сервиса. Конечные точки настраиваются для каждой сервисной операции.
Каждая конечная точка определяет адрес и привязку для обмена с сервисом. Например,
у вас может быть одна конечная точка, которая работает при помощи SOAP no HTTP.
Для того же самого сервиса у вас может быть еще одна конечная точка, которая
позволяет сервису работать с MSMQ. Таким образом, вы можете добавлять и настраивать
конечные точки для вашего сервиса независимо от кодирования самого сервиса. Это
обеспечивает вашему сервису возможность эффективной работы как с существующими, так
и с новыми клиентами.
□ Address (адрес) — это уникальный URI для сервиса. Этот адрес используется
вызывающими клиентами для обнаружений сервиса. URI также определяет протокол, который
Глава 19. Ориентированные на сервис приложения
781
нужен для работы с этим адресом (такой как HTTP или TCP). Каждая конечная точка,
которую вы определяете для вашего сервиса, может иметь собственный адрес.
□ Behaviors (поведение)— определяет поведение конкретной сервисной операции,
конкретной конечной точки или всего сервиса. Вы можете описать поведение для таких
вещей, как учетные данные и пропускная способность сервиса.
□ Binding, Binding Element и Channel (привязка, элемент привязки и канал)— конечные
точки имеют привязки, которые описывают обмен через конечные точки. Привязка
включает информацию о транспорте, кодировании и безопасности. Например, вы
можете настроить привязку конечной точки для работы через транспорт HTTP с текстовой
кодировкой.
Привязка состоит из элементов привязки. Каждый элемент представляет собой часть
привязки. Например, у вас могут иметься элемент привязки для кодировки и элемент
привязки для транспорта. Элементы привязки и их настройка реализуются как каналы.
Элементы привязки располагаются в несколько уровней и формируют этот канал.
Таким образом, канал представляет собой фактическую реализацию привязки.
Visual Studio предоставляет различные инструменты, которые облегчают создание сервисов
WCF. Основные шаги таковы: необходимо описать проект WCF, создать сервисный
контракт (как интерфейс), реализовать сервисный контракт, а затем настроить конечные точки
связи для сервиса. Затем вы пишете клиента, который будет пользоваться сервисом (через
его конечные точки). И наконец, вы выбираете модель хостинга для вашего сервиса и
развертываете его соответствующим образом. Давайте же рассмотрим все эти шаги.
Шаблон проекта WCF Project
Вы можете использовать Visual Studio для создания проекта сервиса WCF аналогично тому,
как вы описываете другие проекты. Выбор File | New | Project приведет к открытию
диалогового окна Add New Project. Здесь вы можете выбрать узел WCF под языком С# или
Visual Basic. Это позволит вам выбрать шаблон проекта сервиса WCF (рис. 19.16). В этом
диалоге вы можете задать имя сервиса и местонахождение его кода.
Обратите внимание, что здесь имеется несколько шаблонов сервисов WCF. Эти шаблоны
позволяют вам создавать сервисы WCF под ваши конкретные запросы. Есть два шаблона
для рабочих процессов Windows: Sequential Workflow Service Library и State Machine
Workflow Service Library. Шаблон Syndication Service Library позволяет вам создавать
синдикационный сервис типа новостной ленты RSS. Мы же сосредоточим свое внимание на
стандартном шаблоне WCF Service Library.
Примечание
Есть еще один шаблон проекта для сервиса WCF. Он находится в узле Web
диалогового окна Add New Project. Этот шаблон создает сервис WCF, работу которого
обеспечивает ASP.NET и IIS (аналогично стандартному Web-сервису).
782
Часть V. Создание промышленных приложений
— •• ТЧмти
Project types.
Visual С*
Mndows
Web
Smart Device
Off ке
Database
Reporting
Silverlight
Test
WCF
Workflow
Other Languages
Other Project Types
Test Projects
Templates.
Visual Studin installed templdtr-s
ЩSequential Workflow Service Library
^Syndication Sen/ке Library
My Templates
JpSearch Online Templates...
,
[<Ш Framework^ w
estate Machine Workflow Service Library
!$&WCF Service Library
|ra|3
A project for creating a VVCF service cLrss Itbrary (.dll) (NET Framework 3.5)
Name- wVcfCustomerProfire
C\Users\msneir\Documents\Visual Studio 2008\Projects\972719
Рис. 19.16. Создаем новый проект сервиса WCF
Файлы библиотек сервиса WCF
Проект WCF Service Library, который создается по шаблону Visual Studio, содержит
интерфейс для описания вашего сервисного контракта, класс сервиса для реализации
интерфейса, файл App.config для настройки сервиса, а также ссылки на другие библиотеки .NET.
»/* 972719 - Microsoft V««
File Edit View Refactor Project ButW Debug Data Tools Test Window Help
1 ii * _j - J d & а -а & ** -r* - Ф - ~4 * Debu9 w - *?&"
• m
ь
ICust<MnerProf9e5ervice.cs
-Г'.- f!(i;h!
'ttWrx
*f, »f«J
* X iScWjnlKplorw-WdfCujtc»Tier... ▼ 4 Xf
.. _i using System;
; j ui*jiq- Зуэсев.Collections Generic;
! using System.Ling;
, | uaing System.Runtime.Serialisation;
*> ! using Syaten.ServiceModel;
using System.Isxt;
using 3usiae33Encitie3;
/
v J narrescace XcfCdscamerPiafile {
public interface .
GetCustc!BerProJileCr''ing cuatoeerld),
\\ 1 — —1
^ public class „V~pra.ce'
~J
^3 Solution "972719' E projects)
'I -Э BusinessEntities
; + 3^ tustomerMarvager
t <J$ CustomerProfile
'x. 3 EntrtyServices
i ijj WcfCustomerProfile
t jtf Properties
X id References
£ App config
^3 CustomerPrQfileSrrvice.es
j£,jj iCustomerProfileServke.es
1 jc5pSolution... ^ Macro L. ^Propwtfs
Рис. 19.17. Проект WCF Service Library
Глава 19. Ориентированные на сервис приложения
783
На рис. 19.17 показан новый проект на основе этого шаблона. В окне кода представлено
начало разработки интерфейса CustomerProf ileService.
Интерфейсный класс сервиса (ICustomerProfileService.cs на рисунке) — это тот интерфейс,
который вы используете для описания контракта вашего сервиса. Контракт включает в себя
сервисные операции и контракт данных. Выделение интерфейса в отдельный файл помогает
абстрагировать все атрибуты WCF и элементы контракта от логики вашего сервиса.
Класс определяется как сервис WCF при помощи атрибута ServiceContract в верхней
части класса. Кроме того, операции сервиса (методы сервиса) обозначаются как таковые
посредством применения к методу (GetCustomerProf ile) атрибута OperationContract.
Класс сервиса (в списке Solution Explorer это CustomerProfileService.cs) реализует
интерфейс сервиса. Именно здесь располагается логика сервиса независимо от того, содержится
ли в ней реальная бизнес-функциональность или вызовы другой библиотеки, в которой
находится фактический код реализации. На рис. 19.18 показано представление класса сервиса.
Обратите внимание, что этот класс является просто стандартным классом С# (он может
быть также и на Visual Basic), который реализует интерфейс сервиса. Эта модель
программирования должна быть вам хорошо знакома.
File Edit View Project BuHd Debug Data Tools Test Window Help
-Л " J ' J A & Д 4J > •* - «, " '* *> Debug - An/CPU - ££ 'J
Ц л ;ёё, ' ° J s ■, ,. у t&ifr ^
' CustomerProfileScrvfcee iCustor««PraidtSKytcE»ts j *"* X
-^A'crCustcmaProrileCurtomeiPrchleServi - $К-Ч*. л i v i'Vu *+t >,i'i'< i *,, ^ L^ ^ "P Ы A
- - ~ -- - ~ ., ^3 Solution 972719-E projects)
«UuySyKem.Callectiors.Seneric; Я; >' ^ BusineiErrtitie
.+" *23 CustomerManageT
•.+• ii$ CustcmerProfile
v i%$ EntJLyServites
'- '3 WdCustomerPrcfUe
и У Properties
Uj ~M References
J^ App config
яшшвввт
Jjj ICustcmerProfileServicecs
, иччпд Syacen.Lmq;
% using Systen Runtuae SeEialiietiDn;
С | uainq Syateja.SersnceKsa*!;
i ' usj.ng System.Isxt;
' изл.а? 3u3ine3aEnt_£ie3;
^П пагеаграсе XcrCascomerFrofile I
^3 J<Ublif, ClliSfl , , s-"* ,-, # • - * J '"n
I i r>t,i\Lic ~ .•" ~ GetZuatcrer?ref±le(a*Ti.n!.j customer Id) (
'I
Entity5ervicrs.'_af--* -
new EitityServicea.'
;:..' cu3cPr3fil» -
recurr ca3cPs-cfll£.3ecCust;oiB£ricii3to!nerIaJ ;
iu^5otutJo . sj3fc*a>:fc j*^F«op*rt
tteroisl Saved
Рис. 19.18. Код реализации сервиса WCF
Создание сервиса WCF
Теперь, когда вы знакомы со стандартным шаблоном проекта сервиса WCF, пришло время
изучить создание сервиса WCF при помощи Visual Studio 2008. Для примера разработаем
WCF-версию сервиса CustomerProfile, который мы уже создали ранее в разделе Web-
784
Часть V. Создание промышленных приложений
сервисов. Подобно тому сервису, данный сервис будет обращаться к объекту Customer,
описанному в библиотеке BusinessEntities (см. листинг 19.1), а также коду реализации
EntityServices (см. листинг 19.2). В последнем имеются методы для получения информации
о клиенте из хранилища данных и для сохранения изменений этой информации. Вот те
шаги, которые необходимо сделать для того, чтобы реализовать такую функциональность в
виде сервиса WCF:
1. Начните с создания нового проекта WCF Service Library. Назовите сервис CustomerPro-
fileService (а его интерфейс — ICustomerProf ileService).
2. Добавьте ссылки на библиотеки классов EntityServices и BusinessEntities (из
предыдущего примера для Web-сервиса).
3. Откройте файл ICustomerProf!leService. Удалите из файла образцовый код и добавьте
вместо него описания методов GetCustomerProfile, SaveCustomer и
DeleteCustomer. Каждое описание метода должно быть помечено атрибутом
[OperationContract]. Ваш код должен быть похож на листинг 19.9.
j Листинг 19,9. Описание интерфейса ICu^tomttrFxofileService
using System;
using System.Collections.Generic-
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using BusinessEntities;
namespace WcfCustomerProfile {
[ServiceContract]
public interface ICustomerProfileService {
[OperationContract]
Customer GetCustomerProfile(string customerld);
[OperationContract]
void DeleteCustomer(string customerld);
[OperationContract]
void SaveCustomer(Customer customer);
}
}
4. Затем откройте файл класса CustomerProfileService.es. Здесь вы будете реализовывать
код интерфейса, описанного на предыдущем шаге. Для начала выделите реализацию ин-
Глава 19. Ориентированные на сервис приложения
785
терфейса iCustomerProf ileService на уровне класса. Вы должны увидеть маленький
смарт-тег. Щелкните по нему и выберите пункт Implement Interface 'ICustomerProfile-
Service'. Это создаст заглушки для методов вашего сервиса. Затем добавьте код,
аналогичный листингу 19.10.
using System;
using System.Collections.Generic-
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using BusinessEntities;
namespace WcfCustomerProfile {
public class CustomerProfileService : ICustomerProfileService {
public Customer GetCustomerProfile(string customerld) {
EntityServices.CustomerProfile custProfile =
new EntityServices.CustomerProfile();
return custProfile.GetCustomer(customerld);
}
public void DeleteCustomer(string customerld) {
EntityServices.CustomerProfile custProfile = new
EntityServices.CustomerProfile();
custProfile.DeleteCustomer(customerld);
}
public void SaveCustomer(Customer customer) {
EntityServices.CustomerProfile custProfile =
new EntityServices.CustomerProfile();
custProfile.SaveCustomer(customer);
}
}
}
5. Последний шаг— обозначить созданный вами в первом примере объект Customer как
сериализуемый. Этот класс находился внутри библиотеки BusinessEntities. После этого
WCF будет знать, что она может сериализовать данные внутри класса для передачи меж-
786
Часть V. Создание промышленных приложений
ду клиентом и сервисом. Для этого используйте атрибуты DataContract пространства
имен System.Runtime. Serialization (вам может понадобиться добавить ссылку на
это пространство имен). Пометьте класс как DataContract, а каждое свойство— как
DataMember. Код показан в листинге 19.11.
using System;
using System.Runtime.Serialization;
namespace BusinessEntities {
[DataContract]
public class Customer {
[DataMember]
public string Id { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public string Email { get; set; }
[DataMember]
public string AddressLinel { get; set; }
[DataMember]
public string AddressLine2 { get; set; }
[DataMember]
public string City { get; set; }
[DataMember]
public string State { get; set; }
[DataMember]
public string PostalCode { get; set; }
[DataMember]
public string Phone { get; set; }
Глава 19. Ориентированные на сервис приложения
787
[DataMember]
public bool ContactEmail { get; set; }
[DataMember]
public bool ContactPhone { get; set; }
Вот и все. Теперь у вас есть простой сервис WCF, для которого вы можете настроить
конкретные конечные точки (для работы с различными вызывающими клиентами). Теперь мы
посмотрим, как использовать Visual Studio для тестирования сервиса WCF.
Выполнение и тестирование вашего сервиса WCF
Visual Studio 2008 поставляется с хост-приложением, которое вы можете использовать для
хостинга, выполнения и тестирования ваших сервисов. Вы настраиваете приложение вашего
сервиса как стартовый проект Visual Studio (надо щелкнуть по нему правой кнопкой мыши и
выбрать пункт Set as Startup Project). После этого вы можете выполнить ваше приложение
в режиме отладки. При этом запустится хост-приложение, а также будет создан клиент для
тестирования вашего сервиса. На рис. 19.19 показан хост-сервис. Доступ к нему можно
получить через системный лоток.
F.lc Help
Senncee
ВО!
SSS
айн
to ■>тюшттттт;
Addtona) Herniation
Service stated
Ready
Рис. 19.19. Хост-сервис WCF
Тестовый клиент WCF представляет ваш сервис и его операции. На рис. 19.20 показан
написанный в данном примере сервис (который выполняется внутри тестового клиента).
Обратите внимание на интерфейс iCustomerProf ileService. Вы можете раскрыть его для того,
чтобы увидеть операции вашего сервиса. Если вы дважды щелкнете по сервису, то в правой
788
Часть V. Создание промышленных приложений
части вы получите тестового клиента. Здесь мы выделили сервисную операцию
GetCustomerProfile.
Для вызова сервиса введите его параметры в разделе Request и нажимаете кнопку Invoke.
В нашем примере это означает ввод значения customerid и возврат объекта Customer.
На рис. 19.21 показаны результаты нашего теста.
Рис. 19.20. Тестовый клиент WCF
File Help
| £ %М/Service Protect i 1
П I- j^p/*xatost8731/DragnJVm_Ac
J Ы *? Cuetornen^ioflaServtee
I ! « GdCuetanerProfleO
I I * DeleteCustomerQ
J * SaveCurtoroflrO
I g) CorJig Ffe
1 4 r lit ► 1
1 Service invocation completed.
GetCuetomerPrrte
Requeet
| Name
i curfomerld
Reepx«e
| Nene
| В Murn)
AddwtUnel
J AddreesUneZ
1 <*V
1 Contact onii
CortactPhor»
J Em*l
i ld
! Name
! Phont
| PoitaCode
i State
| Formatted \Ш> \
"' "'" " """" "' ' I
Value Type
fi»sa62&66S4-467J> adeb 1 ac System Sbvig j
1 1
[ hwhe 1 1
Value Type 1
Вшлеи Entitle* Cuitomer 1
00 Some Street* Syelem String * 1
"Apt 1" Syitem Sbfig ; Щ
"РЮйюгдгГ Syetam Stmg ; 1
Falae Syetem Boolean 1
True Syrian Boolean fl
"rr*4eene!#contasc com' System String : '1
99ea62&66D-4672>ede&-1» Syelem String I
"Mke SneT Syitem Strfig 1
55-1234" Syrten Stmg . 1
5220" Syitem String i |
ТА" Syelem SWng , 1
— --— - - 1
Рис. 19.21. Сервис, вызываемый тестовым клиентом WCF
Глава 19. Ориентированные на сервис приложения 789
Вы можете также переключить отображение ваших результатов из представления Formatted
(см. рис. 19.21) в представление XML. Представление XML может быть полезным при
отладке. Переключение представлений происходит при нажатии на вкладку XML в нижней
части тестового клиента WCF. На рис. 19.22 показаны те же самые результаты в виде XML.
as wcf Тел citwt ДЯЯ^И^И
1 File Help
- ЗД My Service Propcti
*j| Htp Atocelic* 87ai/-Defflgn_Tine_A:
d 7' ICustomecProfileService
V DeJdeGuatomen}
V SaveCustomerfl
|| j^ Coring File
1 < " >
|l Service invocation completed.
ньшян^н^нн^^н^^в^^сг^!!^^!^^!
I GaCcrtomerProfita :
I Reque*
i о Envelope xmhs a-'Xtp/ъс*м w3 org/2(&5,^B<kJressfng' win» s»"hMp -'/www w3 org/2S *
i <kHeadw;
1 <ifiti>antmj*{hdw*and*HY *\ttoJ'Ami>iJi огв/1Си^опкгРгой1е5вллсе»<з«Си*«лвгРгсЛ1 L
1 <аМв*юде10>итии1(]Ж5а>Ш7БЗЧБ7сЪ34С«71а8ЭТа225й</аМешдеФ> ? §
i «a Rep*rTo> 1
i здАййеяээШр/А**** w3fctg/2(^v1}3/«ldreas)ng^WDnymoij»<'aAddieej> 1
i t'a Hep»yTo> [i
1 <-'$ Headeo i
<»Body- ~ It
Re-iponee 1
i ^ОлСийсдае^РгоГйЯмроп»»^™^^/'^*^?^!»^./^ *■ И
J dSetCuatomarProHeReiiA жп*» a- tap 'Vichemat datacoriract org '2004,137 EkJsnsasEntti R
>aAddr«Kljne1>100SonieS,-Mt^aAddieuUne1> Ц
ii <аЛ**е»Ые2хЦ* 1 о'аАИгемипе2> 1
i; <aCty>Pltabufgho'aCty> 1
! «а Озп1а4Бпа|ЫЫ«ел/а£аг*ас1Ета1? 1
ii ^CortactPhoneatrue</aCbrtactPhone> ]
; <a ld>639Ba626-6SS4-4t72*de5-1ac$20ccae42</a W> - И
1 < <a Nome >Mfce SneK/a Nam» j
taPhone>555-12J4^a Phones - 1
1' Flatted j xml 1
Рис. 19.22. Результаты тестового клиента в виде XML
Настройка сервиса WCF
Вы увидели те основы, которые необходимы для создания сервиса WCF. Теперь, когда ваш
сервис уже существует, можете отредактировать его конфигурацию для поддержки
различных клиентов. Это означает добавление конечных точек и соответствующей
конфигурационной информации. Помните, что при помощи WCF вы можете создать единственный
сервис, а затем оптимизировать его для работы с различными клиентами. Один клиент может
обращаться по HTTP, другой — по TCP, а третий — через именованные каналы. При
помощи конфигурации вы можете обеспечить поддержку всех этих клиентов (и не только их).
Вспомним, что шаблон WCF Service Library содержит файл App.config. Именно в этом
файле вы описываете конфигурацию вашего сервиса. К счастью, фирма Microsoft создала
вам в помощь редактор Service Configuration Editor. Для доступа к этому инструменту
необходимо щелкнуть правой кнопкой мыши по файлу App.config и выбрать пункт Edit WCF
Configuration. При этом запустится редактор (как показано на рис. 19.23).
Совет
Этот же редактор можно использовать и для редактирования конфигурационных
файлов WCF вне Visual Studio. Это может быть полезно тогда, когда вам нужно
выполнить редактирование уже после разработки. Для этого просто запустите
SvcConfigEditor.exe.
790
Часть V. Создание промышленных приложений
^Ц c\uie«Vmnetl\docurr*ntswt5uai itudio ?OOS\p»oject5\972719\entrty«rvi«5\appxonfig - */"crosoft Service Confi» >CD ^ ^ ШОЯВ
File Help
•s U Client
-U Metadata
CJ EndpoKs
LJ Bmings
lJ Dtognortcs
О Message Legging
_J Listeners
2j Sources
cr LJMvBncod
] Endport Behaviors
LJ Service Behaviors
t* '_l Ыепзюпз
'♦) 2j Hostsig Envronment
Cr&s^e a New Service
Create a NewCiiert
ЙИШЬ»
Summary
Cr^sfr a Nt^Vr-Wc';.
No service is defined
Рис. 19.23. Редактор конфигурации WCF Configuration Editor
F.fe Help
gcpllpefty, l T uT
'„ ^2 Services
- *„ WdCustom«PrD«eCustciiiefPio»ieServioe
v_J Hoit
""""] (Empty Name)
"~] {Empty Name-
t LJOert
Hi Bndngs
» lJ Oagnortice
л LJ Advanced
ЯИвййвИЯЙ* in
Summary
Thee are nc properties tc show, m «hs page Exps
nodes
rieate a Npw S«*rvic»
Deal» a Ner* Uiert
Рис. 19.24. Запуск мастера New Service Endpoint Element Wizard
Вы можете использовать этот инструмент для выполнения индивидуальных настроек
элементов вашей конфигурации. Однако лучше всего данным инструментом пользоваться
при помощи его мастеров. В нем есть мастер для определения новой конечной точки.
Далее описаны шаги для создания новой конечной точки по протоколу TCP для
CustomerProfileService.
Глава 19. Ориентированные на сервис приложения
791
Мы будем использовать эту конечную точку для вызова сервиса после создания клиента.
1. Для начала выделите каталог Endpoints. В панели Tasks выберите пункт Create a New
Service Endpoint (рис. 19.24). При этом откроется диалоговое окно для новой конечной
точки.
2. Первый шаг мастера— выбор сервиса, для которого вы описываете новую конечную
точку. Это показано на рис. 19.25. Вы выбираете наш сервис ICustomerProfileService.
3. Следующий шаг— выбрать режим связи сервиса. Вы можете выбрать TCP, HTTP,
именованные каналы, MSMQ, а также Peer to Peer. Для нашего примера выберите TCP (рис. 19.26).
What service contract are you using?
A Contract is s collection of operations the* specifies whet the endpanl corTmunicstes to she outside world It
tsusuaJry A* name of #ж interface thst you define in code Yooceni»e'Browse' то seJectthe ccrtrset from
your service «a sembly
Specify the service contract for the service
cornet тшт^тж^т^шшя
] [ Cancel ]
Рис. 19.25. Определить сервисный контракт для конечной точки
TCP baeed communication Use th» rate for servtcee thai require tat ccmmлясвЬсп «n the
network
> HTTP
HTTP bMed саттадчсаЪсп Use the mode for service* that require irrterop bated on the wefc service
•'") Nsned Pipes
Use Hut inooe for fast рп-«меЬяе <wrnrnun»calion.
Queued cornmurecabon огнпвсЬпе and across the network ТЬэ cornmumcabon mode requires
MSMQ to be tmtailed
J"> Peer To Peer
Create a node in в peer tc peer network
< Previous. ](^3*ек*>~"
Cancel ]
Рис. 19.26. Настроить связь конечной точки
792
Часть V. Создание промышленных приложений
4. Затем вам нужно указать адрес (или URI) для обнаружения сервиса. Для нашего примера
укажите net.tcp://localhost/CutomerProfileService. Мы организуем хостинг нашего сервиса
по этому адресу. Вызывающие клиенты смогут получить сервис в этой точке. На
рис. 19.27 показан ввод этого значения.
5. На этом работа мастера New Service Endpoint Element Wizard завершается. Вы должны
увидеть сводку настроек конечной точки (рис. 19.28). Нажмите кнопку Finish для
завершения операции.
■ <Ъулот Ц Н*а> | ' * t ' Qferi |
Рис. 19.27. Указать адрес конечной точки
^ < Prewoo» ] ' < CZ^^~~I С***1 ]
Рис. 19.28. Сводка настроек мастера New Service Endpoint Element Wizard
Глава 19. Ориентированные на сервис приложения
793
Затем нам нужно убедиться, что для сервиса включено совместное использование
портов. Это позволит множеству клиентов получить доступ к одному и тому же ТСР-порту
данного компьютера. Для этого выделите в дереве конфигурации каталог Bindings. В
панели Tasks выберите New Binding Configuration. После этого откроется диалоговое
окно, которое попросит вас выбрать тип привязки (рис. 19.29). Выберите netTcpBinding и
нажмите кнопку ОК.
File Help
йуидр»
щртм^чЩ Cr**tft a Ne* Bir
-1 ^_J Servcei
_. *, WrfajatomerProfleCustDfnerPrclii
- LJEhdporH»
1 ть HTTP and
~WHTTPBn
""iTCPBlndng
► LH Cttert
♦» lJ Diagnoses
f ^J Advanced
New Binding Corfigjataor*
Create a New Service
Create a Ne*£ errt
M
Рева* select a bir-dm? type
[base Hap Bning
i bascHttp-ConteXBrxIrig
; custom Bindng
'mexHftp&ndng
; mexHttpsBndrxj
j mexNan»e:IP*)eB»idng
текТсрВгккч
! mamqNegrahonBnding
1 netMamq&nding
net Named Pipe Bndng
■ natPeerTcpBmdtfTg
netTcpv-ortodoBTdnfl
webHttpBmding
w«20C7FederaUonHttpftndng
*o2DC7Http frying
wiDuatttlpBrring
weFaderaltanHttpBndrig
wsHttp&ndbng
wtHttpConte»! Bndwig
«
J 1 C*fK^
Рис. 19.29. Создание новой конфигурации привязки
7. В окне свойств привязки найдите свойство PortSharingEnabled и установите его
значение в True (рис. 19.30). Укажите также имя для привязки — Port Sharing Binding.
8. Затем в дереве конфигурации выделите созданную вами в мастере конечную точку.
Найдите ее свойство BindingConfiguration и установите его значение в название
конфигурации привязки, которую вы создали ранее (это PortSharingBinding). Пример показан на
рис. 19.31.
Теперь вы можете закрыть редактор Configuration Editor. Теперь вы можете открыть файл
App.config и увидеть в нем элемент <netTcpBinding> и ваш новый элемент <endpoint>.
Вы можете запустить сервис точно так же, как и раньше. На этот раз вы должны увидеть
хосты как для конечной точки HTTP, так и для конечной точки TCP (рис. 19.32).
Совет
Для того чтобы это правильно работало в Windows Vista, вам может понадобиться
включить совместное использование TCP-портов на компьютере. Вы можете сделать
это при помощи следующей командной строки (для этого вам понадобятся права
администратора): sc.exe config NetTcpPortSharing start= demand.
794
Часть V. Создание промышленных приложений
Щ cVujwAmjnffP^dc<utn«Tts^^
^Ш^ШШ^ШШШлШШ^Ш^Ш^ШШШ-
\ - Mjcpwoft Service
File Help
.^ШШШЖ.шшшшшш
- _J Service» j
- *> WcfCustornerProfie CustamerProfileSerYlce j
-J Host |
- ...3 EndDOrte i
'
wa HTTP finding 1
тех HTTP Binding !
TCP Bmdng [
т lldtert
t .".J Bindrx» i
7% Port Sharing Bmdng «netTcpBmdng) '
♦ lJ I>agno5tcs ,
<• ^ Advanced
i
;
'
Ceiete &ndingCar*£jralJW j
Geete s (Jess. Service
Create a New Client
nctTcpBlRding; Port Sharing Binding
Br,ding [$9<su(lfy\
MaxB-ffe'FoolSrze
MaxBa'teSze
МахСоглесйогз
MaxRecei vec №essage&ze
OpenTi-rwoat
Ь^.^^^^ШШШШШШ
ReceiveTirneoiit
SerxiTimeoLit
TrareacborFlcw
T'ar sactoor pTotoed
TrarsferMode
j В R«ad«rQuotoi Рщяи»
j МахДп v. Length
Ma> Bytes D*rRe.»d
MaxDeptr-
Max MafreT abieChajCouU
MexSTnrgC&ntentLength
i G FUlistrieSKsnt Properties
Enabled
Insctr/it/Timeout
Ordered
PortSharngEnblBd
524288
65536
10
65536
00 01 00
iTrue) I
00 10 00
00 01.00
False
Ole Transactions
Bufrerad
0
a
0
0
a
False
00 10 00
True
A boolean value that specifies whether TCP port shanng is erafcJed fee this
corneclior.
1
*
H
" 1
'
Рис. 19.30. Установить PortSharingEnabled в True
J3| cc\jJser3\r«5rKfr4dDc:jmeT,tsWisuai c«fcH<^2808\proj»clA97Z71^«(cSra - Microsoft Se-vice- ~
File Help
i ^} Service*
J *, Wdartomen^naftteC^omerProHeSexvice
a Host
- _J Endporti
we HTTP BWog
-Ц тех HTTP Bmdrig
"^ TCP BmoVig
i IJOent
; UBfxinga
7% Port Shermg Binding IhetTcpBtndrg}
) ^J Diagnostic!
„J Advanced
Delete Endpoint
Create e New Servite.
Create a NewGient
Мйи^йайв^
General j
ldentty[Heed«i
IB (ConfiguBtion)
i Nara
|g Endpwnt Properties
BehaviorCcrfijuration
Binding
BmdingNa-rce
BrndingNsTjespace
Contract
Lister Un
UsterllnMode
TCP
net Jcpy^ocdhoa*/QjstomerPrufileS«
nelTcp Binding
I Bindings oenne the protocol (lor example transport and encoding зе»пдэ j to be
j ь-seo to computtcate *ilh an efidpoim Choose the binding type and fcindirgccnfi
Рис. 19.31. Выбор BindingConfiguration для конечной точки
Теперь мы рассмотрим создание клиента для вызова нашего сервиса через эту новую
конечную точку.
Глава 19. Ориентированные на сервис приложения
795
File Help
_ Й§] Mv Service Projects
- 3») Щ> /locatwst S?3b'T>3(gn_Time_AddrM$e
X* CujtcmerPmfteSefvte (WSbHpBncfengj|
V GetCusiomerPniieO
V DeleteCustomerfl
V SaveCustcmrj)
.. J^ ICuatenwProrileSenrtce^'NelTcpBrKilngJ'l
*» GetCustomerFVafileO
V DeWeCuaiemerfl
[J^ Cottfig Fie
G«|Cuetofl»fProWe SaveCustomer '
Request
Name
f- customer
Address Lne1
AddrcssLne2
City
Contact bnal
Cert ad Phone
Email
Ftapon»
Name
Formatted j><ML i
Value
БиапмгЕлМюэ Customer
hull
JndO
ni}
Fake
Fabe
tu»
Value
Type
Business Entities Customer *
System Stnng
System String
System Stnng
System Boolean
System BviDtean
System Stnng
Type
*
'
invoke j
Service added successfully
Рис. 19.32. Новая конечная точка внутри тестового клиента WCF
Использование сервиса WCF
Мы пользуемся сервисом WCF аналогично тому, как было описано ранее для Web-сервиса.
Начать нужно с добавления в ваш проект ссылки на сервис. Вот список необходимых для
этого шагов:
1. Убедитесь, что приложение CustomerManager вашего решения не содержит ссылок на
сервисы. Если там все еще есть ссылка, которую вы создали в предыдущем разделе по
Web-сервисам ASP.NET, то удалите ее. Удалите также и файл App.config, поскольку он
может содержать конфигурации сервиса. Он будет создан вновь.
2. Щелкните правой кнопкой мыши по проекту и выберите пункт Add Service Reference.
При этом откроется диалоговое окно Add Service Reference (рис. 19.33). Вы можете
использовать кнопку Discover для поиска сервиса WCF в данном решении. Настройте
пространство имен для ссылки в значение CustomerServiceProfile и нажмите кнопку ОК.
3. Теперь у вас имеется новая ссылка на сервис и новый файл App.config. Вы можете
использовать редактор WCF Configuration Editor и для конфигурационных файлов клиента.
Щелкните правой кнопкой мыши по файлу App.config в приложении CustomerManager и
выберите пункт Edit WCF Configuration для того, чтобы открыть конфигурацию
(рис. 19.34). Выберите каталог Client. Обратите внимание, что там имеются две
клиентские конечные точки: одна для HTTP, а другая для TCP. Запомните их названия (они вам
скоро понадобятся) и закройте редактор.
4. Последний шаг — необходимо изменить способ создания экземпляра сервиса. Вернемся
к коду листинга 19.7. Здесь вы создали экземпляр CustomerProf ileSoapClient. Вам
нужно изменить этот код для создания экземпляра CustomerProfileServiceClient.
Это экземпляр клиента WCF, который создается ссылкой на сервис. Вспомните, что для
796
Часть V. Создание промышленных приложений
этого сервиса имеются две конечные точки. В конструктор сервиса вы передаете ту
конечную точку, которой хотите воспользоваться. Это делается по имени конечной точки:
CustomerProfileService.CustomerProfileServiceClient cp =
New CustomerProfileService.CustomerProfileServiceClient(
"WSHttpBinding_ICustomerProfileService");
To see 9 tot of available service* on a specific server, enter a service URL and click Go. To browse f cr available
services, click Discover.
Address;
Services;
нхштшшач^ягг * \ go [d«
H (?) $|) CurtomerProfileService
вшивши
Operations
<*DeteteCustomer
i «GetCuitomerProhle
j VSaveCuitomei
il service(s) found at address
^ttp:/yiccalhost&731/Design^'ro*_Addre5KvWcrcuslome^
Namespace:
CietomerProfiteService
i 0*
Рис. 19.33. Диалоговое окно Add Service Reference
£j Беллой
- 1 iWm
-U Metadata
L) L) Endparti
"П WSrttpB«dr>g_ICuBtomerPro«e5er
~^ NetTcpftnding.lCuatomerPnftleServ
x d Bindhge
♦ LJ Degnoetica
i '22 Advanced
4 V >
Create в New Service
Create a No» Chert
Summary
См -fr n Ne« Uierrt
[Vle.e
http ;*localhc«t 873rD«qjp_T T*_Ai»es5eiA,,'cfCust
«Httpftnding
WS4tlcBirrfin3 iCwS;omersrr" .Srmce
Cus'omeTPjcFileSersv.elCb-atcrnefFicfileSdr/ic^
Address
Bindirs
Binding confiuwaben
Cortraci
Eiulpoint NetTrpBuidi iMk^
Adores» n«t,tcp locdhKtCustcrne'pTOfileSer/ic»
&rri тд n*Tcpbnding
BireHrso eorvfigur^ricn sl<flTcc№rdiHT iCfts-^PrdilgS^r ce
Cortrsct Cae.oiierPrcfiltbefvice ICustome'ProfileSer.ire
Рис. 19.34. Конфигурационный файл клиента WCF открыт в редакторе
Глава 19. Ориентированные на сервис приложения
797
Вот и все. В этом коде вы указываете, что хотите работать с конечной точкой HTTP.
Генерируемый Visual Studio хост может легко работать с конечными точками HTTP. Теперь вы
можете запустить приложение CustomerManager и подключиться непосредственно к вашему
сервису WCF.
Конечно, здесь не хватает еще одного шага. Как Visual Studio не может быть хостом для
ваших Web-сайтов, точно так же она не предназначена и для постоянной работы хостом
ваших сервисов. Вам нужно выбрать хост, развернуть на нем ваш сервис, а затем изменить
способ доступа клиента к сервису. Давайте посмотрим, как это делается.
Хостинг и развертывание сервиса WCF
Для того чтобы ваш сервис мог принимать запросы, он должен выполняться и быть в
активном состоянии. Это означает, что он должен иметь в качестве хоста какую-то исполняющую
среду. Вспомните из нашего описания Web-сервисов: их хостинг обеспечивал для нас IIS.
Мы можем обеспечить с его помощью и хостинг ваших сервисов WCF. Однако есть и
другие возможности.
Мы хотим подобрать такой хост, который будет соответствовать вашим потребностям.
Например, если у вас имеется одноранговое приложение, то вы наверное уже знаете, что
каждый узел сети может обеспечивать хостинг своих собственных сервисов. Вам нужно также
учесть такие вопросы, как развертывание, гибкость, мониторинг, управление временем
жизни процессов, безопасность и т. д. Далее мы приводим краткий обзор имеющихся вариантов
хостинга для WCF.
□ Self-Hosted (собственный). Сервис с собственным хостингом содержит сервис внутри
работающего исполняемого файла. Исполняемый файл — это написанный вами
управляемый код. Вы просто встраиваете в него еще один или несколько сервисов. Таким
образом, сервис получает собственный хостинг. Дополнительный процесс для выполнения
ему не требуется. Его временем жизни управляет время жизни исполняемого файла.
Когда исполняемый файл работает, то сервис слушает запросы и соответствующим
образом на них откликается. Если это не так, то сервис находится в нерабочем состоянии.
Сервисы с собственным хостингом хороши тогда, когда вашим клиентам нужно
обмениваться друг с другом. Так происходит в одноранговых приложениях типа Microsoft
Groove. Каждый клиент имеет сервисы, которые могут общаться с другими клиентами.
Для создания сервиса с собственным хостингом вы создаете (внутри вашего
приложения) экземпляр класса ServiceHost. Этому классу передается экземпляр вашего
сервиса. Затем вы вызываете метод Open класса ServiceHost для того, чтобы начать хостинг
сервиса. Когда работа закончена, вы вызываете метод Close.
□ Windows Service (сервис Windows). Вы можете обеспечить хостинг вашего сервиса WCF
внутри сервиса Windows. Windows Service инсталлируется на компьютере как сервис.
Сервис Windows можно запустить, остановить, а также запустить при перезагрузке
системы. Таким образом, сервисы Windows очень устойчивы и надежны для тех случаев,
когда вам нужно, чтобы сервисы просто постоянно работали. Они поддерживаются на
всех клиентских и серверных версиях операционных систем Windows.
Для создания сервиса Windows (который будет обеспечивать хостинг вашего сервиса
WCF) вы создаете производный от ServiceBase класс. Затем вы перекрываете методы
798
Часть V. Создание промышленных приложений
Onstart и OnStop для того, чтобы настроить хост для вашего сервиса. В методе
Onstart вы создаете глобальный экземпляр ServiceHost, а потом вызываете метод
Open для того, чтобы начать прослушивать запросы. Затем вы просто вызываете метод
Close метода OnStop.
И наконец, вы создаете класс инсталлятора для вашего сервиса — для инсталляции его в
каталоге сервисов компьютера. Этот класс наследует от класса installer. Затем вы
компилируете код и запускаете installutil для инсталляции сервиса на компьютер.
□ IIS. IIS может быть хостом для ваших сервисов WCF. Вы можете использовать многие
встроенные в эту платформу преимущества, в том числе мониторинг, высокую
готовность, высокую масштабируемость и т. д. Однако при хостинге в IIS можно
использовать только транспорт HTTP. Во многих случаях это может быть ограничивающим
фактором.
Для хостинга вашего сервиса WCF в IIS вам необходимо сначала создать новый каталог
IIS и настроить его как приложение. Затем вы создаете svc-файл для представления
вашего сервиса. Если вы использовали шаблон WCF из каталога Web-проектов, то он уже
есть у вас по умолчанию. Этот файл должен содержать директиву для того, чтобы
ASP.NET видела ваш сервис. Вот ее пример:
<%@ServiceHost language=c# Debug="true"
Service="WcfCustomerProfile.CustomerProfileService"%>
Затем вы можете развернуть ваш сервис в подкаталоге AppCode каталога приложения
IIS. Он содержит класс реализации сервиса, его интерфейс, а также конфигурационный
файл.
□ WAS (Windows Process Activation Service). WAS появился в Windows Server 2008
(имеется он также и в Windows Vista). WAS дает вам все преимущества IIS (мониторинг
работоспособности, повторное использование процессов, активацию по сообщению
и т. д.) и не ограничен одним только HTTP. WAS работает через HTTP, TCP,
именованные каналы и MSMQ. Кроме того, WAS не требует от вас написания кода хостинга
(как в случае собственного хостинга и в варианте сервиса Windows). Вместо этого вы
просто настраиваете WAS для того, чтобы он обеспечивал хостинг вашего сервиса.
Как видите, для хостинга вашего сервиса существует много вариантов. Каждый имеет свои
достоинства и недостатки (в смысле настройки, кодирования, конфигурирования и
развертывания). Вы можете потратить на изучение этих вариантов какое-то дополнительное время
(в соответствии с вашими потребностями). Вы можете найти дополнительную информацию
по каждому варианту в MSDN. Просто поищите "WCF Hosting Options", и вы найдете
практические руководства для каждого только что обсуждавшегося хоста.
Резюме
Данная глава познакомила вас с Web-сервисами ASP.NET и сервисами на основе WCF. Вы
видели, как .NET абстрагирует программирование сервисов и предоставляет инструменты
для облегчения вашей жизни. Таким образом, вы можете сосредоточиться на создании
бизнес-функционала (а не на написании служебного кода).
Глава 19. Ориентированные на сервис приложения
799
Вот некоторые ключевые моменты данной главы:
□ Web-сервисы основаны на открытых стандартах. .NET соблюдает эти стандарты для
того, чтобы гетерогенные приложения могли работать совместно с Web-сервисами;
□ Web-сервис ASP.NET состоит из asmx-файла, который указывает на выделенный код
сервиса. Web-сервис работает только через HTTP. Этот asmx-файл представляет собой
URI сервиса;
□ сервис WCF можно создать с несколькими конечными точками (для эффективной
поддержки множества клиентов с различными протоколами обмена). Сервисы WCF
работают по HTTP, TCP, именованным каналам (и это еще не все);
□ вы пользуетесь сервисом посредством добавления ссылки на сервис. При этом
генерируется локальный прокси-клиент, который вызывается вашим кодом.
Глава 20
Встраивание рабочих процессов
в ваши приложения
Существует много типов приложений, с которыми вы можете столкнуться как разработчик.
Возможно, вам придется создавать элементы управления пользовательского интерфейса,
Web-сайты, клиентов, инфраструктуры, сервисы, отчеты по данным и т. д. Существует,
однако, особый класс приложений, которые создаются для управления бизнес-процессами.
Бизнес-процесс может вовлекать много других приложений, систем и людей. Возможно,
вам даже приходилось уже писать приложение подобного рода. Например, у вас может
'иметься в наличии библиотека для обработки заказа. В ней может содержаться метод,
который знает, как распознать заказ, прочитать данные из базы данных и дать соответствующий
ответ на запрос. Скорее всего этот код взаимодействует с другими библиотеками кода,
сервисами и системами. Такой тип кода называется приложением рабочего процесса.
Рабочий процесс — это просто набор шагов, которые необходимо последовательно
обработать для того, чтобы реализовать конкретную бизнес-цель или задачу. Рабочие процессы
есть везде. Например, обработка таких документов, как авансовые отчеты, табели, заказы на
покупку, счета и запросы на выделение средств— это все рабочие процессы. Кроме того,
такие задачи как прокат фильма, обработка ссуды и бронирование номера в отеле— это
тоже рабочие процессы. Возможно, вы уже писали код такого рода (хотя и не называли его
рабочим процессом).
В этой главе описаны фундаментальные концепции создания рабочих процессов при
помощи Visual Studio и технологии Windows Workflow Foundation (WF). Здесь мы опишем
создание как последовательных рабочих процессов, так и рабочих процессов на базе конечных
состояний. Мы также рассмотрим варианты хостинга рабочих процессов и вызова их из
клиентского приложения.
Примечание
Вы можете создавать приложения Windows Workflow как при помощи Visual Studio
2005, так и Visual Studio 2008. Необходимые инструменты поставляются в комплекте с
версией 2008. Для версии 2005 вам нужно будет скачать расширения Windows
Workflow Extensions. Библиотеки классов Windows Workflow имеются в составе .NET 3.0 и
.NET 3.5. Последняя имеет несколько улучшений для рабочих процессов и WCF
Однако в основном вы можете создать точно такие же рабочие процессы и при помощи
версии 3.0.
Глава 20. Встраивание рабочих процессов в ваши приложения
801
Фундаментальные основы Windows Workflow
Вы должны представлять себе рабочий процесс как последовательность связанных между
собой шагов для решения определенной бизнес-проблемы. На этих шагах для выполнения
задач может вызываться внешний код или сервисы. Они обычно требуют вмешательства
человека (такого как утверждение или некая другая соответствующая форма обработки).
Когда задача завершена, то начинает выполняться следующая задача рабочего процесса —
и так до завершения процесса. Рабочий процесс может приостанавливаться при
выполнении, ожидая получения сообщения или реакции пользователя. Рабочий процесс может быть
коротким или длительным (занимающим дни и даже месяцы). Таким образом, рабочий
процесс имитирует потребности реальных бизнес-процессов.
Технология Windows Workflow Foundation (WF) фирмы Microsoft предоставляет набор
инструментов для графического изображения рабочих процессов, а также исполняющую среду
для формализации процесса выполнения кода рабочего процесса. Вы используете эти
инструменты для проецирования шагов бизнес-процесса на те действия, которые выполняются
исполняющей средой рабочего процесса. Давайте же посмотрим, как это работает.
Компоненты рабочего процесса
Перед тем как начать создавать рабочие процессы, важно понимать те компоненты, которые
используются для того, чтобы помогать вам создавать и выполнять эти рабочие процессы.
Первый — это визуальный конструктор, который позволяет вам визуально создавать код
вашего рабочего процесса. Использование конструктора аналогично созданию формы
Windows или ASP.NET. Вы могли бы сделать все это при помощи одного только кода, но
инструменты значительно облегчают этот процесс.
После завершения кодирования ваш рабочий процесс компилируется в сборку. Эта сборка
используется хост-приложением для создания экземпляра вашего рабочего процесса (по
запросу клиента). На рис. 20.1 показано визуальное представление этого процесса.
^
ш
W
Хост-приложение для рабочего процесса
?
f Исполняющая среда
рабочее процесса
WtrtflcMftuntnie w =
New WorkflowRunfcrie 0
I t ■ ч Wo'kflowh^ncedientlnstarce= ' Ведет Обмен ^/Щ|
Откомпилировано +-+\ MyWAsaemdsl J wcreateWo*1cwrMyWfAs»m di- ~"T~"
clief.llnstance sla\:
Сярямм|
I Правила |Пранзакции11 Сохранение j \ Отсгеживзние [
Клиентское
приложение
Рис. 20.1. Компоненты Windows Workflow
Обратите внимание, что рисунок слева представляет собой рабочий процесс. Он
компилируется в сборку. Затем на эту сборку ссылается создаваемое вами хост-приложение. Это
802
Часть V. Создание промышленных приложений
хост-приложение может быть сайтом ASP.NET, Web-сервисом, сервисом Windows, а также
любым другим процессом .NET. Хост отвечает за управление клиентскими запросами к
рабочему процессу.
Хост управляет запросами при помощи создания экземпляра объекта WorkflowRuntime.
Именно этот объект создает экземпляры вашего рабочего процесса. Он использует
планировщик рабочих процессов для запуска рабочего процесса в определенном потоке и
возвращения вам указателя (GUID) на рабочий процесс. Затем вы можете использовать этот
GUID для получения работающего экземпляра рабочего процесса от исполняющей среды.
Исполняющая среда либо вызывает сервис планировщика (он не показан) для рабочих
процессов в оперативной памяти, либо использует сервис хранения для повторной активации
сохраненного рабочего процесса.
Клиенты ведут обмен с хостом при помощи любого выбранного вами механизма.
Фактически вы можете скомбинировать клиента и хост в одном приложении. Это может быть
полезно при тестировании, а также для тех приложений, в которых рабочий процесс имеет смысл
только при работающем клиенте (и поэтому несколько рабочих процессов не
поддерживается). Более часто встречающимся вариантом обмена с клиентами является создание хост-
приложения в виде сервиса Windows, которое работает с Remoting или WCF (в качестве
канала связи). Вы можете также вести обмен с рабочими процессами в процессе Web-сайта
или предоставлять их через Web-сервис по HTTP.
Теперь, когда у вас есть базовое представление, давайте рассмотрим инструменты, которые
yisual Studio предоставляет для создания рабочих процессов. Мы вернемся ко всем этим
концепциям в последующих разделах и продемонстрируем их работу.
Шаблоны проектов рабочих процессов
Вспомним, что существуют два основных типа рабочих процессов: последовательные и те,
которые работают в соответствии с изменением состояний основного документа (или записи
данных). Исполняющая среда рабочих процессов знает эти типы. Фактически созданный как
конечный автомат рабочий поток наследует от класса StateMachineWorkf lowActivity, в то
время как последовательный рабочий поток реализует класс SequentialWorkf lowActivity.
Эти типы рабочих потоков нашли свое отражение и в инструментах. Например, когда вы
создаете новый проект рабочего потока, то вас просят выбрать соответствующий тип
проекта. На рис. 20.2 показан диалог Add New Project с выделенным узлом Workflow. Конечно,
вы можете создавать проекты рабочих процессов как на Visual Basic, так и на С#.
Многие шаблоны проектов на рисунке имеют две разновидности: один для процесса
конечного автомата, а другой — последовательный. Выбор типа создает проект, в который
включен файл, реализующий соответствующий класс. Вы можете добавить любой тип рабочего
процесса в любой тип проекта. Вы можете также начать с пустого проекта рабочего
процесса, в который будете просто добавлять элементы рабочих процессов.
Есть шаблоны проектов, которые включают в себя также и хост-приложение. Они
обозначены как Console application (как для последовательного процесса, так и для процесса на
основе конечного автомата). Проект такого типа будет содержать простое хост-приложение,
которое создает экземпляр вашего рабочего процесса. Вы можете использовать этот тип
проекта во время проектирования для выполнения и тестирования вашего рабочего процес-
Глава 20. Встраивание рабочих процессов в ваши приложения
803
са по мере его создания. Однако когда вы будете готовы выдать окончательный вариант,
вам нужно будет удалить приложение Console application и изменить тип проекта на проект
библиотеки (dll).
Add Ne* Project
U
Project types:
,NET Frarow/Dfk 35
■ пО
Visual С*
Windows
Web
Office
Database
Reporting
Silverlight
Test
WCF
Workflow
Other Languages
Other Project Types
Test Projects
Vtsual Studio installed templates
rP Empty WorHlo* Project
!Щ Sequential Workflow Library
^SharePcmt 2D07 State Machine Workflow
•^ State Machine Workflow Library
My Templates
^Search Online Templates^,
i
/p Sequ ential Workflow Console Applicat,
^ SharePcint 2007 Sequential Workflow '
^pState Machine Workflow Console Appl j
,^ Workflow Activity Library [
1
j
!
1
1
'
'
1 A project for creating a sequential workflow console application. (NET Framework 35)
Name TravelRequertWf
Locations Cj\Users\msnell\Docoment5\My StuffWisual Studio 2008\97272Q\Chapter 20WS2IC8U-C20
Рис. 20.2. Добавление нового рабочего процесса
Новый проект рабочего процесса настраивает также и соответствующие ссылки для рабочих'
процессов внутри .NET Framework. Ключевые пространства имен, инкапсулирующих
классы рабочих процессов — это System.Workflow.Activities (различные действия рабочих
процессов), System.Workflow.Runtime (классы исполняющей среды, связанные с
рабочими процессами), а также System.Workflow.ComponentModel (включает базовые классы,
используемые для конструирования действий рабочих процессов).
Визуальный конструктор рабочих процессов
Когда вы создаете новый проект рабочего процесса, то по умолчанию он открывается
внутри визуального конструктора рабочих процессов Workflow Designer. Этот инструмент
позволяет вам графически изображать ваши рабочие процессы (их действия, состояния и
связи). Вы используете этот инструмент и для работы с каждым действием (для настройки его
свойств и связей). На рис. 20.3 показан пример конструктора Workflow Designer внутри
Visual Studio 2008.
Обратите внимание на центральную часть экрана. Это поверхность конструирования для
рабочего процесса. Показано создание последовательного рабочего процесса. В начале этого
рабочего процесса (в его верхней части) имеется стрелка старта, а в нижней части — значок
окончания (для указания завершения рабочего процесса). В нижней правой части конструктора
находятся три инструмента: Print Preview, Zoom и Pan. Рабочие процессы — это визуальное
представление соответствия вашего кода бизнес-процессам, и поэтому их часто
распечатывают для анализа и совместного использования. Функции изменения масштаба (Zoom) и пано-
804
Часть V. Создание промышленных приложений
рамирования (Pan) полезны, поскольку рабочий процесс может стать очень большим и вам
понадобятся возможности для поиска и рассмотрения отдельных его фрагментов.
Действия на поверхность конструирования вы перетаскиваете из панели Toolbox, которая
показана в левой части экрана. Обратите внимание на множество действий, которые могут
быть использованы для рабочего процесса. Скоро мы их опишем.
Панель инструментов рабочих процессов Действие
Панель _
Windows Workflow"
ф VS?*RJ C20 Mtr,cwt» VkuuJ S.udt»
Fi»r Ыу V.trw Prwfl Build T.«b\f 0*»* "'oefc
[ Window» WortSL» '
1^ Pfetl**'
,}J СвЧЬ*е»гз»/е1.,
, > Соье
*] Cfcl ipmWtAbSc. <
; sij) Сш ь» twtmdAct *
< ф r*-rnOr-vrn
! fc F*aH*f»«JI<t>
.{■J H« « ebur «alt,,,
4 «Use
. <•«; btwk«Wrb*«fv«r
I J& InvaktrWcwtfin»
i t > гчм-rtitH
< Pr (<•>•
< ii Suspend
'«t Wfodiw Hrip
на
He*
i*2
Поверхность конструирования
рабочих процессов
jy kagnrt «
~. 4$ TnveRecje«t»recenc$
'Ик^^кДкЗ^
|R
y"*"«l|
'iftlMfettvltyl Sy*«« WertJW*
'Nam*;
>Kk«AciM<yL
Свойства и действия
рабочих процессов
Кнопки Print Preview. Zoom и Pan
Рис. 20.3. Инструменты рабочих процессов
Окно свойств рабочего процесса
Внизу справа на рис. 20.3 показано окно Properties для выделенного действия рабочего
процесса. В данном случае выделено действие codeActivityl. Окно свойств является
основным средством наименования действий, доступа к их конфигурации, а также подключения
их к коду. Нижняя часть окна свойств содержит набор операций, которые применимы к
выделенному действию. Здесь вы можете генерировать обработчики событий, просматривать
дополнительные свойства, управлять условными ветвлениями (если они имеются) и т. д.
Если вы что-то забудете, то, возможно, вы сможете найти ссылку на операцию в этом окне.
Панель инструментов рабочих процессов
Панель инструментов рабочих процессов (показана в верхней части рис. 20.3) позволяет вам
изменять масштаб, а также делать панорамирование по рабочему процессу. Вы можете так-
Глава 20. Встраивание рабочих процессов в ваши приложения
805
же использовать значки плюса и минуса для разворачивания и сворачивания вложенных
действий (таких как действие IfElse, показанное на предыдущем рисунке). Значки, которые
похожи на пиктограммы Visual Studio для комментирования, используются для включения
или отключения действий. Вы просто выделяете действие и нажимаете кнопку Disable для
того, чтобы его закомментировать.
Для работы с нестандартными темами рабочих процессов вы можете использовать две
кнопки на правом конце панели инструментов. Тема рабочего процесса позволяет вам
изменить внешний вид рабочего процесса внутри визуального конструктора. Вы можете
изменить цвета, шрифты, толщину линий и многое другое. Вторая кнопка справа запускает
инструмент настройки тем Theme Configuration (рис. 20.4). Обратите здесь внимание, что для
действия Code выбирается белый фон и пунктирный контур. Ваша тема будет сохранена в
wtm-файле (это файл темы рабочего процесса). Последняя кнопка на панели открывает
диалоговое окно Options и выделяет узел Workflow Designer | Themes. Здесь вы можете
выбрать конкретный файл темы для вашего рабочего процесса.
Theme Configuration
Them* N«mc My Favorite Theme
Theme lociltcn С \Lken\m&ncJIVAppD«l*
SeJecl Designer »nd Configure Properties.
-}J WoriJIow
l> Actrvity Designers
Д- AutoApprove
J.I C»IIF_iterr»slMeihod
-% Compensate
ii GetMnnayrr
\) Hjndl«EitenalEv*nt
jij» InvokeWebiervice
PcIk>
_£, SendActrvrty
3 SetState
ft Suspend
Q Termintte
% Throw
•ii, 'AebServiceFjult
\Ro«rring\vVindt?«s VScrlrflow Four>ctition\ThemeiSMy Favorite Theme wtti
' h«
» В Background
| BacfcColorStart [ | White
B«ckColcrEnd | | White
Ber>groundSty(e Horizontal 1
1 В Foreground ' <
DesignerlmigePsth
FcreCclor LB 0.0.0 i
BorderColor Щ 128.128. 128
BorderSt>le Dash
BackCoiorStart
» Pieise specify the dtttqntt background qradient color.
|
1
!
f
i
4
CtHf Nil» Wl> ktfe>*
1 »
3
i-
OK | j С*«че>
. № ^ w ^^
~llMSff
;-i
►
r
i
PrevteiM <<
ТЯЖТ
Рис. 20.4. Настройка нестандартной темы для вашего рабочего процесса
Шаблоны элементов рабочего процесса
Элементы в рабочий процесс добавляются точно так же, как и в любой другой проект (надо
щелкнуть по файлу проекта правой кнопкой мыши и выбрать пункт Add | New Item). При
этом откроется диалог Add New Item с выделенным узлом Workflow (рис. 20.5).
В этом диалоговом окне вы можете добавить новое действие, последовательный рабочий
процесс, а также рабочий процесс типа конечного автомата. Эти рабочие процессы будут
дополнительными рабочими процессами в проекте (как мы это уже обсуждали). Элемент
действия позволяет вам создать нестандартное действие для вашего рабочего процесса. Есть
также и библиотека для создания совместно используемых действий (это похоже на
пользовательский или нестандартный элемент управления).
806
Часть V. Создание промышленных приложений
Add New Item - TVavdRequestWf
Categories.
Vrsuaf C# hems
Code
Date
General
Web
Windows Forms
WPF
Reporting
Workflow
Sequential Workflow wrth definition express
N<me- Woikf fowl дот!
■& лШШ1
Templates:
Visual Studio installed templates
i Ф Ф 4
Activrty Activity (л-fth Sequential
code separ Workflow.
! Li
Web
Ccnfigurat..
My Templates
J
Search
Online Те.
4
Sequential
Workflow
[with code
separation)
ed as Xami and user cade in a separate code file.
4
State
Math in
1
*?]
State
Machine.
Add
1$Ы&»П
Be :
Cancel
Рис. 20.5. Шаблоны элементов рабочих процессов
Для каждого типа элемента имеются две версии. Одна версия каждого шаблона элемента
помечена текстом "(with code separation)" (с разделением кода). Вы можете видеть это в
выделенном на рисунке элементе. Эти шаблоны элементов позволяют вам выразить рабочий
процесс в виде кода разметки XAML (вместо сгенерированного визуальным конструктором
С# или VB). Выраженный в виде XAML рабочий процесс имеет расширение xoml (для того
чтобы не путать его с xaml-файлами в WPF). Для создания рабочего процесса на XAML вы
также используете визуальный конструктор. Однако некоторым разработчикам может
оказаться легче работать с разметкой (если им нужно редактировать рабочий процесс в коде).
В конечном итоге все рабочие процессы компилируются в сборку. Далее показана
сгенерированная визуальным конструктором разметка XAML для простого последовательного
рабочего процесса:
<SequentialWorkflowActivity x:Class="TravelRequestWf.Workflow!"
х:Name="Workflowl"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns="http://schemas.micro3oft.com/winfx/2006/xaml/workflow">
<CodeActivity x:Name="codeActivityl" />
<IfElseActivity x:Name="ifElseActivityl">
<IfElseBranchActivity x:Name="ifElseBranchActivityl">
<CallExternalMethodActivity x:Name="callExternalMethodActivityl" />
</IfElseBranchActivity>
<IfElseBranchActivity x:Name="ifElseBranchActivity2">
<CodeActivity x:Name="codeActivity2" />
</IfElseBranchActivity>
</IfElseActivity>
</SequentialWorkflowActivity>
Глава 20. Встраивание рабочих процессов в ваши приложения
807
В виде частичного класса визуальный конструктор генерирует этот же самый рабочий
процесс следующим образом (в файле <HMH_pa6o4ero_npouecca>.Designer.cs (или vb)):
namespace TravelRequestWf {
partial class TravelRequestProcess {
private IfElseBranchActivity ifElseBranchActivity2;
private IfElseBranchActivity ifElseBranchActivityl;
private IfElseActivity ifElseActivityl;
private CodeActivity codeActivity2;
private CallExternalMethodActivity callExternalMethodActivityl;
private CodeActivity codeActivityl;
[System.Diagnostics.DebuggerNonUserCode]
private void InitializeComponent() {
this.CanModifyActivities = true;
this.codeActivity2 = new System.Workflow.Activities.CodeActivity();
this.callExternalMethodActivityl =
new System.Workflow.Activities.CallExternalMethodActivity();
this.ifElseBranchActivity2 =
new System.Workflow.Activities.IfElseBranchActivity();
this.ifElseBranchActivityl =
new System.Workflow.Activities.IfElseBranchActivity();
this.ifElseActivityl =
new System.Workflow.Activities.IfElseActivity();
this.codeActivityl =
new System.Workflow.Activities.CodeActivity();
//
// codeActivity2
//
this.codeActivity2.Name = McodeActivity2";
//
// callExternalMethodActivityl
//
this.callExternalMethodActivityl.Name =McallExternalMethodActivityl";
//
// ifElseBranchActivity2
//
this.ifElseBranchActivity2.Activities.Add(this.codeActivity2);
this.ifElseBranchActivity2.Name = flifElseBranchActivity2";
//
// ifElseBranchActivityl
808
Часть V. Создание промышленных приложений
//
this.ifElseBranchActivityl.Activities.Add
(this.callExternalMethodActivityl);
this.ifElseBranchActivityl.Name = "ifElseBranchActivityl";
//
// ifElseActivityl
//
this.ifElseActivityl.Activities.Add(this.ifElseBranchActivityl) ;
this.ifElseActivityl.Activities.Add(this.ifElseBranchActivity2) ;
this.ifElseActivityl.Name = "ifElseActivityl";
//
// codeActivityl
//
this.codeActivityl.Name = "codeActivityl";
//
// TravelRequestProcess
//
this.Activities.Add(this.codeActivityl);
this.Activities.Add(this.ifElseActivityl);
this.Name = "TravelRequestProcess";
this.CanModifyActivities = false;
Совет
Те, кто хочет вести разработку в коде и не хочет пользоваться визуальными
инструментами, уже поняли, что это вполне возможно. Фактически вы можете совместить
объявления действий и метод initializeComponents в одном файле (как это было
показано ранее с вашим классом рабочего процесса). Точно так же компилятор
поступает при компиляции двух частичных классов.
Действия рабочих процессов
Шаги вашего бизнес-процесса вы проецируете на набор действий, которые определяют ваш
рабочий процесс. У вас могут быть действия, которые вызывают внутренний код,
обращаются к Web-сервисам, либо вызывают некий член сборки, на которую имеется ссылка. Ваши
действия могут иметь ветвления в зависимости от переданных в рабочий процесс данных.
Вы можете использовать действия для параллельного выполнения задач. Действия Windows
Workflow представляют собой богатый набор инструментов для кодирования бизнес-
процессов.
Наборы действий для последовательного рабочего процесса и процесса типа конечного
автомата почти одинаковы. Это и понятно, поскольку процесс типа конечного автомата — это
Глава 20. Встраивание рабочих процессов в ваши приложения 809
просто другой способ подхода к последовательности действий бизнес-процесса. Здесь
каждое состояние содержит последовательности (вместо единой длинной последовательности).
Существует несколько дополнительных действий для работы с установкой состояний и
запуском действий.
В табл. 20.1 представлены самые часто встречающиеся действия, которые вы будете
использовать для создания ваших рабочих процессов. Каждое действие приведено вместе с его
значком с панели инструментов и кратким описанием.
Таблица 20.1. Ключевые действия рабочих процессов в панели инструментов
Действие
| ф CalfExtemalMetnod
| J Code |
I б 0е|аУ I
| xfy EventDnven |
| ~[l HandleExtemafEvent |
I Л tfE,se I
| H^ InvokeWebService |
| Щ InvokeWorkflow |
'{«Ф Parallel |
| 3 SetSfate |
| [3 Statelnrtialization |
| [J] StateFinalizatian |
Описание
Используется для вызова метода из сборки .NET. Этот метод
внешний по отношению к рабочему процессу
Служит для вызова кода, содержащегося внутри вашего рабочего
процесса. Вы подключаете это действие к методу кода,
связанному с вашим рабочим процессом
Используется для создания паузы в вашем рабочем процессе
Предназначено для подключения событий, которые реализуют
интерфейс lEventActivity. В действие EventDriven могут
быть вложены другие действия, которые должны выполняться как
часть события
Используется для того, чтобы позволить внешнему приложению
вызывать ваше действие (как при ожидании утверждения). Ваш
рабочий процесс на этом действии приостанавливается до
возникновения события
Используется для обеспечения условного ветвления. Условия
могут быть реализованы в виде выражений или набора правил,
которыми можно управлять извне самого рабочего процесса
Применяется для вызова Web-сервиса из вашего рабочего
процесса
Может использоваться для асинхронного вызова другого рабочего
процесса
Используется для группирования двух или более
последовательностей действий, которые можно выполнять параллельно
Обратите внимание, что по своей сути рабочие процессы однопоточ-
ны. Поэтому параллельные действия выполняются по
циклическому алгоритму, а не по-настоящему многопоточно
Применяется только внутри рабочих процессов типа конечного
автомата. Позволяет вам перейти из одного состояния рабочего
процесса в другое
Действие можно использовать для последовательности действий,
которая выполняется тогда, когда рабочий процесс типа
конечного автомата впервые переходит в данное конкретное состояние
Служит для выполнения набора действий непосредственно перед
переходом из одного состояния в другое
810
Часть V. Создание промышленных приложений
Таблица 20.1 (окончание)
Действие
| 0 White |
| 4S RectfrveActivity |
| Jy- SendActivity |
Описание
Можно использовать для выполнения цикла по другому действию
до момента выполнения определенного условия Действие While
может содержать только одно действие. Если вам нужен цикл из
нескольких действий, сделайте это единственное действие
действием SequenceActivity (которое может содержать несколько
дочерних действий)
Используется для получения данных при помощи WCF
Служит для отправки данных при помощи WCF
Теперь с фундаментальными основами технологии Windows Workflow покончено. Пришло
время применить эти знания путем создания сначала последовательного рабочего процесса,
а затем и рабочего процесса типа конечного автомата.
Создание последовательного рабочего процесса
Последовательный рабочий процесс очень похож на блок-схему. Обработка начинается на-
рерху и продвигается вниз. По пути принимаются различные решения, и рабочий процесс
делает ветвления. Рабочий процесс может иметь внутри себя цикл, но в конечном итоге он
закончится. Последовательные рабочие процессы очень похожи на то, что вы рисуете на
доске, когда описываете свои бизнес-процессы (большое количество прямоугольников и
стрелок).
Лучший способ понять строение Windows Workflow— это создать рабочий процесс для
реального бизнес-процесса. В следующих разделах мы пройдем основные шаги создания
последовательного рабочего процесса.
Конструирование рабочего процесса
Рабочий процесс начинается с концепции в виде диаграммы (на листе бумаги или на доске).
Затем вы используете инструменты конструирования для отображения этой концепции на
действия рабочего процесса. В нашем примере мы предположим, что вы работаете на
большую компанию, которой необходимо автоматизировать и отслеживать процесс обработки
запросов на деловые поездки.
Пользователь инициирует запрос на деловую поездку посредством заполнения формы (она
может находиться на Web-сайте, внутри клиентского приложения, создаваться из формы
InfoPath и т. д.). Форма подключена к поставщикам транспортных услуг и имеет свою
внутреннюю логику, которая вычисляет общую стоимость поездки: авиационный перелет,
аренда машины, суточные, расходы на парковку и за пробег. Пользователя также просят
написать обоснование поездки.
Глава 20. Встраивание рабочих процессов в ваши приложения 811
Если сумма запроса не превышает 1500 долларов и запрашивающий занимает должность
менеджера или более высокую, то запрос утверждается автоматически. Однако если запрос
превышает 1500 долларов (или запрашивающий не является менеджером), то ему требуется
утверждение более высокопоставленного менеджера. В этом случае о запросе уведомляется
непосредственный менеджер пользователя. Менеджер вносит его в систему, где он может
его просмотреть и утвердить (или отклонить). После утверждения через поставщиков
транспортных услуг выполняются необходимые бронирования и запросившему сообщаются все
необходимые подробности его поездки. Для обработки бронирований имеется приложение
Web-сервиса.
Реальное приложение для регистрации запроса и выполнения утверждения является
внешним по отношению к рабочему процессу (точно так же, как и хост). Создание клиента и
хоста мы рассмотрим в одном из следующих разделов. Пока же вы будете имитировать клиента
внутри консольного приложения, которое будет настроено для работы в качестве хоста
рабочего процесса. Вот те шаги, которые необходимо выполнить в Visual Studio 2008 для
создания такого рабочего процесса:
1. Создайте новый проект приложения Sequential Workflow Console application с
названием TravelRequestWf (на языке Visual Basic или на С#). В этом примере будет
использоваться С#, но все концепции и визуальный дизайн сохраняются и для Visual Basic. Мы
будем использовать Console application для того, чтобы выполнять и тестировать
рабочий процесс без необходимости создавать отдельный хост и отдельного клиента.
2. Переименуйте рабочий процесс по умолчанию (Workflowl) в шаблоне проекта на
TravelRequestProcess. По умолчанию Visual Studio создаст рабочий процесс в виде кода.
Однако этот пример будет функционировать с рабочим процессом и в виде кода, и в виде
XAML.
3. При первом создании рабочего процесса запроса на деловую поездку требуется
некоторая информация о запросе: имя пользователя, запрашивающего поездку; а также общая
стоимость поездки. Кроме того, в рабочий процесс должен быть передан идентификатор
запроса на поездку (для того чтобы связать его с подробностями запроса в базе
данных — в том случае, если это понадобится).
Все эти данные будут переданы из хост-приложения в рабочий процесс как параметры.
WorkflowRuntime проецирует эти параметры на свойства вашего рабочего процесса.
Затем вы можете использовать эти свойства в рабочем процессе (как входные и выходные
параметры).
Для добавления свойств щелкните правой кнопкой мыши по вашему рабочему процессу
и выберите иункт View Code. Затем вы можете добавить свойства в ваш класс
TravelRequestProcess. Ваши свойства должны выглядеть примерно так:
namespace TravelRequestWf {
public sealed partial class TravelRequestProcess :
SequentialWorkflowActivity {
public TravelRequestProcess() {
InitializeComponent();
}
27 3ак 3716
812
Часть V. Создание промышленных приложений
public string TravelRequestor { get; set; }
public double TravelCost { get; set; }
public int TravelRequestld { get; set; }
4. Теперь вы можете начать конструирование рабочего процесса. Дважды щелкните по
файлу рабочего процесса (для того чтобы он открылся в визуальном конструкторе).
Первое действие, которое вам необходимо добавить, — это уведомление менеджера,
который должен выполнить утверждение. Предположим, что этот код содержится во
внешней сборке (поскольку он используется во многих приложениях). Поэтому перетащите
действие CallExternalMethod на поверхность конструирования и подключите его к
линии рабочего процесса, которая соединяет значки начала и конца.
Для настройки имени GetUserProf ile для этого действия используйте панель свойств
Properties (щелкните по действию правой кнопкой мыши и выберите пункт Properties).
Пока нет необходимости настраивать это действие, вы настроите все действия в
отдельном шаге.
5. На следующем шаге рабочего процесса вы должны определить, является ли
запрашивающий пользователь менеджером. Для этого добавьте действие IfElse на поверхность
конструирования сразу под действием CallExternalMethod. В панели свойств присвойте
этому действию имя ifUserManager.
*J> V52K8U-C20 - Mkrasoft VUual Studre
File Edit View Project Build Debug Drti Tools Test Window Help
>£ j ' TravetRequeslProcess^s (Design]*
Sequential Workflow
Т^ЖаййГ
№
htmW Saved
*
Рис. 20.6. Последовательный рабочий процесс с ветвлением ifUserManager
Глава 20. Встраивание рабочих процессов в ваши приложения
813
Вы будете использовать левую ветку действия IfElse для того случая, когда пользователь
является менеджером. Выделите эту ветку и назовите ее if Manage г. Выделите правую
ветку и назовите ее elseNotManager.
Ваша панель конструирования должна быть похожа на то, что показано на рис. 20.6.
6. В той ветке, которая выполняется тогда, когда пользователь является менеджером,
нужно проверить еще одно условие. Здесь вам нужно еще одно действие IfElse для
определения, не превышает ли запрос 1500 долларов. Назовите это действие
ifOverThreshold. Используйте левую сторону для случая true, а правую для случая
false. Назовите ветви соответственно ifOver и el seAu to Approve.
В ветке, где требуется утверждение, добавьте действие CallExternalMethod и назовите
его NotifyManager. Здесь будет использоваться разделяемая библиотека для
уведомления менеджера о необходимости утверждения. Ниже него нужно добавить действие для
обработки утверждения. Для этого вы перетаскиваете действие HandleExternalEvent на
поверхность конструирования. Это приведет к приостановке рабочего процесса и
ожиданию события от внешнего приложения (в котором будут содержаться подробности
утверждения). Назовите это действие awaitApprovalForManager.
В ветке с автоматическим утверждением вам нужно сообщить рабочему процессу, что
запрос был утвержден. Для этого добавьте действие Code. Оно будет использоваться для
вызова в рабочий процесс внутреннего метода и соответствующей установки состояния
утверждения. Назовите это действие setAutoApprove.
Ваш рабочий процесс должен выглядеть примерно так, как показано на рис. 20.7.
Рис. 20.7. Условия утверждения для менеджеров
814
Часть V. Создание промышленных приложений
7. Теперь вам нужно настроить ту ветку, которая выполняется в том случае, когда
делающий запрос пользователь не является менеджером. Сначала вам нужно добавить
действие CallExternalMethod с именем Not if yManager2. Затем ниже него добавьте действие
HandleExternalEvent и назовите его awaitManagerApproval.
Ваш рабочий процесс теперь должен выглядеть примерно так, как показано на рис. 20.8.
8. Последним шагом вам нужно добавить действие для выяснения результата утверждения.
Для этого добавьте еще одно действие IfElse между предыдущим действием и точкой
завершения. Назовите это действие checkApproval. Назовите левую ветку ifApproved, a
правую— if Rejected.
Внутри ветки утверждения добавьте действие InvokeWebService для вызова сервиса,
который работает с сайтами поставщиков для выполнения бронирований (откажитесь пока
от диалогового окна Web-ссылки). Назовите его invokeTravelReservations. Под ним
добавьте действие CallExternalMethod, которое будет уведомлять пользователя о
номере подтверждения бронирования. Назовите его SendConf irmationNotice.
Внутри ветки отклонения добавьте действие CallExternalMethod, которое будет
уведомлять пользователя, что поездка была отклонена. Назовите его SendRejectionNotice.
Эта часть вашего рабочего процесса должна выглядеть примерно так, как представлено
на рис. 20.9.
*#> VS2KSU-C20 - Mrcrosoft Visual Studio
file Edit View Project Build Debug Workflow Dat* Took Test Analyze Window Hefp
TravHRequestProceu.es [Design]*
Г
i«Ovef
I
(
I
*S i*>,.'fil'7fVMr50lCl
4
о
£lse*L*sAparov«
3
I 0
yt awaitApprovalFor I
Manager }
I
I
j teWUvAppirum
■V
4* wummm
i awaitManagerAp
* praval |
is
™L
hern(s) Saved
Рис. 20.8. Добавление утверждения менеджера
для запросов от тех, кто не является менеджером
Теперь ваш рабочий процесс сконструирован. Следующий шаг— настроить все действия,
которые вы только что поместили в рабочий процесс (вызываемый ими код, обрабатывав-
Глава 20. Встраивание рабочих процессов в ваши приложения
815
мые ими события, а также правила, с которыми они работают). Мы рассмотрим каждый тип
действия и обсудим их настройку.
*/> VS2K8U-C20 - Microsoft Visual Siuoso
File Edit View Preyed Buttd Debug Workflow Date Tools
H
TncvelRcquestProces&cs [Design!"
5
I i
1 * l
t
1
£1
v invoJ«Te«¥#fRe**
** rvaticns ^
i 1)
f tj SwdCbftferfcsifc» | "
['*■ fiHtfatt j
,
f
1
El
ftem{s} Saved
сз \sX щ}$$Mщ
Test Window Help
4
w x ^i
J
SI
** *<« .....I
i |
\
„ 1
Щ
43!
1 i
Рис. 20.9. Раздел обработки утверждений в рабочем процессе
Настройка действий CallExternalMethod
Для начала вы настроите все действия CallExternalMethod. Это делается одинаково. После
того как вы настроите одно из них, вы сможете настроить и все остальные.
Для настройки вызова внешнего кода из рабочего процесса вы должны сначала описать
интерфейс, помеченный атрибутом ExternalDataExchangeAttribute. Рабочий процесс
будет настроен на вызов этого интерфейса. Затем этот же самый интерфейс будет реализован в
хост-приложении в виде класса, после чего хост зарегистрирует экземпляр реализации в
исполняющей среде. Далее исполняющая среда будет вызывать этот экземпляр. Хост и
клиента мы скоро рассмотрим. Пока же давайте опишем интерфейсы и настроим действия:
1. Добавьте в проект рабочего процесса интерфейс (при помощи диалога Add Item) и
назовите его lUserProf ile. В нем будет определена сигнатура метода isUserManager,
который принимает строку userid. Ваш код должен выглядеть примерно так:
using System;
using System.Collections.Generic-
using System.Linq;
using System.Text;
using System.Workflow.Activities;
816
Часть V. Создание промышленных приложений
namespace TravelRequestWf {
[ExternalDataExchange]
public interface IUserProfile {
bool IsUserManager(string userld);
}
}
2. Добавьте в проект рабочего процесса еще один интерфейс и назовите его
iNotification. В нем будут определены сигнатуры различных методов уведомления.
Код должен выглядеть примерно так:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Workflow.Activities;
namespace TravelRequestWf {
[ExternalDataExchange]
public interface INotification {
void NotifyPendingApproval(string userld);
void RejectTravel(string userld, int travelId);
void NotifyUser(string userld, string message);
void SendConfirmation(string userld, string confirmationNumber);
}
}
3. Откройте рабочий процесс в визуальном конструкторе. Выделите действие
GetUserProf ile и просмотрите его свойства. Нажмите кнопку с многоточием у
свойства InterfaceType. При этом появится диалоговое окно Browse and Select a .NET Type,
позволяющее вам выбрать интерфейс, который этот метод будет вызывать. Пример
показан на рис. 20.10. Выберите только что созданный вами интерфейс iUserProf ile.
4. Затем выберите в выпадающем списке MethodName. Выберите IsUserManager.
5. Теперь вы должны увидеть в панели Properties два дополнительных свойства: userld и
Return Value, userld — это параметр метода IsUserManager. Нажмите кнопку с
многоточием рядом с параметром для того, чтобы получить диалоговое окно (рис. 20.11).
Здесь вы можете выбрать свойства, которые ранее описали для вашего объекта.
Выделите TravelRequestor. Вспомните, что это свойство будет настраиваться при первом
запуске рабочего процесса.
6. Затем вам нужно сделать то же самое для того, чтобы отобразить результат
(ReturnValue) вызова метода IsUserManager на локальное свойство. Сначала добавьте
Глава 20. Встраивание рабочих процессов в ваши приложения
817
в рабочий процесс новое свойство (при помощи файла выделенного кода) типа Boolean.
Назовите его isUserManager. Выделите свойство ReturnValue в панели свойств
Properties и выберите действие привязки свойства в нижней части страницы. После этого
появится диалог привязки свойства. Выберите здесь свойство IsUserManager.
Browie and Select a NET Type
4h —.fa. j fr—Hw —*ЛшЛ м>1. »f btMullMrf^li... j»*»trih.H»
Type Name TravelRequertWfJUierProfile
Type ^ Advanced
1 4j <Current Project>
^ {) TravdRequertWf
43 Referenced Assemblies
Type Name »• Fully Qualified Name
£3lApprovel TravelRequestWfJApproval
123lNoufictnon TravelRequestWfJNotjficaiton
Selected Type lUaerPraflte member of {TraveUUqueslWf}
Conttrncd in А&етЫу <СштеМ Pro$ect>
Рис. 20.10. Настройка свойства InterfaceType для действия CallExternalMethod
Bind ЧиегЫ' to an activity's property иЦШаШ
| Bind to an existing member j ВЫ to *fw» member
i \ -r $ TravdRequertProcea
W-£ GetUserProfile
Ш A rfUcerManage?
i ft) l*i chetfcAppreval
4 df ConnrmationNumbcr
ffl j^P DynamicUpdaleCondition
i i <ЙР Name
^jf Description
T be selected property of type 'SysterruString' can be «ss«jned to the target property of type
'Syjtrmitrlng'.
£««*» )
Рис. 20.11. Проецирование параметра вызова метода на свойство рабочего процесса
818
Часть V. Создание промышленных приложений
Обратите внимание, что значка с красным восклицательным знаком в действии больше нет.
Это означает, что действие было настроено без ошибок. Вам нужно будет повторить эти
шаги для других действий HandleExternalMethod: NotifyManager, NotifyManager2,
SendConf imation и SendRejectionNotice. Вот подсказки для этого:
□ предполагаем, что метод NotifyPendingApproval принимает идентификатор
запрашивающего пользователя и ищет менеджера;
□ при использовании метода NotifyUser просто введите строковый литерал в качестве
свойства сообщения;
□ создайте в рабочем процессе новое свойство для хранения номера подтверждения
бронирования, возвращенного Web-сервисом поставщика транспортных услуг. Его можно
привязать к параметру conf irmationNumber метода SendConf irmation.
Настройка действия CodeActivity
Вы можете настроить действие CodeActivity двойным щелчком по нему — оно будет
сгенерировано и подключено к методу вашего рабочего процесса. Либо вы можете использовать
окно свойств для настройки свойства ExecuteCode.
Выделите CodeActivity с именем setAutoApprove и дважды щелкните по нему. Внутри
редактора кода добавьте локальное поле для отслеживания состояния утверждения рабочего
процесса. Затем установите это поле в значение true (внутри действия setAutoApprove).
Ваш код должен выглядеть примерно так:
private bool _isApproved = false;
private void setAutoApprove_ExecuteCode(object sender, EventArgs e) {
_isApproved = true;
}
Настройка действий IfElse
и использование редактора RuleConditionEditor
Ваша следующая задача — настройка условий IfElse. Вы можете создать два типа условий:
кодовые условия и условия декларативных правил. Первые позволяют вам написать код
условия в вашем рабочем процессе. Последние используют для управления условиями движок
правил. Для нашего примера вы настроите условия декларативных правил:
1. Откройте рабочий процесс в визуальном конструкторе. Сначала вы настроите ветки
ifUserManager. Выделите ветку if Manage r и просмотрите ее свойства. Выделите
свойство Condition. Настройте его на условие декларативных правил. Это даст вам два
дополнительных свойства под свойством Condition: ConditionName и Expression.
2. Нажмите в ConditionName кнопку с многоточием для запуска диалога Select Condition.
Здесь щелкните по кнопке New в панели управления для создания нового условия. При
этом вы получите диалог редактора правил Rule Condition Editor (рис. 20.12).
3. Настройте в условии булево выражение, которое определяет содержимое локального
свойства isUserManager (для того чтобы определить, равняется ли оно true). Обратите
Глава 20. Встраивание рабочих процессов в ваши приложения
819
внимание, что в этом окне работает технология IntelliSense. Нажмите кнопку ОК и
выберите Rename для того чтобы дать условию название isManager. Нажмите кнопку ОК
еще раз (для того, чтобы закрыть диалог Select Condition). Теперь вы настроили ветку
ifManager для IfElse-действия в ifUserManager.
<Л VS2K2U-C?D - Microsoft Visual Studio
File Edit View Project ША PebuaPfU T<x»fcTest WfrdowHelp
&
<tm
Rudy
Se*ja*Condrtion
\V я
'%Jf Select з rule condition to be assigned to the actfvtty's condition. You can elso add, edit, delete с
rename existing conditions
| Name
Rule Condition Ed-tor
J
ГЛёД
Edit constraints to create a rule condition.
Eximplerthis^Propl s= 'Ye" [| lhis.Prop2 == 2
Condrtюre
thisJsliserManoger== tru
I ^TripleDESCiyptoServiceProvider
?Triptet
Рис. 20.12. Добавление условия декларативного правила
4. Повторите этот процесс для ветки elseNotManager. Вычислите свойство
IsUserManager (равно ли оно false?). Назовите это правило NotManager. Этот шаг
необязателен, поскольку условие else будет выполнено автоматически (если другое
условие окажется false).
5. Повторите этот процесс для ветки ifOver в ifOverThreshold. Настройте условие для
этой ветки на вычисление выражения this.TravelCost >= 1500 и назовите его
OverThreshold. Нет необходимости явно настраивать ветку else, поскольку она будет
выполнена в том случае, когда условие другой ветки будет false.
6. Повторите процедуру для ветки if Approved в checkApproval. Настройте условие для
этой ветки на вычисление выражения this.isApproved = true и назовите его
Is Approved. И опять нет необходимости явно настраивать ветку else.
Все действия IfElse настроены. Теперь на этих действиях и их ветвях не должно быть
значков ошибок.
Настройка действия InvokeWebService
Теперь вам нужно добавить Web-сервис для имитации выполнения резервирований. Для
этого добавьте в ваше решение проект ASP.NET Web Service project. Создайте единствен-
820
Часть V. Создание промышленных приложений
ный метод ReserveTravel, который принимает идентификатор записи запроса на поездку
и возвращает номер подтверждения. Ваш код должен выглядеть примерно так:
namespace TravelReservationService {
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfilel_l) ]
[ToolboxItem(false)]
public class Reservation : System.Web.Services.WebService {
[WebMethod]
public string ReserveTravel(int travelld) {
// Тестовый код для возврата номера подтверждения
return XCV89432";
Вернитесь к вашему рабочему процессу и добавьте ссылку на этот Web-сервис. Используйте
кнопку Advanced в диалоговом окне Add Service Reference для добавления стандартной
ссылки на Web-сервис (вместо ссылки на клиента WCF). Это упростит наш пример. Вы
можете назвать эту ссылку TravelReservationService. Теперь вы готовы
сконфигурировать действие Invoke WebService.
Properties
[ InvduTraveMesenntlons System WorkflowJtotvrtiesJnvokeWebSeiviceActivrty
pIU*]* ^
[ (Name)
Ыкшш^н
1 Name
[ Path
[ Description
trebled
Invoked
Invoking
1 MethodNime
Ц PrncyCliss
Sessiordd
ЯВ travelld
Name
Path
i URL
iiwokeTr*velReu»rv*tions
Д ActrvrtyzTravelRequertPnjcea, Path=ConfkmitionNumber|
TraveJReqMestProcesa
ConflrmaHonNumber
True
>л
a
ReserveTravel
TravHRequestWf.Trave9ReseTV«tionServkeJU*ervatk>fl
it ActMty=TnveJRequestProcess, Pam=TravetRequefUd
TnvdReqvcstProccn
TraveJReqHestld
http//localhest:59aiS/ReservsMoaasinK
f generate Handlers. Prorrote ВшодЫе Properties. Щг\4 property 'fRetunValiel'^
[ . -- --..-;
..- - . - - j: „„ „ — -—г" - . _ -
Ц!
Tl
CI
J
Рис. 20.13. Конфигурация Web-сервиса invokeTravelReservations
Настройте действие InvokeWebService так, чтобы оно вызывало прокси-класс, который был
сгенерирован тогда, когда вы настраивали Web-ссылку. Для этого сделайте следующее:
1. Сначала выделите действие invokeTravelReservations и просмотрите его свойства.
Глава 20. Встраивание рабочих процессов в ваши приложения
821
2. Выделите свойство ProxyClass и настройте его в значение
TravelRequestWf. TravelReservationService. Reservation (оно должно появиться
в раскрывающемся списке).
3. Укажите для метода имя ReserveT ravel.
4. Используйте панель свойств для привязки параметра travelled к свойству
TravelRequestid рабочего процесса. Сделайте то же самое и для возвращаемого
значения метода. Привяжите его к свойству ConfirmationNumber.
Ваша конфигурация должна выглядеть так, как показано на рис. 20.13.
Настройка действий HandleExternalEvent
Последние два действия, которые вам нужно настроить,— это HandleExternalEvent.
Вспомните, что эти действия должны ждать сообщения извне (о том, что утверждение было
послано). Это аналогично внешнему приложению, вызывающему метод вашего рабочего
процесса. Однако благодаря природе рабочего процесса (сохранение в базе данных,
длительность, работа в исполняющей среде) вы не можете просто вызвать метод, как сделали
бы это для другого класса. Вместо.этого необходимо использовать действия
HandleExternalEvent. Для их настройки вам придется написать некий код. Однако при взаимодействии с
рабочими процессами это обычное дело, и вы будете это делать достаточно часто.
Вот шаги для настройки действий HandleExternalEvent:
1. Создайте описывающий событие интерфейс, который будут использовать внешние
вызывающие модули. Добавьте этот интерфейс в ваш проект рабочего процесса и назовите
его IApproval.
2. Добавьте оператор using System.Workflow.Activities в верхнюю часть файла.
3. Создайте событие в вызываемом интерфейсе, которое использует делегат
EventHandler<T>, и назовите его Approval:
event EventHandler< ExternalDataEventArgs > Approval;
Как видно, этот делегат принимает в качестве параметра ExternalDataEventArgs.
Если вам просто нужно узнать о возникновении события, то вы можете использовать этот
аргумент. Однако поскольку здесь нам надо знать, утвердил ли пользователь (или
отклонил) запрос на поездку, то нам нужно передать в событие данные.
4. Внутри этого же файла создайте новый класс, производный от
ExternalDataEventArgs. Назовите его ApprovalEventArgs. Этот класс должен
предоставлять свойство для передачи утверждения. Вы должны также создать конструктор,
который принимает instanceid и передает его в базовый класс. И наконец, пометьте
этот класс как [Serializable] для того, чтобы исполняющая среда рабочего процесса
могла его сериализовать при необходимости.
5. Измените аргумент делегата события интерфейса, чтобы использовать этот
ApprovalEventArgs.
822
Часть V. Создание промышленных приложений
6. Пометьте интерфейс атрибутом [ExternalDataExchange] для того, чтобы рабочий
процесс его распознал. Теперь ваш файл должен выглядеть примерно так:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Workflow.Activities;
namespace TravelRequestWf {
[Serializable]
public class ApprovalEventArgs : ExternalDataEventArgs {
public bool IsApproved { get; set; }
public ApprovalEventArgs(Guid instanceld)
: base(instanceld) {
}
}
[ExternalDataExchange]
interface IApproval {
event EventHandler<ApprovalEventArgs> Approval;
}
}
7. Вернитесь в визуальный конструктор рабочих процессов. Выделите действие
awaitApprovalForManager и просмотрите его свойства. Сначала настройте свойство
InterfaceType. На рис. 20.14 показано диалоговое окно для этого.
8. Затем настройте свойство EventName на событие Approval. После этого в панели
Properties должны добавиться параметры е и sender. Это те параметры, которые будут
посылаться событием. Вы могли бы создать здесь свойство для привязки к значению е, а
потом использовать его в условиях. Однако мы просто напишем этот код.
Выделите обработчик Invoked в окне свойств Properties и выберите действие Generate
Handlers в нижней части панели (либо дважды щелкните по фактическому действию в
визуальном конструкторе). Здесь вам нужно написать код для приведения типа аргументов
событий и настройки поля условия утверждения. Ваш код должен выглядеть примерно так:
private void awaitApprovalForManager_Invoked(
object sender, ExternalDataEventArgs e) {
ApprovalEventArgs approvalArgs = (ApprovalEventArgs)e;
this._isApproved = approvalArgs.IsApproved;
}
Глава 20. Встраивание рабочих процессов в ваши приложения
823
9. Повторите этот процесс для действия awaitManagerApproval. Вы можете использовать
тот же самый интерфейс события, поскольку в любой момент времени только один будет
в состоянии ожидания.
Browse end Select» NET Type
Showing Interface* marked with an ExternaiDatabcchangeAttribute
Type tome TravelRequestWfJApproval
Type *АЛ*Г>С*4
: d vi < Current Project>
; j 0 TravelRtquestWf
' K*Jj Referenced Assemblies
i | td WorlcflowHeJper
Type Name
Fully Qustrfted Name
j Selected TypelApprevat member of {Vi^velR«4)u(^tWt.i
' Contained in Assembly <Currrat Pra$ert>
Рис. 20.14. Выбор InterfaceType для действия HandleExternalEvent
Ваш рабочий процесс полностью настроен и работоспособен. Теперь вам нужно настроить
клиента, который будет вызывать рабочий процесс и создавать соответствующие события.
Описание хоста и клиента для рабочего процесса
Вспомните, что когда мы начинали этот пример, мы выбрали шаблон с консольным
приложением Console application. Это консольное приложение включает в себя клиент и код
хоста, и в его процесс встроен наш рабочий процесс. Конечно, в большинстве приложений,
которые вы будете писать, эти три вещи будут самостоятельными (клиент, хост и библиотека
рабочего процесса). Однако реальный код хоста и клиента не будет отличаться от того, что
вы увидите в этом примере (за исключением настройки каналов связи, что не имеет почти
никакого отношения к рабочим процессам). Поэтому такое единое консольное приложение
дает хороший пример работы хоста и клиента.
Клиент
Клиентское приложение в нашем примере очень простое. Данные вводятся через консоль и
ответы выдаются тоже на консоль. Вы можете легко заменить консоль пользовательским
824
Часть V. Создание промышленных приложений
интерфейсом Windows, чтобы организовать ввод и вывод для пользователя. Но это не даст
вам никаких дополнительных знаний о рабочих процессах.
Специфичный для консоли код перемешан с кодом хоста. Часть его находится в методе
Main (в Program.cs); другие его части инкапсулированы вне этого метода. Для ясности далее
показано, как мы будем получать ввод пользователя из консоли:
private static string _userName;
private static double _travleCost;
private static int _requestld;
private static void EnterTravelRequest() {
// Описать параметры рабочего процесса
Console.Write("Enter a user name (>6 = manager): ");
_userName = Console.ReadLine();
Console.Write("Enter travel cost (double): ");
string cost = Console.ReadLine();
_travleCost = double.Parse(cost);
* Console.Write("Enter travel id (int): ") ;
string id = Console.ReadLine();
_requestld = int.Parse(id);
}
Примечание
В этом примере хост и клиент (и рабочий процесс) встроенные. Под хостом и
клиентом мы понимаем здесь (соответственно) относящийся к хосту и клиенту код.
Хост
Хостинговая часть рабочего процесса — это то, на чем мы хотим сосредоточить наше
внимание. Конечно, хост должен сделать ссылки на пространства имен Windows Workflow и на
саму реальную библиотеку рабочего процесса. В нашем примере объединенный шаблон уже
позаботился об этих двух требованиях.
При старте приложения хосту необходимо создать экземпляр класса Workf lowRuntime (для
того чтобы создать рабочие процессы и управлять ими). Обычно это делается при помощи
оператора using:
using (WorkflowRuntime workflowRuntime = new WorkflowRuntime()) {
}
В течение жизни приложения должна быть доступна исполняющая среда. Следующий
шаг— запуск исполняющей среды. Вы можете либо явно вызвать для этого метод
startRuntime, либо подождать создания и старта первого рабочего процесса. При этом
Глава 20. Встраивание рабочих процессов в ваши приложения 825
исполняющая среда рабочих процессов запустится автоматически. В нашем примере мы
выберем второй способ.
Вы можете создать экземпляр рабочего процесса при помощи вызова метода
CreateWorkflow объекта исполняющей среды. При этом вам будет возвращен тип
Workf lowinstance, с которым вы можете работать. В этот метод вы можете передать тип
рабочего процесса, который вы хотите создать. Вот пример:
Workflowinstance instance = workflowRuntime.CreateWorkflow(
typeof(TravelRequestWf.TravelRequestProcess));
С целью идентификации рабочего процесса для исполняющей среды используется свойство
Instanceld объекта Workf lowinstance. Исполняющая среда может обеспечивать хостинг
множества экземпляров. Поэтому данный идентификатор важен для идентификации
выполняющегося рабочего процесса, с которым клиент работает или который он запрашивает.
Выполняющийся рабочий процесс — это находящийся в работе процесс. Он может
находиться в памяти или быть сохранен в базе данных. Это свойство имеет тип Guid и может
быть получено следующим образом:
Guid wfld = instance.Instanceld;
Передача параметров в рабочий процесс
Хост отвечает также и за передачу параметров в рабочий процесс при его первом создании.
Эти параметры хосту обычно посылает клиент, но именно хост посылает их в рабочий
процесс. Для этого вы должны сначала настроить публичные свойства рабочего процесса.
Любой передаваемый в рабочий процесс параметр, имеющий то же самое название, что и одно
из этих публичных свойств, будет автоматически привязан к этому свойству. Вспомните,
что мы уже делали это.
Параметры передаются в рабочий процесс как коллекция Dictionary (вида "ключ,
значение"), содержащая элемент для каждого свойства, которое вы хотите настроить. Ключи
имеют тип string и содержат названия свойств. Значения имеют тип object,
поскольку параметр может иметь любой тип. Вы создаете коллекцию Dictionary следующим
образом:
Dictionary<string, object> myDictionary = new Dictionary<string, object>();
В нашем примере у нас есть три свойства, для которых нам нужны начальные значения:
TravelRequestor, TravelCost и TravelRequestld. Вы уже видели ранее, как клиентское
консольное приложение получало эту информацию от пользователя. Нам нужно
спроецировать эти вводные данные на элементы коллекции следующим образом:
Dictionary<string, object> wfParams = new Dictionary<string, object>();
wfParams.Add("TravelRequestor", _userName);
wfParams.Add("TravelCost", _travleCost);
wfParams.Add ("TravelRequestld", _requestld) ;
И наконец, вы используете перегрузку метода CreateWorkflow в хосте для передачи
параметров во время создания исполняющей средой экземпляра рабочего процесса.
826
Часть V. Создание промышленных приложений
Вот пример:
// Создать экземпляр рабочего процесса
Workflowlnstance instance = workflowRuntime.CreateWorkflow(
typeof(TravelRequestWf.TravelRequestProcess), wfParams);
Эти параметры будут теперь иметь установленное значение при запуске исполняющей среды.
Настройка вызываемого рабочим процессом кода
Теперь вам нужно описать код, который будет вызываться для действий CallExternal-
Method. Вспомните, что при настройке этих элементов вы добавили в рабочий процесс
интерфейсы. Здесь вы будете реализовывать эти интерфейсы, а затем добавите экземпляр
вашего нового класса в исполняющую среду рабочих процессов:
1. Создайте файл нового класса и назовите его User Prof ile.
2. Внутри этого класса реализуйте интерфейс iuserProfile.
3. Добавьте простое средство для определения того факта, является ли пользователь
менеджером (помните, что это просто тестовый код). Вот пример:
using System;
using System.Collections.Generic-
using System.Linq;
« using System.Text;
using System.Workflow.Activities;
namespace TravelRequestWf {
// Реализация интерфейса рабочего процесса в хосте
public class UserProfile : IUserProfile {
public bool IsUserManager(string userld) {
// Тестовый код для возврата значения true
//в зависимости от длины идентификатора пользователя
return (userld.Length > 6);
}
}
}
4. Добавьте в библиотеку еще один класс и назовите его Notification.
5. Реализуйте в этом новом классе интерфейс iNotif ication.
6. Для тестовых целей создаваемые вами методы будут просто писать на консоль, чтобы вы
могли убедиться в том, что они вызываются. Эти методы должны выглядеть следующим
образом:
using System;
using System.Collections.Generic;
Глава 20. Встраивание рабочих процессов в ваши приложения
827
using System.Linq;
using System.Text;
using System. Workflow.Activities;
namespace TravelRequestWf {
// Реализация интерфейса рабочего процесса в хосте
class Notification : INotification {
// Примечание: это просто тестовый код
public void NotifyPendingApproval(string userld) {
Console.WriteLine("Approval pending. Userld: " + userld);
}
public void RejectTravel(string userld, int travelld) {
Console.WriteLine("User travel rejected. Userld: " + userld
+ " Travelld: " + travelld.ToString());
}
public void NotifyUser(
string userld, string message) {
t
Console.WriteLine("User travel approved. Userld: " + userld
+ " Travelld: " + message);
}
public void SendConfirmation(string userld,
string confirmationNumber) {
Console.WriteLine("Travel confirmed. Userld: " + userld +
" Confirmation number: " + confirmationNumber);
}
}
}
7. Теперь вам нужно подключить эти классы к рабочему процессу. Вспомните, что рабочий
процесс настроен на работу с этим интерфейсом. Он будет проверять исполняющую
среду на наличие экземпляра класса, реализующего этот интерфейс. Откройте хост
(Program.cs) для настройки этой связи.
Следом за созданием WorkflowRuntime создайте экземпляр
ExternalDataExchangeService. Затем добавьте этот сервис в исполняющую среду, а
потом — ваш класс в этот сервис. Далее показан код:
// Создать объект обмена данными
ExternalDataExchangeService exchangeServ =
828
Часть V. Создание промышленных приложений
new ExternalDataExchangeService();
workflowRuntime.AddService(exchangeServ);
// Настроить связь CallExternalMethod
exchangeServ.AddService(new UserProfile());
exchangeServ.AddService(new Notification());
Хост настроен для того, чтобы рабочий процесс мог его вызывать. Теперь вам нужно
убедиться в том, что хост может вызывать события рабочего процесса.
Создание событий из клиента
Последний шаг перед запуском рабочего процесса — создание обмена между хостом и
выполняющимся рабочим процессом через модель событий. Вспомним, что мы уже описали
интерфейс, который настроил контракт вызова из хоста в рабочий процесс. Мы сделали это при,
настройке действий HandleExternalEvent. Контракт интерфейса был назван lApproval.
Выполните следующие шаги для реализации этого контракта обмена в приложении хоста:
1. Создайте в приложении новый класс и назовите его ManageApproval.
2. Реализуйте созданный ранее интерфейс lApproval. Это означает, что вам нужно
описать дескриптор для события Approve. Кроме того, класс должен быть помечен как
Serializable. Далее показан пример:
[Serializable]
class ManageApproval : lApproval {
public event EventHandler<ApprovalEventArgs> Approval;
}
3. Затем создайте в классе метод, который будет запускать событие. Этот метод должен
вызываться из клиента для утверждения поездки (или отклонения ее). Он должен
записывать результаты в параметры ApprovalEventArgs, которые принимает событие
Approval, а затем порождать событие, передавая самого себя в качестве посылающей
стороны. Вот пример:
public void ApproveTravel(int travelld,
bool isApproved, Guid wfInstanceld) {
// Проверить, есть ли подписчик на событие
if (Approval != null) {
// Создать аргументы нового события и установить утверждение
ApprovalEventArgs approvalArgs = new ApprovalEventArgs(wfInstanceld);
approvalArgs.IsApproved = isApproved;
// Породить событие, передав самого себя
Approval(this, approvalArgs);
}
\
Глава 20. Встраивание рабочих процессов в ваши приложения
829
4. Вам нужно зарегистрировать экземпляр этого нового класса в сервисе обмена данными
рабочего процесса. Это позволит соединить события хоста и рабочего процесса.
Добавьте в метод Main следующий код (после уже сделанных вами ранее вызовов
AddService):
// Настроить обмен HandleExternalEvent
ManageApproval approvalMgr = new ManageApproval();
exchangeServ.AddService(approvalMgr);
5. Теперь вам нужно добавить клиентский код (также в метод Main файла Program.cs). Это
позволит вам ввести условие утверждения.
Вспомните, что рабочий процесс должен уведомить соответствующего утверждающего
менеджера. После этого утверждающий менеджер зайдет в клиентское приложение. Это
приложение проверит, является ли данный утверждающий менеджер правильным
утверждающим, а затем позволит ему произвести утверждение. Однако нашему простому
консольному приложению придется все это имитировать при помощи некоего тестового
кода. В настоящем решении клиентское приложение узнало бы об этом благодаря
информации из рабочего процесса (возможно, сохраненной в базе данных).
Вы можете попросить пользователя ввести утверждение через консоль, а затем вызвать
метод ApproveTravel класса ManageApproval. Все это будет передано в ожидающий
рабочий процесс. В этот метод вы должны передать имитированный идентификатор
запроса на поездку, состояние утверждения (true или false), а также идентификатор
экземпляра рабочего процесса. Это показано в следующем коде:
approvalMgr.ApproveTravel(_requestId, true, instance.Instanceld); ,
Полный код хоста и клиента показан в листинге 20.1.
Шт*№ 20.1. Полный код хоста и клиента
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;
using System.Workflow.Activities;
namespace TravelRequestWf {
class Program {
private static AutoResetEvent _waitHandle = new AutoResetEvent(false);
private static string _userName;
private static double _travleCost;
private static int _requestld;
private static void EnterTravelRequest() {
830
Часть V. Создание промышленных приложений
// Описать параметры рабочего процесса
Console.Write("Enter a user name (>6 = manager): ") ;
_userName = Console.ReadLine();
Console.Write("Enter travel cost (double): ") ;
string cost = Console.ReadLine();
_travleCost = double.Parse(cost) ;
Console.Write("Enter travel id (int): ") ;
string id = Console.ReadLine();
_requestld = int.Parse(id);
}
static void Main(string[] args) {
using (WorkflowRuntime workflowRuntime = new WorkflowRuntime()) {
// Создать объект обмена данными
ExternalDataExchangeService exchangeServ =
new ExternalDataExchangeService();
workflowRuntime.AddService(exchangeServ);
// Настроить обмен CallExternalMethod
exchangeServ.AddService(new UserProfile());
exchangeServ.AddService(new Notification());
// Настроить обмен HandleExternalEvent
ManageApproval approvalM.gr = new ManageApproval () ;
exchangeServ.AddService(approvalMgr);
// Подключить события рабочего процесса
workflowRuntime.WorkflowCompleted += OnWorkflowComplete;
workflowRuntime.WorkflowTerminated += OnWorkflowTerminated;
// Получить ввод пользователя
EnterTravelRequest();
// Настроить параметры
Dictionary<string, object> wfParams = new Dictionary<string, object>();
wfParams.Add("TravelRequestor"f _userName);
wfParams.Add("TravelCost", _travleCost);
wfParams.Add("TravelRequestld", _requestld);
Глава 20. Встраивание рабочих процессов в ваши приложения
831
II Ждать указаний пользователя
Console.WriteLine("Hit enter to start the workflow.");
Console.ReadLine();
// Создать экземпляр рабочего процесса
Workflowlnstance instance = workflowRuntime.CreateWorkflow(
typeof(TravelRequestWf.TravelRequestProcess), wfParams);
// Запустить рабочий процесс
instance.Start() ;
Console.WriteLine("Workflow Started: " +
instance.Instanceld.ToString());
// Сделать паузу, чтобы подождать рабочий процесс
Thread.SleepC00);
// Если рабочий процесс ждет утверждения (тестовый код)
if(IsWaitingOnApproval()) {
Console.Write("Enter 'approve' to approve travel,
or anything else to reject: ");
string approval = Console.ReadLine();
if(approval == "approve") {
approvalMgr.ApproveTravel(_requestld, true, instance.Instanceld);
} else {
approvalMgr.ApproveTravel(_requestld, false, instance.Instanceld);
}
}
_waitHandle.WaitOne();
Console.WriteLine("");
Console.WriteLine("Hit enter to exit.");
Console.ReadLine();
}
}
private static bool IsWaitingOnApproval() {
// Это тестовый код, а не реальный клиент.
// Определить, ждет ли рабочий процесс утверждения.
UserProfile userProfile = new UserProfile();
// Если пользователь - не менеджер, то требуется утверждение
if (!userProfile.IsUserManager(_userName)) {
return true;
832
Часть V. Создание промышленных приложений
} else if (_travleCost > 1500) {
return true;
} else {
return false;
}
}
private static void OnWorkflowComplete(object sender,
WorkflowCompletedEventArgs e) {
Console.WriteLine("Workflow Completed: " +
e.WorkflowInstance.Instanceld.ToString());
_waitHandle.Set();
}
private static void OnWorkflowTerminated(object sender,
WorkflowTerminatedEventArgs e) {
Console.WriteLine("Workflow Completed: "
+ e.Workflowlnstance.Instanceld
+ ". Message: " +e.Exception.Message);
_waitHandle.Set();
}
}
}
Выполнение вашего рабочего процесса
Теперь вы создали работающий последовательный рабочий процесс, который содержит все
три составляющие приложения рабочих процессов: рабочий процесс, хост и клиент. Эти
части являются концептуальными составляющими нашего единого приложения. Однако при
необходимости вы могли бы выделить их в отдельные части. Вот концептуальные части
приложения (файлы) с разбивкой на рабочий процесс, хост и клиент:
□ рабочий процесс — TravelRequestProcess, IApproval, INotif ication, IUserPro-
file;
□ хост — частично содержится в Program.cs, ManageApproval, Notification;
□ клиент — Program.cs (содержит не только ввод пользователя, но и код хоста).
Теперь вы можете запустить рабочий процесс и протестировать его. Он должен откомпили-
роваться, а затем выдать вам консольное приложение по вводу информации для запроса на
поездку. Вы можете ввести информацию и запустить рабочий процесс. Начнет выполняться
логика, и если потребуется утверждение, то вы получите подсказку для его ввода. На
рис. 20.15 показан проход по рабочему процессу.
Глава 20. Встраивание рабочих процессов в ваши приложения
833
Рис. 20.15. Выполняющийся рабочий процесс
Отладка рабочего процесса
Вы можете настраивать точки останова в коде любого проекта вашего решения и проходить
код пошагово (точно так же, как и в любом другом приложении). Кроме того, вы можете
визуально проходить по выполняющемуся рабочему процессу.
з t МЮбОМШ
</> VS2K8U-С20 (Debugging) - Microsoft Visual Studio
' File Edit View Project Build Debug Tools Test Window Help
| > &-4У ем -ь л ** * * • ^V К.^^~".."*¥""iP'\ .Л...;! & > "I
1 ► Л Л Sa ♦ el £■ ^{Wetj^ L$* * -PWCRK [5Ma]TrevelRequestWft- Thread* 1-181 Workflow.!B8B452M - T V ;!
Ю
ЯЕ
и
S*quentul Workflow
О-Jj 0tiUt«f*»flf«
iS tfUierV*n*i)*r
di*N>atMdaitfM
i N»me
MB ^* InterfeceType
'— 2jf MetfwdName
i—ф ^Jj> Pjremeter«ndlngi
V»fue
<N*me - lUserPreflte'RilName - TraveRequeftWf.IUserProfee^
TiUierM*nager*
Count-2
{System Workflow ComponentModd WarkflonParameterOndng}
{Sytta^VilMW^.CoaporimlhlodelM/orkflowPflrame trrBrodhg}
ц """ V* xj
Type
Syetem.Type {System.F
» *frng j
System Workflow Comp ,
Syttant.Worlrflow.Conip j
System.Workflow Camp - *
I— Rvalue
| ffiBierQttlgl OblputffiBhd Symbol Rewte|^Locib[g3Aut8f [|5|W«tchl)
Л ' object (string)
Reedy
Рис. 20.16. Рабочий процесс запроса на поездку выполняется в отладчике
Для настройки точки останова в вашем процессе сначала выделите то действие, на котором
вы хотите прервать выполнение. Щелкните по этому действию правой кнопкой мыши и
выберите пункт Breakpoint | Insert Breakpoint. При этом на действие будет установлен
красный значок точки останова. Когда вы теперь будете выполнять рабочий процесс, он остано-
834
Часть V. Создание промышленных приложений
вится на этом действии. После этого вы можете использовать окно Immediate и команды
пошагового прохождения (точно так же, как и для обычного кода).
На рис. 20.16 показан пример рабочего процесса запроса на поездку, который открыт в
отладчике. Вы видите, что окно Locals показывает параметры, соответствующие рабочему
процессу.
Совет
Windows Workflow предоставляет также и действия для обработки ошибок. Есть
действие FaultHandler, которое работает во многом аналогично блокам кода try... catch.
Рабочий процесс типа конечного автомата
Хорошая новость состоит в том, что рабочие процессы типа конечного автомата работают
во многом подобно своим последовательным собратьям. Поэтому все изученное вами ранее
применимо и к этому типу рабочих процессов (и мы не будем повторяться). Вместо этого
мы сосредоточимся на различиях между этими двумя типами рабочих процессов.
Основная разница между последовательным процессом и процессом типа конечного
автомата носит концептуальный характер. Оба они имеют начало и конец; оба выполняют шаги
в определенной последовательности. Однако рабочий процесс типа конечного автомата
занимается единственным документом в процессе его перехода между состояниями. Это
может быть как документ, так и запись базы данных. Последовательности выполняются тогда,
когда состояние изменяется (выход из текущего состояния или вход в новое состояние).
Внутри состояния вы можете делать все то же самое, что делается в последовательном
рабочем процессе: ветвление, ожидание события, вызов внешних методов и т. д.
Давайте же рассмотрим создание простого рабочего процесса типа конечного автомата.
Создание рабочего процесса типа конечного автомата
Для примера предположим, что теперь вам нужно обрабатывать авансовые отчеты
пользователей по тем поездкам, которые они запрашивали в предыдущем примере. Пользователь
будет создавать авансовый отчет и сохранять его как черновик. Когда авансовый отчет
будет готов, пользователь представит его менеджеру на утверждение (через клиентское
приложение). После этого он поступит в рабочий процесс в состоянии "представлен". Затем
менеджер утвердит или отклонит отчет. Если отчет утвержден, то он переходит в состояние
"утвержден". Если он отклонен, то рабочий процесс уведомит об этом пользователя и
экземпляр рабочего процесса завершится. Позднее пользователь может повторно представить
отчет (если это требуется). После утверждения отчета в финансовый отдел будет послано
уведомление о необходимости выплаты. После обработки выплаты пользователь будет
уведомлен о номере чека выплаты и отчет перейдет в свое финальное состояние — "завершен".
Примечание
В этом разделе мы намеренно сосредоточились на специфичных для конечного
автомата элементах. Если вы не можете понять эту концепцию, вернитесь к
последовательному примеру и перечитайте в нем все подробности.
Глава 20. Встраивание рабочих процессов в ваши приложения
835
Для того чтобы при помощи Visual Studio 2008 создать этот рабочий процесс типа
конечного автомата, необходимо выполнить следующие шаги:
1. Создайте новый проект Machine workflow Console application project с именем Ех-
penseReportWf (на языке Visual Basic или на С#). В этом примере используется Visual
Basic (поскольку в предыдущем был С#). Однако концепция и визуальный дизайн
остаются теми же самыми. Мы будем использовать версию консольного приложения для
тестирования и выполнения рабочего процесса (без необходимости создания отдельных
хоста и клиента).
2. Переименуйте рабочий процесс по умолчанию (Workflowl) в шаблоне проекта в
ExpenseReport. По умолчанию Visual Studio создаст рабочий процесс в виде кода.
Однако этот пример работает как с кодовым рабочим процессом, так и с рабочим
процессом в виде XAML.
3. Когда рабочий процесс ExpenseReport создается впервые, ему требуется некоторая
информация об авансовом отчете: представляющий его пользователь и идентификатор
для привязки к реальному авансовому отчету (через клиентское приложение). Эта
информация будет передана как параметры в рабочий процесс из хост-приложения.
Добавьте в рабочий процесс свойства для этих параметров (Userld типа string и
ExpenseReportld типа Guid). Ваш код должен выглядеть так:
Private _userld As String
Public Property Userld() As String
Get
Return _userld
End Get
Set(ByVal value As String)
_userld = value
End Set
End Property
Private _expenseReportId As Guid
Public Property ExpenseReportld() As Guid
Get
Return _expenseReportId
End Get
Set(ByVal value As Guid)
_expenseReportId = value
End Set
End Property
4. Откройте рабочий поток типа конечного автомата в визуальном конструкторе. Выберите
состояние в конструкторе и просмотрите его свойства. Присвойте свойству Name этого
состояния значение Submitted.
Это состояние будет представлять те действия, которые происходят при старте рабочего
процесса. Поэтому щелкните по этому состоянию правой кнопкой мыши и выберите
836
Часть V. Создание промышленных приложений
пункт Set as Initial State (для того чтобы показать, что это состояние рабочего процесса
при старте). Вы должны увидеть слева от состояния зеленую стрелку.
5. Теперь добавьте действия State из панели Toolbox для оставшихся состояний: Approved,
Rejected, Paid и Completed. Настройте соответствующим образом их названия.
Щелкните правой кнопкой мыши по состоянию Completed и выберите пункт Set as Completed
State. Это означает, что данное состояние представляет собой завершение рабочего
процесса. На рис. 20.17 показано, как должен выглядеть ваш рабочий процесс.
ЛЫЖНИ
</> VS2KSU-C20 - Microsoft Visual Studio
i File Edit View Project Build Debug Workflow Data Toots Test Window Kelp
1 Л • J * -5 id # i , *> * r - 43- ' ¥ Debug - AnyCPU
m
w
ExpemelfepWf.vb [Dt^gn)"
State Machine Wafrflw
rnllfHWL
Drop StateActivity,
t v entDtiven Activity,
StBtdnitializBtbnActivity cr
Sta^eFineliatioriActjvity heie
Д ^JmxxL
AmmmMfMn
Drop SUleActwty
EventDrrvenAc'rvity
Statelniaalizetion Ac iivity or
SiateFinalizauonActrvrty here
Drop StateActivrty, j
Ev entDrrven Activity
5»telnitializatii?nuclivi!yor j
StateFinaliza'icnActivity here
Drop Si*fceActivity,
E\entDnver>Actrvi«y, ;
StatelnftializatJonActivity or
StateFinaliraticnActivity here '
i
J^Frrcatsl ^TaskrJiiti
Ready
Рис. 20.17. Состояния рабочего процесса типа конечного автомата в визуальном конструкторе
Инициализация и переход из состояния в состояние
Вспомните, что состояние выполняет определенную последовательность действий, которые
приводят к переходу в другие состояния. Для того чтобы это работало, необходимо
добавить в состояние действие Statelnitialization или StateFinalization. Первое используется для
обработки действий при входе в состояние. Второе применяется (не обязательно) для
обработки переходов при выходе из состояния (и до начала следующего состояния).
Создание состояния Submitted
Для настройки инициализации и перехода для состояния Submitted необходимо выполнить
следующие шаги:
1. Настройте состояние Submitted. Добавьте в него действие Statelnitialization и
присвойте его свойству Name значение submittedlnit.
Глава 20. Встраивание рабочих процессов в ваши приложения
837
2. Дважды щелкните по действию Statelnitialization для того, чтобы открыть визуальный
конструктор состояния Submitted. В верхней левой части имеется элемент управления
хронологией переходов (для возврата в визуальный конструктор ExpenseReport). Он
хорошо работает и в тех случаях, когда внутри состояний у вас есть еще и подсостояния.
3. Добавьте CodeActivity в действие submittedlnit и назовите его NotifyManager.
Здесь мы пропустим действия CallExternalMethod, поскольку они уже были описаны в
последовательном примере. Вместо этого вы напищете код, который будет имитировать
отправку уведомления менеджеру о том, что запрос ожидает утверждения.
4. Добавьте в это действие обработчик (при помощи окна свойств) и напишите в его коде
вывод уведомления на консоль. Обратите внимание на то, что в реальном рабочем
процессе вам не пришлось бы этого делать. Этот код просто имитирует реальное
уведомление. Вот пример кода:
Private Sub NotifyManager_ExecuteCode(ByVal sender As System.Object, _
ByVal e As System.EventArgs)
Console.WriteLine("Expense report approval required: " & Userld)
End Sub
5. Вернитесь в визуальный конструктор. Дизайн Statelnitialization состояния Submitted
должен выглядеть так, как показано на рис. 20.18. Нажмите ссылку ExpenseReport в
левой верхней части для возвращения к основному дизайну конечного автомата.
6. Теперь вам нужно добавить действие EventDriven ниже действия Statelnitialization
состояния Submitted. Назовите его eventDrivenApproval. Действие Statelnitialization не
может обрабатывать внешние события, поэтому данное действие необходимо для
управления событием, которое будет запущено хостом для утверждения менеджера.
**> VS2K8U-C20 - Microsoft Visual Stwtfo
~¥
Fife Edit View Project Build Debug Workflow D*ta Tools Test Ап»1уге Window Help
\* ExperoeRepoftArb [Design]*
^^ jot!]
a,
^3 ExpenseReport
SfcfcWMhiaeWoricKc* ,
i лЭ Subnit'ed
j£l Submitted
a -a v
' subm/tiertTnit
! 3
1 | $ ЫоЙ(уМ«Й0«Г j
i
1
1
I
!!§
M
ili
Ready
Рис. 20.18. Дизайн Statelnitialization для состояния Submitted
838
Часть V. Создание промышленных приложений
7. Дважды щелкните по этому событию для того, чтобы оно открылось в визуальном
конструкторе.
8. В верхней части события добавьте действие HandleExternalEvent, которое будет
ожидать утверждения менеджера. Назовите это действие waitMgrApproval. Мы скоро
вернемся к его настройке.
9. Добавьте действие IfElse под действием HandleExternalEvent. Назовите его
if Approved. Назовите левую ветку isApproved, а правую ветку — notApproved.
Скоро вы вернетесь к их настройке.
10. Добавьте действие SetState в каждую ветку действия IfElse. SetState используется для
перехода к следующему состоянию.
11. Выберите действие SetState левой ветки и откройте его свойства. Назовите его
setApproved и установите его свойство TargetStateName в значение Approved (при
помощи раскрывающегося списка).
12. Назовите действие SetState в правой ветке именем setRejected и настройте его
свойство TargetStateName в значение Rejected.
Рабочий процесс для действия EventDriven создан. Ваш рабочий процесс должен выглядеть
подобно рис. 20.19. Теперь вам необходимо настроить действия HandleExternalEvent и IfElse.
! о ЫшШЗ
<*> VS2KSU-C20 - Microsoft Visual Studio
File Edit View Project Build Debug Workflow Data Tools Test Arwlyie Window Help
| £j| ExperweReperi
i
i
1
i
: U Submitted
j3 ^ubmrUed
cwsntDriVenApproN a!
1
ф vwtMgrApprrov*!
1
ж i'App'oved
1
1 ♦ 1
isAporsved nctApp-oved
i i
l^_J"
i
1
Saving Auto Recovery Informat»or>
Рис. 20.19. Дизайн eventDrivenApproval для состояния Submitted
Настройка состояния Submitted
Конструирование eventDrivenApproval еще не совсем закончено. Сначала нам
необходимо настроить шаблон обмена для отправки сообщений в рабочий процесс (при помощи
Глава 20. Встраивание рабочих процессов в ваши приложения
839
события). Это позволит вам завершить настройку waitMgrApproval действия HandleEx-
ternalEvent.
Вспомним из последовательного рабочего процесса, что первый шаг процесса— это
настройка интерфейса, объявленного в рабочем процессе. Хост-приложение создаст при
помощи этого интерфейса класс реализации, а затем передаст его экземпляр в исполняющую
среду рабочих процессов.
Для настройки обмена рабочего процесса с этим событием сделайте следующее:
1. Создайте новый файл кода Visual Basic и назовите его IApproval.vb.
2. В новом файле создайте новый класс, который наследует от ExternalDataEventArgs.
Назовите этот класс ApprovalEventArgs. Добавьте в этот класс свойство с названием
isApproved (типа Boolean). Это свойство будет хранить утверждение.
3. Добавьте интерфейс для события, которое будет порождаться для рабочего процесса.
Назовите этот интерфейс iApproval. Это событие должно быть типа
EventHandler<T>. Вы должны ввести его как новый класс аргументов события.
Ваш код должен выглядеть следующим образом:
Imports System.Workflow.Activities
<ExternalDataExchange()> _
Public Interface IApproval
Event Approval As EventHandler(Of ApprovalEventArgs)
End Interface
<Serializable()> _
Public Class ApprovalEventArgs
Inherits ExternalDataEventArgs
Public Sub New(ByVal instanceld As Guid)
MyBase.New(instanceld)
End Sub
Private _isApproved As Boolean
Public Property IsApproved() As Boolean
Get
Return _isApproved
End Get
Set(ByVal value As Boolean)
_isApproved = value
End Set
End Property
End Class
4. Вернитесь в рабочий процесс и откройте его файл выделенного кода. Добавьте свойство,
которое будет привязано к аргументам события, посланным в действие HandleExter-
840
Часть V. Создание промышленных приложений
nalEvent. Назовите это свойство ApprovalEventArg. Ваше свойство должно выглядеть
следующим образом:
Private _approvalEventArgs As ApprovalEventArgs
Public Property ApprovalEventArg() As ApprovalEventArgs
Get
Return _approvalEventArgs
End Get
Set(ByVal value As ApprovalEventArgs)
_approvalEventArgs = value
End Set
End Property
Вернитесь в визуальный конструктор рабочего процесса для действия
eventDrivenApproval состояния Submitted. Перейдите в окно свойств для настройки в
HandleExternalEvent действия waitMgrApproval на использование этого нового
интерфейса. Настройте свойства InterfaceType, EventName и спроецируйте аргумент
события е на только что созданное вами новое свойство. Ваша конфигурация должна
выглядеть подобно показанной на рис. 20.20.
ley {»I"ttgSb*f
</» VS2KaU-C20 - Microsoft Visual Studio
File Edit View Project Build Debug Workflow
£ jmeRepcr* : ~£ SubrriKec
7 I
f | Submtted
К !
eventDri4't:iiApprcvdl
< _[i waitMgrApproval
Ш i'Approved
isAppravei
m
i'3 setApp^ed™"*»
| Approved J
1
i'El5*3r4rv:Wcuvity2
SI
I ,
'3 ietRejetwd
Rejected
ftem(s) Saved
Date Tools Test Window Help
X Properties """ "* "*"* "" Z"Л x
waitMgrApproval Syitem.WorkflowActMtjesHendleEKternalEventActivJty ■»
{Name}
! Description
; Enabled
EventName
InterfaceType
I Roles
I Invoked
;ш e
sender
J
waHMer Approval
True
Approval
ExpenscReportWfiApprovaJ
a Activity =EitperttfReport, Path= ApprovalEventArg
U
i. :iCSLfc«!ftIfil£jLPS'^-
' Please specify the identifier of the activity. It has to be unique in the workflow.
Рис. 20.20. Настройка действия waitMgrApproval
6. Последний шаг для настройки действий состояния Submitted — это настройка ветвей
условия IfElse. Выделите левую ветвь (isApproved). В окне свойств укажите, что
Condition имеет значение Declarative Rule Condition. В свойстве ConditionName
откройте менеджер правил условия. Настройте в Rule Condition вычисление содержимого
Глава 20 Встраивание рабочих процессов в ваши приложения
841
свойства ApprovalEventArg (к которому вы только что привязались). Это условие
должно выглядеть так:
this._approvalEventArgs.IsApproved
7. Назовите условие ApprovedCondition. Это завершает состояние Submitted. Вернитесь
в главный экран рабочего процесса конечного автомата.
Теперь вы должны увидеть линии, идущие от Submitted к Approved и к Rejected. Они
представляют собой переходы (рис. 20.21). Теперь вам нужно настроить остальные состояния.
1 о 1 з ЬйД
ц/> VS2KBU-C2Q - Microsoft Visas' Stud,o
File Edit View Project Build Debug Workflow Data Tools Test Window Help
<3 ' _J " J «I H > ** - ' *»J * > D'bug - AnyCPU
Я ExpciueRcportvb [Design}"
Siet* Machine WoiWIew
DiopStsteActKir/
Е.егкОпчепАс'пчсу
SuielmtialuaticnActivir, cr
StateFinalizBtionAcDvit>' here
f:Mxtitmttlii.Mt;..!iitiitl\ttM
Diop StiteActJvi-y
EventDmenAc'h'ir/
SutelnitisliaticnActr.ity cr
StstsMnalizabonAcnvity here
^ Er-cr List & 'ssJf L Л
Ready
Рис. 20.21. Рабочий процесс конечного автомата с переходами состояния Submitted
Конструирование и настройка состояния Approved
Состояние Approved (Утверждено) аналогично состоянию Submitted. Вам необходимо
добавить в состояние Statelnitialization и действие EventDriven. Вот шаги для этого:
1. Добавьте действие Statelnitialization и назовите его approvedinit. Дважды щелкните
по нему, чтобы открыть его визуальный конструктор.
2. Добавьте CodeActivity с названием NotifyFinance и опять выдайте на консоль
имитацию уведомления финансовому отделу о том, что авансовый отчет готов к оплате. В
реальной жизни это могут быть данные, отправленные в финансовую систему. Ваш код
должен выглядеть следующим образом:
Private Sub NotifyFinance_ExecuteCode( _
ByVal sender As System.Object, ByVal e As System.EventArgs)
842
Часть V. Создание промышленных приложений
Console.WriteLine("Finance notice. Expenseld: " _
& _expenseReportId.ToString())
End Sub
3. Вернитесь к диаграмме состояний. Добавьте действие EventDriven с названием
eventDrivenPayment. Дважды щелкните по нему для того, чтобы открыть его
визуальный конструктор.
4. Добавьте действие HandleExternalEvent для ожидания уведомления об оплате из
финансовой системы. Назовите это действие waitForPaymentNotice.
5. Под ним добавьте SetState с названием setPaid. Используйте окно свойств для
установки состояния Paid рабочего процесса (после получения оплаты).
6. Для настройки действия HandleExternalEvent создайте новый файл кода (аналогичный
созданному ранее файлу IApproval.vb). Назовите его IPaymentNotice. Этот файл будет
содержать интерфейс с событием, запускаемым финансовой системой. При его запуске
будет присылаться номер чека оплаты авансового отчета. Этот код должен выглядеть
следующим образом:
Imports System.Workflow.Activities
<ExternalDataExchange()> _
Public Interface IPaymentNotice
Event Approval As EventHandler(Of PaymentNoticeEventArgs)
End Interface
<Serializable()> _
Public Class PaymentNoticeEventArgs
Inherits ExternalDataEventArgs
Public Sub New(ByVal instanceld As Guid)
MyBase.New(instanceld)
End Sub
Private _checkNumber As Integer
Public Property CheckNumber() As Integer
Get
Return _checkNumber
End Get
Set(ByVal value As Integer)
_checkNumber = value
End Set
End Property
End Class
Глава 20. Встраивание рабочих процессов в ваши приложения
843
7. Используйте этот код для настройки действия HandleExternalEvent для действия
EventDriven состояния Approved. Спроецируйте аргументы события из события е на
новое свойство типа PaymentNoticeEventArgs рабочего процесса (вы можете вызвать
это свойство paymentNoticeArgs). Действие состояния должно выглядеть подобно
показанному на рис. 20.22.
ч/> V52K3U С20 - Microsoft Vtsual Studio 1 сз { El ЙЙ&Ы
F
3
т
~~-
*
—
Rt
le Edft V
Expentef
ev» Project Butld Debug
teportvb IDeagnJ-; £рйюди$
)*ta Tools Test Window Help |
1 -x
1 ■■■— ■■■■■■-■■■ ■■-■ л,
i
}
I
i
JD State Machine Warkttow
Z3 E-< pen «Report • ^jj Apprcved
^3 Apprcvec
I
j. Aai*FcrP<iyTT»fntM
^ slice
13 «#*«!
| Piid .
1
P«PP«*«f #f X;
waHForPaymenlNotke System Workflow Acti/ities.HandleExternalEventA' » I
ii/l-J,^ ' ^ ^ . .^_ .„, , „ i
0 .V i ^ .
(Name) wattForPaynientMotke j
Description j
Enabled True j
Event We me Approval j
! InterfaceType ExpeitseReportWfJPaymenlNottce ]
i Rotes i j
|bj ». 1
~ Invoked 4 i .
>B « • * rv Ь
И1Ш111Ш1Ш ArtJvitvrExpenseRepcrt, Path=PaymentNotrcf EventArgj_ J
i sender > §
' 1
1
. лггй \- i^fi PT:>rcJ*E "K^cle »r5j?rti« Eins Werec эггрг- 1
1 1 -In* I
', j j Jjjj' Please specify a value for parameter of type
i i v» ' bperueRepartWf PaymentNoticeEventArgs'
\ 'с£( ^Properties ~'^Sc^fccmL<pittrer
a&r
Рис. 20.22. Конфигурация действия EventDriven состояния Approved
Конструирование и настройка состояния Rejected
Внутри состояния Rejected (Отклонено) вы просто уведомляете пользователя об отклонении
и помечаете рабочий процесс как завершенный. Вот шаги настройки состояния Rejected
рабочего процесса:
1. Начните с добавления в состояние Rejected действия Statelnitialization. Назовите его
rejectinit. Дважды щелкните по нему для того, чтобы открыть его в визуальном
конструкторе.
2. Добавьте CodeActivity в Statelnitialization состояния Rejected и назовите его Noti-
fyRejection. Добавьте обработчик для этого действия и выдайте уведомление об
отклонении в окно консоли, как это показано здесь:
Private Sub NotifyRejection_ExecuteCode( _
ByVal sender As System.Object, ByVal e As System.EventArgs)
Console.WriteLine("Expense report rejected. Expenseld: " _
& _expenseReportId.ToString())
End Sub
28 3ак 3716
844
Часть V. Создание промышленных приложений
3. Добавьте действие SetState с названием SetComplete и установите его свойство Таг-
getStateName в состояние Completed. Это покажет исполняющей среде, что рабочий
процесс успешно завершился.
Конструирование и настройка состояния Paid
Для состояния Paid (Оплачено) вы можете повторить предыдущие шаги. Вот они:
1. Добавьте действие Statelnitialization с названием paidlnit. Дважды щелкните по нему
для того, чтобы открыть в визуальном конструкторе.
2. Добавьте CodeActivity в Statelnitialization состояния Paid и назовите его NotifyUser.
Добавьте обработчик для этого действия и выдайте уведомление на консоль. Включите в
него номер чека, как это показано здесь:
Private Sub NotifyUser_ExecuteCode(ByVal sender As System.Object, _
ByVal e As System. EventArgs)
Console.WriteLine("Expense report paid. CheckNumber: " _
& jpaymentNoticeArgs.CheckNumber.ToString())
End Sub
3. Добавьте действие SetState с названием setComplete2 и настройте его свойство Таг-
getStateName в значение Completed.
Рабочий процесс сконструирован и настроен. Окончательный вид визуального конструктора
оо всеми переходами показан на рис. 20.23.
<Л VS2K8U-C20 - Microsoft Visual Studio
File Edit View Project BuSd Debug Workflow DjU Tool* Test Window Kelp
1~\™шт1
^j^gj^ge^j^Xbcpe^eReooflvb [ОмДО
№.
inimMMiitfftiMirni
3m
23 submittedlntt
«ф everrtDnvenApprovel
ш
&
2] ■pprewdlnit
aty eveotDrrvenPjyment
mim
a pi
3! rqectlnit
a
\&l™r№bj£L№\
w^J&Dh,
i
~x*ffl
ш
&
ш
Ready
Рис. 20.23. Переходы рабочего процесса ExpenseReport
Глава 20. Встраивание рабочих процессов в ваши приложения
845
Описание клиента и хоста
В этом разделе мы настроим клиент и хост для рабочего процесса типа конечного
автомата. Помните, что эти два элемента концептуально различны и могут быть физически
разделены. Мы просто комбинируем их для того, чтобы протестировать рабочий процесс и
сосредоточиться на его концепциях (а не на концепциях клиентского приложения или
сервиса Windows).
Вот шаги для создания кода приложения клиента/хоста:
1. Откройте файл Modulel.vb, в котором содержится консольное приложение.
2. Вам нужно описать параметры, которые будут передаваться в рабочий процесс. Сначала
добавьте два локальных поля на уровне класса для этих значений:
Shared _userld As String
Shared _expenseReportId As Guid
В верхней части Sub Main добавьте запрос к пользователю для ввода имитатора
идентификатора пользователя. Ваш код должен выглядеть следующим образом:
Console.Write("Enter user name: ")
_userld = Console.ReadLine()
Затем добавьте определение объекта коллекции Dictionary для хранения параметров,
которые будут передаваться в рабочий процесс. Добавьте это определение перед
созданием экземпляра рабочего процесса. Код должен выглядеть так:
Dim wfParams As New Dictionary(Of String, Object)
wfParams.Add("Userld", _userld)
Dim expenseId As Guid = Guid.NewGuidO
wfParams.Add("ExpenseReportld", expenseld)
И наконец, измените вызов метода CreateWorkf low, чтобы он принимал эти параметры.
Вот код:
workflowlnstance = _
workflowRuntime.CreateWorkflow(GetType(ExpenseReport), wfParams)
3. Добавьте консольное сообщение внутри обработчика события OnWorkf lowCompleted:
Shared Sub OnWorkflowCompleted(ByVal sender As Object, _
ByVal e As WorkflowCompletedEventArgs)
WaitHandle.SetO
Console.WriteLine("Workflow Completed")
End Sub
4. Теперь вам нужно настроить вызов для утверждения, которое необходимо на стадии
представления отчета. Начните с добавления нового класса с именем Manage Appro val.vb.
Здесь вы реализуете событие утверждения из интерфейса lApproval, созданного ранее.
Вам также понадобится метод для того, чтобыутверждение могло произойти.
846
Часть V. Создание промышленных приложений
Этот код должен выглядеть так:
<Serializable()> _
Public Class ManageApproval
Implements IApproval
Public Event Approval(ByVal sender As Object, _
ByVal e As ApprovalEventArgs) Implements IApproval.Approval
Public Sub ApproveExpenseReport(ByVal expenseReportld As Guid, _
ByVal isApproved As Boolean, ByVal wflnstanceld As Guid)
Dim appArgs As New ApprovalEventArgs(wflnstanceld)
appArgs.IsApproved = isApproved
RaiseEvent Approval(Me, appArgs)
End Sub
End Class
5. Откройте Modulel.vb и сразу под WorkflowRuntime создайте новый экземпляр класса
ManageApproval и зарегистрируйте его в исполняющей среде рабочих процессов
следующим образом:
1 Создать объект обмена данными
Dim exchangeServ As New ExternalDataExchangeService()
workflowRuntime.AddService(exchangeServ)
' Настроить обмен HandleExternalEvent
Dim approvalMgr As New ManageApproval()
exchangeServ.AddService(approvalMgr)
6. Теперь вам нужно обработать утверждение (в зависимости от ввода пользователя).
Добавьте для этого в Module l.vb следующий код (под вызовом
workf lowlnstance . Start):
' Ждать запуска рабочим процессом события уведомления
Thread.SleepC00)
' Получить утверждение
Console.Write("Enter 'approve' to approve, or anything else to reject: ")
Dim approval As String = Console.ReadLine()
If approval = "approve" Then
approvalMgr.ApproveExpenseReport(expenseld, True, _
workflowlnstance.Instanceld)
Else
approvalMgr.ApproveExpenseReport(expenseld, False, _
Глава 20. Встраивание рабочих процессов в ваши приложения
847
workflowlnstance.Instanceld)
End If
7. Теперь нам нужно выполнить аналогичный набор шагов для регистрации уведомления
финансового отдела об оплате. Начнем с создания нового файла ManagePayment.vb.
В этом классе реализуем интерфейс iPaymentNotice:
<Senalizable() > _
Public Class ManagePayment
Implements IPaymentNotice
Public Event Approval(ByVal sender As Object, _
ByVal e As PaymentNoticeEventArgs) Implements" IPaymentNotice.Approval
Public Sub ProcessPayment(ByVal expenseReportld As Guid, _
ByVal checkNumber As Integer, ByVal wflnstanceld As Guid)
Dim payArgs As New PaymentNoticeEventArgs(wflnstanceld)
payArgs.CheckNumber = checkNumber
RaiseEvent Approval(Me, payArgs)
End Sub
End Class
8. Вернитесь к Modulel.vb и зарегистрируйте экземпляр этого нового класса в
исполняющей среде следующим образом:
Dim paymentMgr As New ManagePayment()
exchangeServ.AddService(paymentMgr)
9. Внутри утвержденной области блока if. . .Else консольного приложения добавьте
запрос для имитации ввода финансовым отделом номера чека (листинг 20.2).
10. Полный код хоста и клиента показан в листинге 20.2.
\ Листинг 20.2, Полный код хоста/клиента
Module Module1
Class Program
Shared WaitHandle As New AutoResetEvent(False)
Shared _userld As String
Shared _expenseReportId As Guid
Shared Sub Main()
Using workflowRuntime As New WorkflowRuntime ()
AddHandler workflowRuntime.WorkflowCompleted,
AddressOf OnWorkflowCompleted
848
Часть V. Создание промышленных приложений
AddHandler workflowRuntime.WorkflowTerminated, _
AddressOf OnWorkflowTerminated
1 Создать объект обмена данными
Dim exchangeServ As New ExternalDataExchangeServj.ee()
workflowRuntime.AddService(exchangeServ)
' Настроить обмен HandleExternalEvent
Dim approvalMgr As New ManageApproval()
exchangeServ.AddService(approvalMgr)
Dim paymentMgr As New ManagePayment()
exchangeServ.AddService(paymentMgr)
Console.Write("Enter user name: ")
_userld = Console.ReadLine()
Dim wfParams As New Dictionary(Of String, Object)
wfParams.Add("Userld", _userld)
Dim expenseld As Guid = Guid.NewGuid()
wfParams.Add("ExpenseReportld", expenseld)
Dim workflowlnstance As Workflowlnstance
workflowlnstance = workflowRuntime.CreateWorkflow( _
GetType(ExpenseReport), wfParams)
workflowlnstance.Start()
Console.WriteLine("Workflow Started: " + _
workflowlnstance.Instanceld.ToString())
' Ждать запуска рабочим процессом события уведомления
Thread.SleepC00)
1 Получить утверждение
Console.Write( _
"Enter 'approve' to approve, or anything else to reject: ")
Dim approval As String = Console.ReadLine()
If approval = "approve" Then
approvalMgr.ApproveExpenseReport(expenseld, True, _
workflowlnstance.Instanceld)
1 Ждать уведомления финансового отдела
Thread.SleepC00)
Глава 20. Встраивание рабочих процессов в ваши приложения
849
Console.Write("Enter check number (int): ")
Dim checkNbr As String = Console.ReadLine()
paymentMgr.ProcessPayment(expenseld, Integer.Parse(checkNbr), _
workflowlnstance.Instanceld)
Else
approvalMgr.ApproveExpenseReport(expenseld, False, _
workflowlnstance.Instanceld)
End If
WaitHandle.WaitOne()
Console.WriteLine("")
Console.WriteLine("Hit enter to exit.")
Console.ReadLine()
End Using
End Sub
Shared Sub OnWorkflowCompleted(ByVal sender As Object, _
ByVal e As WorkflowCompletedEventArgs)
WaitHandle.Set()
Console.WriteLine("Workflow Completed")
End Sub
Shared Sub OnWorkflowTerminated(ByVal sender As Object, _
ByVal e As WorkflowTerminatedEventArgs)
Console.WriteLine(e.Exception.Message)
WaitHandle.Set()
End Sub
End Class
End Module
Выполнение рабочего процесса типа конечного автомата
Теперь вы можете запустить приложение рабочего процесса. Оно начинается с запроса
имени пользователя. После его ввода авансовый отчет считается представленным. Посылается
уведомление, которое означает, что рабочий процесс начался. Затем выдается сообщение о
необходимости утверждения, и пользователь получает запрос для ввода утверждения. Если
утверждение не произошло, то рабочий процесс завершается.
Если же авансовый отчет утверждается, то финансовому менеджеру посылается уведомление,
и пользователя просят ввести номер чека. Затем рабочий процесс помечается как
"оплаченный" и пользователю сообщается номер чека. После этого рабочий процесс завершается. На
рис. 20.24 показан пример консольного приложения, выполняющего эти шаги в отладчике.
850
Часть V. Создание промышленных приложений
Рис. 20.24. Результаты приложения в окне консоли
Вы можете добавить точки останова и пройти пошагово по рабочему процессу типа конечного
автомата точно так же, как вы делали это в последовательном рабочем процессе. Точка
останова может находиться на действии состояния или на любом действии внутри состояния.
Резюме
Данная глава представила вам основные фундаментальные концепции создания приложений
(^которые работают с технологией Windows Workflow Foundation), и в том числе компоненты
приложений рабочих процессов: клиент, хост и рабочий процесс. Клиент— это любое
приложение, которое вызывает хост для работы с экземпляром рабочего процесса. Рабочий
процесс — это набор шагов, которые решают некую бизнес-проблему. Ваш рабочий
процесс компилируется и работает внутри хост-приложения. Хост-приложение управляет
вызовами между клиентом и исполняющей средой рабочих процессов.
Мы описали также инструменты конструирования Visual Studio, в том числе и основные
блоки для создания рабочих процессов, такие как CodeActivity, HandleExternalEvent, Set-
State и IfElse. Мы также обсудили, как создать собственную тему для внешнего вида
рабочего процесса.
В последующих разделах этой главы мы подробно описали создание как последовательного
рабочего процесса, так и процесса типа конечного автомата. Первый из них — это набор
взаимосвязанных действий с началом и концом. Второй — это рабочий процесс,
основанный на состояниях (Submitted, Approved, Rejected, Archived и т. д.) единственного
элемента. Код для этих примеров можно найти на Web-сайте данной книги.
Важно отметить, что данная глава является всего лишь основами Windows Workflow. Мы
надеемся, что она заложила для вас некий фундамент, который позволит вам исследовать
дополнительные концепции и сервисы, предоставляемые этой технологией, в том числе:
сохранение рабочего процесса в базу данных SQL Server, добавление сервиса отслеживания
для наблюдения за действиями выполняющегося рабочего процесса, создание
компенсирующих транзакций для отката длительных рабочих процессов, а также разработка ваших
собственных действий, которые могут быть многократно использованы различными
рабочими процессами.
Глава 21
Разработка офисных бизнес-приложений
Microsoft Office— это популярный и очень хорошо продающийся пакет приложений для
человека, работающего с информацией. Мы все знакомы с обработкой текста,
электронными таблицами, электронной почтой, формами и прочими функциональными
возможностями, предоставляемыми приложениями Microsoft Word, Microsoft Excel, Microsoft Outlook и
Microsoft InfoPath. Но эти приложения способны на большее: они сами по себе являются
платформой разработки — платформой, которую можно расширять и настраивать для
создания бизнес-приложений, использующих самые лучшие функциональные возможности,
предлагаемые каждым приложением.
Например, приложение для заказов на покупку может использовать знакомство конечного
пользователя с Microsoft Word и вводить данные при помощи формы Word, а отчеты и диа-*
граммы можно генерировать в Excel. '
В прошлом основным инструментом расширения приложений Microsoft Office был Visual
Basic for Applications (VBA). При помощи VBA разработчики (и даже пользователи) могли
создать широкий диапазон решений (от простых макросов и до более сложных вариантов),
которые реализовали бизнес-логику; они могли также получать доступ к базам данных. VBA
предлагает простой доступ к объектным моделям каждого приложения Microsoft Office:
Project, Word, Outlook, InfoPath, PowerPoint, Publisher и т. д.
Однако начиная уже с первого выпуска инструментов Visual Studio Tools for Office (VSTO)
разработчики имеют надежный способ создания решений Office на управляемом коде —
при помощи Visual Basic и Visual C# непосредственно в Visual Studio.
Visual Studio 2008 была выпущена с третьим поколением VSTO, которое позволяет вам
разрабатывать проекты под последний выпуск— Microsoft Office 2007. Тема использования
VSTO для разработки под Office является чрезвычайно обширной — ей посвящены целые
книги; в этой главе мы надеемся просто представить концепции VSTO и показать— как
типы проектов Office в Visual Studio можно использовать для быстрого создания мощных
приложений, которые используют имеющиеся возможности Word, Excel и Outlook. Вот
некоторые из тем, которые мы изложим:
□ создание нестандартных панелей действий;
□ создание нестандартных панелей задач;
□ настройка ленты в Office.
852
Часть V. Создание промышленных приложений
Мы не пытаемся описать объектную модель расширяемости приложений Office (кроме того
минимума, который необходим для понимания концепций). Более полное изложение Office как
платформы разработки мы рекомендуем искать в блоге команды VSTO по адресу:
http://blogs.msdn.com/vsto/, в книге "VSTO for Mere Mortals™: A VBA Developer's Guide to
Microsoft Office Development Using Visual Studio 2005 Tools for Office" (авторы Kathleen
McGrath и Paul Stubbs, издательство Addison-Wesley Professional, 2007 год), а также в
различных разделах MSDN, в которых описывается VSTO (см. тему "Visual Studio Tools for Office").
Давайте начнем с краткого обзора различных функциональных возможностей Office,
которые можно видоизменять.
Примечание
Несмотря на то, что вы можете использовать Visual Studio 2008 для разработки как
под Office 2003, так и под Office 2007, в этой главе мы обсуждаем только проекты под
Office 2007.
Обзор функциональных возможностей
расширения Office
Поскольку каждое приложение Office имеет уникальное и весьма специализированное*
назначение, не следует удивляться тому, что возможности модификации приложения Office
зависят от самого приложения. Несмотря на то, что все они совместно используют одну
общую компоновку пользовательского интерфейса, в каждом из них имеются свои тонкости,
которые определяют разницу в возможностях инструментов VSTO.
Например, как Excel, так и Word работают с файлами, a Outlook— с сообщениями
электронной почты (которые могут храниться или локально, или на сервере, либо в обоих
местах). Поэтому мы можем применять расширения уровня документов к Excel и Word, но не к
Outlook. И наоборот, объектная модель Outlook поддерживает концепцию областей форм
(которая отсутствует в Excel и Word).
Функциональные возможности Office
В табл. 21.1 дана сводка различных функциональных возможностей, которые можно
модифицировать и расширять в приложениях Office. Мы обсудим в следующем разделе каждую из них.
Таблица 21.1. Точки расширения Microsoft Office
Приложение
Microsoft Excel 2007
Функциональная возможность
• Панель действий
• Панель задач
• Кэш данных
• Лента
• Смарт-теги
Глава 21. Разработка офисных бизнес-приложений
853
Таблица 21.1 (окончание)
Приложение
Microsoft InfoPath 2007
Microsoft Outlook 2007
Microsoft PowerPoint 2007
Microsoft Word 2007
Функциональная возможность
Панель задач
• Панель задач
• Области форм Outlook
Панель задач
• Панель действий
• Панель задач
• Кэш данных
• Лента
• Смарт-теги
Некоторые из этих функциональных возможностей являются возможностями уровня
документов, а другие — возможностями уровня приложений. Разница между ними в основном в
области видимости. Модификации уровня документа прикреплены к конкретному
документу и живут внутри него, будь то файл doc/docx программы Word или таблица Excel. В
отличие от них, функциональные возможности уровня приложения являются более глобальными
и реализованы как надстройки для приложений Office (точно так же, как создаются и
реализуются надстройки для Visual Studio — см. главу 13).
Совсем скоро при обзоре типов проектов VSTO мы рассмотрим механизм дифференциации
уровня решений (уровень документа или уровень приложения). Сначала давайте изучим
функциональные возможности, упомянутые в табл. 21.1. Понимание этих возможностей —
это ключ к использованию Office (при помощи VSTO) в ваших решениях.
Панели задач и действий
Панели задач в Office используются для предоставления команд и функциональных
возможностей (которые являются центральными для выполняемой задачи) без отвлечения
пользователя от текущего загруженного документа. На рис. 21.1 показан снимок экрана
панели задач Microsoft Word 2007 для автоматического создания писем. Эта панель задач
может давать пользователю указания по последовательности действий и в то же время
загруженный документ будет все время виден. Панели задач существуют на уровне приложения.
А вот панель действий — это тип панели задач, который реализован на уровне документа.
Кэш данных
Кэш данных— это способность VSTO хранить данные локально в документе. Этот кэш
иногда называется также "островом данных". Поскольку VSTO может читать и писать в кэш
данных, то он является полезным инструментом для хранения информации, необходимой
вашей надстройке для Office, либо для создания "теневых копий" тех данных, которые
находятся в базе данных, но нужны в некоторых ситуациях отсутствия подключения.
854
Часть V Создание промышленных приложений
fW Ы *? * ' * «j) Д. У ? Оосиглепб • Microsoft Word
r _ _
~" Horn» Insert Pag* layout References Mailings Review V*ew
_J tnvelopcs J-j Start Mail Merge ~ w u> Л ■: i <
.«IS
Table Tools
Developer Design .aycut
3j Labels _jp Select Recipients •
Ci «»t* Start Ma' 4<n jj»*
t«p$«'«i «k1j£« кет* tfa< *« caf««d ib
"-en «i (tax куем fl*ty « л« Hwi зЬ T«i в
•*«cV dvacttf
uda ia£*» w »« Зш* S*>4* plSer «*»• *>« t>»j
pSfy »4 tut Qu«t Stye p«r>j'7»dftM!<»T-
m ижЪ'тсая^ i «roc Ъ' an mtn»<
Ггл>»^, insult
ОД l «Г] W&rd«?20 >J$ *3
ZF^*
Select «Juhwwmi ty|»r
>' г- чЧ /ре or t">a/' et r «* e у aj
wo'bogoo»'
о 1с1«ч
l-fnatmesrajes
> Er ;e cpes
D rectory
I «4rer<
'oc car ре'$.ота1л be tells'
trat each регзоч *e«a-<es
C&r< Next то carnrue
St*>p I of 6
•* Next. S toting dorj-nent
i^^.^¥L»jHui- ~J&*
Рис. 21.1. Панель задач Microsoft Word 2007
Лента
Лента— это новый элемент пользовательского интерфейса, который появился в Microsoft
Office 2007. Он представляет собой новый способ предоставления пользователям
функциональных возможностей (без использования традиционных панелей инструментов и меню).
Команды на ленте сгруппированы по категориям задач и внутри каждой категории команды
визуально сгруппированы с другими аналогичными командами.
*«< t«<;- i S'W< V.*i
_ _ АаВЫ AaSfot AaBbCt
n
Microsoft Word 2007
К-Ы*
*
-J'
Si*,?' ^J
kJ*$»Se4
II 7 >j
A (WW* iT{
'*
i Je V oi
"*
-
>ev . t<
. >
<*t *
-1
J
Microsoft PowerPoint 2007
Рис. 21.2. Ленты в Microsoft Word 2007 и PowerPoint 2007
Например, в Word у нас есть вкладка Review (Рецензирование), на которой собраны все
команды рецензирования документов. Поскольку лента дает мгновенный доступ ко всем
Глава 21. Разработка офисных бизнес-приложений
855
наиболее используемым командам, то она не имеет проблем строки меню (в которой
элементы могут быть сгруппированы в несколько уровней системы меню).
Вкладки ленты и группировка команд на вкладке могут изменяться в разных приложениях в
зависимости от контекста. На рис. 21.2 приведено сравнение вкладок Ноше (Главная) для
Word и PowerPoint.
Смарт-теги
Смарт-теги в Office работают аналогично смарт-тегам интегрированной среды Visual Studio
(см. главу 8). Word способен распознать различные типы контента при его вводе в документ
(такие как имена, даты, финансовые символы и телефонные номера). Когда такой элемент
распознан, он помечается пунктирным фиолетовым подчеркиванием. При нависании
курсора над таким подчеркиванием будет показан значок смарт-тега, который может быть затем
использован для доступа к каскадному меню различных опций взаимодействия с этими
данными. Например, возможно, вы хотите добавить чей-то номер телефона в ваш список
контактов. Это действие легко выполнить из меню смарт-тега для номера телефона (рис. 21.3).
При помощи VSTO вы можете создать собственные распознаватели смарт-тегов и
связанные с ними команды.
Т«Па
4&Л ЬЛ^'ФЙЙД*^* Document!-Mrcrosoft Word
^•^ Horn* ; Jmert Pag*taye*rt Rrter'wuiM ЯШщ*- 8«ttev; \Я«» Develop if «*>
«■* & Catibri{Bodyj * 11 - |j«jJr-*£-№ Sjfc JS, &
E55} 555-121
©j
Telephone Number ►
Telephone Number ►
Smart Tig Options,..
Telephone Numbers 555*1212
£dd to Contacts 1
Eemov* this Smart Teg
Slop Recognizing 55-1ZLZ' ► i
»iA
*»в«ш$ ш«й»и34 тт$ ф ^feLHHl^ML
Рис. 21.3. Меню смарт-тега в Microsoft Word 2007
Типы проектов Office в Visual Studio
Существует тип проекта (или целое семейство типов проектов) для каждого приложения
Office. На рис. 21.4 мы видим различные имеющиеся типы проектов (для этого в
диалоговом окне New Project нужно сначала раскрыть узел языка, а затем узел Office).
856
Часть V. Создание промышленных приложений
Обратите внимание, что у нас есть возможность разрабатывать под приложения как
Microsoft Office 2003, так и Microsoft Office 2007. В основном и подход, и имеющиеся
возможности одинаковы (разумеется, за исключением новых функциональных возможностей,
появившихся в Office 2007 — не самой последней из которых является лента).
1 ri \т&ё
New Project
Project types
Visual С*
Windows
Web
Smart Device
Office
2007
2003
Database
Reporting
I Test
WCF
Workflow
Database Projects
Other Languages
Distributed Systems
Other Project Types
A project for creating a managed code *dd-in for Excel 2007. (NET Framework 35)
Templates-
Visual Studio installed templates
f\ Excel 2007 Add- in
*ч*Едсе12007 Workbook
(^Inf ©Path 2007 Form Template
Ui PowerPoint 2QQ7 Add-in
_3SharePoint 2007 Sequential Workflow
|~,*Vi5io 2007 Add-in
fir Word 2007 Document
My Templates
sjp Search Online Templates
LN£TFramev*crk35
• C11
ix Excel 2QQ7 Template
tyllnfoPath 2007 Add-in
i<? Outlook: 2007 Add-in
l'tProject2007 Add-in
^jSharePoirU 2007 State Machine Workflow
I* Word 2007 Add-in
ft? Word 2007 Template
Name,
JjOceUon'
Solution Narnf'
ExcelAddJnl
С \UsersU powers REDMONDvOocumenhWeual Studio 2QQ8\Projech
Excel Adtflnl 7. Create directory for solution
, Add to Source Control
firowse».
Рис. 21.4. Типы проектов Office в Visual Studio
Для Word и Excel вы увидите по два типа проектов: шаблон надстройки и шаблон уровня
документа (для Word он называется Word 2007 Document, а для Excel — это Excel 2007
Workbook). Как уже говорилось, разница между надстройкой (уровня приложения) и
расширением документа состоит в области видимости: когда вы компилируете проект VSTO,
то генерируется сборка на управляемом коде (точно так же, как и для любого другого типа
проекта в Visual Studio). Эта сборка может быть прикреплена или связана с приложением
Office (например, Word или Excel), либо с документом Office (например, файлом doc/docx
или xls/xlsx). Сборки уровня документов загружаются только тогда, когда загружается
документ, и область их действия ограничена документом. Надстройки уровня приложения
загружаются при старте приложения (пользователь может этим управлять), и по своему
действию они являются более глобальными.
Примечание
Несмотря на то, что Visual Studio 2008 без всякой дополнительной настройки
полностью поддерживает проекты Microsoft Office (по крайней мере, в версии Visual
Studio Professional), вам, очевидно, понадобится иметь на компьютере
инсталлированный Microsoft Office (а возможно, и разные другие компоненты). Подробные
требования для VSTO см. в статье MSDN с названием "How to: Install Visual Studio
Tools for Office".
Глава 21. Разработка офисных бизнес-приложений
857
Создание надстройки для Office
Для того чтобы начать создание вашей надстройки для Office, создайте в Visual Studio
новый проект (при помощи выбора любого типа проекта надстройки для Office). На рис. 21.5
показана базовая структура проекта, созданного как проект надстройки для Word. У нас есть
единственный файл кода, который создает стартовую точку входа для надстройки и
обеспечивает нас пространствами имен, которые нужны нам для доступа к объектной модели
расширяемости приложения Word.
В смысле рабочей среды разработчика мы пока не видим ничего особенного. Но VSTO
обеспечивает мощный набор визуальных конструкторов, которые вы можете использовать
для создания вашего решения под Office. Для доступа к ним вам необходимо добавить
элемент проекта, который имеет соответствующий визуальный конструктор. Для начала
давайте посмотрим, как создать модифицированную ленту.
<*• WordArfdfnl - Microsoft Visual Stud*
з i ®ШЗш
file £drt Vjew RefBCtor Eroject guild fitbog Dfti look Window flefp
i §J * м ^ffi MMrK JLS8yRiaX^—гй^ШгЛ-*РеЬид "Any cpu ^
Щ
Ijfi llH'itktUXLviJwbtp&bjt-'* u-s J« *
. —.-
f ||^|W'j.dA^ei>lTh'iAddlf.
j > li using Systea;
using System.Collections.Generic-
using Systen.Linq;
using System.Text;
using System.Xal.Linq;
using Word - Hicroaoft.Office.Interop.Word;
using Office — Microsoft.Offlee.Core;
-j namespace WordAddlni
public partial class Tfci^A'iciin
ШЗШ&-*.
j JJj Solution 'WerdAddW a project)
' it f% WerdAddlnl
j i > Ш Properties
• i' iil References
j i #3Word
■ Щ) ThtsAddln cs
private void ThlaAddIn_Staxtup{ob3ect ae
I
privace void ThisAddln Shutdown(object a
t
}
Ready
Рис. 21.6. Проект надстройки Microsoft Word 2007
Модификация ленты
Для поддержки ленты в проект VSTO необходимо добавить элемент проекта Ribbon.
Щелкните проект внутри Solution Explorer правой кнопкой мыши и выберите пункт Add
New Item. В диалоговом окне Add New Item (рис. 21.6) вы увидите два различных шаблона:
Ribbon (Visual Designer) и fcibbon (XML). Первый шаблон предоставит вам поверхность
визуального конструирования для модификации ленты в режиме WYSIWYG. Поскольку эта
поверхность конструирования не может быть использована для создания некоторых слож-
858
Часть V. Создание промышленных приложений
ных возможностей ленты, то имеется еще и шаблон Ribbon (XML), который позволит вам
писать функции ленты на XML.
Arid New Heir. - WordAddlnl
Categories'
Visual С* hems
Code
Data
General
Web
Windows Forms
WPF
Office
Reporting
Work-flow
Iemplater
j Visual Studio installed templates
My Templates
J Search Online Templates
I
A control that provides a visual designer fcr basic Ribbon customization tasks
£lame: Rkbbonlxs
x] Ribbon fXML)
Рис. 21.6. Шаблоны элементов проектов под Office
<S> WordAddlnl Microsoft Visual Siudx>
' file £dit y\ew Project fiwid fiebug D^t*
J3* d'W iJ «# * '! ' ' "
i -* L : J ~ -- л v. ' f :;: л
4
1
RfebonLts [De»9nl
|£Q NLfc-П
"* Т<кАЛН; 'BuiL-l >
|
loots Tegr Адагуге
t J- Debug
>0j »>> S); »,♦ v
Window tielp
- Any CPU
\ u:
- a
- ;
Ц,о^1щШ1
- x iij
?!
J
i
Рис. 21.7. Поверхность конструирования ленты
Глава 21. Разработка офисных бизнес-приложений
859
Вам придется использовать шаблон Ribbon (XML) в том случае, если вы хотите сделать
что-нибудь из следующего списка:
□ добавить встроенную группу на нестандартную вкладку;
□ добавить встроенный элемент управления в нестандартную группу;
□ модифицировать обработчик событий для встроенного элемента управления;
□ добавить элементы в Quick Access Toolbar (Панель быстрого доступа) или удалить их
оттуда.
Для наших целей давайте выберем элемент Ribbon (Visual Designer) и добавим его в наш
проект. При этом в наш проект добавится файл Ribbonl.cs. Аналогично Windows Forms,
этот файл имеет визуальный конструктор и прикрепленный к нему файл выделенного кода.
Полученная нами поверхность конструирования является точной копией пустой ленты
(рис. 21.7).
Лента состоит из нескольких элементов: вкладки используются для группировки функций на
высшем уровне, группы нужны на каждой вкладке для более тонкого разделения функций, а
элементы управления в группах предназначены для создания нестандартного
пользовательского интерфейса надстройки.
В загруженном визуальном конструкторе ленты мы имеем доступ к специфическим
элементам управления лентой (при помощи панели Toolbox— см. рис. 21.8). Добавление
элементов управления на ленту или добавление новых групп производится простым
перетаскиванием необходимого элемента управления на ленту или вкладку группы.
Toolbox
~ Office Ribbon Controls
| ^ Pointer
U Box
4 Button
jj ButtonGrcup
0 CheckBax
prf CcmooBox
▼ DrcpDown
l«b( EditBox
3 " Gallery
I...., Group
A Label
IX- Menu
Separator
Г~ SplitButton
. Tab
Ф ToggleButton
+ AH Windows Forms
♦ Compion Controls
N
-II
i 1
i
i~
1
i i
IP
H;
-|;
Рис. 21.8. Элементы управления ленты в панели Toolbox интегрированной среды
Добавление элементов на ленту
Для демонстрации мы создадим нашу собственную нестандартную группу внутри вкладки
Add-Ins. Поскольку нам по умолчанию уже предоставлена одна группа, то мы можем пере-
860
Часть V. Создание промышленных приложений
именовать ее в нечто более подходящее для нашей надстройки. Все элементы ленты
модифицируются при помощи окна свойств (точно так же, как и во всех других типах проектов
Visual Studio). Мы просто щелкаем по группе, а затем настраиваем ее метку.
Группы на поверхности конструирования ведут себя как контейнеры, что позволяет нам
перетащить в группу кнопку. На рис. 21.9 показано начало создания нестандартной ленты
для надстройки системы закупок. Мы добавили две кнопки, изменили их свойство
ControlSize в значение RibbonControlSizeLarge, настроили в метке тот текст, который мы
хотим отображать в кнопке, а также добавили в кнопки изображения.
Совет
Использованные в этом примере изображения были взяты из библиотеки
изображений Visual Studio 2008 Image Library, но есть отличный способ использования любых
значков, которые вы видите в Office. Сначала надо скачать надстройку Icons Gallery
Add-In из центра загрузок Microsoft Download Center (ищите 007 Office System Add-In:
Icons Gallery"). Это файл Excel. Если вы его откроете, то увидите целую галерею
значков Office (см. вкладку Developers (Разработчик) на ленте Excel).
При наведении курсора на изображение вы увидите значение его imageMso. Это
строка, которую можно встроить прямо в свойство Officelmageld ленты. Если для
кнопки еще не настроено никакого изображения, то после этого будет использоваться
указанный значок Office. Это настоящее благо для конструирования пользовательских
интерфейсов, учитывая сотни имеющихся в Office высококачественных значков. На
стадии конструирования эти изображения видны не будут, но они будут корректно
отображаться на стадии выполнения.
«•> WordAddlnl - Microsoft Visual Studio
fjle £dit Vtew Project
bda--i-:3 лш
L > ь ,: il ~ ~
hfSoibt* r^ xi
F QffKe Ribbon Co- -
I \ Pointer J
t- Button
•>¥ ButtonGroup
0 Ch«kBo< s
,*J CombcBox
1 ■*■ DropDown
i»bl EditBo*
I J Gallery ;
v~j Group
A Label .
Гк Menu \
[ Separator
i T; SplitButton |
jtfJ ToggleBurton \
1 Ready
ftuild fiebug Data look Tejt Analyze JMndow tlrip
л , \ " * '• ' ~ ,* * ~ V Debug - Any CPU
- ~ 1 Lid * ft *# a 5 & •£: к ] %! i Л ,J
Re^gurcesjtsa* j Rtbbonl x? RibbonU* (Designf _ __" *
tbPr ПП^Л
"S TabAddra {Built In;
V* ^
SfttHi to Vender CK< ts Vender
S/stanas ^0 » FO
}
РЫасв j
Ex sting FO '
Pv^hss^ng group?
ш \
*
L ' ^mlMI
-1» i
*"'
la i>2
i ^ Solution 'WardAddln * j
: _ 'i*' WordAddlnl j
£ &i Reference?
| ♦ JfWcrd j
♦ ^J Resources
1*1 w I *
[Properties" v~a"x j
] Properties Folder Praperti «•
| Folder Nar Properties I
JFoUerNime
i Name of thrc fclder
Рис. 21.9. Создание в Office нестандартной ленты
Если вы хотите добавить в нашу ленту еще несколько групп, то для этого придется
выполнить еще несколько операций перетаскивания из панели Toolbox. Вы можете изменить по-
Глава 21. Разработка офисных бизнес-приложений
861
рядок групп в ленте посредством перетаскивания их влево или вправо относительно других
групп.
Примечание
Вы заметите, что на ленте уже реализована вкладка по умолчанию с названием
TabAddlns (Built-in). Когда вы создаете ленту для вашей надстройки, то ее группы
будут автоматически отображаться на вкладке Add-lns (Надстройки) приложения Office.
Если вы хотите добавить элементы на встроенную вкладку или создать собственную
вкладку, которая не соответствует встроенной вкладке Add-lns, то для достижения
такого уровня модификации вам нужно будет использовать шаблон Ribbon (XML).
Обработка событий элементов управления ленты
Обработка событий для наших кнопок проста: идея VSTO состоит в том, чтобы обеспечить
возможности модификации Office при помощи тех же самых парадигм разработки, которые
уже имеются в Visual Studio. Это означает, что мы можем просто дважды щелкнуть по
кнопке для того, чтобы интегрированная среда автоматически создала и подключила
процедуру обработки события, готовую для приема любого кода, который мы напишем для
реализации поведения кнопки.
Для тестирования давайте добавим в кнопку Replace Existing PO следующее:
private void buttonReplacePO_Click(object sender, RibbonControlEventArgs e)
{
MessageBox.Show(lfbuttonReplacePO_Click fired!");
}
Если мы теперь запустим проект нажатием клавиши <F5>, то автоматически запустится
Word; мы увидим наши доработки ленты на вкладке Add-lns. Нажатие кнопки Replace
Existing РО даст показанные на рис. 21.10 результаты.
[ £|- Й*^ V $ £Ф^ * Document- Microsoft Word ^.|ЖВИ
i w*' нот* Jiwrrt щь fcajwut 4«f*rftw« Mafeosi R*tf«* view a&ttoptt j Atw-inj * <& II
1 V & >*.-
I S*ndtaVender . FAKto Йерйк* '-.
[ Syrtemas PO Vendor a* PObt«ttn$J42 -
ft,itfca$ir<3 %x\i$Z
Рис. 21.10. Тестирование кнопки на ленте
862
Часть V. Создание промышленных приложений
Модификация панели задач
Панели задач не имеют своего специального визуального конструктора, поскольку они
реализованы через создание пользовательского элемента управления, который уже имеет
поверхность конструирования. Для добавления нестандартной панели задач в нашу надстройку
Word щелкните по проекту правой кнопкой мыши, выберите Add New Item, а затем —
пункт User Control.
Примечание
Поскольку панели действий являются концепциями уровня документа, то мы будем
обсуждать их отдельно в разд. "Создание расширения документа Office" далее в
этой главе. Там будет использоваться все тот же самый общий процесс разработки.
После добавления пользовательского элемента управления и загрузки визуального
конструктора мы можем заняться созданием пользовательского интерфейса и выделенного кода
для панели задач. Здесь единственный специфичный для VSTO аспект состоит в
подключении пользовательского элемента управления панели задач к объектной модели Word. Вся
эта работа делается в коде внутри класса надстройки. Сначала (для того чтобы немного
упростить себе жизнь) мы добавим оператор using в наш класс надстройки:
using Microsoft.Office.Tools;
Затем мы объявляем два локальных объекта — один для панели задач, а другой для
пользовательского элемента управления:
private PurchaseOrderTaskControl poUserControl;
private CustomTaskPane poTaskPane;
Ты^шЁЗшП
■*•>)
Paite
Hsm* Jimrt Psuj* layotrt
any Name
Document • Microsoft Word
Rtttttnm Mailings ftf*tew Vie* Dtvtfopei
Table
Add-lrn Design layout
<„> | в г й * л* x, ** №\ ш m m w \ »§♦
AaBbCcI AaBbCcI AaBbd
T Normal Г No 5paci
<ft
Heading 1 - Слаиа« »fbn«
Styles -
$Ves
Purchase Order
39233222
Furefaree Orders
mm Active Purchase Orders:
PO 530123832 (Сапою 5впясм)
PO S92332225 {UghUnuw til)
PO 39210C101 (H/W Retaseh}
PO 322C20213 CorpTrafn inc}
!~~ Vff s: ma( \ ~~
" f' *""" Ш Ш¥ f"""
"'" S&eifar: '*•
fixid:? '"
" ZJ ШШ1 ~ :~"
". "". ЩЩа'ЩёТ _1_.
Workflow Saltings
Req. Bus; rutas Justtf ftati an:
ROI Study
Final Approver:
Jane Doe *•
\2 fixed SudqetWorfcflcv/
(У| Outside VendorWorkf low
G Service» Only Workflow
_£L.
Pae*'l«*l CcrfumrcS WcrdclW ц2Й *?3 '
Рис. 21.11. Нестандартная панель задач в Microsoft Word 2007
Глава 21. Разработка офисных бизнес-приложений
863
И наконец, нам нужен код для добавления нестандартной панели задач в экземпляр
приложения. Мы поместим его в событие startup (в данном примере это ThisAddinStartup),
чтобы панель задач при запуске надстройки сразу же становилась доступной и видимой:
poUserControl = new PurchaseOrderTaskControl();
poTaskPane = this.CustomTaskPanes.Add(poUserControl, "Purchase Orders");
poTaskPane.Visible = true;
Если вы теперь соберете и запустите проект, вы должны будете увидеть свою панель задач
внутри среды Word (рис. 21.11).
Создание областей форм Outlook
Надстройки Outlook способны добавлять области форм в любой класс сообщений внутри
Outlook. Класс сообщений лучше всего представлять себе как различные элементы,
описанные в Outlook: записки, задачи, сообщения электронной почты и т. д.
Для создания областей форм сначала нужно создать проект надстройки Outlook, а затем
добавить элемент Outlook Form Region. При этом появится мастер для создания области
формы, который собирает информацию, необходимую для автоматического генерирования
файла класса для области формы. Первый экран мастера используется для указания, хотите
ли вы создать совершенно новую область формы или использовать существующую, которая
была создана в самой программе Outlook. Вторая страница мастера (рис. 21.12) указывает
место для области формы. Здесь имеются четыре варианта (с рисунком, который
иллюстрирует позиционирование области формы). *
New С Jtlook Form Яедюп
И
О Д Select the type of form region you want to create
The type of the Term region determines where the form region appears «.hen you open tn item tn Outlook
What type of form region do you want to create?
> Separate
Adds a new page to the form
9 Adfotfung
Appends to the bottom of the form
< > gepbeement
Replaces the default page of the form
RepUce-aH
Replaces the entire form.
< Erevjou* j J NJert > ] I Cancel
Рис. 21.12. Возможные типы областей форм в Outlook
864
Часть V. Создание промышленных приложений
New Outlook Fo-Trt Region
Ол Supply descriptive text and select your display preferences
The name appear; m the Ribbon of an Outtcok item or as the header text in an
replacement and replace-all form region types, you can also include в title anc
What name, title, and description ds you want to use?
Name
Purchase Order Details
In which display modes should this form region appear?
{< Inspectors that are in compose mode
{/] Inspectors that are in read mode
f-" Reading Pane
J < grevious J1
U**t>
adjoining form
description.
J -
region.
l«
Fprthe
ШМ1
*
Cancel
Рис. 21.13. Поддержка инспекторов
Nev. Outlook Form Region
СШ Identify the message classes that will dkptay this form region
Vou can asscciate the form region with standard or custom message classes
Wtuch standard message classes will display thh form region?
(_' Appointment (IPM Appointment)
П Contact {IPM Contact I
П Pjstftbution List (IPM DistList)
P Journal Entry (IPM.Activity)
M Mail Message (IPM Note]
( 1 Post (IPM Post]
| ]£S${lPMPc«tRSS)
{ i Issk (IPM Task)
To identify a custom message class, typethe custom message class name {for example: !PM.Post Contoso j
Separate multiple message class names with semicolons
W_hich custom message classes wffl display this form region7
Lt*!
ftntsh
Рис. 21.14. Связывание области с классом сообщений
Третья страница мастера (рис. 21.13) запрашивает название области, а также те режимы
инспектора, которые она должна поддерживать. Инспектор — это термин Outlook для обо-
Глава 21. Разработка офисных бизнес-приложений
865
значения окна, используемого для просмотра и редактирования определенного класса
сообщений. Например, когда вы составляете в Outlook новое сообщение электронной почты, то
видите инспектора электронной почты в действии.
Четвертая (и последняя) страница мастера (рис. 21.14) связывает область формы с любым
встроенным классом сообщений Outlook либо с нестандартным классом сообщений
(разработанным сторонней организацией).
По завершении Visual Studio сгенерирует код для всех свойств области формы, описанных в
мастере. Теперь вы готовы конструировать пользовательский интерфейс для вашей области
формы.
Визуальный конструктор для Outlook Form Region выглядит аналогично визуальному
конструктору User Control: это просто пустой холст, на который вы перетаскиваете элементы
управления. Точно так же, как и с другими типами надстроек, именно в классе вашей
надстройки вы связываете пользовательский интерфейс вашей области формы с объектной
моделью Outlook (для выполнения самой фактической работы надстройки).
На рис. 21.15 показана завершенная область формы Outlook, прикрепленная к классу
сообщений электронной почты (IPM.Notes).
У *> О -* * « FW РО for lighthouse project-APPROVAL NEEDED-M«sjgr..
1q В
Options formal fot Devetop«
Щ * c"J^!lBodrt * " * £A* Щ ЯШ * &s* ^ *»• Щ*
Addrcu CJi«c*t
Book Name*
Follow
Up* 4
Qptfsni
Soelling
^ РгаяНт
LSbJ
Subject- FWt PO for Itghthouj* project - APPROVAL NEEDED
Attache* ffippfl
Jene, see my attached approval; please let me know the disposition before end of quarter.
Thanks
m
rVcha» Order 0«Ы«
TocalAmou* $14 79290
Workflow Stab» Дммьпд T)«r 3 Approval
Final Ipproval Jar* Goo
Rfprt
Рис. 21.15. Область формы Outlook в действии
Создание расширения документа Office
Существуют различные способы самостоятельной настройки документов Office. Вы
можете встроить в документ элементы управления, создать специфичные для документа па-
866
Часть V. Создание промышленных приложений
нели действий, реализовать ваши собственные смарт-теги, а также сохранить в документе
данные.
Проект уровня документа создается при помощи того же самого процесса, который мы
использовали для надстроек. Однако на этот раз нужно выбрать тип проекта Excel 2007
Workbook или Word 2007 Document. Эти типы проектов используют визуальные конструкторы,
которые обеспечивают вам внешний вид электронной таблицы Excel или документа Word.
Элементы управления хостинга
Как Word, так и Excel имеют хост-элементы, которые работают как контейнеры для элементов
управления и кода. Хост-элемент— это по существу прокси-объект, который представляет
физический документ в приложении. Это ключевые объекты для модификаций на уровне
документа. Для Word у нас есть объект Microsoft. Off ice. Tools. Word. Document, a для
Excel— объект Microsoft. Off ice. Tools .Excel. Worksheet. Мы создаем
функциональность при помощи этих хост-элементов (посредством визуальных конструкторов). Каждый
хост-элемент может обеспечивать хостинг как элементов управления Windows Forms, так и
"родных" элементов управления Office.
Примечание
Существует также и третий хост-элемент, который представляет собой рабочую книгу
, электронных таблиц Excel: Microsoft. Off ice. Tools. Excel. Workbook. Это хост-
элемент для выполнения модификаций на уровне рабочей книги электронных таблиц,
но он не является контейнером для элементов управления. Этот Workbook работает
как лоток компонентов и может принимать такие компоненты, как DataSet.
Элементы управления Windows Forms
Элементы управления Windows Forms можно добавлять на поверхность конструирования
документов точно так же, как и при конструировании приложения Windows Forms. В нашем
примере мы будем использовать рабочую книгу электронных таблиц Excel. Шаблон проекта
Excel 2007 Workbook автоматически добавляет в наш проект xslx-файл, который содержит
три электронные таблицы, причем каждая представлена собственным классом (это те самые
хост-элементы, которые мы только что обсуждали). Эти таблицы уже определили события
старта и завершения, что позволяет нам выполнять необходимую работу при открывании
или закрывании таблицы.
Поверхность конструирования таблицы выглядит идентично электронной таблице в Excel.
Здесь вы можете добавлять на таблицу элементы управления Windows Forms (при помощи
панели Toolbox в Visual Studio), а также реализовывать код в файле выделенного кода (для
подстройки функционирования этих элементов управления). На рис. 21.16 показан
визуальный конструктор рабочей книги в интегрированной среде разработки (с добавленными на
него несколькими элементами управления).
Примечание
Создание проекта документа Office требует доступа к проектной системе Microsoft
Office Visual Basic for Applications. Обычно этот доступ из соображений безопасности
Глава 21. Разработка офисных бизнес-приложений
867
отключен. Если он отключен, то Visual Studio выдаст вам напоминание включить его
перед созданием вашего проекта для Office.
П^Г
</) ExcelWorkbookl - Microio*t Visual Studio
£ёе £drt View Prej«<t flurtd gebug Djti Joel* Tej* Window Help
Any CPU
\&
tcottx»
♦J Excd Control*
J AB Windows Forms
l^ Pointer
§ BackgrcundWorler
^ BindingSource
|*b) Button
И CheckBoa
°^ CheckedlistBox
K\ CotorDialog
•iff ComboBox
^J DataGndVtew
тЗ DataSet
X? DateTimePicker
2 DomamUpDovtn
.1\ FolderBrowierDiaiag
23 FontDiafog
LED HeJpProvidef
* > HScroitBar
jjjil ImegeList
A Label
Л LinkLabel
*3 LtrtBox
Ready
J,
|Нйт*{. Iru«*t [Рдд* tSJ* ? FOfmttfoS Data ) Ht№W V1*# > Ow*fofl*r АЛИИ.* 5 ¥
Alignment Numfeft Slyias C«m
Pa$t*
Л
-Z"
1 _Act)veXWrapper3
/» , =EMBED(
$«|«аРигаЬл»*0«к**
С
ЫВах1
9
10
11
и < ► *< Sh«etl,
0 <Wph Agm* Sbdgrt
or - - -— a ~ *
Sh«et3 Sh»et3 *M *Я
Ik*
Рис. 21.16. Настройка электронной таблицы Excel
Элементы управления хоста
Элементы управления хоста — это термин для обозначения "родных" элементов управления
Office. Эти элементы фактически расширяют объекты (имеющиеся в объектных моделях
Word или Excel) для предоставления дополнительных возможностей, таких как обработка
событий и привязка данных. Создание документа при помощи элементов управления хоста
производится так же, как и при помощи элементов управления Windows Forms. В
загруженном проекте уровня документа вы увидите в панели Toolbox в Visual Studio вкладку,
которая содержит элементы управления хоста для приложения, под которое делается разработка.
Для Excel это будет вкладка Excel Controls, а для Word — вкладка Word Controls.
В табл. 21.2 перечислены имеющиеся для Excel и Word элементы управления хоста.
Таблица 21.2. Точки расширения Microsoft Office
Тип проекта
Excel 2007 Workbook
Элемент управления хоста
ListObject
NamedRange
Функция
Отображает данные по строкам
и столбцам
Представляет диапазон Excel;
может быть привязан к данным
и предоставлять события
868
Часть V. Создание промышленных приложений
Таблица 21.2 (окончание)
Тип проекта
Word 2007 Document
Элемент управления хоста
Bookmark
BuildingBlockGalleryContentControl
ComboBoxContentControl
DatePickerContentControl
DropDownListContentControl
PictureContentControl
PlainTextContentControl
RiqhTextContentControl
Функция
Представляет собой вкладку
Word
Строительный блок
документа — это часть документа,
которую предусматривается
использовать многократно (титульный
лист, заголовок и т. д.) — этот
элемент управления отображает
список строительных блоков,
которые пользователи могут
вставлять в документ
Стандартное комбинированное
окно
Стандартный элемент выбора
даты
Раскрывающийся список
элементов
Представляет собой область
документа, в которой
отображается изображение
Представляет собой блок текста
Представляет собой блок
текста; может содержать
обогащенный контент
Создание панели действий
Кроме настройки взаимодействия с пользователем в документе, элементы управления
Windows Forms используются также и для создания нестандартных панелей действий. Панели
действий следует использовать для предоставления пользователям контекстуальных данных
и возможных команд при редактировании или просмотре ими документа (документа Word
или файла рабочей книги электронных таблиц Excel).
Существует несколько причин, по которым вам может понадобиться реализовать интерфейс
вашего документа в виде панели действий. Одна причина в том, что панель действий
"связана" с документом, но фактически не является его частью — содержимое панели действий не
будет распечатываться при распечатке самого документа. Другая причина реализации
панели действий — сохранение фокуса на документе: вы можете читать и пролистывать весь
документ, а информация и команды панели действий будут все время видны.
Физически панели действий создаются при помощи пользовательских элементов
управления и представляются элементом Actions Pane Control. Добавление этого элемента в ваш
проект документа создаст класс пользовательского элемента управления; далее вы просто
как обычно создаете пользовательский интерфейс элемента управления. Однако в общем
Глава 21. Разработка офисных бизнес-приложений
869
случае вам, скорее всего, понадобится динамически добавлять или удалять элементы
управления из панели действий (в зависимости от того, что именно пользователь делает в
документе, который открыт в Word или Excel). Именно эта контекстная чувствительность
является и преимуществом, и целью использования панели действий.
Совет
При использовании Windows Forms для взаимодействия с Windows Presentation
Foundation можно также включать в панель действий и элементы управления WPF. Более
подробную информацию по хостингу элементов управления WPF в пользовательском
элементе управления см. в документации MSDN (ищите класс ElementHost в
Windows Forms).
Управление поведением стопки
Поскольку панель действий работает как контейнер панели инструментов (который
пользователь может прикрепить или переместить), то существует движок управления
компоновкой, которое указывает, как необходимо отображать элементы управления внутри панели
действий. Свойство ActionsPane.StackOrder работает совместно с перечислением
StackStyle для управления поведением компоновки. Различные значения stackstyle
описаны в табл. 21.3.
Таблица 21.3. Значения StackStyle
Значение
FromBottom
FromLeft
FromRight
FromTop
None
Описание
Элементы управления укладываются в стопку, начиная с нижней части
панели действий
Элементы управления укладываются в стопку, начиная с левой части
панели действий
Элементы управления укладываются в стопку, начиная с правой части
панели действий
Элементы управления укладываются в стопку, начиная с верхней части
панели действий
Укладка в стопку не производится (порядком и компоновкой управляют
вручную)
Точно так же, как вы делали в случае нестандартной панели задач, после сборки
пользовательского элемента управления (который вы хотите показать в панели действий) вам
необходимо создать переменную поля для экземпляра элемента управления, а затем добавить
элемент управления в панель действий.
Поэтому в классе ThisWorkbook мы добавим следующее объявление:
private ActionsPaneControll approvalPane = new ActionsP^neControll ();
А следующая строка кода добавит наш пользовательский элемент управления в панель
действий рабочей книги электронных таблиц:
this. ActionsPane.Controls.Add(approvalPane);
870
Часть V. Создание промышленных приложений
На рис. 21.17 показана нестандартная панель действий вместе со своей электронной таблицей.
г* JJJ2.
bcceKVarlbockljtkx - Wrtroioft Excel
)
Home li««t page Layout Formula* Oslo 4*vt«w Vttw Denrelccw Arid n$ W
^ Arial <16 • = « ы *> A "" ' E
-IS » / H MA*
Л
jp format - ^« ,..
L
E12
AJic-unent f»jmr?«r
& V & 391002912
n Your Company
Purchase Ordi ~*£зг
12 /ow Axnssi
13 "our AJdrecrP
14 Cry Ssa's Zip Cotmf)
16
17 Supplier Nome >rderDate
18 AMrsssi ent Terms
19 ^i*Bss? ^ ОБ. Point
20 ca/^sutsZip ght Terms
21 fax хкх xxx-xxxx _ ^cct Code
22 Phone *jc* >jr >jsj Sates Tax:
23 Attn Suppner Contact
391002912|
Approve
Record Comparison
Show Other PQs Ior th s Vendor
и « » и Sheetl She«S2 Sheyt3 ГЗ 'Щ,.;
brrtir t3
Рис. 21.17. Нестандартная панель действий в Excel
Сохранение данных в кэше данных
Кэш данных — это область для чтения/записи в документе Office Word или рабочей книге
Excel, которую ваше приложение Office может использовать для хранения необходимых
данных. Самый часто встречающийся вариант— привязка элементов управления хоста или
элементов управления Windows Forms в панели действий или на поверхности документа к
набору данных, сохраненному в острове данных документа.
Физически этот остров данных реализован как XML-документ, который встроен в документ
Office. Этот XML-контейнер может хранить любой тип данных, который удовлетворяет
следующим двум требованиям:
□ он должен быть реализован как открытое поле элемента хоста для чтения/записи
(например, класс ThisDocument для Word или класс ThisWorkbook для Excel);
□ он должен быть сериализируемым (исполняющая среда использует XmlSerializer для
вербализации объекта в острове данных).
Большинство встроенных типов .NET соответствует этим требованиям. Если вы написали
нестандартный тип, который также удовлетворяет этим требованиям, то он тоже может
быть сохранен внутри острова данных.
Добавить данные в кэш данных просто. Вы помечаете атрибутом CachedAttribute тот тип
данных, который хотите сохранить, и тогда (при условии, что тип удовлетворяет
требованиям кэша данных и что вы создали экземпляр данного типа внутри вашего проекта VSTO
уровня документа) он будет автоматически добавлен в остров данных.
Глава 21. Разработка офисных бизнес-приложений
871
Объекты DataSet оказываются полезными при передаче внутри острова данных. Для
объявления DataSet в качестве кэшируемого необходимо написать следующее:
[Microsoft.VisualStudio.Tools.Applications.Runtime.Cached()]
public DataSet poDataSet;
Это декларативная инструкция для исполняющей среды VSTO— сериализовать объект и
добавить его в кэш данных текущего документа. Сам DataSet можно заполнять так, как вам
угодно.
Есть также способ обязательного кэширования объекта в документе. Каждый элемент хоста
предоставляет методы isCached и StartCaching. Комбинируя оба этих метода, вы можете
проверить, имеется ли уже объект в кэше, и если его еще нет— добавить его в кэш. При
помощи этих двух методов вы можете добавить следующий код для сохранения в документе
нашего объекта poDataSet:
if (!this.IsCached("poDataSet"))
{
this.StartCaching("poDataSet ");
}
Если вы используете метод StartCaching (), то нет необходимости помечать класс
атрибутом Cached, но сам объект должен по-прежнему выполнять остальные требования для се-
риализации острова данных Office. Вы можете также использовать метод stopCaching
хост-элемента для того, чтобы дать указание исполняющей среде VSTO удалить объект из
кэша данных документа.
Совет
Есть еще и третий способ поместить объект в кэш данных, окно свойств. Если вы
используете окно Data Sources для добавления набора данных в ваш проект, то
сможете создать экземпляр набора данных, а затем выбрать его в визуальном конструкторе
В окне свойств для экземпляра набора данных установите свойство Cache in
Document в значение True. Вам понадобится также изменить тип доступа экземпляра
набора данных на Public.
Доступ к кэшу данных
Часто бизнес-приложение под Office будет использовать сервер, который работает как
центральное хранилище документов. Здесь возникает дилемма: офисные приложения (такие как
Word и Excel) не предназначены для работы в серверной среде, когда много их экземпляров
может понадобиться считывать из файла подкачки (для обработки множества запросов к
расширению на уровне документа). До настоящего момента для расширения Office мы
использовали объекты объектной модели Office. Это подразумевает, что на компьютере,
выполняющем ваш исполняемый модуль, должен быть инсталлирован Office — а для типовых
серверных инсталляций это совершенно не характерно. К счастью, одной из основных целей
архитектуры уровня документов Office является четкое отделение данных от представления
данных. Иначе говоря, архитектура VSTO определяет способ доступа к документу без
фактического использования клиентского приложения Office. Вместо него используется сама
исполняющая среда VSTO.
872
Часть V. Создание промышленных приложений
Ключом доступа к серверной стороне документа является класс ServerDocument. Этот класс
(который является частью исполняющей среды VSTO и находится в пространстве имен
Microsoft.VisualStudio.Tools.Applications) позволяет произвести программный
доступ к кэшу данных документа на тех компьютерах, где нет инсталлированного Office.
Работающий на сервере процесс передает путь к необходимому документу в конструктор
ServerDocument, а затем использует классы CachedDataHostltem и CachedDataltem для
получения либо схемы, либо XML (либо и того, и другого) из острова данных документа.
Если на целевом компьютере инсталлирована исполняющая среда VSTO, то для доступа к
данным заказов на покупку (из электронной таблицы заказов на покупку на сервере) можно
использовать следующий код:
string poFile = @"С:\ServerData\po39233202.xls";
ServerDocument poDoc = null;
poDoc = new ServerDocument(poFile) ;
CachedDataHostltem dataHostltem =
sdl.CachedData.HostItems ["ExcelWorkbookl.Datasheet1"];
CachedDataltem dataCache = dataHostltem.CachedData["CachedPO"];
// Свойство dataCache.Xml будет содержать XML
//из указанного острова данных
При помощи свойства dataCache.Xml вы можете теперь десериализоваться обратно в
исходный тип данных, просмотреть данные и т. д.
Реализация ваших собственных смарт-тегов
Смарт-теги приложений Office работают примерно так: по мере ввода пользователя (в
открытом документе) сам текст ввода "разбирается" на маркеры, которые затем сравниваются
со всеми терминами/выражениями, которые распознаются в любых приложениях Office.
Если текст распознается смарт-тегом, то пользователю выдается список действий
(отображаемый при помощи того пользовательского интерфейса, который уже был описан ранее
при первом представлении концепции смарт-тега). То есть у нас есть две части процесса:
распознавание и действие.
При помощи VSTO вы можете создать ваши собственные смарт-теги, которые определяют
распознаваемый ими текст, а также и список возможных действий, который будет
представлен пользователю после распознавания.
Как Word, так и Excel реализуют классы, которые наследуют от базового класса
Microsoft.Office.Tools.SmartTagBase.
Для Word это класс Microsoft .Off ice. Tools. Word. SmartTag, а для Excel это класс
Microsoft .Office.Tools .Excel. SmartTag. Оба этих класса реализуют два важных
свойства, определенные в классе SmartTagBase: Terms и Expressions. Если вашему
смарт-тегу необходимо выявлять совпадение простых текстовых маркеров, то вы можете
Глава 21. Разработка офисных бизнес-приложений
873
добавить их в коллекцию Terms. Если требуется более сложное сопоставление, то
свойство Expressions примет регулярное выражение для такого сопоставления.
Для того чтобы определить, как настроить объект вашего смарт-тега, необходимо немного
узнать о том, как приложения Office разбирают текст на маркеры. Например, если
пользователь вводит РО29302 в Word, то синтаксический анализатор автоматически создаст из этого
текста два маркера: первый маркер будет РО, а второй — 29302. Добавление строки "РО" в
коллекцию Terms приведет к тому, что этот текст будет распознаваться нашим смарт-тегом
(поскольку один из маркеров совпадает с нашим условием). Мы могли бы также написать
более сложное и надежное регулярное выражение, которому соответствуют "буквы РО,
перед которыми имеется один или несколько пробелов, и за которыми следует любое
количество цифр, а затем один или более пробелов" следующим образом: \sPO[0-9]*\s.
После того как вы решили, что хотите делать в вашем смарт-теге поиск текстовых
совпадений, вам необходимо определить список действий, которые будут доступны пользователю
при нажатии смарт-тега. Если вы хотите сделать поиск заказа на покупку при помощи
только что показанного регулярного выражения, а затем дать пользователю возможность
просмотра подробностей этого заказа на покупку (возможно, внутри панели действий или в
области формы Outlook), то вы можете определить это действие при помощи класса Action
(который имеется как в Word, так и в Excel). Класс Action предоставляет событие, которое
мы можем перехватить для выполнения указанного действия:
// Создать объект действия
DisplayPO = new Action("Display PO details");
// Добавить действие в смарт-тег
POSmartTag.Actions = new Action[] { DisplayPO };
Home ln«rt ОД* [xfcut
$ Calibrl (Body}
-* в / if
S Г
Cpfciairf '»
•.a
Past»
WoidDocumentl docx - Microsoft Word
ftrt?**rut$ Mailings Rei>ie>w View Deveutper
fint
11 :!§*-*:■?-«* 4,^
{&- —''44Hr|
Pa i»S df, >
This is a test of our custom smart tag.
3G
Does «t recognize powT.* рсшошш
Display PO details
Remove this Smart Tsg
Stop Reccgniung" РО230Ш923 " >
Smart Tag Options..
JLL.
Pagti I of 1 Column: t* ' Ward» 14 q$ £3
Ciilri Cnange Editing
Styifei ' Slj;.<4 '
2t>1*>
:£f|pBrefca$eOrd*« "* )
AcUs'e Purchase Orders.
FO £50129832 JConloao Service»)
FO 152332222 (Lighthouse Prqed)
j PO 352332223 |Lgl ill «use 02}
FO 3321С4Л01 [HAV Refresh)
PO S22G2C210 £«рТг«п be }
Worlrto* Setfargs
Peq Business Justification.
ROI Study
Final Дрргс vw:
Jane Doe ▼
Q Fixed Budget workflow
Г7] Outside VrwicrMjrkflow
U Services Only rVortflo*
И rota j sl.,11,.^,,, jfc ,IMMAJ
Рис. 21.18. Нестандартный смарт-тег в действии
874
Часть V. Создание промышленных приложений
В листинге 21.1 все это сведено в один блок, который можно скопировать и вставить в класс
документа Word (например, This Document) для создания нестандартного смарт-тега, а на
рис. 21.18 показан смарт-тег в действии.
| Листинг 21.1. Проект Word Document с нестандартным смарт-тегом
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Xml.Linq;
using Microsoft.VisualStudio.Tools.Applications.Runtime;
using Tools = Microsoft.Office.Tools.Word;
using Office = Microsoft.Office.Core;
using Word = Microsoft.Office.Interop.Word;
namespace WordDocumentl
public partial class ThisDocument
{
private void AddPOSmartTag()
{
// Создать объект смарт-тега
Tools.SmartTag poSmartTag =
new Tools.SmartTag("www.contoso.com#POSmartTag",
"PO Smart Tag");
//Мы хотим проверять совпадение регулярного выражения:
poSmartTag.Expressions.Add(new Regex(@"\sPO[0-9]*\s") ) ;
// Определить действие для смарт-тега
Tools.Action displayDetails = new Tools.Action("Display PO details...");
// Добавить действие в смарт-тег
poSmartTag.Actions = new Tools.Action[] { displayDetails };
// Добавить смарт-тег в документ
this.VstoSmartTags.Add(poSmartTag);
Глава 21. Разработка офисных бизнес-приложений
875
II Подключить обработчики событий для действия смарт-тега
displayDetails.Click += new Tools.ActionClickEventHandler(
displayDetails_Click);
}
void displayDetails_Click(object sender, Tools.ActionEventArgs e)
{
// Здесь должен быть код доступа в систему закупок
// для предоставления информации в текущем документе
}
private void ThisDocument_Startup(object sender, System.EventArgs e)
{
AddPOSmartTag();
}
private void ThisDocument_Shutdown(object sender, System.EventArgs e)
#region VSTO Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InternalStartupO
{
this.Startup += new System.EventHandler(ThisDocument_Startup);
this.Shutdown += new System.EventHandler(ThisDocument_Shutdown);
#endregion
Резюме
В этой главе мы описали имеющиеся в Visual Studio 2008 возможности использования
приложений Microsoft Office и модификации их поведения как на уровне приложения, так и на
уровне документа. В нашем обсуждении надстроек Office мы охватили: возможности
добавления ваших собственных элементов, вкладок и группировок на ленту; создание областей
29 3ак 3716
876
Часть V. Создание промышленных приложений
форм Outlook; а также разработку нестандартных панелей задач. В нашем обсуждении
расширений уровня документов Office мы проиллюстрировали: концепции хостинга элементов
управления Windows Forms и "родных" элементов управления Office на поверхности
документа; создание нестандартных панелей действий для предоставления контекстно-
чувствительных действий и информации пользователям; а также использование
архитектуры кэша данных для чтения и записи данных в документы Office как на клиентской, так и на
серверной стороне.
И наконец, мы познакомили вас с созданием ваших собственных смарт-тегов.
Несмотря на то, что мы сосредоточились только на нескольких приложениях Office,
которые могут быть модифицированы при помощи VSTO, мы надеемся, что мы предоставили
достаточно информации о проектах и визуальных конструкторах VSTO для того, чтобы вы
могли начать свое изучение Visual Studio и Office в качестве платформы разработки.
ЧАСТЬ VI
Система
командной работы
Visual Studio Team System
Глава 22
Командная работа
и система командной работы Visual Studio
Мы уделили много внимания конкретному описанию того, как заставить Visual Studio
наилучшим образом содействовать созданию самых различных приложений: приложений
Windows Forms, Web-приложений, приложений для работы с базами данных, библиотек классов
и т. д. И при нашем обсуждении различных инструментов Visual Studio, которые позволяют
выполнять такие разработки, мы сосредоточились непосредственно на роли разработчика —
на том, как быстро написать качественный код при помощи интегрированной среды
разработки Visual Studio. Но если мы будем говорить только о кодировании, то упустим из виду
более общую картину. Проекты разработки программного обеспечения включают в себя и,
другие важные роли и навыки. Проекты программного обеспечения гораздо сложнее, чем
обычное создание кода; они живут своей собственной жизнью, которая содержит различные
рабочие моменты.
Система коллективной работы Visual Studio Team System — это эволюция Visual Studio от
предназначенной для разработчика интегрированной среды разработки до набора
инструментов для коллективной работы (который предназначен для всех ролей проекта разработки
программного обеспечения и позволяет продуктивно работать на всех этапах жизненного
цикла разработки программного обеспечения (Software Development Life Cycle, SDLC)).
В данной главе мы рассмотрим этот набор коллективных инструментов, называемый
системой коллективной работы Visual Studio (Visual Studio Team System, VSTS). Сначала мы
получим некоторые основные знания о SDLC (для того чтобы понять контекст тех проблем,
с которыми сталкиваются команды разработчиков). Затем мы обсудим, что мы имеем в виду
под системой коллективной работы Visual Studio, и кратко познакомимся с набором
инструментов коллективной работы. В остальных главах этой книги будут подробно
рассмотрены различные варианты работы с VSTS.
Примечание
Будьте внимательны: термином VSTS могут называть две похожие по названию, но
различные концепции. Здесь мы используем его для описания всего клиентского и
серверного программного обеспечения, которое составляет систему коллективной
работы Visual Studio. Однако VSTS часто используют и для обозначения Visual Studio
Team Suite. Это комплектация Visual Studio, которая содержит функциональные воз-
880
Часть VI. Система командной работы Visual Studio Team System
можности всех версий Visual Studio (Development Edition, Database Edition, Architecture
Edition и т. д.).
Проекты разработки программного обеспечения
Проекты разработки программного обеспечения — это сложные проекты, которые содержат
различные механизмы. Да, разработчики являются важным компонентом этого машинного
парка механизмов, но они— далеко не единственный компонент. В любом достаточно
крупном проекте принимают участие архитекторы программного обеспечения. Они
являются хранителями технического проекта решения и тесно взаимодействуют с разработчиками
для того, чтобы реализовать его в коде, а также обеспечить его соответствие требованиям и
ожиданиям проекта. Участвуют также и тестеры. Они тестируют правильность созданного
разработчиками кода (при помощи целого набора тестов качества). И наконец, один или
несколько человек занимаются логистикой проекта: кто над чем работает, отслеживание
графика выполнения, а также общее управление проектом.
Каждый проект проходит целую последовательность стадий (от начальной точки и до
завершения). Со временем в отрасли программного обеспечения выработались определенные
модели, которые описывают жизненный цикл разработки программного обеспечения и
взаимодействия между различными ролями и участниками.
Microsoft разработала собственный набор моделей и руководств по SDLC и используемым в
нем ролям (который называется Microsoft Solutions Framework). Microsoft Solutions
Framework (или MSF) находится сейчас в своей четвертой реинкарнации. Она описывает
модель процесса (для описания фаз и действий SDLC), а также модель командной работы
(для описания ролей, которые принимают участие в команде разработки проекта
программного обеспечения). В ней также содержится целая коллекция передового опыта, руководств
по проектам и шаблонов.
MSF имеет две разновидности: MSF for Agile Software Development (MSF Agile) и MSF for
Capability Maturity Model Integration Process Improvement (MSFCMMI). Общее понимание
MSF важно для нашего обсуждения системы коллективной работы Visual Studio по двум
причинам:
□ для понимания значения VSTS вам необходимо сначала понять проблемную область
проектов разработки программного обеспечения; овладев общеупотребительным
набором терминов для описания этой проблемной области, вам будет гораздо легче понять
те преимущества, которые дает Visual Studio Team System;
□ кроме того, VSTS способна использовать модели шаблонов, которые реально влияют на
поведение инструментов в Visual Studio. MSF Agile и MSF for CMMI — это два шаблона
фирмы Microsoft для использования с Visual Studio Team System.
MSF Agile
MSF Agile проецирует концепции MSF на методологию гибкой разработки программного
обеспечения.
Глава 22. Командная работа и система командной работы Visual Studio 881
Несмотря на то, что сложно дать определение "гибкости" процесса разработки, эта
методология придерживается следующих принципов:
□ личности и взаимодействия важнее процессов и инструментов;
□ правильное и качественное программное обеспечение ценится выше, чем подробная
документация;
□ сотрудничество с клиентом и между членами команды важнее обсуждения контрактных
условий;
Я проектная команда должна реагировать на изменения, а не следовать строгому плану
проекта.
Модель процесса MSF Agile
Модель процесса MSF Agile v4 рассматривает процесс разработки как маршруты,
контрольные точки и результаты работы. Маршрут— это набор действий (некоторые из
них последовательные — рабочие потоки (workstreams), а некоторые — нет).
Контрольные точки— это точки консенсуса, в которых команда совместно изучает
состояние дел и принимает решение: продолжать по плану, изменить план или
остановиться. Результаты работы — это некий осязаемый выходной результат одного
или нескольких действий (это может быть исходный код, документы, электронные
таблицы и т. д.), который генерируется в течение проекта.
Модель MSF Agile также содержит концепцию циклов. Циклы представляют собой частоту
выполнения действий. Например, ежедневное построение является примером цикла,
который влечет за собой целый набор действий (которые в свою очередь дают целый набор
результатов работы).
Модель командной работы MSF Agile
Помимо действий, которые вы ожидаете увидеть внутри SDLC, полезно также понять
взаимодействие между различными ролями проекта программного обеспечения. Модель
коллективной работы MSF Agile представляет команду проекта как набор различных групп.
Потребности каждой группы представлены ее членами, и все члены считаются равноправными.
Все роли одинаково важны. На рис. 22.1 представлена модель командной работы Agile.
MSF for CMMI
Модель Software Engineering Institute's Capability Maturity Model (CMM) — это "эталонная
модель сложившихся в конкретной области практик, используемых для оценки и
улучшения способностей группы работать в данной области" (http://www.sei.cmu.edu). Модель
Capability Maturity Model for Integration (CMMI) является коллекцией четырех СММ для
следующих областей: разработка программного обеспечения, системотехника,
интегрированная разработка продуктов и процессов, работа с поставщиками. MSF v4 for CMMI
(MSFCMMI) — это платформа, непосредственно связанная с этой четырехкомпонентной
моделью CMMI.
882
Часть VI. Система командной работы Visual Studio Team System
Бизнес-аналитик
d
i
(:
i
Менеджер проекта
Управление проектом
Среда пользователя
э
Тестировщик
С
i
Тесты
J
Бизнес-аналитик
С
Управление
продуктом
Э
С
i
Архитектор
Архитектура
J
1
Менеджер
по выпуску
Операции по выпуску
продукта
Ъ
Разработчик
Разработка
Рис. 22.1. Группы и роли в модели командной работы MSF Agile
'Модель процесса MSF for CMMI
Подобно MSF Agile, процесс MSF for CMMI описывается в терминах маршрутов и
контрольных точек. Маршруты в MSFCMMI определены более формально, контрольные точки
также хорошо определены в смысле выдаваемых материалов.
На рис. 22.2 показаны маршруты и контрольные точки модели процесса MSF for CMMI.
Размещение
завершено
Утверждение
готовности версии
Завершение ^
разработки этапа
Утверждение
концепции
Утверждение
планов проекта
Рис. 22.2. Маршруты и контрольные точки MSF for CMMI
глава 22. Командная работа и система командной работы Visual Studio
883
Несмотря на то, что существует много конкурирующих моделей SDLC, все они сводятся к
проектным действиям, соответствующим естественному процессу проекта:
1. Сначала все участники должны договориться о концепции проекта. Чего они хотят
достичь? Как они поймут, достигли они успеха или нет?
2. После того как было достигнуто общее понимание, установлены границы и
документированы цели, команде проекта необходимо договориться о том, что они хотят создать и
как они собираются это создавать.
3. Затем планы приводятся в действие, и для программного приложения создается
архитектура, оно проектируется и пишется.
4. По мере написания различных компонентов системы их необходимо тестировать (для
того чтобы убедиться, что они действительно реализуют требования проекта и
соответствуют требованиям команды проекта к качеству).
5. И наконец, после того как все части написаны, протестированы и утверждены,
приложение развертывается для его использования.
Эти фазы называются соответственно: Envisioning (Концепция), Planning (Планирование),
Developing (Разработка), Stabilizing (Стабилизация), и Deploying (Развертывание). Каждая из
этих фаз имеет свой набор действий, результатов работы и контрольных точек.
Модель командной работы MSF for CMMI
Модель командной работы MSFCMMI в принципе (и по структуре) идентична модели
командной работы MSF Agile, но она определяет и использует большее количество ролей/
Сравните рис. 22.1 и 22.3.
t
i
Менеджер проекта
IPM Officer
Управление проектом
Архитектор UX
Специалист по обучению
пользователей
Среда пользователя
С
Архитектор инфраструктуры
Архитектор решения
Архитектура
Тестировщик
Менеджер
по тестированию
i
Тесты
Менеджер продукта
Аудитор
Бизнес-аналитик
SME
Спонсор
J
с
i
Менеджер
по выпуску
Операции по выпуску
продукта
Управление
продуктом
Инженер сборки
Менеджер разработки
Разработчик
Ведущий разработчик
Разработка
j
Рис. 22.3. Группы и роли в модели коллективной работы MSF for CMMI
884
Часть VI. Система командной работы Visual Studio Team System
Система командной работы Visual Studio
Успех проекта программного обеспечения определяют только три переменных: скорость,
качество и деньги. Иначе говоря, вы можете увеличить успех приложения в том случае, если
изготовите его быстрее, сделаете его лучше, либо потратите меньше денег на его
разработку. Если вы действительно хотите оптимизировать эту тройку "быстрее, лучше, дешевле", то
вам необходимо выйти за рамки роли разработчика и процесса написания кода и начать
обдумывать использование прочих ролей и навыков, которые сложились в жизненном цикле
разработки программного обеспечения. Вам следует также уделить внимание не только фазе
разработки проекта. Вам нужно уделить внимание планированию проекта, начальному
анализу архитектуры, тестовым комплексам и управлению рабочими элементами.
Visual Studio Team System понимает это основное соображение и повышает роль Visual
Studio в процессе разработки программного обеспечения, предоставляя вам целый набор
взаимосвязанных инструментов, которые работают со всеми ролями и стадиями SDLC.
Visual Studio Team System — это название целого набора версий Visual Studio, каждая из
которых предназначена для определенной роли процесса разработки программного
обеспечения. С точки зрения возможностей продукта вы можете представить себе Visual Studio
Team System как (предназначенный для командного использования) расширенный набор
имеющихся версий Visual Studio (таких как Visual Studio Professional или Visual Studio
Standard — см. рис. 22.4).
Ранее мы уже обсудили модели командной работы MSF. Visual Studio Team System
предоставляет инструменты для следующих ролей: архитектора, разработчика, тестера и
менеджера проектов. Это означает, что под нужды архитектора, разработчика и тестера
приспособлены различные продукты: Visual Studio Team Architect, Visual Studio Team Developer и
Visual Studio Team Test. Менеджерам проектов предоставляется набор надстроек, утилит и
отчетных функций, поставляемых вместе с сервером Visual Studio Team Foundation Server.
Этот сервер функционирует в системе командной работы как ключевой компонент
коллективной разработки и хранения. Каждый из этих продуктов предоставляет в знакомой
интегрированной среде специфические для данной роли инструменты.
<•>
Microsoft Vi»uaf Studio Team System
4&
Microsoft Visual Studio Profession*!
Microsoft Visual Studk) Stanford
У5
Microsoft Vinual Studio
Express Editions
Рис. 22.4. Версии Visual Studio
Глава 22. Командная работа и система командной работы Visual Studio
885
Примечание
Помните, что продукты Visual Studio Team System (такие как Architecture Edition)
представляют собой расширенный вариант других версий Visual Studio: версии
VSTS добавляют возможности сверх имеющихся в Visual Studio, Professional. Иначе
говоря: все, что вы можете делать в Visual Studio Professional, вы сможете сделать
и в Visual Studio Team System Architecture Edition (или Development Edition, или Test
Edition и т. д.).
Давайте рассмотрим различные продукты VSTS и их соответствие модели процесса
разработки программного обеспечения.
Visual Studio Team System Architecture Edition
Версия Visual Studio Team System Architecture Edition предназначена для роли архитектора.
Частью работы архитектора является помощь команде разработчиков и команде
менеджеров проекта в плане четкого разъяснения дизайна системы. Дизайн и архитектура системы
обычно визуализируются при помощи моделей; модели являются превосходным способом
конструирования и обдумывания различных аспектов больших систем— и с этой точки
зрения они являются отличным средством документирования. Их историческая проблема
состоит в том, что их трудно перевести в код и необходимо обновлять при каждом
изменении самого кода.
Visual Studio Team System Architecture Edition предоставляет архитектору инструменты,
которые решают эти проблемы. Точнее говоря, четыре визуальных конструктора — Distributed
Application Designer, Logical Infrastructure Designer, Deployment Designer и Class Designer —F
работают совместно для создания динамических моделей программной системы. Помимо
совместной работы, эти конструкторы могут также синхронизироваться с кодом системы.
Вот основные преимущества, имеющиеся в Visual Studio Team Architect:
□ вы можете визуально писать код при помощи конструктора Class Designer;
□ вы можете описывать сетевую инфраструктуру при помощи конструктора Logical
Infrastructure Designer;
□ конструктор Distributed Application Designer позволяет вам создавать архитектуры на
основе сервисов (на базе кода, описанного в конструкторе Class Designer);
□ конструктор Deployment Designer предоставляет вам возможность разворачивать
систему (или подсистему) в указанную среду, которая была описана при помощи
конструктора Logical Infrastructure Designer;
П изменения моделей, произведенные в этих визуальных конструкторах, немедленно
распознаются и синхронизируются в коде.
Мы подробно опишем эти четыре конструктора в главе 27.
Visual Studio Team System Development Edition
Версия Visual Studio Professional делает потрясающую работу как интегрированная среда
разработки; ее редакторы кода и визуальные конструкторы и мощные, и легкие в использо-
886
Часть VI. Система командной работы Visual Studio Team System
вании. Версия Visual Studio Team System Development Edition расширяет роль разработчика
и предоставляет инструменты для проверки кода. При помощи VS Team Developer вы
можете проверить производительность и качество вашего кода. В этой версии есть инструменты
статического и динамического анализа кода, профилирования кода, покрытия кода, а также
средства модульного тестирования.
Статический анализ кода
Статический анализ кода — это проверка исходного кода на стадии проектирования,
которая выходит за пределы возможностей синтаксического контроля компилятора. Расширим
эту аналогию: если проверка компилятора аналогична проверке правописания текстового
процессора, то статический анализ кода аналогичен проверке грамматики: он пытается
определить смысл вашего кода, а затем указать проблемные области.
Анализ кода производится при сборке/компиляции; аналитическими проверками можно
управлять на вкладке Code Analysis диалогового окна свойств проекта (рис. 22.5).
^Ile^wll
file £dtt i«ew Ercject Soild Телш E*cug Data Icols Test Ацвгухе ^ndow fcieip
Л - ~J * J я! ** ' ' *1 ' * Debug • Any CPU
** UtwafeHfLRecrutL_ndicatH>n.Contr»ct ■»■ X
Application
Build
BliIcI f *enti
Debug
Resources
Ser\ ices
Settirgs
Reference Path*
Signing
Code Aw/su
£onf.gjration j-Actrve tGetaig) ▼
FiBt*crr: ^Actsve (Any CP-J) ▼
P
it
♦
t
MVbp,<-^ IU«W > W..I „W.».I«4.W 4W«k
jles EneS ей Duftng Cotle Analysis
[■/ Clofcasizatior. Rj.es
'■/ Interoperability Rules
\<f Maint?»nab . ty Roles
J Мое ' ty Rjle»
</, Naming Rtiies
J Performance RUe:
jv> Portsb! ty Rules
• Reliaaili^/*ules
V Sectrit, Rules
\<f Usage Pules
I if »• 2 X
f >~
i *»'*
jticn LitwareHP «22 £ '
LrLvare WeS5 *e
LiNvareHRAjthentcE
ЬглзгеНР ,-uthc lati
LitvareHP Pcrtfcvic С
Lrt.vaieHRPc-tfc ic 5
LrKvareHR Pctfc <c S
U*areHF Pc-tfr ic S
Lit.vareHP Pctfc ic J :*
LrLvareHRPr.ateApp
Lrt>vaieHRPfivatt«pf:
LrU-areHP Рос cupp
LibvareHP Plb! cApp
LrhvareHP Recru:ip
LiUvareHRPrcrut ig.
LrtvvareHRPtcFLtng
Л P'cpeitses
^ References
%\ IPecrvi tingPcuSer
£] IPscrinthgSsndir;
£) Posit en ci
Д'мгН «*> .JJSolutoiE
Ready
Рис. 22.5. Управление опциями анализа кода
Динамический анализ кода и профилирование кода
Точно так же, как статический анализ кода работает на стадии проектирования,
динамический анализ кода работает с вашим кодом на этапе выполнения. При профилировании ваш
код анализируется для того, чтобы предоставить вам информацию о выполнении вашего
приложения. Имеются два профилировщика кода. Выборочный профилировщик опра-
Глава 22. Командная работа и система командной работы Visual Studio
887
шивает ваше приложение и получает информацию о нем. Инструментирующий
профилировщик вставляет зонды в ваш код на этапе компиляции; эти зонды выдают данные,
которые собираются профилировщиком.
Метрики кода
Метрики кода (Code Metrics) являются способом генерирования объективной статистики о
вашем коде. В версии VSTS Development Edition инструмент Code Metrics используется для
создания представления о степени сложности кода и удобстве его сопровождения. Вот
некоторые из имеющихся в Code Metrics показателей:
□ Maintainability Index (Индекс сопровождения)— значение (от 0 до 100), которое
характеризует легкость сопровождения вашего кода; чем выше это число, тем легче ваш
код в сопровождении;
□ Cyclomatic Complexity (Цикломатическая сложность) — значение, определяющее
структурную сложность вашего кода. Оно выводится при помощи изучения количества
различных возможных маршрутов прохождения кода в программе;
□ Depth of Inheritance (Глубина наследования)— значение вычисляется при помощи
подсчета для каждого класса его относительной глубины от корня вашей иерархии
классов;
□ Class Coupling (Сцепление классов)— число для определения относительной связи,
которая существует в приложении (обычно стремятся к низкой степени сцепления);
□ Lines of Code (Количество строк кода) — количество строк выполняемого кода в при-'
ложении.
Покрытие кода и модульное тестирование
Покрытие кода и модульное тестирование работают сообща. Модульное тестирование
производится при помощи инфраструктуры на основе атрибутов (аналогичной используемой в
инструментах JUnit и NUnit; возможно, вы знакомы с ними).
После создания теста вы можете использовать средства тестирования для того, чтобы
определить, какие строки кода были фактически пройдены тестом. Это делается интерактивно в
окне редактора кода (протестированные строки имеют зеленый фон, пропущенные —
красный) и в окне результатов Code Coverage Results. Создание модульных тестов и проектов
тестов поддерживается и в Visual Studio 2008 Professional, но VSTS Test Edition
предоставляет следующие дополнительные возможности:
□ создание модульных Web-тестов, модульных тестов баз данных, ручных модульных
тестов и модульных тестов нагрузки;
□ удаленное выполнение тестов;
□ управление связанными с тестом рабочими элементами.
Кроме того, покрытие кода анализируется только в VSTS.
888 Часть VI. Система командной работы Visual Studio Team System
Visual Studio Team System Test Edition
Версия Visual Studio Team System Test Edition продолжает тестирование с той точки, где
остановилась версия Development Edition. В дополнение к профилированию, модульному
тестированию и инструментам покрытия кода данная версия имеет инструменты для
тестирования нагрузки Web-приложений, выполнения и анализа модульных тестов, а также
управления тестовыми случаями.
Создание тестов
В VSTS Test Edition вы можете создать следующие типы тестов:
□ Unit Tests (модульные тесты) — это те же самые модульные тесты, которые
поддерживаются и в версии VSTS Development Edition;
□ Web Tests (Web-тесты) — это последовательности HTTP-запросов для проверки
функциональности Web-приложений; они могут быть использованы в тестах
производительности или для тестирования в предельных режимах;
□ Load Tests (тесты нагрузки) — используются для имитации трафика Web-сайта (см. еле-
дующий раздел)',
П Manual Tests (ручные тесты)— некоторые тесты невозможно автоматизировать или
написать для них скрипты (такие как взаимодействие пользователя с пользовательским
интерфейсом приложения). В этих случаях можно создать ручной тест. Ручные тесты в
VSTS — это документы Word, в которых описаны отдельные задачи, составляющие
тест. Несмотря на то, что тесты ручные, при помощи фиксирования в документе
последовательности задач и их результатов вы можете управлять тестом и просматривать его
точно так же, как и остальные тесты в системе;
□ Generic Tests (обычные тесты) — это просто оболочки для любых других тестов,
которые возвращают только результат: пройден тест или нет. Такой тип теста полезен как
механизм расширения, поскольку он позволяет вам использовать тесты, не
предусмотренные встроенными типами тестов VSTS;
□ Ordered Tests (упорядоченные тесты) — аналогичны обобщенным тестам. Это оболочки
для серий других тестов, которые должны выполняться последовательно.
Тесты нагрузки
Тесты нагрузки являются в определенном отношении уникальными: VSTS может создать
логический тестовый блок под названием стенд (rig). Стенды — это клиентские
компьютеры (называемые агентами) и контроллер для генерирования нагрузки на систему. В Visual
Studio Team Test имеются все возможности управления для создания агентов, присваивания
их контроллеру, инкапсулирования группы агентов и контроллера в единый стенд, а также
для выполнения тестов на стенде и наблюдения за ними.
Управление тестами осуществляется при помощи редактора Test List Editor (рис. 22.6).
Мы описываем тесты нагрузки в главе 28.
Глава 22. Командная работа и система командной работы Visual Studio
889
<.#> LitwareHS - Miaoso1* Visual Studio
File £drt view Project fiuiid Тевгц Qebug Oita Jools Test Analyze Window Help
J3* „J • .J" -> У «. v * ' ► Debug * Any CPU
j 4 *> м ^ з is n r} ii * * *
У Test Lbt Editor ~ x
\% -, ' " ^ j3 *ll *И > Group Bys [None] » [AlKclumf » <Type keyword* » _J
jfV
i v , \> Item's) checked, д
j - ^ Lists of Tests Test Name Project
£ DitabeseUnitTett» '
5^1 Tests Not in a L st
i ^ All Loaded Tests i
i i
• j
i j
1 .
i !
j
j
\
1
|
i
Ready
^ >Ь»п*Г|
' Л ^|
Scln зп E <р!счг • Set. » 2 x j
' T
~ &3 Lrt^vareHR Recruit га ^
i Ъш Properties ]
•» ^ Reference: j
& ^j IReciuil igPovSe^.
Ji^j IPecruit ngSyndic*
ii *^ Position cs 1
| ч «J3 LrtA-areHR Recruit rg
! i йГ$ .-itwareHP Recruit г 9
4 s*3 Shp.Runtiroe.Contra. j
('•» #T3 ^P Pontine Serx'icrB |
■» «C?J S*ic Runtine Services
i Лч j3 She Secur.t, Brokered
i &ji Shp Security Siolce'ed
- <У 'J, TestProjectl
; \ ал Properties
1 - ~j References
-L3 Microsoft Vis^ ]
■ О Microsoft Vis- j
| *Л System
1 -J System Ccfig *
_7xkjn-i'^ „^Solution E
Рис. 22.6. Редактор Test List Editor
Visual Studio
Team System Database Edition
Версия Visual Studio Team System Database Edition стремится ввести разработчиков данных
и администраторов баз данных в жизненный цикл разработки программного обеспечения —
для этого она предоставляет инструменты, которые обращаются с объектами баз данных
точно так же, как и с другими объектами проекта. Например, при помощи VSTS Database
Edition вы можете поместить объекты базы данных в систему управления исходными
кодами, а также тестировать хранимые процедуры. В следующих подразделах описаны основные
наборы инструментов, поставляемые вместе с VSTS Database Edition.
Модульный тест
Модульное тестирование так же важно для баз данных, как и для приложений. Вам
захочется убедиться в том, что интерфейс прикладного программирования вашей базы данных
(состоящий из хранимых процедур, триггеров и функций), структуры данных (таблицы и
представления), а также система безопасности на уровне таблиц и пользователей способны
пройти функциональное тестирование модульными тестами. Модульные тесты для объектов
баз данных обрабатываются точно так же, как и любые другие модульные тесты Visual
Studio Team System, а это в свою очередь означает, что их можно включить в любой
тестовый набор.
890
Часть VI. Система командной работы Visual Studio Team System
Редактор T-SQL
Редактор T-SQL добавляет дополнительные возможности сверх стандартного визуального
конструктора SQL в Visual Studio, в том числе: поддержку многопоточного выполнения
хранимых процедур, улучшенную обработку и отображение результирующих наборов
данных, а также улучшенную среду разработчика (с синтаксической подсветкой, выбором
языка скриптов и статистикой запросов).
Проекты баз данных
Разработчики данных могут написать в новом проекте базы данных скрипт схемы базы
данных и метаданных и поместить их в систему управления версиями. Это позволяет членам
команды работать с определениями базы данных в-автономном режиме (например, без
прямого подключения к производственному или тестовому серверу SQL) — это большое
преимущество, которое позволяет командам разрабатывать и тестировать, изменения схемы
перед тем, как зафиксировать их на сервере.
Изменения схемы и данных
VSTS Database Edition имеет инструмент для сравнения схемы и данных. Он позволяет вам
моментально разглядеть специфические различия между двумя разными версиями схемы
базы данных или набора данных.
Мы обсуждаем версию Database Edition в главе 29.
Сервер Team Foundation Server
Все командные продукты могут работать самостоятельно, но добавление сервера Team
Foundation Server (TFS) позволяет всей команде совместно работать над действиями и
маршрутами. Он даже имеет собственный набор перспективных технологий. TFS служит всем
ролям, однако роль менеджера проекта поддерживается только инструментами,
поставляющимися вместе с Team Foundation Server.
Примечание
Для Team Foundation Server необходим сервер Microsoft SQL Server 2005.
Система управления исходным кодом
Сервер Team Foundation Server содержит совершенно новый движок системы управления
исходным кодом, который (при использовании для больших команд разработчиков)
значительно превосходит возможности Visual Source Safe. Система управления исходными
кодами TFS использует в качестве хранилища- SQL Server 2005 (вместо файловой системы) и
легко масштабируется для самых больших команд разработчиков. Кроме родной поддержки
доступа по HTTP/HTTPS, система управления исходным кодом TFS поддерживает также
политики возврата и откладывание изменений.
□ Политики возврата (check-in policies)— позволяют вам добавлять правила, которые
обрабатываются при возврате для проверки выполнения процедур и лучших практик.
Глава 22. Командная работа и система командной работы Visual Studio 891
Пример — политика возврата, которая требует от статического анализатора кода
предъявления сертификата для разрешения возврата.
□ Откладывание (shelving) — это способ возврата файла в набор отложенных изменений
(вместо размещения его в дереве исходных кодов). Это позволяет вам вернуть рабочий
материал без перезаписывания того рабочего материала, который находится в главной
ветви исходных кодов вашего проекта.
Примечание
Несмотря на то, что большинство пользователей будет работать с системой
управления исходными кодами TFS при помощи Visual Studio, она поставляется с
самостоятельным пользовательским интерфейсом, который обеспечивает функциональность
на уровне администратора и сотрудника (для тех клиентов, у которых нет Visual Studio
Team System).
Управление исходными кодами описывается в главе 24.
Отслеживание элементарных работ
Элементарная работа — это атомарный модуль в VSTS для отслеживания и управления
действиями и результатами работы (в контексте проекта). Элементарная работа может быть
назначена любой роли команды проекта и определенному рабочему процессу. Элементарная
работа хороша тем, что она может быть связана со множеством элементов, при этом
создается сеть из связанных результатов работы. Например, вы можете создать элементарную
работу для отчета об ошибке, а затем привязать этот отчет об ошибке к возвращенному
файлу исходного кода, разработчику, тестеру и тестовому случаю (который выявил эту
ошибку).
Вместе с сервером Team Foundation Server поставляется целый набор надстроек Microsoft
Office, который позволяет менеджерам проекта привязываться к элементарным работам из
Office. Например, менеджер проекта может использовать надстройку Microsoft Word для
генерирования отчета о состоянии, который будет непосредственно связан с элементарными
работами в базе данных TFS. Либо менеджер проекта может использовать надстройку
Microsoft Project для автоматического генерирования и синхронизации элементарных работ
с элементами действий плана (в файле Microsoft Project).
Несмотря на простоту концепции, элементарные работы являются самым важным
элементом сотрудничества в VSTS. Рассмотрим такой сценарий: вам назначена элементарная
работа исправления ошибки в вашем коде. Сначала вы просматриваете элементарную работу,
затем проверяете проблемный код, делаете исправления, а потом используете инструменты
разработки/тестирования VSTS для автоматического выполнения тех тестов, которые
покрывают этот блок кода. После этого вы можете вернуть измененный код в хранилище
исходных кодов. Затем наступает очередь команды тестеров. Когда исправление попадает в
построение, то это построение также связывается с данной элементарной работой. Все это
время всем заинтересованным сторонам рассылаются уведомления, чтобы они могли
следить за продвижением элементарной работы по ее рабочему процессу.
Мы рассматриваем элементарную работу в главе 25.
892
Часть VI. Система командной работы Visual Studio Team System
Автоматизация построения
Частью Team Foundation Server является Team Foundation Build. Она позволяет тем ролям,
которые управляют выпуском версий: прогонять тесты кодовой базы, делать построение
кодовой базы, делать выпуск версии кодовой базы на файловый сервер, а также
генерировать отчеты по построению и распространять их между членами команды*
Team Foundation Build — это инструмент с графическим пользовательским интерфейсом,
который является надстройкой над инструментом MSBuild. В главе 30 имеются все
подробности по использованию функциональных возможностей автоматизации построений TFS.
Отчеты
Поскольку все элементарные работы и результаты работы VSTS хранятся в базе данных
SQL Server 2005, то TFS может использовать сервисы SQL Server 2005 Reporting Services и
SQL Server 2005 Analysis Services для составления отчетов по качеству построений,
продвижению элементарных работ, результатам тестов, результатам построений и т. д.
Портал проекта
Сервер Team Foundation Server использует шаблон проекта для создания сайта Windows
SharePoint, содержащего библиотеки документов и шаблоны документов, которые
соответствуют выбранному типу проекта. Например, создание проекта на основе шаблона MSF
Agile приведет к созданию сайта SharePoint с шаблонами документов, сгенерированными
именно для этого процесса.
Использование сайта SharePoint в качестве универсального портала позволяет даже тем
участникам проекта, у которых нет Visual Studio, взаимодействовать с элементарными
работами VSTS и участвовать в совместной работе над проектом.
Резюме
Visual Studio Team System сфокусирована на реализации всех маршрутов жизненного цикла
разработки программного обеспечения (а не только маршрута разработки). Ключевым
элементом является целостный подход к управлению продвижением программного
обеспечения по его жизненному циклу. VSTS добавляет охват средой Visual Studio и других ролей
жизненного цикла программного обеспечения, таких как: архитектор, бизнес-аналитик,
тестер качества, управленец проекта. При этом VSTS преследует следующие цели:
П избегать незапланированного разрастания объема разработки;
□ улучшить обмен информацией;
□ минимизировать дублирования;
□ оптимизировать ресурсы;
□ упростить процесс разработки;
Глава 22. Командная работа и система командной работы Visual Studio 893
□ управлять рисками и снижать их;
□ облегчить "посмертный" анализ и использование лучших практик.
В этой главе вы узнали, что VSTS является набором различных версий Visual Studio, каждая
из которых предназначена для своей роли. Эти версии Visual Studio доступны по
отдельности, а также пакетом, который называется Visual Studio Team Suite. Имеется также
серверный компонент, который называется Team Foundation Server и находится в центре системы
развертывания VSTS. Поскольку все эти инструменты работают совместно комплексным
образом, то Visual Studio Team System поддерживает различные типы рабочих действий,
начиная от архитектуры и разработки — и до тестирования (а также и управление
элементарными работами, связанными с каждым из этих типов действий).
В следующих главах мы рассмотрим отдельные инструменты Visual Studio Team System и
увидим, как их можно использовать в команде разработчиков.
Глава 23
Управление командными проектами
и работа с ними
В предыдущей главе были описаны инструменты, поставляемые вместе с системой
командной работы Visual Studio Team System. Теперь пришло время рассмотреть специфику
сервера Team Foundation Server.
Сервер Team Foundation Server является центральным ядром коллективной работы в среде
Visual Studio Team System: Visual Studio обеспечивает специфические инструменты для
каждой роли — архитектора, разработчика, тестировщика и менеджера, а сервер Team
Foundation Server предоставляет центральное хранилище и сервисы совместного использования
информации, необходимые для связывания команды проекта в единое целое. В этой главе
мы сосредоточимся на настройке сервера Team Foundation Server и использовании его
возможностей по обеспечению командной работы.
Анатомия сервера
Team Foundation Server
Как уже обсуждалось в главе 22, сервер Team Foundation Server (TFS) служит центральным
ядром коллективной работы в среде Visual Studio Team System. Именно TFS реализует
систему управления исходными кодами, отслеживание элементарных работ, проектные
извещения, а также массу прочих функций коллективной работы.
Вы можете представлять себе TFS как набор Web-сервисов, работающих с хранилищем
данных. Физически это означает, что функциональность TFS предоставляется через Web-
сервисы Windows IIS, а хранение данных, анализ и сервисы отчетности обеспечиваются
SQL Server 2005. Эти две части TFS называются уровнем приложения и уровнем данных.
Эти уровни — логические и могут физически соответствовать одному или нескольким
серверам. Некоторые организации размещают оба этих уровня на одном сервере; другие
размещают уровень приложения на Web-ферме, а уровень данных — на нескольких
инсталляциях SQL Server.
Глава 23. Управление командными проектами и работа с ними
895
Примечание
Решение о размещении TFS обусловлено инфраструктурой и специфическими
потребностями вашей организации. Сервер Team Foundation Server поставляется с
обширными инструкциями по инсталляции, которые необходимо тщательно изучить
перед тем, как определить наилучшую в смысле инфраструктуры конфигурацию.
Уровень приложения
Уровень приложения состоит из набора Web-сервисов (работающих под ASP.NET/Microsoft
Internet Information Services), которые обеспечивают систему управления исходными
кодами, отслеживание элементарных работ, отчетность и основные функции TFS. На рис. 23.1
показана общая структура сервера-приложения TFS.
Сервер Team Foundation Server (уровень приложения)
Web-сервисы
ig
о.
О)
О
о.
ш
О
S S
х 2
Q) га
5 «=£
m о
Ш S
2 i
Ц
8
£ 5
2 га
5 ci
ш о
га *
И
i
О s
Портальные
Web-сайты
М
Q.
О
U
Sharepoint
Internet Information Services
N
Сервисы
Windows
о «j
i |
OL d
О) Ш
О о
Microsoft Windows Server 2003
Рис. 23.1. Сервер Team Foundation Server приложение
Web-сервисы на уровне приложения работают как упаковщики для интерфейса прикладного
программирования TFS, который обеспечивает реальную функциональность TFS. Эти
сервисы находятся в виртуальных каталогах Web-сайта Team Foundation Server. На рис. 23.2
показаны эти каталоги Web-сервисов внутри программы IIS Manager.
Внутри каждого каталога сервиса имеются одна или несколько конечных точек Web-сервиса.
Список дан в табл. 23.1.
Таблица 23.1. Web-сервисы уровня приложения
Каталог
сервиса
Web-сервисы
Build Services
BuildController, BuildStore, Integration, PublishTestResultsBuildService
896
Часть VI. Система командной работы Visual Studio Team System
Таблица 23.1 (окончание)
Каталог
сервиса
Core Services
Warehouse
Version Control
Work Item Tracking
Web-сервисы
EventService, Authorization Service, CommonStructureService, GroupSecuri-
tyService, ProcessTemplate, ProjectMaintenance, Registration, ServerStatus
WarehouseController
Administration, Integration, ProxyStatistics, Repository
ClientService, ConfigurationSettingsService.ExtemalServices, Integration,
SyncEventsListener
1 ж Intrmrt Intarmatjan services i lib) Гt*»*a*r
r§ $te &**»■» $trf &гкк>* tfftif*
Ш^
*i*(t)ffl><tfiei&l$8B|&l>*i»
1 )?& Interret Information Serv ces
I '+' „; Appl cation s>oos
1 i-, j, Websites
„ti Л Ce'i-tt Wee Site
I +1 Ж SharePomt Central Adn*-istr*von ,3
j '-] fg ЕЕЯЭ5ЙЕЗЯЕЖЯ
1 + ф Services
j ♦ Oi /ersioiContrd
I * "«& ,«Vor*ite'"Tijckrg
j „t j »sonet_dent
1 „., »Veb Service Extensors
Я: «^ Ctreuit SMT* VTtia Server
_.
toame
•^/Euld
•^Servxes
l£>»e»s«nConlrol
^Wsreiaute
^WciKte-TraJTsg
J a*jnet_dte"it
Web Coifig
♦1
|P»tr>
С 'Piogram = l±sV",'C-osost I
С ^Program =-iesY-*ico«o*t 4
С iPiocrwn^WcosonV
С VrcflramPlesMcrTfot I
С 'frogrwn Ples'fcrosoV'j
1 jeJ
_ Г
Рис. 23.1. Web-сервисы сервера Team Foundation Server
Совет
Обычно вам не приходится беспокоиться о Web-сервисах TFS. Они работают как API
сервера, который используется различными инструментами TFS (такими как Team
Explorer). Однако если вы хотите расширить функциональность TFS, то именно с них и
нужно начинать. Документация по Web-сервисам фрагментарная, но некоторую
информацию по расширению TFS и интеграции с ним вы можете найти в Visual Studio
2008 SDK (см. http://msdn.microsoft.com/vstudio/extend/default.aspx). Вы можете
также получить некоторое представление о Web-сервисе посредством его вызова из
вашего браузера. При этом вы получите краткое описание сервиса и список
поддерживаемых им методов.
В дополнение к этим Web-сервисам на серверах уровня приложения развертывается и
работает также сервис Windows — это сервис планировщика задач. Этот сервис (который
выполняется под именем TfsServerScheduler) является сервисом для планирования различных
задач TFS. Например, система построений VSTS использует этот сервис для планирования
построений.
Глава 23. Управление командными проектами и работа с ними
897
Примечание
Team Foundation Build — это серверное приложение, предназначенное для
выполнения автоматических построений программного обеспечения и управления ими. Оно
использует собственный сервис Team Build Service, который работает независимо от
планировщика заданий. Сервис Team Build Service можно развернуть на сервере
уровня приложения (но это не обязательно). Он может быть также развернут на
клиенте или на отдельном сервере.
Уровень данных
Уровень данных — это по существу компьютер с сервером SQL Server 2005. Он служит
хранилищем данных для TFS и обеспечивает аналитические сервисы и сервисы отчетности,
которые непосредственно используются сервером TFS (рис. 23.3).
п
Хранилище
данных
Журналирование
действий
Сервер Team Foundation Server (уровень данных)
СЗ СЗ Q
Сборка
Интеграция
I mtff" ^*- ■■■л^
^
Управление Отслеживание Приложения к
исходными кодами элементарных работ элементарным работам
Microsoft SQL Server 2005
Файловая система
^SZ
N
Microsoft Windows Server 2003
Рис. 23.3. Сервер Team Foundation Server: уровень данных
Физически TFS хранит свои данные в семи базах данных:
□ база данных журнала действий (TfsActivityLogging);
□ база данных построений (TfsBuild), которая содержит данные, имеющие отношение к
построениям системы (такие как шаги построения и показатели качества построения);
898
Часть VI. Система командной работы Visual Studio Team System
□ база данных интеграции (Tfslntegration), которая хранит основную информацию о
командном проекте, настройки безопасности и регистрацию событий;
□ база данных системы управления версиями (TfsVersionControl);
□ база данных хранилища (TfsWarehouse), которая служит хранилищем для анализа и
отчетности;
□ база данных элементарных работ (TfsWorkltemTracking), которая хранит элементарные
работы;
□ база данных приложений к элементарным работам (TfsWorkltemTrackingAttachments), в
которой имеется единственная таблица Attachments, служащая коллекцией указателей
на файлы приложений к элементарным работам.
Приложения к элементарным работам хранятся в файловой системе.
Важно отметить, что связь между TFS и SQL Server очень тесная: TFS использует SQL
Server Analysis Services и SQL Server Reporting Services для нужд своей отчетности.
Безопасность
Для реализации системы безопасности сервер TFS использует традиционную и хорошо
изученную модель пользователей и групп. Существуют две широких категории пользователей:
администраторы сервера и члены проекта. Администраторы сервера отвечают за
администрирование всех компонентов TFS (начиная от конфигурации Web-сервисов в I IS и
заканчивая настройкой баз данных в SQL Server). Члены проекта — это те пользователи, которые
составляют команду проекта. Несмотря на то, что эти две широкие категории могут
перекрываться и ничто не мешает совмещать обязанности администратора сервера с
обязанностями менеджера проекта, при инсталляции сервера TFS по умолчанию эти обязанности
обеспечиваются членством в разных группах.
Глобальные группы безопасности
Глобальные группы безопасности — это универсальные группы верхнего уровня, которые
организуют для пользователей наборы разрешений администратора или пользователя:
группа Team Foundation Administrators имеет полные права на все элементы TFS, а группа Team
Foundation Valid Users содержит пользователей, которые имеют доступ к ресурсам Team
Foundation Server.
Группа Team Foundation Valid Users на уровне проекта подразделяется на группы
безопасности проекта.
Группы безопасности проекта
Для каждого отдельного проекта TFS определяет разрешения и уровни доступа при помощи
классификации пользователей в три группы: администраторы проекта, сотрудники и
читатели. Эти группы имеют убывающий по отношению друг к другу уровень привилегий
(рис. 23.4).
Глава 23. Управление командными проектами и работа с ними
899
Администраторы"
проекта
Сотрудники
Читатели
Рис. 23.4. Роли безопасности Team Foundation Server
□ Project Administrators (администраторы проекта). Администраторы проекта имеют
полномочия управлять проектами. Они управляют контентом на портальных сайтах
проекта, определяют членство команд, устанавливают параметры безопасности и имеют
полный контроль над элементарными работами проекта.
□ Contributors (сотрудники). Сотрудники представляют основную часть членов команды;
это те, кто отвечает за осуществление проекта и поэтому наделены полномочиями
добавлять, редактировать и удалять элементарные работы данного проекта. Они могут
также просматривать информацию, которая опубликована на портальном сайте проекта.
□ Readers (читатели). Читатели — это те, кто имеет законный интерес к результатам
проекта (однако они не вносят в него своего вклада). У них есть полномочия только на
просмотр, и в основном они взаимодействуют с проектными данными через портальный
сайт проекта.
Проецирование ролей на группы
В главе 22 мы описали две поддерживаемые модели проектного процесса. TFS использует
шаблоны процессов для описания того, как физически реализовать конкретный процесс при
помощи компонентов TFS и Visual Studio Team System. В следующем разделе мы более
подробно опишем шаблоны процессов. Однако их важно упомянуть именно здесь,
поскольку одной из областей шаблона процесса является безопасность. Шаблон берет описанные в
процессе роли и проецирует их на группы безопасности TFS. В табл. 23.2 показано, как роли
MSF Agile и MSF CMMI проецируются на три группы уровня проекта (используемые
подсистемой безопасности TFS).
Таблица 23.2. Роли MSF и группы безопасности TFS
Роль
Группа
Роли MSF Agile
Architect
Business Analyst
Developer
Project Manager
Contributor
Contributor
Contributor
Project Administrator
900
Часть VI. Система командной работы Visual Studio Team System
Таблица 23.2 (окончание)
Роль
Группа
Роли MSF Agile
Release Manager
Tester
Project Administrator
Contributor
Роли MSF for CMMI |
Auditor
Build Engineer
Business Analyst
Developer
Development Manager
Infrastructure Architect
IPM Officer
Lead Developer
Product Manager
Project Manager
Release Manager
Solution Architect
Sponsor
Subject Matter Expert
Test Manager
Tester
User Education Architect
User Experience Specialist
Contributor
Project Administrator
Contributor
Contributor
Project Administrator
Contributor
Contributor
Project Administrator
Contributor
Project Administrator
Project Administrator
Contributor
Reader
Reader
Project Administrator
Contributor
Contributor
Contributor
Управление командным проектом
Теперь, когда у вас уже есть неплохое понимание сервера TFS с точки зрения его
архитектуры, вы уже готовы к тому, чтобы увидеть, как вы можете создать в TFS командный
проект и обеспечить его хостинг на сервере. Термин "командный проект" используется для
того, чтобы отличить проект совместной работы на базе TFS от проекта Visual Studio.
Первым шагом необходимо инсталлировать клиентское программное обеспечение TFS; оно
имеется на инсталляционном дистрибутиве TFS. После установки этого программного
обеспечения на вашем компьютере в Visual Studio появляются некоторые добавления для ее
взаимодействия с сервером TFS: новый пункт меню Tools позволяет вам подключиться к
. серверу TFS, в меню Visual Studio добавляется новый пункт Team, а в меню File появляются
Глава 23. Управление командными проектами и работа с ними
901
новые команды. Мы вернемся к меню Team чуть позже. Кроме этих улучшений Visual
Studio, инсталлируются также различные надстройки Microsoft Office; они позволяют вам ,
пользоваться определенными возможностями TFS (такими как отслеживание элементарных
работ) в приложениях Microsoft Word, Microsoft Excel и даже Microsoft Project.
Создание нового командного проекта
Создание нового командного проекта происходит так же, как и создание нового проекта
Visual Studio: в меню File | New | Team Project. Запустится мастер New Team Project Wizard.
Примечание
Если вы не видите в меню File среды Visual Studio пункта Team Project, то у вас,
вероятно, не инсталлировано клиентское программное обеспечение для Team
Foundation Server. Еще одной причиной могут быть ваши настройки среды Visual Studio. Эти
настройки влияют на структуру вашего меню File. Например, если у вас загружен
профиль Visual Basic Development settings, то пункт New Team Project будет
размещен непосредственно в меню File (а не в подменю New). Вы можете изменить
настройки среды при помощи мастера импорта и экспорта настроек Import and Export
Settings Wizard (доступ к которому можно получить через Tools | Import and Export
Settings).
Мастер соберет всю необходимую информацию для создания различных структур TFS,
которые используются командным проектом (включая базы данных и Web-сайты).
Выбор названия командного проекта
На первой странице мастера (рис. 23.5) вы получите запрос названия для командного проекта.
New Team P>o}ect or 192 163&2
ТГ
fj
Specify the Team Project Settings
The New Team Prej*ct Wizard uses the team project name you type nere when creating variow
components ,n Viijai Stud с Team System. After the teem project в created, the name »wed
by team membeitto locate the team pf eject in Team System Se sure the name >ol pick a
unique and not already in use on:
- Team Fouiaaticr» Server
- Vrf'indowi SharePoint Se'vices
♦ 5QI Server Reporting Services
What b the name ©f the team project?
eBanl ing
&t*t>
Рис. 23.5. Выбор названия проекта
902
Часть VI. Система командной работы Visual Studio Team System
Помните, что выбранное здесь название будет (в различных формах) встраиваться во
многие структуры TFS — начиная от имен баз данных и заканчивая Web-сайтами SharePoint.
Поэтому вам необходимо выбрать такое название, которое не конфликтует ни с какими
текущими проектами, размещенными на целевом сервере TFS.
Выбор шаблона процесса
На второй странице мастера (рис. 23.6) вас попросят указать шаблон процесса. Как мы уже
упоминали, по умолчанию здесь есть шаблоны MSF Agile и MSF for CMMI.
Ваш выбор шаблона будет определяющим для многих поведений среды Team System.
Например, элементарные работы по умолчанию, документы и командные роли — все это
заполняется при старте нового командного проекта на основе информации из шаблона
процесса.
New Team P'oject or 192 16S 02
? {88&1Щ|
3$
Select a Process Template
Tie p'cct>s template define* key aspects c( ho* the team project is managed The prcce:s
terrplate may incude\*crk tem types, wcik piodticts, report: queries, anc1 orcceis gu force
fcryourtearrt project
Which process lempiate should be used to create the team project?
MSF for Agile Sof twart Development - A 2 •»
Pownlogrf afl jtfcapi Pracc» Templates °nhr«
The following jjescr.bes 1че process template in mce oetail
Choose the MSF for Agile ScftAare Development process ?c' projects with shcit 1 f ecyclei -
and deiivery-oriented teams «vho can *o^ **rthaut .ot» of intermediate documentation
M$F fcr Agile Sc*tA-ate Development is an iterative, scenario-driven develcpmert r'ecess
for euidirg NET, Wei», Лес Serv.-e, ard cthe» object-oriented applications.!? d.rect>y
incorporates practices for handling quality of service reqwementssuch as peifo?rrance
and security jt .ties a context-criven approach (context-based; to determine howtc
operate tie p'oject, eip'icilty calls out project r si n t success criteria for the optimal
oeiK ery of $c*taare, and incorporates ail ci the traditional sof»-<A*re development ro as sucn
as the busmes: analyst, Reject marsger, architect, developer, tester and release manager ,.
< £re«fic<.is
finish
Рис. 23.6. Выбор шаблона процесса
Название портала проекта
Следующая страница используется для указания имени Web-сайта портала проекта
(рис. 23.7). Портал проекта— это Web-сайт SharePoint Services, который должен быть
единым центром материалов командного проекта— начиная от стандартных элементарных
работ и документов и заканчивая объявлениями, ссылками и справочной информацией по
процессу.
Название портала по умолчанию совпадает с названием проекта, которое вы указали на
начальной странице мастера; вы можете его изменить на что-либо другое (помня, однако, что
портал проекта имеет более широкую и разнородную аудиторию, чем остальные элементы
командного проекта). *
Глава 23. Управление командными проектами и работа с ними
903
, New Teen '-»o>ect сг 132 16S '->
* Т jffjffi£>S$3fa
fi
Specify tKe Settings for the Project Portal
The wcard uiest'te rame and etiuiptior you Ivpe here «.hen t»eat ng the teem p'c e.v portal
ir vV nc ov»s She «Port Set\ ces Aithotjh the default «-«tie is *he Sfcote tame >cu r, вес fc tie
teann project jot, car t%pea Jtfferent tit's that w4 appeal for the team p-cject portel cr»r>
What is the title of the team project porta»?
<r В anting
What is the description of the team project portaP
eEanknjTeenFcrtal
Team project porta) site address:
h'tp/'tf$rtmC8 Ster,e6*nkiP3
* £<evicus
&txl >
finish
Рис. 23.7. Название портала проекта
Настройки системы управления исходными кодами
Страница настроек системы управления исходными кодами (рис. 23.8) позволяет вам
управлять тем, как этот новый проект должен быть настроен в отношении его хранилища
исходных кодов. Вы можете: создать новый каталог в корневом дереве системы управления ис1
ходными кодами: создать новую ветвь под уже существующим каталогом системы
управления исходными кодами; отложить создание системы управления исходными кодами
до более позднего момента времени.
Hew lean P-oject or 192 26S 0 2
J J Specify Source Control Settings
1 -
Create an e.T>Fty sc-jrce control folder
WBar-K.ng
« C'eetea ne<v scurre cental bran:h
9ratnch frorr.
S- «Bunkipgi
£c rot ceate a :=t,rce contrc 'c der it this time
< fc'ewcus ^e<t >
| Finish
' 'ii \&%&т
V
Can ее
Рис. 23.8. Настройки системы управления исходными кодами
904
Часть VI. Система командной работы Visual Studio Team System
Подтверждение ваших настроек
Теперь мастер покажет вам страницу подтверждения выбранных вами настроек. Нажатие
кнопки Finish запустит процесс генерирования проекта на сервере. Страница степени
выполнения покажет вам, какой процесс в данное время выполняется. После того как все будет
создано, последняя страница уведомления (рис. 23.9) подтвердит, что командный проект
был создан, и предложит вам просмотреть руководство по процессу проекта (более
подробно об этой странице руководства — далее в этой главе).
Теперь вы успешно создали новый командный проект в TFS. Следующий шаг — добавление
в проект членов команды.
New Teir» Ptotfct on 1S2J.68 02
гшШ|
*J^ Confirm Team Prefect Scttmgs
Jum project settinge;
Team Protect 5ettang»
• Name, евапкпе.
Process Template Settings
• ProcessTe-vlere: MSF for AgleSoftwareDeveioD»"er4 \4.2
• Template Description. Choose the MSF for Agfe Software Development process b' pi ejects
with short Ifecvdei зге* detKery-aierted trams who can Aork without bts o'rtermedlat*
documentation. MSF for Agile Software Development s an iterative, scenarto-dhven
developraeit process fe* ouding NET, Л'еЬ, Web Service «id other object-awnad
apptcabons it drecty ncarporates pracsces for handang quairy of service requirement» such
аз performance and security, at&es a cortejct-dnven approach {contrxt-baseci to determrie
no*, to operate the project, expkitly cab ou protect risk a» a succen ?itana V the aptm»
der. erv of sofhvtve. and ocorpor«tei «1 of the radaona) soft** e demtopmeit ram audi
as the buaness analyst, project manager, architect, deveop*', tester, and reieese manager
Th»MSF process» a flextte cucarce framework that hefes create шп adaptive system for
software development This egke methodology jrSapate» the need to adapt to change, and
focuses on oeople as the most moortant component w the яссеи of a project It atoo
Clitic Finish to create the team project 01 click Previous tc modify your settings
* Pjrevteus
finish
Cancel
Рис. 23.9. Последнее подтверждение
Добавление пользователей в команду проекта
В качестве администратора проекта вы имеете доступ к группам безопасности, которые
управляют доступом к вашим проектам. В Visual Studio вы можете получить доступ к настройкам
членства групп при помощи инструмента Team Explorer или через меню Team.
Воспользуйтесь случаем кратко ознакомиться с окном Team Explorer. Как администратору (или
сотруднику), вам будет необходимо досконально разобраться с различными функциональными
возможностями Team Explorer. В последующих разделах этой главы и последующих главах этой
книги мы уделим дополнительное внимание этому инструменту и возможным вариантам его
использования. Пока же такого поверхностного знакомства вполне достаточно.
Работаем с окном Team Explorer
Когда вы подключитесь, отобразите окно Team Explorer (посредством выбора View | Team
Explorer в Visual Studio). Окно Team Explorer — это полноценный инструмент, который
работает аналогично другим инструментам вроде Solution Explorer.
Глава 23. Управление командными проектами и работа с ними
905
При установленном подключении (к работающему серверу TFS уровня приложения) вы
увидите в окне Team Explorer различные узлы (рис. 23.10). Узел верхнего уровня
представляет сам сервер Team Foundation Server. Ниже этого узла имеются различные проекты
данного сервера. И в каждом проекте есть каталоги Work Items, Documents, Reports, Team
Builds и Source Control. Ниже узла сервера имеется также и каталог Favorites.
Team Explore*
1 Я И\
«d 192.168.0.2
^2 Щ Favorites
с , Л eBankingl
^J Work items
„+, _j Team Queries
_J My Queries
~4 Documents
v4%** айюйМщ
#*J
лг
:
<] Actual Quality \s Planned Veioci |
_J Bug Rates
J Bugs by Priority
^ Bugs Found Without
j) Builcts
^] ExitCnteria
f) Issues and Blocked V
J\ issues List
J\ Load Test Summary
_J Project Velocity
J\ Quality Indicates
4 4H
Ccrrespcr*
►''ос* Items
: lJ
Рис. 23.10. Окно Team Explorer
Каталоги командного проекта
Точно так же как и в Solution Explorer, каталоги внутри узлов командного проекта служат
для организации всего, что создано в командном проекте. Каждый каталог предоставляет
контекстное меню: щелкните правой кнопкой мыши по каталогу для того, чтобы получить
доступ к корректным для данного узла действиям. На рис. 23.11 показано контекстное меню
для узла Work Items.
Двойной щелчок по любому элементу проекта приведет к загрузке этого элемента в
соответствующее окно Visual Studio. В разд. "Вклад в проект" далее в этой главе мы опишем,
как просматривать и создавать элементы проекта.
Каталог Favorites
Каталог Favorites содержит ярлыки для других узлов окна Team Explorer. Обычно сюда
помещаются ссылки на часто используемые узлы проекта, поскольку они могут находиться
в глубине древовидной структуры или в самом конце длинного списка элементов окна Team
Explorer.
Самый быстрый способ добавить ярлык — это просто перетащить нужный узел в каталог
Favorites.
906
Часть VI. Система командной работы Visual Studio Team System
Team Explore'
\\л ъ
i^ 192168.0 2
*j My Favorites
J\ eBenktngl
v^ Woikltems
Г Add War к Item
I -* G» to Work Item...
j Add Query
. i ^ Add Work Items with Microsoft Excel..
.' 4 Add Work Items with Microsoft Project
h <?#; Team Project Process Guidance
I Refresh
1 '•w "'•""' ~j£ txirCttitiiid ■"
J issues and Blocked Work hems
j Issues List
_J Load Test Summer/
?i Project Velocit)
^ Quality Indicators
Щ
*
►
Рис. 23.11. Контекстное меню Team Explorer
для узла Work Items
Управление группами проекта
Как мы уже объясняли ранее при обсуждении модели безопасности TFS, доступ к
функциональным возможностям TFS определяется уровнем привилегий и разрешениями, которые
выдаются в соответствии с членством в группах. Иначе говоря — то, что вы можете делать
и видеть внутри командного проекта, зависит от того, к какой группе принадлежит ваш
идентификатор пользователя. Доступ к диалоговому окну Project Group Membership могут
получить администраторы проекта; оно используется для управления членством в группах.
Есть два способа доступа к этому диалоговому окну: через меню Team и через окно Team
Explorer. В меню Team (рис. 23.12) выберите Team Project Settings | Group Membership.
При помощи Team Explorer вы можете сделать то же самое щелчком правой кнопкой
мыши по узлу проекта (для того чтобы получить доступ к пунктам меню Team Project
Settings).
Добавление пользователей в группу
Диалоговое окно Project Groups является основным механизмом для добавления или
удаления пользователей из группы проекта (рис. 23.13).
Для добавления в существующую группу нового пользователя выделите группу, а затем
нажмите кнопку Properties. При этом откроется окно свойств для этой группы (рис. 23.14).
В окне свойств убедитесь, что у вас выбрана вкладка Members, установите переключатель
Windows User or Group, а затем нажмите кнопку Add. После этого вы получите
стандартное диалоговое окно Windows для выбора пользователя (рис. 23.15). Выберите здесь
пользователя и нажатием кнопки ОК добавьте его в группу.
Глава 23. Управление командными проектами и работа с ними
907
»> илмггН^ - MicfS*t v' лы\ Stud с
Pile Eiit \iew Pioject Euito Tean Dtnug Data Tccl: Те" £iary:e
.- - rf
1 >> ^ ^ «J ...< ~J „ -*
.2
.
'7
-*
*
,
A Jo WcrK'tepi
Goto Wert Jte-r
Ld? Qu*4
Ma WsfKuens witu MiucKJft Excel
Add Wou-'terw win Mierajcf* Project
Shov* Report Ste
P'ojea Alerts
"tail PiojectSett ogj
тез>г founei*icn Se»vei Settings
V-
&:nccv/ Help
► p„ » *
&n£sq&ie«r
'•'
j _/, eB^nldiigl
< J "eamQjeres
► Sre^-unty ^
* Group Membe'ship
Areas and lies aticns M
Sct."ce Ccnt'ol
j* Bug'Fr md'//ith-L*Ccri«
^ Bl d<
^ ExtCrtieiii
<4 Issue: and Bio ked v.orl «J
J^ Is<t-e< Lis*
Load """est >unmar\,
2 Project Vers :itv
_J Qiii f> Irdicajori
<' P.eacti.-at or»;
(f &b >.
,} Team Explorer 'У-~/'s-i* "• Г >' ;???
| Read.-
Рис. 23.12. Меню Team в Visual Studio
'' Еш&^зя
"rojec* G-o«pr cr eBankirg!
Teem Fo jrdat cr Serve- 192168 0 J
Teanp»o>ect <=ЕэпИпд1
5гзъру
Name
Jhcw global group;
Description
New»,
gemcve
£repertjes„.
Ir cde 'cr 'ear poject Lie-? ала g^cjps la % **- recc~: cr гчглд* the
lean? prqjec» Jf-»ai you r Jt* a sc se* security p*rrissicm ir S-. Se \t'
uf+:c - "9 S?^i:es aid n v\ ^ccas Chji»: ?irj Sf» ice: 5i?5 -яг li-Tapci
Ft i>ceir?o'mason abct,cse;;mg ptir siierii ч "ear Fcuraater ^rver
Рис. 23.13. Диалоговое окно Project Groups
Добавление нестандартных групп
Некоторым организациям может понадобиться реализовать в TFS собственную схему групп.
Ничто не мешает вам добавить ваши собственные группы или удалить группы по
умолчанию (являющиеся частью настройки TFS).
Для добавления новой группы начать нужно все с того же диалогового окна Project
Groups, показанного на рис. 23.13. Однако вместо нажатия кнопки Properties нажмите
ЗОЗак 3716
908
Часть VI. Система командной работы Visual Studio Team System
кнопку New. В появившемся окне вы можете ввести название для новой группы и ее
описание (рис. 23.16).
Team Fcundefa" Server Group PrsDerti«
Team Foundation server. 132MAA2
Team protect eBanktngl
£roup name Readers
jjescnptort Members of the group tone access to the team project
| 256 character» miximum
f Member MembaFcf
i User o' Group
Add member
i <fr learn Founoattcn Server Group "дни * ВйЧ.-.
^indowrs sJser or Grouo
| I CK
,' - . .- . „. -
e-
J i
"""'vTByi
i
' i Ь
i li
F W4 *5 | I
'
C*rtc«t
Рис. 23.14. Свойства группы проекта
Select Users or Group*
j| Sate* thai efaaxttpa
| Ultra. Gtoupa. or &4tale«urtypriKtoaj»
' | Бич th* beau*
I; £f*ertr«er4«4nBn«teieJ^^5Bj5<«)
ra~
[ Advanced., j
liiaifte» 1
Рис. 23.16. Выбор пользователей и групп
Create New Team Foundation Server Group l %,ШмМР i
Team Foundation lerven
Team project:
group name:
prescription;
192.168 XU
eBankmgl
ProductPlanning
Product planrvers and manager^
25b characters maximum
I • °* J I C**ce J
Рис. 23.16. Создание новой группы проекта
Глава 23. Управление командными проектами и работа с ними
909
Тонкая настройка разрешений
Каждая группа имеет примененный к ней набор разрешений по умолчанию. Как
администратор проекта (или администратор TFS) вы можете изменить разрешения, связанные с
любой группой. В меню Team выберите Team Project Settings | Security. Диалоговое окно
(рис. 23.17) даст вам возможность тонкой настройки разрешений, связанных с любой
группой безопасности на уровне проекта (или глобальной).
Project Secur ty
Team Fourwiuci server 192.168.0J
Teem project eBenkingl
i£ws and Croup»
Name
Г».ЫЗж
ШБП
щч
Descrtptio
УУШЁ
Merrben Ы this grouo hive access to th
Member: o' this group can perform all о
Merrben of this grocp can add. modify ,
ш
% («Banking!*.Readers
■% 'eBiakirtgl]\Preject Ad"n nislrators
% eBankinglJNCc-itributc's
4 »ii
Add users and group*
a Team Foundation Server Group
Windows User cr Group
£ermiss>on* for (SERVER [>*•"" Foundation Administrators
Permission £llow Deny
Delete this project
Edit butld Quality
Edit pi eject level information
Publish test resoits
in arderfor tevn project users ana groups to view reports at manage the team preject
po-»it /cj injs» aiso set securty perrrissiow in JJiwOxC' ^Rfcft ticj.*£rw« ir0 jr
'A u^'.s, S^re^n'. Syvkt. ? te Ai.fiT?.r«<tf<mon. Fci mot* infcip-iiien about setting
oer-nissiors ir Ts»m Fcjndation Se*ver see MiJ^irg Дгг й!£Д5'
Рис. 23.17. Настройка разрешений групп
Управление структурой проекта и итерациями
Помимо управления доступом к проекту, еще одной ответственностью администратора
проекта является определение структурных аспектов проекта, а также управление количеством
итераций, планируемых в проекте.
Из предыдущих обсуждений жизненного цикла программного обеспечения (Software
Development Life Cycle (SDLC)) в главе 22 вы знаете, что разные методики применяют различные
подходы к процессу разработки. Но в общем смысле, итерация — это полный рабочий цикл,
который приводит к выпуску рабочей версии программного обеспечения. Последующие
итерации основываются на ранее созданных элементах и полученном опыте — и, наконец,
получается готовый к выпуску продукт. При помощи командных настроек в Visual Studio
администраторы проекта могут управлять количеством итераций, через которые пройдет
данный проект.
910
Часть VI. Система командной работы Visual Studio Team System
В дополнение к итерациям TFS поддерживает концепцию областей. Области — это просто
логический способ группировки объемов работ в проекте. Для проектов разработки
программного обеспечения область может определять границы функциональной группы или
набора функциональных возможностей.
И областями, и итерациями можно управлять при помощи одного и того же диалогового
окна Areas and Iterations (доступ через Team Project Settings | Areas and Iterations).
Добавление или изменение областей проекта
На рис. 23.18 показано диалоговое окно Areas and Iterations с активной вкладкой Area. Это
рабочая поверхность, используемая для создания и структурирования областей проекта.
Например, вы можете наполнить структуру проекта при помощи создания областей Web UI,
Web Services и Database. После этого вы сможете подразделить эти функциональные
области на специфичные для каждого основного компонента составляющие.
Области изображены в дереве диалогового окна. Для добавления новой области сначала
выделите родительскую область, а затем нажмите кнопку Add New Node (в панели инструментов
на вкладке Area). Затем вы можете редактировать название области внутри самого дерева.
Удалить узел просто — надо его выделить, а затем нажать кнопку Delete Node в панели
инструментов. Узлы можно также перемещать в самом дереве. Сначала выделите узел, который вы
хотите переместить, а затем используйте четыре кнопки справа в панели инструментов
диалогового окна для перемещения его (узла) вверх внутри списка элементов одного уровня либо
для перемещения вверх или вниз внутри отношения "родитель — потомок".
Дгеа> ьгз Ite'aticn * ' *
Тез п Fcindaticn Ser. er 152 iiifj 2
TesTtp-ctect *B«nkingi
Area flteretian
Aiea
tf«eb Jl
Cjuorrcs
«recants
Transact on:
> Web Sc-'icej
Cjrorre^s •
A :c cunts
Tt4isict nr>:
System
Datsbast
Accounts
Cjstcm» :
"riisict 2r>s
\ Busiresr intelligence
Preparation
£*cuiity Clcte
Рис. 23.18. Добавление областей в проект
Любые созданные области используются для структурирования элементарных работ в
проекте. Таким образом, они могут функционировать как механизм организации работы по
составляющим функциональных областей.
Глава 23. Управление командными проектами и работа с ними
911
Примечание
Поскольку области очень специфичны для каждого проекта, то по умолчанию при
создании экземпляра нового командного проекта никакие области не создаются.
Добавление или изменение итераций
Работа с итерациями ведется так же, как и с областями. Сначала щелкните по вкладке
Iteration, а затем добавьте или переместите узлы. В отличие от областей, выбранный вами
шаблон проекта имеет по умолчанию определенное количество итераций. Для примера—
проект MSF Agile уже имеет три прописанных итерации (рис. 23.19).
Area* &^a Itere+iom & *Z&£
Team Fcurctetipr Server
Team prcjtcr
д(И fte c'ioi
ftfaiior
he ation С
fte.atior 1
ftc aticr 2
P snning
1 P'anmng
- Bjiidmg
2 Eliding
3 Balding
Stab.iizing
4 Stscil lirg
192168.0.2
eBant ingl
^ecurit^ „
Рис. 23.19. Управление итерациями проекта
Вклад в проект
Члены команды взаимодействуют с командным проектом различными способами (которые
будут отличаться в зависимости от роли данного пользователя). В следующих разделах
описано, как сотрудники проекта могут использовать Visual Studio Team Explorer для
сопряжения с сервером Team Foundation Server.
Подключение к серверу
Team Foundation Server
Перед тем как использовать инструмент Team Explorer, вам необходимо сначала
подключиться к серверу Team Foundation Server — а конкретнее, к серверу уровня приложения.
912 Часть VI. Система командной работы Visual Studio Team System
В меню Tools в Visual Studio выберите пункт Connect to Team Foundation Server. После
этого откроется диалоговое окно, которое показывает любые "известные" экземпляры TFS
(рис. 23.20). Вы можете либо выбрать из этого списка, либо (если необходимый вам сервер
не показан) добавить его в список при помощи нажатия кнопки Servers.
' ! -i Ш№*8^,
Connect to Team foundetan Server '■. " ЯМмНР I
£onnect to a T«m Fcunsjtign Seivrc :|
; i Je*m projects: j
j J b'(Select ДК j
! | j[/, eBenfrmgl j j
[ Ш ~Jj i C»K«l ..
Рис. 23.20. Подключение к серверу
Team Foundation Server
Для добавления в диалоговое окно нового сервера TFS нажмите кнопку Add и заполните
свойства подключения по HTTP: имя сервера, порт и протокол.
Выберите один из серверов из списка, затем — один или несколько проектов этого сервера
и нажмите кнопку ОК.
Если администратор проекта добавил вашу учетную запись в группы проекта, то теперь вы
подключены к выбранным вами командным проектам TFS и можете использовать Team
Explorer для доступа к элементам этих проектов.
Использование Team Explorer
Вы уже рассматривали инструмент Team Explorer; он обеспечивает интерактивное,
организованное представление элементов проекта. Как сотрудник проекта, вы можете
редактировать или просматривать эти элементы, либо создавать новые элементы в различных
категориях (например, элементарные работы, отчеты или документы).
Использовать Team Explorer несложно: при щелчке правой кнопкой мыши по узлу вы
получаете контекстное меню с различными действиями, которые соответствуют содержимому
каталога. Например, вы можете таким образом переслать документ (посредством щелчка
правой кнопкой мыши по одному из каталогов документов). Либо вы можете создать новую
элементарную работу.
В следующих главах обсуждаются элементарные работы, построения и управление
исходными кодами.
Глава 23. Управление командными проектами и работа с ними
913
Использование портала проекта
Как мы уже говорили, портал проекта является связующим звеном для всех разнообразных
компонентов проекта. Поскольку это сайт на базе SharePoint Services, то он сохраняет
стандартную структуру сайта SharePoint: он состоит из смеси стандартных Web-частей (ссылок,
объявлений и т. д.) и специфичных для TFS Web-частей. Все это обеспечивает целостное
представление текущего состояния проекта для пользователей (рис. 23.21).
Рис. 23.21. Подключение к проектам на сервере
Team Foundation Server
Вы можете посетить портал проекта при помощи Web-браузера, перейдя на сайт вручную;
по умолчанию он находится по адресу: http://<#s app server>/sites/<project
/fa/n£>/default.aspx. Вы можете автоматически попасть туда при помощи щелчка правой
кнопкой мыши по проекту в Team Explorer или выбора в меню Team. И там, и там имеется
пункт Show Project Portal, который запустит новое окно браузера с адресом сайта портала.
Сотрудники проекта используют этот портальный сайт для получения доступа к документам
командного проекта извне Visual Studio и для ознакомления с объявлениями, общими
отчетами по продвижению проекта и тому подобными материалами. Портальный сайт также
интенсивно используется пользователями-читателями, поскольку он является единственным
способом доступа к информации командного проекта без использования Team Explorer.
Имеются Web-части по умолчанию для просмотра информации о построениях, проверки
оставшегося объема работ, просмотра уровня ошибок, а также для просмотра списка
нерешенных проблем. Вы можете также получить доступ к полному реестру отчетов
(поставляемых из SQL Server Reporting Services) или посмотреть руководство по процессу.
914
Часть VI. Система командной работы Visual Studio Team System
Руководство по процессу
Руководство по процессу— это коллекция материалов в формате HTML, которая
описывает и документирует процесс жизненного цикла разработки программного обеспечения
(SDLC). Для каждого командного проекта специфическое руководство (для
использованного в данном проекте процесса) доступно на портальном сайте проекта: просто щелкните по
ссылке Process Guidance в левой панели навигации.
На рис. 23.22 показаны материалы руководства для проекта на базе MSF CMMI.
M^lJMIUJMUIl, .1 .L,. JM.. тт^тчшт^ттш^
iffy ■* \ii Пгр . tfoanOo.Stgs'eto mgl^ooessat23GucarfTe/>;«,i **
45*j!MGF*9 CVN"sccesermp«B<.'Sfl!>a-»t i
■liMMIt
1 Rsles V«ork "it
< /'"" i ooni iiiirtiiiion
1 ~c,-c-.^>
1 Mindsets
Л *~VCl<*S *">d JXTt'lCIS -i ~ V -/ >S. • ' 31 "*i С < '= .1 -• Г ! {?KZ ■ '
II ^«^i« ^;l;:;Лг^г, ;\ut"r~ ;"V;S
J T ,• > Mccie ' ' - < '' - « fU "'"- >'< r>S\i<t.
I Nindsets T'k' "r; ' '" *■ П ' ' v<' ""< "v ' %"'*'
1 .mc\f5t or;
'.! м «)<!*«* s
{ Quality i*
j f>«fit*ifirf by
}>'<'< г >cip ej Cf. i
'<{ * ' ~~ *
-=JSi^Si|
<< i
*j ■» Ж " E*9* " Toefe » **
|^^^iL$^l^^n
j- < MMl .r.Js< _J
»»*'»''"«""»-•'«""" '«» ■■■ »v
с i rs' ;i<f';) - ' 'zzi
ъ t acs л : cc t„ s ec z , n-t
;:^{'1'^""'?;:' '
,',.' 1tV ч'"' *
Qualities Ы
Service
tii; >i tf сч
, ^
^JtoRa«t * tf3*i »
Рис. 23.22. Руководство по процессу проекта
Использование Microsoft Office
Microsoft Office — это третий инструмент, который вы можете применять для работы с
элементами, хранящимися на сервере Team Foundation Server. При помощи различных надстроек
и шаблонов вы можете использовать приложения Office (такие как Word, Excel и Project) для
того, чтобы напрямую обмениваться с сервером TFS и обновлять хранящиеся там элементы.
Использование Microsoft Word ограничено работой с различными шаблонами документов
(dot-файлы), которые включены в шаблоны процессов MSF Agile и MSF for CMMI.
Microsoft Project и Microsoft Excel предлагают настоящую интеграцию с TFS и позволяют
вам управлять элементарными работами непосредственно из этих приложений Office.
Управление элементарными работами при помощи Project и Excel
После инсталляции клиентского программного обеспечения для Team Foundation Server в
приложении Office появляются новая панель инструментов и меню Team. На рис. 23.23 по-
Глава 23. Управление командными проектами и работа с ними
915
казан Microsoft Project с инсталлированной надстройкой TFS. Используя панель
инструментов или меню Team, вы можете подключиться к TFS (при помощи того же процесса, что вы
видели на рис. 23.19), а затем импортировать в проект элементарные работы из TFS. После
редактирования плана проекта в Microsoft Project вы можете опубликовать произведенные в
элементарных работах изменения обратно на сервер TFS (при помощи кнопки Publish).
; Mtcosoh P-ojeci - Frcj=c*l
*-] File j-dil >*«, . Imett F$»rmi Jcoli
4 A *' Calendar
Gent* Chart
Network С ъуът
Ш ~ "
ЦЦ v т£э>п S; «em Of r>L
||| Teem S^rtemTaik Shett
Щ 2"S T Miking G*£tt
ЩЁ 'SC Resc tr^e Ojph
Щ 2S1 Pr.e jrce Sheet
Щ ... Rescuict Lsege
Щ I? < *<a M^fe Vie^s.
Щ -£. Te£ir Теэгг ExptcerTiao
Wk 2*s W'J
§88 ш^>^£> ' cofh*ri
Щ 1 ==lt4 Tuip On Preset Gode
Ш *"' Зм
Щ jjf Hice ^srge Highlight ng
«Ц hWcei end Focrter
Ш Zcor>
1
Ры*
£»cj«:l
f*
r
I
1
1
k
и
r
r>g ► p
Report £ptiabc«te Ttjn
ф *<
J Refresh
5t»r
Mar Г 3C<C
Мог Г'ЗС'С7
Мог Гг:с«-0'
Мгг 7-20 0?
тче r^s-c
Ть„ S^C
> frt"" ,<ti ЪИЪЪ-
\
!
"
F rttsh ece>
/s- 7C0 07
•si 7ЯС 37
/-r'?CD7
,':" 7-30'37
Wee £.< 1 37
=i.&:o: :s-
_u« 9Г 1 27
Л/idev» ^eip
Aral
5
s»c- с PufcU"
N*-e» s-3
4e*'e»ri
=S
4 ss
>e»
e*
3ear;e '=г
Зеогде <=a
Hel " ss
~ i 1_„
* X
- a » В "
JP _ . A-?? J
jjjjjjjjjf Geo ge
3Ftsssi George
*
,
Рис. 23.23. Microsoft Project работает с TFS
r .
'
Л
1 om? Insert И<з?1а;о«*
Те,- -
h
!
*b
4
s
ч
JS
U i >
bttfy
> "xc ?wrro>-?'> St dorr?
' * 5t',lM-l|
S3 - /•
letffjlas
Bug
Bockl
->ra
- Mitrosc'L Exrt
Rft«» \ ts
"*}Pub!i:i
oj*tf; aBaftkingt Se*v*n 132Д58 Q2 Q|ti*iy; Ail Weak itw$
2l5lBug ,
216 Bug 1 „, Л ;, ,
21? Bug {
218 Bug
219 Bug
220 Bug
saisug
222 Bug
223 Bug
22« Bug
225 Bug
м Sitee:i $ьмг2 ^**^
-
J* 35*^
EEf £
Closed
Closed
Hi
Clc#>d
j
^вяв
^oel&re" >* Ir'
jJfiUti.^ ^(.sr'ivj'e
•
^^^рГ"^ g^>^^^^^^аапъ
Bug
Bug
Bug
Bug
Bug
Bug
Bug
Bug
Bug
Bug
Bug
jy^. __ , w
лп ' \. im
TaoleT . ~ ''-
L«s;<jr W
„»> ""*{ J'i30ie vott «<>
<
^sss^^ „, , t
'- !
^ i
»
*'
T
^
*
^ * \
Рис. 23.24. Использование Microsoft Excel для управления элементарными работами
916 Часть VI. Система командной работы Visual Studio Team Systerr)
Через меню MS Project View вы можете также получить доступ к некоторым нестандартным
представлениям проекта.
Аналогичные возможности имеет и Microsoft Excel. Вы можете использовать меню Team
для получения списка элементарных работ, импортирования их в Excel, и даже для внесения
изменений цикла обработки обратно в базу данных TFS (рис. 23.24). Мы будем более
подробно рассматривать интеграцию с Excel и Project в главе 25.
Примечание
Фирма Microsoft предоставляет также сервер совместной работы над проектами,
который называется Microsoft Office Project Server. Сервер Team Foundation Server
может интегрироваться с сервером Microsoft Office Project Server 2007 при помощи
отдельного коннектора, который доступен по адресу: http://www.codeplex.com/
pstfsconnector. Версия 1 предназначена для работы с сервером Team Foundation
Server 2005, а версия 2 — для работы с сервером Team Foundation Server 2008.
Использование проектных извещений
Извещения — это уведомления электронной почты, которые посылаются с сервера TFS
тогда, когда происходит определенное событие. Члены команды проекта могут подписаться на
те извещения, на которые они должны реагировать (при помощи диалогового окна Project
Alerts). В меню Team выберите пункт Project Alerts. Появившееся диалоговое окно
показывает все имеющиеся категории извещений; здесь вы можете ввести свой (или чей-то
другой) адрес электронной почты для получения уведомления о событии (рис. 23.25).
Project AfcrtJ - eBar»x>r>gl
I V 1ш£3ш
Check the alert ycu want to create, and then enter tbe e-mart addresses cf the people you want tc
receive the alert in the form ' someoneeexample.com . Separate e-mail addresses Wth semicolons.
£fOj*ct alerts for eBank'ngl
Alert Send to
'/ My work items are changed by others darrenCiitwar4com
A^yth ng is checked in
A bv.ild cuaitty changes
A build completes
| OK
•
Format
HTML
HTML
HTML
HTML
. . Cancel
t i
Рис. 23.25. Управление извещениями проекта
Вы можете получать извещения в формате HTML или в виде простого текста. Когда
извещение появляется в папке Inbox (Входящие) вашего почтового клиента, вы можете
просмотреть извещение, а затем использовать вложенные ссылки для получения
дополнительной информации. Например, если вы получили извещение потому, что кто-то изменил одну
из ваших элементарных работ, то вы сможете получить информацию о том, кто именно это
сделал и какие работы были изменены.
Глава 23. Управление командными проектами и работа с ними
917
Работа с отчетами проекта
Обычно работа с отчетами проекта происходит точно так же, как и с любыми другими
элементами проекта (такими как документы или элементарные работы): вы можете дважды
щелкнуть по отчету внутри Team Explorer (или выбрать отчет в портале проекта) для того,
чтобы просмотреть его содержимое. На рис. 23.26 показан отчет, который открыт внутри
Visual Studio.
Помните, что отчетные функции TFS основаны на сервисе SQL Server Reporting Services.
Некоторые основные моменты мы изложим в последующих разделах.
£itt Edit Umw fiwfd Team Dfti look Tfft AQffyzc ДОпоЪм Цф
:^;gJM^ ИГ
$■ Rea^ie«rtDe*ak-Riip«*t Viewer;
r favorites
j>№PNF<mims t
yPU HttpA'tfsrtraO&lleportSerm/ReportSefviceeirm^feBanta
Itavtien «eankingl
H i
&
го %
&
12
4^шш*
1 of3
^
Ft** *
UNmown
ШТа*
ШВид
Urtnown
BTask
ю t
62
«
fifl
tf
66 _
W Are» «Bankingl T|K
*end
с
> M 10O% ▼ Find | h-?xt Select ■ format
Scenario
Show Customer Summery
0 Active, 0 Resolved, 4 doted
0 Active, 0 Resolved, 6 Closed
Logki Customer
0 Active, 0 Resolved, 7 Closed
1Ш t Rev t
Salt andhashpravwjrd 5
Request Password Reset 5
Reset Password 5
Change Password 5
_JSecuresubmftjaeoVittaJs _ __ r m 5
1ЙМ1й11М»ШМ^^ ......
er
Vte» Report
w By^M
Completed
Completed
Completed
Stat* t
Closed
Closed
Closed
Ooaed
Closed
* -|
i
1
Ъ \
:
*<
jp
1 |
•
'I
Ready
Рис. 23.26. Просмотр отчета TFS в Visual Studio
Использование хранилища данных
Отчеты генерируются непосредственно по кубу OLAP, созданному по реляционной базе
данных TfsWarehouse (рис. 23.27). Это позволяет получить в отчетах информацию по
нескольким различным источникам, а также сводную информацию по построениям, тестам
(включая тестовые случаи, тесты покрытия кода и тесты нагрузки), управлению исходными
кодами и по элементарным работам.
Конструирование отчетов
Члены команды могут взять существующий готовый отчет и изменить его под свои
потребности. Вы можете также создавать с нуля нестандартные отчеты. Благодаря сервису SQL
Server Reporting Services самым лучшим способом для этого является использование визу-
918
Часть VI. Система командной работы Visual Studio Team System
ального конструктора Report Designer в Visual Studio. Создайте новый проект типа Report
Application (в категории Reporting) в Visual Studio (рис. 23.28). Если категория Business
Intelligence Reports у вас отсутствует, то вам необходимо инсталлировать SQL Server
Business Intelligence Server Studio с инсталляционного дистрибутива SQL Server.
Хранилище
данных
Управление
Журналирование исходными Отслеживание
действий кодами элементарных
работ
Интеграция
Сборка
Приложения к
элементарным
работам
Рис. 23.27. База данных сервиса отчетности
New Project
Pt cj cct typ«i- Templates- >NET Fram evvork 3.5
Visual C* * i vkh^ *♦ uliott ,u\Uiitrn-i,3U
Widows J1 Fepcrts Appbcaticn
Web '
Smart Je\i:e , '
q^ j 1 Search Online Terr p ?tes
Ditabase ,
Reporting
'est ,
VVCF |
Wcrkflov» |
Da'sbasePtc ects " \
A project for creating an «plication with a 'A ^dov» user interface and a Resort (Г4ЕТ Framexck I
Н*т»е' ReportsApplication
Location CM'ie'svderfe'vDccurren'sO/isja Stjdio2G08'<Project: ▼
Solution N»ne Reporiiupplicahon (V| Create jfrectc-y for sokrt en
Adc to Source Centict
{ OK
. ^
7 p li *;
- ^n
5
' 2ro*<ie
Cancel
' '' :
Рис. 23.28. Создание проекта нового отчета
Глава 23. Управление командными проектами и работа с ними
919
После создания проекта вы можете добавить новый элемент проекта Report и использовать
мастер Report Wizard для визуального конструирования вашего отчета. На рис. 23.29
показано создание отчета по построениям проекта.
ztf:or- W;r*ra
* **< J Design
available f e ds.
BiUCfMatrialilD
Pr^jr-tAi'^mbf/D
CcmpcnentlD
St«-tDats
EndDtfe
L-xtMeasijreCcde
BCMLe.el
^ Pe'Aistnb /Qt>-
tv'ro'ieaDate
r
the Matrix
3]:p ayect *tel< s
Раде^
j^clLmnj >
£OvVJ >
Qetate >
< £r«vicu*
<
♦
♦
-
[ „♦
<x
%Л
J Cane* *
Рис. 23.29. Создание нестандартного отчета
Резюме
Сервер Team Foundation Server — это набор компонентов на уровне приложения и уровне
данных, которые делают возможной совместную работу над командными проектами. В этой главе
мы рассмотрели системную архитектуру уровня данных и уровня приложения сервера Team
Foundation Server. Мы также кратко обсудили безопасность использования сервера TFS.
Мы описали, как менеджеры проекта работают с сервером TFS (и с такими инструментами,
как Team Explorer) для создания новых командных проектов, управления шаблонами
процесса, назначения членов команды в проект, а также для поддержания портального сайта
проекта. Вы узнали, как сотрудники проекта работают в составе команды и используют
различные функциональные возможности TFS для участия в процессе проекта (при помощи
Team Explorer, портала проекта, а также Microsoft Office).
В последующих главах на базе этих знаний вы углубитесь в данный процесс с целью
управления элементарными работами, для работы с системой управления исходными кодами, а
также и для управления построениями. Вы изучите также, как архитекторы и разработчики
могут использовать функции моделирования VSTS, как тестеры могут пользоваться Visual
Studio Test Edition для выполнения модульных и нагрузочных тестов и управления
тестовыми случаями, а также как разработчики данных и администраторы баз данных могут
использовать имеющиеся в версии VSTS Database Edition инструменты для баз данных.
Глава 24
Система управления исходными кодами
В данной главе описывается система управления исходными кодами Visual Studio Team
System: точнее говоря, сама система управления и хранилище (которое предоставляет сервер
Team Foundation Server), а также средства ее интеграции с Visual Studio.
Идея системы управления исходными кодами достаточно проста: в любом проекте
разработки программного обеспечения имеется необходимость в централизованном хранении и
управлении файлами, которые являются базовыми элементами. Иначе говоря, система
управления исходными кодами централизованно управляет доступом не только к файлам
исходного кода, но также и к любым другим элементам проекта, имеющим вид файлов и
созданным во время реализации проекта. Эти элементы могут включать в себя документы
технических требований, сетевые диаграммы и планы тестирования.
Примечание
Термины "система управления исходными кодами" и "система управления версиями"
являются синонимами (по крайней мере, в данной книге). Несмотря на то, что термин
"система управления версиями" является в некоторых отношениях
предпочтительным (поскольку намекает на тот факт, что управление производится не только
исходными кодами), мы в данной главе используем термин "система управления
исходными кодами" для того, чтобы соответствовать основному объему документации MSDN
по командным системам — и даже несмотря на то, что база данных системы
управления исходными кодами (на уровне данных сервера Team Foundation Server) имеет по
иронии судьбы название TfsVersionControl.
Работу системы управления исходными кодами можно разбить на следующие области
ответственности:
□ она централизованно хранит файлы (безопасным и надежным образом);
□ она предоставляет способ группировки наборов версий файлов для составления
"версии";
□ она позволяет множеству пользователей взаимодействовать одновременно с одним и
тем же файлом (при помощи концепций возврата, извлечения и слияния);
□ она следит за изменениями, произведенными в файле: кто их сделал, когда они были
сделаны и почему.
Глава 24. Система управления исходными кодами
921
Система управления исходными кодами (которая поставляется вместе с сервером Team
Foundation Server и Visual Studio) выполняет все эти требования (и не только эти). Это
надежное клиент-серверное решение, специально предназначенное для управления исходными
кодами больших команд разработчиков (на уровне предприятия).
Основы системы управления исходными кодами
Система управления исходными кодами, которая поставляется в составе VSTS и сервера
Team Foundation Server, является совершенно новой системой фирмы Microsoft; она не
является улучшенной версией предыдущей системы управления исходными кодами Visual
Source Safe. Система управления исходными кодами Team Foundation Source Control (TFSC)
была создана с нуля для того, чтобы стать системой масштаба предприятия, которая может
обслуживать сотни и даже тысячи одновременно работающих пользователей.
ё
Примечание
Система управления исходными кодами Visual Source Safe (VSS) не исчезла. Вместе
с Visual Studio 2005 была выпущена новая версия VSS 2005 и она остается
предпочтительным механизмом управления исходными кодами для индивидуальных
разработчиков или небольших команд (не более пяти членов).
TSFC была создана для решения нескольких фундаментальных задач:
□ для обеспечения масштабируемого решения для команд разработки уровня
предприятия;
□ для обеспечения надежного решения;
□ для удаленного доступа при помощи протоколов HTTP/HTTPS;
□ для того чтобы позволить нескольким разработчикам одновременно работать с файлом
исходного кода;
□ для создания полностью интегрированной пользовательской среды в Visual Studio.
Перед тем как углубляться в вопросы работы с системой, в следующих разделах на самом
высоком уровне будут описаны основы системы управления исходными кодами TFSC.
Основы архитектуры
Поскольку система TFSC является еще одним сервисом, предоставляемым TFS, то она
работает поверх все той же трехуровневой архитектуры. Она использует SQL Server в качестве
базы данных для хранения исходных кодов, предоставляет доступ к этому хранилищу при
помощи сервера TFS уровня приложения, а также использует Visual Studio в качестве
клиента. На рис. 24.1 показана диаграмма этой системной архитектуры.
Такая архитектура позволяет системе управления исходными кодами масштабироваться
вверх путем добавления дополнительных серверов на уровне приложения. Кроме того,
объем хранения можно увеличить путем добавления устройств хранения на сервере базы
данных или добавления самих серверов баз данных.
922
Часть VI. Система командной работы Visual Studio Team System
^Клиентские инструменты^
для работы с системой
управления исходными
кодами
Visual Studio
Sjh
HTTP/HTTPs
Сервисы системы
управления исходными
кодами
Сервер TFS
(уровень
приложения)
MS SQL/
TCP/IP
"И
Сервисы системы
управления исходными
кодами
*&
Сервер TFS
(уровень
данных)
Рис. 24.1. Система управления исходными кодами
Team Foundation Source Control System
Совет
Для географически распределенных команд Team Foundation поддерживает
возможность использования прокси-серверов для локального кэширования данных системы
управления исходными кодами. Настройками прокси-серверов можно управлять в
диалоговом окне Team Foundation Settings, а занимаются этим администраторы
Team Foundation Дополнительные подробности настройки прокси-серверов для
увеличения производительности вы можете найти в документации MSDN (ищите фразу
"How to: Configure Team Foundation Source Control to Use Proxy Server").
Права и разрешения системы безопасности
TSFS использует ту же самую интегрированную систему безопасности Windows, что и
сервер Team Foundation Server уровня приложения (на котором она и находится). Это означает,
что для определения конкретных уровней разрешений (при работе с системой управления
исходными кодами) используется все та же модель пользователей/групп и тот же самый
процесс добавления или удаления пользователей. Иначе говоря, TFSC не имеет собственной
базы данных пользователей или системы безопасности; она работает в более широкой
инфраструктуре сервера Team Foundation Server. Вообще говоря, пользователь в системе
управления исходными кодами является либо сотрудником, либо администратором.
Группа сотрудников обычно населена членами команды, выполняющими роли
разработчиков, тестеров, спонсоров и прочими. Они работают с системой управления исходными
кодами и выполняют обычные задачи: выкладывают файлы для модификации, проверяют
внесенные в файлы изменения, добавляют файлы в хранилище или удаляют их.
Администраторы обслуживают сервер системы управления исходными кодами.
Администраторы управляют доступом к хранилищу исходных кодов, а также поддерживают
целостность и безопасность всех элементов в хранилище. У администраторов также могут быть
некоторые специфичные для проекта задачи — они могут определять необходимость
создания новой ветви в дереве проекта и управлять слияниями между ветвями. Членство в этой
группе обычно ограничено глобальными администраторами TFS и такими ролями, как
менеджер проекта или руководитель проекта.
На уровне разрешений TSFC поддерживает различные детальные права, которые можно
присваивать отдельным пользователям (или группам) или отбирать у них. Поддерживаемые
TSFC разрешения/права описаны в табл. 24.1.
Глава 24. Система управления исходными кодами
923
Таблица 24.1. Разрешения системы управления исходными кодами
Разрешение
Описание
Разрешения на файлы/каталоги
AdminProjectRights
Checkin
CheckinOther
Label
LabelOther
Lock
PendChange
Read
ReviseOther
UndoOther
UnlockOther
Пользователь может устанавливать уровни разрешений для
пользователей/групп
Пользователь может вернуть файл в хранилище исходных кодов
Пользователь может вернуть файл другого пользователя в хранилище
исходных кодов
Пользователь может пометить элемент
Пользователь может пометить элемент другого пользователя
Пользователь может заблокировать элемент
Пользователь может извлечь, добавить, удалить, создать ветвь,
выполнить слияние, а также отменить удаление
Пользователь может читать содержимое файла или каталога
Пользователь может изменить комментарии другого пользователя по
набору изменений или примечания при возврате
Пользователь может отменить ожидающие изменения, внесенные другим
пользователем
Пользователь может снять блокировку элемента, установленную другим
пользователем
Глобальные разрешения
AdminConfiguration
AdminConnections
AdminShelvesets
AdminWorkspaces
CreateWorkspace
UseSystem
Пользователь может действовать как администратор и изменять основные
настройки системы управления исходными кодами
Пользователь может остановить любое выполняющееся действие
системы управления исходными кодами
Пользователь может удалить набор отложенных изменений другого
пользователя
Пользователь может редактировать рабочее пространство другого
пользователя
Пользователь может создать рабочее пространство
Пользователь имеет доступ к системе управления исходными кодами (это
базовое разрешение, которое необходимо для пользования любой частью
системы TSFC)
Имея эти основные представления о системе управления исходными кодами, вы уже готовы
к изучению интегрированных в Visual Studio инструментов, которые позволяют
пользователям Visual Studio решать как простые, так и сложные задачи работы с системой управления
исходными кодами.
924
Часть VI. Система командной работы Visual Studio Team System
Система управления исходными кодами
Для решения как простых, так и сложных задач работы с системой управления исходными
кодами у вас в Visual Studio есть два основных инструмента: Solution Explorer (который мы
уже обсуждали во многих главах этой книги), а также инструмент Source Control Explorer.
Solution Explorer можно использовать для непосредственного управления элементами
решения (или проекта) в системе управления исходными кодами. Source Control Explorer
также обеспечивает многие из этих функций и дополнительно предоставляет вам
возможность просмотра (хранящихся на уровне данных TFS) элементов системы управления
исходными кодами.
Однако перед тем, как вы сможете работать с этими инструментами или использовать
(специфичные для системы управления исходными кодами) функциональные возможности
Visual Studio, вы должны убедиться в том, что Visual Studio настроена для совместного
использования с сервером Team Foundation Server.
Настройка Visual Studio
Настройки Visual Studio для работы с системой управления исходными кодами находятся в
диалоговом окне Options. Выберите Tools | Options, а потом перейдите к странице Source
Control. Здесь вы можете использовать раскрывающийся список для выбора той системы
управления исходным кодом, которую хотите использовать. Пока в этом списке имеется
только один элемент — Visual Studio Team Foundation Server (рис. 24.2), и именно его и
нужно выбрать.
Options УШЕШГ
AutoReccver *
• Documents
Find and Replace .
Fonts end Colors >
:- Help j |
Import and Export Settings
International Settings
Keyboard
Startup
T«k Lrst
Web Browser
Щ
■/ Performance Tools »
Projects end So/utions
j Source Control
PTug-ir> Selection
Environment
Plug-In Selection:
'
Specifies the source control plug*in to use w'&h Microsoft Visual Studio and «Rows
changes to plug-in specific options
Current source control piug-irv
| Vteni Studio Team Foundation Server ■* ] j
Visual Studio Team Foundation St ! |
-> Text Editor
1
[ OK ]| Cencd | L
Рис. 24.2. Выбор системы управления исходными кодами в Visual Studio
Когда в качестве провайдера системы управления исходными кодами выбран TFS, вы
можете автоматически использовать Visual Studio в качестве клиента при подключении к
серверу TFS.
Глава 24. Система управления исходными кодами
925
Внутри Visual Studio вы можете:
□ перемещаться по командным проектам и рабочим пространствам;
□ изучать файлы в хранилище исходных кодов;
□ получать файлы из хранилища и возвращать их;
□ возвращать сделанные в файле изменения или отменять их;
□ просматривать историю изменений файла.
Мы рассмотрим все эти действия (и не только их) Чуть позже в этой же главе. Теперь
пришло время освоить пользовательский интерфейс Source Control Explorer.
Окно Source Control Explorer
На рис. 24.3 показано окно Source Control Explorer (SCE) в Visual Studio. Вы видите, что
SCE имеет вид окна документа (а не инструментального окна), что в нем имеется несколько
различных панелей (в которых видна информация системы управления исходными кодами),
и эти панели организованы таким образом, что окно похоже на окно Windows Explorer
операционной системы.
ч/> LrtwareHR - Microsoft Visual Stud»
File £dit View Project fiurfd Qtbuq Data Iooh Tejt Analyze Window bjelp
J3 • ' U? Ы ЯМ * 'Л^*****!*'-**} Debug * Any CPU
У$\ Source Control btpforvri
Source location: [Л $/LitwareHRAgileAitwareHR/Shp.Runlime.Services
Folders X I Local Eath. £\lrrware\Shp.Runtime.Servic«
- Щ 19216802
L» * v^*r*M«* Ar ie
h< \*3r LrtwareHR
i£ Li3 LrtWire.WebSHe
Tj CJ LrtwareHR-Authuj
Щ Ca LrtwareHR.Autho
•i Ca LrtwareHUPcrtfo
ф CJ LrtwireHR-Portro
Lf Ca Lrh*areHRJ>ortfoj .;
LV £j LrtwareHRJ>ortfo' I
3B LJ UtwareHR-Portfo; S
if L3 LrtwareHR Prrvatf
* Си LrtwareHR.Pnvatr-'*
it! CJ LitwareHR.Pubfar
ut% СЗ LitwareHRJ>ubiic
«V CJ Lrt*areHR.Recrur
it U LtwweHR.Recru>
и £Э LrtwareHR Reerur "
Name ■*■
Ll Properties
<j] AuthenticationHelper.es
^j AuthenticationLogic cs
■^ AuthfnticahonSemce.cs
•3J AuthorizaucnL09ic.cs
^ AuthoruaticnService cs
-•^Constantvcs
^ Conlat.cs
</ '^J DatamodelLogie cs
' ^ DatamodelLogicHelper.es
»jj DalamodelService.ci
4J lYiewStrategy.es
Ц OneJomPertntrtyViewStrBte...
jj PresentationLogic cs
=3J Pre£entationService,cs
tt^Shp.Runtune.Servtces esproj
.■■^..Shp.Run^TOeSen^ebcjroy.rj!!,,,
Pending Change User
locked*
lock, edit
Darren
Darren
al<gl
Sotutfon Explorer <r * x
•Q Solution LrtwareHR *
i ^ &J9 LrtwareWebSrte !E
(?) alii Properties '—
i fjl ai References
^ App_Data
' fcl ^App.Themes
(J Controls
1^ Css
LlJ Errorc
La Inut
Ш LIMP
ffl C3 TryWizerd
1Я [Л Ibk
it) aj Defaultaspx
2_i Web.eonfig
a\jSj Web^itemap
Ь *>3| LrtwareHR-Authe
' ffi a'iJi Properties
t) ,'Л References
_J App.Data
8SJ) SecurrtyTokei w
A
W
)
j^Tean Ё* . ^Solution .
Ready
Рис. 24.3. Окно Source Control Explorer
Панель инструментов
Панель инструментов окна SCE обеспечивает легкий доступ к стандартным действиям. Эти
кнопки позволяют вам делать следующее (по порядку следования кнопок слева направо):
□ скрывать или показывать панель каталогов;
926
Часть VI. Система командной работы Visual Studio Team System
П обновлять содержимое всех панелей (например, повторно запросить сервер);
□ создавать новые каталоги внутри древовидной структуры системы управления
исходными кодами;
□ добавлять файлы в хранилище системы;
□ удалять файлы из хранилища системы; .
□ получать с сервера самую последнюю версию файла (эта команда работает рекурсивно;
если выделить корень дерева системы управления исходными кодами, то вы можете
получить последние версии всех файлов);
□ извлечь файл для редактирования;
□ вернуть сделанные в файле изменения;
□ отменить сделанные в файле изменения;
□ сравнить копию файла на сервере с локальной копией.
В панели инструментов имеются также два раскрывающихся списка, которые вы можете
использовать для изменения вашего рабочего пространства (подробнее о рабочем
пространстве чуть позже) или для изменения вашего положения в дереве системы управления
исходными кодами.
Панель каталогов
Панель каталогов содержит иерархическое представление "каталогов" системы управления
исходными кодами на сервере (для выбранного вами рабочего пространства). Если вы
знакомы с терминологией Visual Source Safe, то уже знаете, что рабочее пространство
аналогично рабочему каталогу. Это локальная рабочая область на вашем жестком диске, которая
соответствует определенному проекту TFSC на сервере. Когда вы получаете файлы с
сервера, то они размещаются в локальном каталоге, который вы связали с данной рабочей
областью. Поскольку рабочим областям имеется соответствие в вашей файловой системе и
поскольку генерируемые проектами элементы организованы иерархическим образом, то
совершенно естественным представлением для просмотра рабочего пространства является
представление "каталог\файл" (даже несмотря на то, что файлы в действительности
хранятся в таблицах базы данных SQL Server).
Панель файлов
При каждом выделении каталога (в панели каталогов) происходит обновление панели
файлов. При этом вам демонстрируются все существующие в данном рабочем пространстве
(каталоге) файлы и подкаталоги. Обратите внимание, что панель файлов использует для
указания статуса файла специальные сигнальные значки. Например, красная галочка
используется для указания уже зарегистрированного файла, а желтый знак плюса обозначает файл
или каталог, который ожидает добавления в хранилище системы на сервере. Эти же самые
значки используются и в окне Solution Explorer.
Глава 24. Система управления исходными кодами
927
Управление рабочими областями
Как мы уже упомянули, рабочие области — это области в вашей локальной файловой
системе. Все локальные копии файлов из системы управления исходными кодами сохраняются
в рабочей области. Локальные копии файлов создаются при первом подключении к
хранилищу исходных кодов. С этого момента ваши локальные файлы становятся вашим рабочим
набором; при модификации любого локального файла сделанные вами изменения
помечаются в рабочей области как ожидающие и не сохраняются на сервере TFSC до тех пор, пока
вы явным образом не укажете этого во время возврата. Иначе говоря, рабочая область
подобна песочнице. Вы можете делать с файлами в вашей рабочей области все, что вам
угодно, и не беспокоиться о том, что это может повлиять на работу других членов команды или
нанести ущерб живучести проекта.
Примечание
Рабочие области на локальном компьютере могут принадлежать только одному
пользователю. Это означает, что если на компьютере существует несколько учетных
записей и каждая запись участвует в командном проекте TFS, то у каждой их них будут
свои рабочие области.
Создание рабочей области
После настройки Visual Studio для работы с системой управления исходными кодами
следующий необходимый шаг для работы с сервером TFS — это создание на вашем компьюте?
ре рабочей области. Без нее вы не сможете получать файлы из хранилища исходных кодов,
и, следовательно, не сможете просматривать эти файлы или вносить в них изменения, что
собственно и является самой главной целью работы в составе команды.
Для создания новой рабочей области выберите File | Source Control | Workspaces. После
этого откроется диалоговое окно Manage Workspaces (рис. 24.4).
Manege Workspaces I ^ \йттШ
i Workspaces
Computer Comment
Afid... ) [ frftt,, 71 [ Bfim**
Рис. 24.4. Управление рабочими областями
928
Часть VI. Система командной работы Visual Studio Team System
Теперь нажмите кнопку Add для того, чтобы открыть диалоговое окно Add Workspace
(рис. 24.5). В этом окне вы предоставляете всю необходимую информацию о рабочей
области и связываете исходные коды на стороне сервера с каталогом на стороне клиента.
Add Workspace
tjame DarrenWS
Server 192168 0.2
Qwnen TFSRTMM\Danen
Computer. DarrenPCj
Qpmmttxt
forking folder»
Status Source Control Folder Local Folder
Click hereto enter a new woridrtg folder
3
Рис. 24.5. Создание рабочей области
После того как вы дадите название рабочей области и укажете владельца, а также имя
локального компьютера, вам необходимо установить соответствие между локальным
каталогом и деревом исходных кодов на сервере. В таблице Working folders (в нижней части
диалогового окна) щелкните мышью в столбце Source Control Folder (в строке "Click here to
enter a new working folder"). При этом в таблице будет создана новая строка; теперь вам
нужно нажать кнопку с многоточием в столбце Source Control Folder и выбрать каталог
проекта на сервере, который вы хотите зеркалировать в вашей рабочей области (рис. 24.6).
Browse for Folder
Ieam Foundation Server.
192Л 68.0.2
folder*
S i& LrtwereHR
ffi Cl LrtwareA/VebSite
К Cj LrtwareHR.Authentication.SvcHost
К Ll LrtwareHRAuthoruation.SvcHost
! к ГЛ LrtwareHR.Portfolio.Gateways
I Й Qj Lrh*»reHRJ>ortfofto.StcurtHo5t
I Ы Da UrwareHRJ>ortfot[o.5trvkes
| ffi Ql LHwareHR-Portfofio.UnSecweHost
Folder a»trc
$^rtw«reHRAyle/UtWireHrVLitwareHRPortfo6o.ContnKt
I OK
Caned
Рис. 24.6. Выбор проекта на сервере
Глава 24. Система управления исходными кодами
' 929
Примечание
Не запутайтесь с концепцией каталогов проектов на сервере системы управления
исходными кодами. Несмотря на то, что система реализована в реляционной базе
данных (а не в файловой системе), вы взаимодействуете с хранилищем TFSC как с
хранилищем проектов, имеющим иерархическую структуру.
Последним шагом необходимо выбрать в вашей файловой системе каталог, который будет
служить корневым каталогом вашей новой рабочей области. Щелкните по столбцу Local
Folder, нажмите кнопку с многоточием, а затем выберите локальный каталог, который
будет связан с хранилищем исходных кодов на сервере (рис. 24.7). Нажатие на кнопку ОК
возвратит вас в диалоговое окно Add Workspace.
Browse For Folder ВЯ
Sefectlocal folder
a ,^ Lttware *
P ...J* Litware.WebSrte
г- ь LitwareHR.AuthenticBtion.SvcHDrt
> L UtwereHR.Aulhorizetion.SvcHost [I
Г ю
л |. LrtwareHR.PortfoHo.Contr»rt II
*> Ы bin
> U °bj
^ Properties
> # LitwareHR.Portfolio.Gateways
i> J* L'rtwareHR.Portfolio.SecureHnst
> U LttwareHR.Portfolio.Servtce$
. » J Ll» UO£ T„ Г,,. }•. Г f ► •
[ «HkftewFddeT] 1 GK ] | Cancel 1
Рис. 24.7. Выбор локального каталога
Для создания рабочей области нажмите кнопку ОК в диалоговом окне Add Workspace.
Теперь, после создания рабочей области, вы можете просмотреть ее при помощи Source
Control Explorer. Для того чтобы открыть его, выберите в меню View | Other Windows, a
затем — Source Control Explorer.
Сначала рабочая область будет пустой. Если файл существует на сервере, но локально его
нет, то его название будет серым. На рис. 24.8 показана рабочая область сразу же после ее
создания; названия всех файлов серые, а это означает, что на данный момент имеются
только копии на сервере.
Для реального заполнения локальной рабочей области файлами из хранилища системы
управления исходными кодами вам необходимо выполнить команду Get Latest. Для этого
убедитесь в том, что в раскрывающемся списке Workspace в SCE выбрана необходимая
рабочая область (см. рис. 24.3), потом выберите каталог проекта на сервере (в панели
каталогов), а затем нажмите кнопку Get Latest (Recursive) в панели инструментов SCE (см.
рис. 24.3).
930
Часть VI. Система командной работы Visual Studio Team System
*& LtwareHR- Microsoft Visual Studio
file £dit View Project .guild Debug Djta Joels Tes.t Analyse V^indow Help
^d3* - ' Л A W ! < ^ "v> v <Jv- '* D*bug - Any CPU
Source Control Explorer
[ЩИ ^ *& Ьг> гЯ
■~ X
>*) " Jfc* ^» Workspace Lit^areWorkspace-Contracts * j
Source location. ,_J $<<uwvareHP Agile/LitiAarehR/'uwareHR.PDrtfolio Contract ■»■
Folders x
i I % 1921GBJ0J
'Q^H,I
-1 C3 wt'^re lAc'e
CvJr lit - '
tuJ1 ** '• *!'*«
,.♦ CJ £ «vKrlF/jt-^i
XW vtHRt it-.-1
iJ'^-^'O'.'
ч CJ "M">hk > ?
%V i-J ' >f е1К°.:-Н
TJi ».cHPP»^<' *
<U- '"HPiVii.
♦ U It г-UP ^k
J uJ Л> 2"-( Г'-0|Г.
♦ CJ ' *- .нч-«.-'и
♦ LJ ' «■»■:»*< „
-iJ L iv x e' IP "et'., -
j « ш j \
Local Eath. CAVSTSWorkspacesUttwarrCerrtract
Name * Pending Change User
»],• .,.0.«)r<ff l-.c<
« ffl t I
""•cisil an £<ptaref » -1 X
^ -J
i*J3 Solut»cn LrtwareHR -
- a'^j LrtwareVVebSrte :
♦i <i^ Properties
'♦' -^1 Frfeiences
-j App_Deta
vii ^i App_Themes
й lJ Controls
i»j iJ Css
♦i lJ Errors
'♦) CJ Irru
'>* U MP
a ^ TryWuard
tti i_J Utils
4i ы *i| Defaultaspx
Ja_} Web config
&,"j Web sitemap
- &Mj LitwareHR Authe
H &^d Properties
vtl ^i References
Mj App_Date
Jj4] SecuntyTcker ^
JPjTdsn Ev. ^-JSclution
Ready
Рис. 24.8. Файлы на стороне сервера (показаны внутри Source Control Explorer)
Добавление файлов
в систему управления исходными кодами
Возможно, именно вы являетесь лицом, ответственным за первоначальное размещение
файлов в систему управления исходными кодами. Предположим, что у вас имеется уже
существующее решение Visual Studio, которое вам необходимо разместить в системе управления
исходными кодами. Необходимо будет выполнить те же самые шаги, что и при создании
рабочей области, но на сервере не будет никаких файлов — все они будут локальными.
Система управления исходными кодами не будет ничего о них знать — даже несмотря на то,
что вы связали ваш локальный каталог рабочей области с каталогом, содержащим файлы
вашего решения. В данном случае вам необходимо взять локальные файлы и добавить их на
сервер.
Для этого используется Solution Explorer: щелкните правой кнопкой мыши по узлу
решения в Solution Explorer и выберите пункт Add Solution to Source Control.
В этот момент файлы будут помещены в список ожидающих изменений как дополнения. Это
означает, что в следующий раз при выполнении возврата у вас будет возможность
завершить операцию и физически добавить файлы на сервер. После фиксирования дополнений
файлы станут доступны для извлечения.
Использование Solution Explorer — это самый легкий способ массового добавления
решений и проектов в систему управления исходными кодами, но вы можете также использовать
для этого и Source Control Explorer. Это предпочтительный способ для добавления
элементов, которые не имеют отношения к проекту.
Глава 24. Система управления исходными кодами
931
Для добавления файла в Source Control Explorer выполните следующие шаги:
1. Откройте окно Source Control Explorer.
2. При помощи панели каталогов перейдите в тот каталог командного проекта, в который
вы хотите поместить файл.
3. Выделите файл, выберите Source Control, а затем — пункт Add to Source Control.
4. В диалоговом окне нажмите кнопку ОК. На рис. 24.9 показано диалоговое окно Add to
Source Control.
Точно так же, как и в случае с Solution Explorer, данная лроцедура фактически только
помечает файл (или файлы) кЪк "ожидающие дополнения". Вы должны завершить операцию
при помощи возврата файлов. В следующем разделе мы изучим процесс возврата файлов от
начала и до конца (а также и поддерживающие его инструменты).
Add to Source Cont/oi I " JHJ j
Add selected fit» to source control
Files.
j Name Folder
i
§xcJude. ".pdh;* obj * dll,* ем;* res;* resources;\cache;*.ilk;"'.ncb
Example * pdb;* obj;* res
C*ncet
Рис. 24.9. Добавление файлов при помощи Source Control Explorer
Редактирование файлов
в системе управления исходными кодами
Итак, мы изучили фундаментальные основы настройки клиентской рабочей области, а также
использования Solution Explorer и Source Control Explorer для получения файлов с
сервера исходных кодов или добавления их на сервер. Теперь возьмемся за самую сердцевину
механизма системы управления исходными кодами — управление изменениями.
Получение файла из хранилища исходных кодов
Есть два способа взять файл из хранилища исходных кодов сервера и поместить его в
локальную рабочую область: использовать команду Get Latest или Check Out. Команда Get
Latest (как вы уже видели из предыдущих примеров управления рабочей областью) просто
получает текущую версию файла в том виде, в котором она существует на сервере, и
копирует ее в вашу рабочую область. Команда Check Out используется для того, чтобы указать
I Мб РоУег„,
932
Часть VI. Система командной работы Visual Studio Team System
системе, что вам нужна последняя версия файла и что вы собираетесь внести в нее
изменения. В зависимости от конфигурации системы TFSC (исключительный или разделяемый
доступ) это будет означать следующее: если доступ исключительный, то на файл будет
установлена блокировка, и никто другой не сможет сделать изменений в то время, как вы
работаете с этим файлом. Если доступ разделяемый, то другие могут делать изменения в
файле; эти изменения будут позднее объединены с вашими изменениями и будет
сгенерирована новая версия, которая будет храниться в хранилище исходных кодов.
Примечание
Настройка доступа (исключительного или разделяемого) фактически определяется
шаблоном процесса, использованным для вашего командного проекта. Более
подробную информацию относительно шаблонов процесса см. в главе 23, либо в
документации MSDN по серверу Team Foundation Server.
Возврат ваших изменений
После внесения изменений наступает время вернуть их на сервер исходных кодов. Это
можно сделать тремя способами: вы можете щелкнуть по файлу правой кнопкой мыши в
Solution Explorer, либо вы можете щелкнуть по файлу правой кнопкой мыши в Source Control
Explorer, либо вы монете использовать окно Pending Changes.
В Solution Explorer вы щелкаете правой кнопкой мыши по тому файлу, который хотите
вернуть, и выбираете в контекстном меню пункт Check In. Появляется диалоговое окно
Check In (рис. 24.10). В этом диалоговом окне содержится список всех файлов, доступных в
настоящее время для возврата. Любой файл можно выбрать при помощи установки флажка
(выбранный вами ранее файл уже будет иметь установленный флажок). Вы просто
отмечаете те файлы, которые хотите включить в процесс возврата, а затем нажимаете кнопку Check
In. Обратите внимание, что вы можете ввести также и комментарий (всегда полезно
снабдить возврат неким историческим контекстом о причине изменений/возврата).
Check In - Source Files • Workspace IPOWERS1
1
,
Source fries
й •
tfork Kerns
; 4
■ Motes
l£
£oRcy
Warnings
1
J
[3[ed[5] *: j « m
Refactcred for new *orkf tow activity
Name
; I** S& NegotiationAclivtty.cj
. fy <$ Tenant0oRcyActrvtty.cs
i £j <j£] DatamodelLogic.ci
С & DatamodelLogicHeiper.es
f^ -$ SysiemLogic cs
L.i&L'twareHR.sin
j t«j LtwareHR.vs mdi
P~ 5j LitwareHR vshcc
i ^^LoraJTetfRuruestainconfig
, [ I ^3» app.config
j Г* _J AuthoringTests.M
[_ '(У DrtibaseSetup.cs
3
Change
edit
lock, edit
lock, edit
lock, edit
edit
edit
add
edit
add
add
add
add
_
Folder -
1 fl |ЩД
i
CAbt^fe\LitwareHR.R*cruhjng.WoiWlow...
C:\Lrtw«fe\Litv»ariHR.Recruftjng.Woikflow...
С \Lrtware\Shp RuntimcServices
G\Lrtware\Shp.Runhme,Services
C\Lrtwiie\Shp PunhmtServieer
CALit*areHR Solution
С UrtwareHR Solution
С \Ut*areHR Solution
C:\LrtwareHR Solution
C:\litwareHR SclutionVTestPiojectl
С \LitwireHR SoluUonXTesiProjecU
C:\LitwareHR SolutienVTestProjectl
Y Jpheckln 1 1
li •
* j
!| i
1,
*!i
i
L'
i
I
1 >j
"'
Camel J
Рис. 24.10. Диалоговое окно Check In
Глава 24. Система управления исходными кодами
933
Кнопки верхней панели инструментов позволяют вам управлять просмотром файлов,
скрывать/показывать область комментариев или даже фильтровать список файлов (по решениям).
Вы можете получить доступ к этому окну и из окна Source Control Explorer: выберите ваш
файл (или файлы), щелкните правой кнопкой мыши и выберите команду Check In для того,
чтобы увидеть диалоговое окно Check In.
В левой части диалогового окна Check In находятся кнопки, называемые каналами, которые
используются для перевода диалогового окна в различные режимы. Кроме канала Source
Files (рис. 24.10) вы можете выбрать каналы для работы с Work Items, Check-In Notes и
Policy Warnings. Перед тем как заняться этими темами, изучим третий способ возврата
изменений в хранилище исходных кодов — при помощи окна Pending Changes.
Возврат изменений при помощи окна Pending Changes
Окно Pending Changes реализовано в Visual Studio как инструментальное окно. Вы
открываете его посредством выбора View | Other Windows | Pending Changes. Можете также
запустить это окно при помощи щелчка правой кнопкой мыши по любому элементу в Solution
Explorer и последующего выбора пункта View Pending Changes.
Это окно (рис. 24.11) содержит список всех ожидающих изменений в вашей текущей
рабочей области. Каждый извлеченный вами файл виден в этом окне.
Pending Changes - Source file» • Worfepace: LPOWERS1
PI
ftk-a 1
|y
iu
r
j^CheckJn -^SMve ^ilMhelvt Q iQ ~ ' - ^ - 3 I 3 |Wod«pec*; LPOWERS1
i СощгпепЬ
; Refactor sprint- new naming conventions (APPROVED)
Name Change
j (?> l£j NegotutionAchvrtyxs edit
| §/} :£ TenantPolicyActivity.es lock, edit
| M <jjj DatemodeILogk.cs lock, edit
[ Щ" Ч& DatamodelLogicHeiper.cs lock, edit
' |V] r& Systemlogicxs edit
[4 £&UtwareHR.sln edit
. ffi 0) LrtwafeHR.vsmdi add
, ffl 5j LJhweHR.vss«:c edit
(if i iiS LocaFTestRim^estrunco nfig add
; kl Liapp.config add
1- l,JSL lA^nmnTefoq» «d<LY —.
Folder -
OVt itwareVL itwarrHR.Recwrting.Workf low«\Activrties
C:\Lthwaie\LitwareH R.RecTuitingWoikflovrt'.Actwtties
C:\Lttvvare\Shp.Runlime.Services
GVLitware\ShpJfantirne,5ervices
C:\Lrtware\Shp A untime.Sen/ie es
C:\LitwareHR Solution
C:\LrtwareHRSolution
C:\LrtwareHR Solution
CrVtrtwareHR Solution
C:\LttwaieHR SolutionUestPtojecll
QMih^ri'HRJ^IiitifmXTi^Prmytl
Ш
* 1
J
•*• 1
*
J
Рис. 24.11. Просмотр ожидающих изменений
Окно Pending Changes структурировано так же, как и окно Check In, и поддерживает те же
самые каналы. Есть только несколько незначительных отличий в панели инструментов,
которая поддерживает две новые кнопки: Shelve и Unshelve. Откладывание описывается далее
в этой главе.
Политики возврата
Команды проектов имеют разные правила, которые пользователи должны соблюдать тогда,
когда определяют необходимость проведения возврата. Например, возврат файла класса,
который не компилируется, — это, вероятно, не слишком хорошая идея. Любой другой со-
934
Часть VI. Система командной работы Visual Studio Team System
трудник проекта, который после этого выполнит команду Get Latest или Check In для этого
файла, повредит свой проект внесенными вами изменениями» Система управления
исходными кодами Team Foundation Source Control понимает важность контрольных возвратов и
предоставляет способ обеспечить выполнение некоторых правил для возвратов (при
помощи использования политик возврата).
В TFS имеются три готовых политики возврата:
□ Code Analysis Policy (Политика анализа кода)— перед разрешением возврата
выполняются определенные тесты по анализу кода;
□ Testing Policy (Политика тестирования) — перед возвратом кода выполняются
определенные его тесты (выбранные из списка всех известных тестов);
П Work Items Policy (Политика элементарных работ) — с возвратом должна быть связана
одна или несколько элементарных работ.
Политики возврата обычно настраиваются и конфигурируются (администраторами проекта)
отдельно для каждого проекта; набор политик по умолчанию обычно определяется
используемым шаблоном процесса TFS. Для указания использующихся в вашем текущем проекте
политик вы должны зайти в настройки системы управления исходными кодами Team
Foundation Server (для этого надо выбрать Team | Team Project Settings | Source Control
Settings). Окно Source Control Settings имеет вкладку Check-in Policy, которая позволяет
вам выбрать политики для текущего проекта (рис. 24.12).
Source Control Settings - eBankingl
lSi**&d
' Check-out Setting? Check-in Pchcy Check-in Notts'
Policy Type Description
ШШ ^- ■ ■ ■-■ шт* шшы *й«ш»»1ж:
I
С
OK
I **~
1 gemove
[ £<"bfe
Cancel
]
)
1
Рис. 24.12. Добавление политики Check-in Policy в текущий проект
Для каждой политики могут потребоваться дополнительные настройки. Например,
добавление политики Code Analysis породит еще одно диалоговое окно, в котором указываются
конкретные тесты анализа кода, которые должны быть выполнены (рис. 24.13).
Если задействованы политики возврата, то при выборе канала Policy Warnings (либо в окне
Check-In, либо в окне Pending Changes) вы увидите нарушения политики. Например, на
Глава 24. Система управления исходными кодами
935
рис. 24.14 показаны нарушения политики, которые произошли вследствие включения
политики Code Analysis и последующей попытки зарегистрировать файл класса Visual Basic без
прогона Code Analyzer.
Cad* Analysis Policy Editor
У Enforce check-in to only contain files that are part of current solution
] Enforce CC-+ Code Analysis (/analyse}
[■/ Enforce Code Analysis For bjanagtd Code
Rule settings for Managed Code Analysis.
Rules Enabled Dunng Code Analysis
'♦ У_ Design Rules
Z |> Globalization Rules
-* [</ Interoperability Rules
-> [£ Maintainability Rules
>/| СД1500 Variable names should not match fiek
i V] CA1501 Avoid excessive inheritance
J ^} CA1501 Avoid excessive complexity
J\ CA1504 Review misleading field names
i J\ СД1505 A.oid unmaintainable code
1 _/j СД1506 A.oid excessive class coupling
' £ k Mobility Rules
♦' (/ Naming Rules
j ♦' [V] Perfcrmance Rules
\Ъ\У Portability Rules
\ [-, 1 i П..-L .^ П ...
1
1<*> ЫЗУ1
u
Treat Warning к Error
L
! '
Г
L
name)
OK
Г"
L
L
(_•
•
1
"^
г
"
Г
) г
C*ncel
Рис. 24.13. Настройка политики Code Analysis
H
ChecV In - -olicy Warnings
ШШйшШШлрГШШШЩШШ Шт шрAШШШ|ШШР Ш
^ & TF1Q139' The following crxek-in policies have not been satisfied
Source files Oescnption
й
iVork Items
u
Checl-in
Motes
£olicy
Warnings
iheckln
Рис. 24.14. Предупреждения политики
Если вы попытаетесь вернуть эти файлы, то появится диалоговое окно Policy Failure
(рис. 24.15). Вы можете сделать выбор: прервать возврат и выполнить политику или
настоять на своем и предоставить комментарий с объяснением причин вашего решения об обходе
политики.
936
Часть VI. Система командной работы Visual Studio Team System
Policy Failure
1 cj l^rgj^'1
1 Checkin csnnot proceed because the policy requirements have
«~*A not been satisfied.
G3 fifvernde policy failure and continue checkin
fieasom
Quick check- in prior to server change-out..
[ 0r£
Jl
^
Cancel
Рис. 24.15. Преодоление ограничения политики
Добавление примечания при возврате
Примечания при возврате — это короткие текстовые заметки, которые вы можете
прикрепить к возвращаемым элементам во время процесса возврата. Примечания при возврате
становятся частью исторических метаданных файла, сохраняются в хранилище исходных кодов
и могут позднее просматриваться (чтобы получить представление об истории изменений
элемента).
Примечание при возврате состоит из названия категории и текста самого примечания. По
умолчанию имеются три категории примечаний: рецензент по безопасности, рецензент по
коду и рецензент по производительности. При выполнении возврата вы можете нажать
кнопку канала Check-in Notes для ввода примечания. Каждая категория примечания имеет
соответствующее текстовое поле, в котором содержится текст примечания (рис. 24.16).
Check In -Check-in Notes
i i3
i Source files
i u
'
i
^Q'kltom
и
Check-in
Botes
1Л
Eolicy
Warning»
Z Cade Reviewer
Reference against global naming standard* work item
j -, Security Reviewer
j Naming change* to login-esp* - pleese re-check credential validation/lookup
- Performance Reviewer
1
i
i
•' £hecfcin j
1^0'
i !
i
i
Cancel ]
Рис. 24.16. Добавление примечаний в возврат
Примечания при возврате могут быть обязательными для проекта, причем вы можете также
добавлять собственные категории примечаний при возврате. Эти настройки можно изменять
Глава 24. Система управления исходными кодами
937
в диалоговом окне Source Control Settings, которое мы описывали при нашем обсуждении
управления политиками возврата. Вкладка Check-in Notes (рис. 24.17) позволяет вам
добавлять или удалять категории примечаний.
Source Control Settings - UtmreHR Agile
имуща
9^ск:ои1М'.*9? !;€ОД-1п
Check-in Notes]
Security Reviewer
Performance Reviewer
Remove:
_'[♦)
[ <Ж ] ' Cancel
Рис. 24.17. Управление в проекте примечаниями при возврате
Например, вы можете добавить новый запрос для примечания (ввести номер статьи базыг
данных). Просто нажмите кнопку Add, заполните текст запроса, а затем укажите,
обязательно ли данное примечание (рис. 24.18).
Add Check-in Mote
1 Iftle:
| KB Article
П B*4u"erf o° check-ins
1 A4d
1 $ ЬШПШр
[ C«nceJ ] |i
Рис. 24.18. Добавление новой категории примечаний при возврате
Использование элементарных работ
Последняя функциональная возможность возврата, которую мы рассмотрим, — это
концепция связи возвратов с элементарными работами. Элементарные работы, которые мы
подробно опишем в следующей главе, используются для представления в проекте различных
задач, начиная с отчетов об ошибках и до обычных текущих задач. Элементарные работы
могут быть связаны с различными элементами системы TFS; сами возвраты также являются
такими элементами.
938
Часть VI. Система командной работы Visual Studio Team System
Для связывания возврата с элементарной работой выберите канал Work Items, а затем
сделайте выбор из списка имеющихся элементарных работ. Путем связывания элементарных
работ с возвратом вы помогаете интегрировать различные рабочие наборы проекта в
цельное представление, характеризующее продвижение проекта. Рассмотрим, например,
разработчика, который создал библиотеку классов (как одну из задач проекта). После
тестирования он определил, что один из его классов в одном из тестовых случаев не работает
надлежащим образом. Вместо того чтобы сообщать об исключительном состоянии, класс
его проглатывает. В командной системе разработки ошибка оформлена в виде элементарной
работы. Для решения этой проблемы разработчик извлекает файл класса, исправляет
ошибку, а затем возвращает файл. В диалоговом окне возврата он может просто связать
элементарную работу с возвратом, либо сделать еще один шаг и указать, что данный возврат
фактически решает проблему, документированную в элементарной работе (рис. 24.19).
Check In - Work Items (LitwareHR Agile/Team Quenes/AH Work Items)
1
Source bits
Л
■23*
V£ork items
! 1
Query, aji Work Items
Workltem... ID
I , Task 284
LL Task 290
[I Task 291
D Task 292
' 2sa* L Task 293
| Checbtn £j Task 29Д
l_ Task 295
A LTasfc 296
ГТ L Task 297
Eoltcv
' Warnings ^ Taifc m
[ Task 299
I 1 Task 300
| l[ Task 301
; ' ) Task 302
' {\J Bug 303
- ,.. < Search*
Title
Set up: Migration of Sour
Set up: Migration of Wor„.
Set up- Set Check-in Pott
Set up. Configure Build
Set up' Send Mail to User,,,
Create Vision Statement
Set up' Create Project De
Create Personas
Define Iteration Length
Create Test Approach W
Brainstorm and Prioritize.
Brainstorm and Prioritize
Set up: Create Project Str..
Create Iteration Plan
Bug: ISecuntyProvider im
State
Actrve
Active
Actrve
Active
Actrve
Active
Actrve
Active
Actrve
Active
Actrve
Active
Actrve
Active
Actrve
- ** * 3
Check-i
Resolve
[ £heckln | [
[flbwSfcd]
n Action *
1
'-
'
i
Cancel
i
Рис. 24.19. Связывание с элементарной работой
Появляющиеся в списке элементарные работы фактически возвращены из запроса, который
выполняется по базе данных элементарных работ. Вы можете изменить этот запрос (при
помощи выпадающего элемента в верхней части окна канала Work Items), либо можете даже
выполнить поиск по всем элементарным работам. Как уже упоминалось, элементарные
работы и запросы (и многое другое) описаны в главе 25.
Концепция наборов изменений
До настоящего времени наше обсуждение процесса извлечения/возврата было чрезвычайно
упрощенным, сосредоточенным на проверке файла, выполнении изменений и последующего
возврата файла обратно в базу данных. Фактически же мы говорили о концепции наборов
изменений. Набор изменений — это компиляция всей информации, связанной с операцией
возврата.
Глава 24. Система управления исходными кодами
939
Для расширения нашего предыдущего примера с исправлением ошибки предположим, что
для исправления этой ошибки вам нужно вернуть три различных файла. Когда вы
выполняете возврат, то одновременно возвращаете все три эти файла и связываете их возврат с
элементарной работой по данной ошибке. Именно здесь вступает в игру концепция набора
изменений: набор группирует эти три файла в единый объект. Иначе говоря, ошибка
связывается с этими тремя файлами как с единым целым. Она связывается с набором
изменений. Все соответствующие элементарные работы, примечания и метаданные об
изменениях кода (дата, время, пользователь) также связываются с набором изменений как с единым
целым (а не с отдельными файлами).
Примечание
Необходимо отметить, что возвраты и наборы изменений по своей сущности
атомарны. То есть сервер Team Foundation Server гарантирует, что весь набор
изменений был зафиксирован полностью; у вас, например, никогда не получится такой
ситуации, что вы попытались сделать возврат трех файлов и только два из них
закончились в транзакции успешно. Либо выполняются все три, либо (в случае
ошибки) ни один из них.
Диаграмма на рис. 24.20 показывает, как наборы изменений вписываются в общий процесс
управления исходными кодами.
Каждому набору изменений присваивается инкрементальный числовой идентификатор.
//
°0*/
Ошибка
:р?*еНо
</
Ч;
1^
■"--.с*.
*ч,
Jfj
Система управления
исходными кодами
TFSC
х>
ъ
ч
Разработчик
Исходный
файл 1
Исходный
файл 2
Исходный
1 файл 3
Метаданные регистрации
Политика
регистрации
Примечания
Элементарные работы
Комментарии
Массив изменений
2989328
Рис. 24.20. Наборы изменений
31 Зак 3716
940
Часть VI. Система командной работы Visual Studio Team System
Откладывание кода
Иногда разработчику может понадобиться отложить свою текущую работу или перейти к
другим задачам до того, как файлы будут готовы для возврата. Например, вы можете
находиться в самом разгаре работы над некими файлами кода, когда вдруг регистрируется
ошибка, которая требует вашего срочного внимания. Или, возможно, вы не завершили
необходимое изменение в коде перед отъездом в отпуск. В обоих этих случаях вы не хотите
возвращать свою работу, поскольку она не закончена. Вы не хотите также оставлять эту
работу извлеченной локально на ваш компьютер на длительный промежуток времени.
Откладывание позволяет вам взять некоторые (или все) ваши ожидающие изменения и сохранить
их в базе данных хранилища TFS без возврата.
Откладывание работает аналогично процессу возврата и обрабатывается окном Shelve. Для
того чтобы открыть окно Shelve, можете нажать кнопку Shelve в окне Pending Changes,
либо кнопку Shelve Pending Changes в Source Control Explorer. Либо вы можете
использовать Solution Explorer: щелкните файл правой кнопкой мыши и выберите пункт Shelve
Pending Changes.
Когда вы откладываете свой код, то создаете своего рода "набор отложенных изменений",
который аналогичен набору изменений, но применим только к отложенному коду. Вы
получите запрос на присваивание имени вашему "набору отложенных изменений" (для того
чтобы его можно было извлечь впоследствии). На рис. 24.21 показаны отложенные файлы кода
в окне Shelve.
Shelve - Source Files - Workspace: Projects-LrtwtreHR
Shetveset name:
Login and sup
Source files
iVorfc Items
presstons shetveset
СощтелЬ
' Shelving to work on new pn 0 bugs
ШШШ
i
i
J 1
u
Check-in
Notes
tome
V) Л\ Login.aspx
^ ^j Login.ispx.cs
'<?) ^ Login.aspit.designer.cs
Vj i) ConsUnts.cs
39 jtf GJotafSuppreumns.cs
Щ "$] GlcbalSuppremans^s
Sfl ^ Negottetion.es
;v] =Й Positmn.cs
U 31 Rejection.cs
У\ ^ Resume.cs
V] 3) SilverlightAccount cs
Gunge
«Tit
edit
edit
edit
edit
edit
edit
edit
edit
edit
edit
Folder
CAUsersMpowers.REDMONOVDocumenHWriual Studio 2008\P~
CAUsersMpowers.REDMQND\E>ocumentsWtsual Studio 200в\Р„
G\Users\lpowers.REDMOMDtvDocuments\Visual Studio 2008ЧР
CAUsersMpowers.RtOMONOVDocumentsWHual Studio 2008\P~
C:\lh«\lpowers.RfDMOND\DocumentsWisual Studio 200B\P..
C:\Users\lpowere.REDMOrVff)\Documefits\VKUBl Studio 2008\P
CAUsers\lpowers.REDMONDM)ocuments\Vbual Studio 2008VPW
Ct\Usen\lpowers.REDMONOSDocuments\Visual Studio 2008\P...
O\U$ers\lpowere.RtDM0ND\Document5\Vi5ual Studio 2008\P„
C;\Users\lpower$.REDMONOVDocuments\VkSual Studio 2UQB\P~.
CtVUsefs\lpowervREDM0N04Documents\Visual Studio 2008NP..
[71 Preserve pending changes locally
_J evaluate policies and check-in note* before shelving
| Shrive
Рис. 24.21. Откладывание изменений кода
Глава 24. Система управления исходными кодами
941
Возврат отложенных изменений
После создания набора отложенных изменений вы можете в любое время вернуть его. После
этого все отложенные файлы вернутся в вашу рабочую область. Нажмите кнопку Unshelve в
окне Pending Changes для того, чтобы открыть окно Unshelve.
Все ваши ранее созданные наборы отложенных изменений будут видны; вы просто
выбираете тот, который вам нужней, и нажимаете кнопку Unshelve (рис. 24.22). Обратите
внимание, что вы можете изменить поле имени владельца и начать новый поиск всех наборов
отложенных изменений, принадлежащих данному пользователю.
Unshelve
Find iberveieti
Owner дет*:
Darren
Results
Shelves** Name * Ditc Comment
[ lietoW^ | Щ* . ] [ №<** | [ Cl<*se |
Рис. 24.22. Возврат отложенных изменений
Слияние изменений
Когда мы представляли вам процесс извлечения, то упоминали, что извлечения могут быть
как исключительными, так и разделяемыми. В случае разделяемых извлечений (когда более
чем один человек активно изменяет один и тот же файл) система Team Foundation
обеспечивает способ объединения этих изменений в новый набор изменений, который заменит
текущую версию файла на сервере.
Рассмотрим самую обычную ситуацию: разработчик А извлекает файл класса и работает с
методом этого класса. Когда файл извлекается, разработчику В назначают ошибку и он
должен работать над другим методом в этом же файле кода. Разработчик В извлекает файл и
работает со своим методом. Разработчик А возвращает свои изменения, а днем позже
разработчик В также возвращает свои изменения. В этот момент получается конфликт: поскольку
у разработчика В в его рабочей области никогда не было файла исходного кода с
поправками разработчика А, то необходимо что-то сделать для слияния этих двух файлов. Эта
ситуация обрабатывается инструментом слияния.
Когда разработчик В начинает возвращать свой файл, то система управления исходными
кодами Team Foundation автоматически распознает этот конфликт. Это приведет к показу
окна Resolve Conflicts (рис. 24.23).
.... ... . .
,.
\ЛШШ1'
'&*' ]
942
Часть VI. Система командной работы Visual Studio Team System
Для разрешения конфликтов в указанном файле вы нажимаете кнопку Resolve, которая
запускает еще одно окно — Resolve Version Conflict (рис. 24.24), которое сообщает
дополнительные подробности по конфликту файлов и предлагает некоторые варианты разрешения
конфликта.
Имеются четыре варианта:
□ позволить Visual Studio автоматически объединить изменения;
□ объединить изменения в двух файлах при помощи инструмента слияния;
□ отменить изменения, которые были сделаны в локальной копии файла;
□ отменить изменения, которые были сделаны в серверной копии файла.
1Еыаш
Resolve Conflicts
Jk No files checked in due to conflicting changes To resolve conflicts, select items and click Resolve
Conflicts:
Name Type Description Path *■ !
VgJ Login aspx.cs Version A newer version ousts on the server, S/lrtwareHR Agile/LrtvvareHR/lrt%»<areHR.PrivateApp.v
1 remaining, 0 resolved
Auto Merge All ^J £esor*em
Рис. 24.23. Окно Resolve Conflicts
Resolve Version Conflict - login,aspxcs
D\Usets\lpowers.R£DMOND\DocumentsWisual Studio 2008 tProjecttWS
Unleashed4sL/hvareHR\Litvi>areHR\LirwareHR.PnvateApp.VVebLIX'\loginrispx.cs could not be checked
in because a newer version easts on the server.
Conflict details
Path: CAUsers\tpoweRkREDMOND\DocumentsWKual Studio 2008\ProjectsWS Unleash
Changer 3 local 3 server. 0 both, 0 conflicting
Resolution options
« Merge changes for me
С Merge changes in merge}ooi
i j y.ndo my local changes
- discard server changes
£етрд*е»>:
oo
Рис. 24.24. Окно Resolve Version Conflict
Во всех случаях (кроме самых простых) вам придется использовать инструмент слияния для
того, чтобы явным образом указать Visual Studio, как необходимо обработать конфликт. Для
Глава 24. Система управления исходными кодами
943
того чтобы облегчить понимание сути конфликта, вы можете запустить в этом окне
инструмент сравнения файлов File Comparison.
Сравнение отличий файлов
Инструмент File Comparison (рис. 24.25) обеспечивает простой параллельный показ двух
файлов (серверного и локального) и визуально выделяет текстовые различия при помощи
изменения цвета фона. Синий цвет означает измененный текст, зеленый цвет —
вставленный текст, а красный цвет — удаленный текст.
При помощи этого инструмента редактировать файлы вы не сможете; это делается
посредством инструмента слияния.
j£§ Differences between «HR/'Litwef«Hll.PnvBteApp.WebUX/Lo3inAjpxci,,C208 (server) 2/16/2098 4 23 РЬ/ and Log n.ajpxcs.^- 1 * V ШЙдд
[ **
M
**i % i'-jmmm.**** v
i^ eHR/lrtwareHR.PnvBteApp.WebUX/Login «px.cs;C208 (server) 11», \% LitwareHR\LrNv»reHR.PrivateApp WebUXsLcgrn aspx.o (ioca!) 2'
[ 36
3T»
36
39
HO
41
42
43
44
MS
46
r
46
49
50
ы
52
!S3
|S4
55
56
Г
56
59
60
61
62
П*М
i
* \ i
< 3«
«jtrirg retlTrl ** Requires.Qi.ery3tr mg ["I 37
33
if ('axring laNullCrEmptyjrecUrin 39
{ *0
LogmCsrvtrol.CreaceDaerUrl - atnr 41
5 42
43
string errar = Ke<jueat.QtferyStruig[',2:2 *4
if («atriig.IafUlierEirpty (error)) *5
i 46
ShowGlcbalError(error); 47
} 43
\ *9
50
proceeded, void Logir.z;ontroI_LoQ5edIn(objet 51
i 52
i.aing (SyatewServiceCr-anael charnel - 53
I 54
chanael Client;Crefittntie.Ia.rj4prNanw 55
56
channel. Clie.r]tCredentiala.OaerHam<57
53
} 5Э
] 60
61
private void 5hc.wGl=balError (atring error) 62
{ 63
switch (error) 64
^ Changed Text ':»scrtt*^ 7eift ,Lnl, Coll
{
string lPcur^tJri - Req^e** Q^tt y*>i i
if ('acring.IaNullOrErcpty(recurnUrl
\
IcginContro;. .CreateJaerL'ri « at
}
string error = Request. 3ueryStrir.e{
if (latrmg.IaMullDrEicpty [error> )
<
ShowGlobaAErrcr(errcr);
}
}
protected vcid LcgxnCcntrol_Logged;n (cb
{
uairg (SyatemServiceCnarnel channel
{
.utlnij чря * K^lpfrs-Cor-vernUie
charnel.ClientCredeiticla.DaeiU
c>ianrel. Client Credentials. OaerN
o,\-jr~\.T-'-qi>.
)
}
private voiq ShovGlobalErrcr (atrmg err
switch (errcrt
Рис. 24.25. Использование инструмента File Comparison
Использование инструмента слияния
Инструмент слияния обеспечивает такое же визуальное представление, как и инструмент
сравнения файлов: он выделяет текстовые различия между двумя окнами. Но этот
инструмент показывает также и третье представление — результат слияния. На рис. 24.26 показан
вид окна инструмента слияния.
Перемещая курсор в панели файла слияния, вы изменяете ваше текущее положение, а затем
вставляете изменения из любого из двух конфликтующих файлов. В нашем примере мы
хотели добавить в файл слияния два метода. Один метод имеется в серверной копии, а другой
метод — в локальной копии. Для создания файла слияния вам нужно сначала выбрать
изменение, выделенное в серверной копии (верхняя левая панель). При этом данный блок изме-
944
Часть VI. Система командной работы Visual Studio Team System
ненного текста будет вставлен в пустой файл слияния (нижняя панель). Затем вы можете
переместить курсор в точку после добавленного текста метода, а потом щелкнуть по
выделенному (измененному) тексту локальной копии (верхняя правая панель). Инструмент
слияния добавит этот текст в файл слияния, что и даст нам желаемый результат: новую версию
файла, в которой объединяется содержимое серверной и локальной копий.
■r"lMiiW
gH vclmp213707.cs - Merge Theirs (logiruBspxccC208) and Yours (Logiaaspxcs)
j '' Some diangetauid not be ^tomatcety merged,
• i / . Pteaeerev*we«fca*iVtnglir«end«^gr*arbotoorthetfwTQ^
! \J2J CkkenHlctregen In the Lflper pines or type rJrelcmer pane to «ppryidwv
OK to contnue.
Ы Theiri (Logm.t$p*.c*;C20ej
££ Vours (iog?n**spx.£ij
33 public partial class Login : BasePage
34 i
35 protected void Page_Laed (object sender, f
36 {
37 serine; retUrl - Request.QuezyStrlngf
38
39 It <> string. IsNullOrEsastyiretUrl})
40 {
41 ^ LoginCotstzcl.CreeteUserUrl - stzi
BasePage
32
33 public partial class Login
34 ( |
35 protected void Face Load{object sender
3« « " [J
string retuxnUzl - Request.QuerySt
0
it {■string. IsHullOrEiBpty (returnUr
i
LoginCoatrol.CreateUaerOrl - a''
^vctmp213707xs \_
merged file
33 public partial class begin : BasePage
34 {
35 protected void Page_Load(object sender, EventArgs e)
31»
38
39
40
string returnOrl - Request.QueryString["ReturnUrl*];
if (!string.IsMullOrEapty(returnUrl))
и
{
41 _. LoalnCcntrol.CreateUserUrl - strina.Fozeat {Culture Inzc.CurreiitCulture. Resource w
4 \ ►
* Viewing Change 1 )-^Тс»Ы Change* 6. Conflicts D f& (Ln37,Coll ( |DeletedTe* jCb*nged~Text (inverted Text
|7 Navigate tondctsonly
OK
Рис. 24.26. Слияние изменений
Ветвление и слияние
Ветвление и слияние — это два различных, но связанных процесса управления деревом
исходных кодов в хранилище сервера Team Foundation Server. Эти операции часто
выполняются командами разработчиков, которым необходимо параллельно работать над разными
версиями кода, а затем в некоторый момент свести эти изменения воедино для того, чтобы
выпустить версию.
Вследствие итеративного характера разработки и сложившихся на современном рынке
программного обеспечения обстоятельств у команд разработчиков часто имеются весьма
сложные потребности в смысле обслуживания дерева исходных кодов. Дерево исходных
кодов — это иерархическое представление различных файлов кода по версиям решений. Для
усвоения идеи ветвления давайте обсудим проблему в контексте рабочего сценария.
Предположим, что команда разработчиков усердно работает над неким революционным
программным обеспечением, которое способно перевернуть рынок. План реализации
продукта предусматривает срочный выпуск версии 1.0 для того, чтобы сосредоточить внимание
на фундаментальных возможностях, после чего предусмотрен быстрый выпуск доработки, в
Глава 24. Система управления исходными кодами
945
которой будут реализованы более сложные вопросы. Руководство проекта принимает
решение работать двумя разными командами. Одна начнет разрабатывать исходную архитектуру
и будет работать над версией 1.0. Когда будет наработан достаточный объем по архитектуре
и проекту и будет создан достаточный объем кода, тогда вторая команда начнет работу над
версией 2.0. Поскольку фазы их разработки перекрываются, то и исходные коды также
будут в определенном смысле "перекрываться".
Рассмотрим диаграмму рис. 24.27; на ней изображено представление дерева исходных кодов
с учетом версий, где видна необходимость ответвления версии 2.0 от исходной версии 1.0.
Впоследствии в некоторый момент времени полностью завершенная версия 1.0 вольется в
дерево версии 2.0. Обратите также внимание, что команда проекта предвидит выпуск
исправления для корректировки неизбежных проблем версии 2.0. Эти изменения также
придется ответвлять, а затем объединять в дереве исходных кодов.
1,0
WbitongSet
\[
1.0
Betal
4
1.0
Release
^branch
^
2.0
Writing Set
П^
2.0
Beta
11
2.0
Release
<>
2.1
Working Set
^vjrancfi
2.0.1
Working Set
Рис. 24.27. Ветвление и слияние дерева исходных кодов
Ветвление
Ветвление — это копирование кода из текущего дерева исходных кодов и размещение этого
кода в новой ветке дерева. Для облегчения понимания этой концепции необходимо
представить себе это в виде каталогов: для ветвления необходимо взять текущий каталог с кодом
(исходный) и создать новый каталог с копией кодов исходного каталога (целевой). Иначе
говоря, вы можете представлять себе ветвление как копирование в файловой системе: вы
берете файлы из одного места и делаете их копию в другом месте. После этого разработка
может йродолжаться параллельно в обоих каталогах.
Ветвление в системе Team Foundation выполняется при помощи Source Control Explorer.
Сначала вам нужно перейти в исходный каталог на сервере, затем щелкнуть по нему правой
кнопкой мыши и выбрать пункт Branch. В диалоговом окне Branch (рис. 24.28) укажите
946. ' Часть VI. Система командной работы Visual Studio Team System
название для новой ветви (или целевой каталог) и выберите версию кода из исходного
каталога. Нажмите кнопку ОК для создания ветви; она автоматически становится видна в
Source Control Explorer.
Branch
Source.
■ S/'LttwarcHR. AgilfLthvareHR/litwifeHR-Alrthenticftion.SvcHcit
Iarget-
S/Lft*areHRAgtk''Lrtv»,areHR./Lft*BieHRAuthentJcation.SvcHoit-pjtcr+>f*nch
Branch from version
B*. [ Latest Vftroon ^
Jj £reate local working copies for One new branch
l_2L^
ЦУшШ!
1 Browse», J
Cancel ]
Рис. 24.28. Ветвление исходного кода при помощи Source Control Explorer
Слияние
Слияние— это противоположная ветвлению операция: вместо ответвления от дерева
исходных кодов производится объединение двух элементов дерева исходных кодов в один
зшемент.
Source Control r/erge Wizard
-Г*" r-1 Select the source and target branches for the merge operation
Select the branch that cents ins the changes you would (itcc to merge.
Source branch.
S/'UtwareHR Agile/LiUareHrVLKwareHR Authentication^cHost
Select the source branch changes you would like to merge
« AJI changes up to a specific version
Selected changesets
Select the target branch for the merge operation. The drop-down list contains all
applicable to the selected source branch.
Iarget branch'
[
-•••;> ' -
[ ^ IfagJSnj ■
firovwse,..
target branches
*'
| Cancel J
Рис. 24.29. Использование мастера Source Control Merge Wizard
Как и при ветвлении, вы запускаете данный процесс из Source Control Explorer. Щелкните
правой кнопкой мыши по одному из исходных каталогов (который будет участвовать в
слиянии) и выберите пункт Merge.
Глава 24. Система управления исходными кодами
947
Мастер слияния Source Control Merge Wizard (рис. 24.29) соберет всю необходимую
информацию об операции слияния. Точнее говоря, вас попросят указать:
□ исходную ветвь;
□ целевую ветвь;
□ те изменения, которые вы хотите объединить (все изменения исходной ветви или только
определенные наборы изменений);
□ те версии исходного кода, которые вы хотите объединить.
Нажатие кнопки Finish в конце мастера завершит слияние.
Резюме
В этой главе мы рассмотрели возможности и инструменты системы управления исходными
кодами Team Foundation. Мы показали архитектуру серверной стороны и обсудили, как
данная система использует операционную систему Windows и сервер SQL Server для
обеспечения исключительно надежной и масштабируемой инфраструктуры для системы управления
исходными кодами.
Мы описали основные концепции управления исходными кодами и исследовали
соответствие системы Team Foundation этим основам.
Кроме того, мы нарисовали общую картину мощного набора инструментов, которые имеют
в своем распоряжении пользователи системы Visual Studio Team System. Эти инструменты
используются для соблюдения политик, выполнения ветвлений и слияний, а также
управления исходными кодами. Мы изучили также использование инструментов управления
исходными кодами для решения различных задач:
□ создание новых рабочих областей;
□ извлечение файлов из хранилища исходных кодов;
□ возврат наборов изменений;
□ откладывание изменений файлов;
□ разрешение конфликтов возврата;
□ ветвление и слияние в дереве исходных кодов.
Поскольку все эти инструменты интегрированы в среду разработки Visual Studio и
поскольку сама система управления исходными кодами интегрирована в концепции управления
проектами, то система управления исходными кодами Team Foundation обеспечивает
беспроблемную интеграцию с остальными задачами разработки проекта.
Глава 25
Отслеживание элементарных работ
Процесс командной разработки программного обеспечения нисколько не проще самого
написания кода. Разработчики хотят сосредоточиться на создании хорошего кода. Однако
клиенты, спонсоры проекта, менеджеры проекта, тестеры (и другие участники)
заинтересованы в отслеживании продвижения этого кода и в определении общего состояния процесса.
Чтобы поддерживать всех в курсе событий, необходимо тратить много времени на
совещания. Эти совещания порождают отчеты, которые часто отстают от того, что реально
происходит (еще до того, как с ними ознакомятся те, для кого они предназначены).
Многие фирмы по разработке программного обеспечения научились хорошо справляться с
этим разрывом. Они все лучше оценивают, документируют и отслеживают продвижение
проектов. Для этого они реализовали такие методики, как Agile, SCRUM, RUP, MSF, CMMI
и экстремальное программирование. Эти методики были важной частью взросления
процесса разработки программного обеспечения. Однако инструменты поддержки этих методик в
платформах разработки начинают распространяться только сейчас.
При помощи сервера Team Foundation Server и отслеживания элементарных работ вы
можете вернуться к созданию кода и в то же время обеспечить предоставление информации по
состоянию и продвижению разработки этого кода. Также важно и то, что остальные члены
команды могут предоставить вам ключевую информацию при помощи интегрированной
среды разработки, в том числе: информацию по результатам тестов, управление
техническими требованиями, сценарии и т. д.
В этой главе мы сосредоточимся непосредственно на элементарных работах, поскольку они
являются теми элементами информации, которые отслеживаются в процессе разработки
программного обеспечения и обеспечивают чрезвычайно необходимые показатели этого
процесса. Мы будем рассматривать элементарные работы с точки зрения различных членов
команды в течение всего жизненного цикла разработки программного обеспечения
(Software Development Life Cycle, SDLC). Затем мы изучим встроенные в Visual Studio 2008
инструменты для работы с элементарными работами и их модификации.
Примечание
Для понимания поставляемых в составе TFS методик см. главу 22. Данная же глава
фокусируется на элементарных работах и на том, как они связаны с процессом
разработки и Visual Studio 2008. Там, где это необходимо, мы обсуждаем элементарные
Глава 25. Отслеживание элементарных работ
949
работы в контексте MSF Agile и MSF CMMI. Однако элементарные работы являются
только частью общей методики.
Когда вы определяете Web-сайт проекта, то система Team System создает страницы,
на которых имеется руководство по избранной методике. Эти страницы являются
обязательным для изучения материалом и могут служить кратким справочным
руководством на тот случай, если вы запутаетесь в методике.
Разбираемся с элементарными работами
Элементарная работа в системе Visual Studio Team System — это именно то, на что похоже
это название: описание работы в проекте разработки. Элементарная работа регистрирует эту
работу— а это позволяет назначать работу, отслеживать ее, связывать с другой работой и
делать по ней отчеты. Подобно задаче проекта, элементарная работа имеет название и
описание подлежащей выполнению работы. У нее есть текущий владелец, история, связанная с
ней информация, срответствующий этап жизненного цикла (или рабочего процесса) и
текущее состояние. Однако разница состоит в том, что в отличие от простой задачи проекта вся
информация по элементарной работе содержится на центральном сервере и становится
моментально доступной всем членам команды при выполнении работы. Именно по этой
причине элементарные работы являются фундаментальным приводным механизмом
совместной работы в системе Team System.
Роль элементарных работ и SDLC
Элементарные работы могут описывать большое разнообразие работ, выполняемых в
данном проекте. Элементарные работы могут создаваться для технических требований проекта,
задач, запросов на изменения, экспертизы кода, ошибок и т. д. Элементарные работы имеют
достаточно возможностей модификации для того, чтобы охватить весь SDLC (жизненный
цикл разработки программного обеспечения) и все его роли. Разработчики, архитекторы,
бизнес-аналитики, тестировщики и менеджеры проекта могут создавать и назначать их, а
также работать над ними. По этим причинам элементарные работы являются основным
приводным механизмом поступательного движения проекта программного обеспечения.
Всю работу можно сделать и отследить при помощи элементарных работ.
Совет
Для того чтобы получить максимум от сервера Team Foundation Server и его отчетов,
необходимо отслеживать при помощи элементарных работ всю работу по проекту.
Перед тем как начать работу, каждый член команды должен спросить себя: "Какую
элементарную работу я использую для отслеживания данной работы?" Это, кстати,
является условием хорошего управления проектом. Менеджеры проекта могут
прогнозировать только ту работу, которую они видят и отслеживают.
Набор элементарных работ для вашего проекта
Большинство проектов, использующих систему Team System, будет пользоваться
предопределенным набором элементарных работ. Каждый такой набор охватывает весь жизненный
950
Часть VI. Система командной работы Visual Studio Team System
цикл разработки программного обеспечения (SDLC) для выбранной методики разработки.
Вы можете создавать для системы Team System нестандартные элементарные работы и даже
нестандартные методики (об этом позже). Однако чаще всего просто описывается проект на
основе одной из поставляемых с системой Team System методик: MSF for Agile Software
Development или MSF for CMM1 Process Improvement (обе они были описаны в главе 22).
Система Team System при выборе методики для вашего нового проекта генерирует набор
описаний элементарных работ для него. Связанные с данной методикой элементарные
работы основаны на принципах методики. Эти элементарные работы описывают поля, состояния
и переходы тех работ, которые будут выполняться в проекте. Кроме того, они генерируют
показатели для отчетов, которые позволяют членам команды знать о состоянии проекта в
любой момент времени. Давайте же изучим эти основные элементарные работы для обеих
поставляемых в составе TFS методик.
Совет
Благодаря успеху системы Visual Studio Team System сторонними организациями
были разработаны различные надстройки. Они содержат дополнительные проектные
методики с соответствующими элементарными работами и отчетами. Мы советуем
вам начать с освоения тех, которые поставляются в составе системы Team System.
Затем вы сможете поискать такую методику, которая будет лучше подходить к
потребностям вашей команды.
Элементарные работы методики MSF for Agile
Методика MSF Agile управляется сценариями. Сценарии описывают то, что приложение
должно делать с точки зрения пользователя. Они также описывают различные требования
по производительности и безопасности. Сценарии предназначены для того, чтобы
обеспечить совместную работу команды разработчиков и клиентов над общим пониманием
проблемы, но в то же время должны оставаться гибкими в отношении изменений. В конечном
итоге именно сценарии управляют задачами, которые будут выполняться командой для
реализации представлений клиента.
Вот полный набор элементарных работ для методики MSF Agile:
□ Scenario (Сценарий);
□ Quality of Service Requirement (Требование к качеству предоставляемого сервиса);
□ Task (Задача);
□ Bug (Ошибка);
□ Risk (Риск).
Давайте же рассмотрим все эти элементарные работы более подробно.
Элементарная работа Scenario
Сценарий описывает взаимодействие пользователя с системой для достижения
определенной цели или выполнения задачи. Если вы когда-либо создавали случаи использования (или
работали с ними), то сценарии покажутся вам очень знакомыми. Обычно в сценарии описы-
Глава 25. Отслеживание элементарных работ 951
вается обычный (успешный) путь достижения цели пользователем. Кроме того, он может
быть связан с альтернативными сценариями, в которых описываются альтернативные
(иногда неудачные) пути системы.
Руководство по процессу MSF предлагает команде разработчиков для начала провести
мозговой штурм списка возможных сценариев системы. Конечно, эти сценарии должны быть
связаны с общей концепцией проекта. Каждый сценарий затем назначается бизнес-
аналитику (или клиенту/специалисту в данной предметной области) для его определения и
описания. В конечном итоге сценарии будут разбиты на задачи, которые члены команды
могут выполнить для реализации данного сценария (и соответственно, самой концепции
проекта).
Вот ключевые поля, описываемые в сценарии:
□ Description (Описание)— это поле дает обзор данного сценария на высшем уровне.
MSF Agile рекомендует, чтобы сценарий создавался в виде документа Word (для этого
на портале проекта имеется шаблон);
□ History (История) — в этом поле отслеживаются изменения сценария;
□ Rank (Ранг) — это поле используется командой для указания приоритета по отношению
к другим сценариям системы;
□ Integration build (Построение интеграции) — это поле используется для указания
построения, в котором реализован сценарий. Это важная информация для команды
тестеров;
□ Rough order of magnitude (Примерная оценка порядка величины) — это поле
используется для указания относительной сложности сценария. Может показаться, что делать
какие-либо оценки преждевременно. Однако эта важная информация может
использоваться для определения, следует ли продвигать данный сценарий (до того, как тратить
на это дополнительные время и деньги).
Элементарная работа
Quality of Service Requirement
Требование качества сервиса (QoS) описывает, как данная система должна работать после
ее завершения. Эти элементарные работы имеют вид требований к нагрузке,
производительности, платформе, внешнему воздействию и безопасности, имеется также и вездесущая
категория "прение". Их цель — добиться от команды понимания того, что ожидается от
системы. Например, требование QoS может указать, что любое взаимодействие с
пользователем внутри пользовательского интерфейса не должно занимать больше секунды. Такое
требование может навязать создание многофункционального клиентского приложения (а не
клиента на основе* браузера).
Используемые для описания требования QoS поля почти идентичны тем, которые
используются для сценария. Руководство по процессу MSF Agile предлагает полностью описывать
требование QoS внутри полей элементарных работ. Вы можете приложить к вашим
требованиям QoS дополнительные документы, но обычно для этого нет особой необходимости
(как в случае сценария).
952 Часть VI. Система командной работы. Visual Studio Team System
Элементарная работа Task
Элементарная работа Task (Задача)— это задача проекта, которая сигнализирует члену
команды о необходимости выполнить некую работу по проекту. Подобно другим
элементарным работам, задачи назначаются членам команды.' Однако элементарные работы типа
Task — это обычно такие элементарные работы, которые составляют график проекта.
Например, может быть задача создания нового сценария. Такая задача может быть назначена
бизнес-аналитику команды.
Когда вы описываете задачу, то вы выбираете отрасль, к которой она принадлежит. Отрасли
похожи на роли проекта — это архитектура, разработка, управление проектом, управление
выпуском версий, технические требования и тестирование. Эти отрасли помогают понять
значение того состояния, которое описывает текущее продвижение данной задачи
(подробнее об этом чуть позже).
Элементарная работа Bug
Элементарная работа Bug (Ошибка) используется для сообщения об ошибке в системе.
Обычно о проблемах сообщают тестеры и пользователи. Эти сообщения записываются и
патом назначаются для исправления. Элементарная работа "ошибка" позволяет управлять
дефектами и отслеживать их в системе Team Systems.
Вот несколько ключевых полей, относящихся к элементарной работе "ошибка":
О Priority (Приоритет) — поле приоритета указывает, является ли ошибка существенной
или это что-то незначительное;
□ Found in build/resolved in build (Обнаружена в построении/исправлена в построении) —
поля построений позволяют вам указать, в какой версии кода была обнаружена ошибка
и в какой версии она была устранена. Это обеспечивает одинаковое понимание у
разработчиков и у тестеров;
□ Test name/test path (Название теста/маршрут теста) — эти поля тестов служат для
указания, какие именно тесты использовались для воспроизведения ошибки. Эта информация
может помочь разработчику воспроизвести ошибку;
□ Triage (Рассмотрение) — это поле используется для указания, была ли утверждена
работа по исправлению данной ошибки или требуется дальнейшее изучение вопроса.
Рассмотрение ошибок обычно производит менеджер проекта. Перед назначением на
исправление ошибка может быть направлена на дополнительное изучение и оценку.
Элементарная работа Risk
Элементарная работа Risk (Риск) позволяет команде упреждающим образом отслеживать
риски проекта и управлять ими. Риски проекта — это все то, что может негативно повлиять
на проект в смысле качества, стоимости, выполнения графика и т. д.
Вы описываете риск, указывая его описание (и соответствующие поля). Есть
дополнительные поля — серьезность и ранг. Серьезность указывает вероятность наступления риска и
степень его воздействия. Серьезность описывается как критическая, высокая, средняя или
низкая.
Глава 25. Отслеживание элементарных работ
953
Элементарные работы методики MSF for CMMI
Методика MSF for CMMI не слишком отличается от MSF Agile. Фактически у них есть
общие базовые принципы и понятия относительно качества и клиентов, а также
приспособления к изменениям. Однако методика CMMI помогает командам разработчиков оцениваться
(сторонними участниками) в смысле выполнения ими своих обязательств и стремления к
постоянному совершенствованию. Эта методика не обязательно должна быть более
обширным или более сложным процессом. Она также должна быть не тяжеловесной и
соответствовать размерам проекта.
Элементарные работы, которые приводят в действие методику MSF for CMMI, похожи на
элементарные работы методики MSF for Agile. Например, в MSF for CMMI проект все так
же управляется требованиями и задачами.
Вот полный набор элементарных работ для MSF for CMMI:
□ Requirement (Техническое требование);
□ Task (Задача);
□ Change request (Запрос на изменение);
□ Risk (Риск);
□ Review (Анализ);
□ Bug (Ошибка);
□ Issue (Проблема).
Давайте изучим все эти элементы по очереди.
Элементарная работа Requirement
Мы уже обсудили, как MSF for Agile описывает две элементарные работы для определения
технических требований (сценарий и QoS). MSF for CMMI описывает единственную
элементарную работу Requirement (Техническое требование). Когда вы создаете новую
элементарную работу типа "техническое требование" для MSF for CMMI, то указываете тип
требования. Затем вы можете выбрать сценарий или требование QoS. Фактически элементарная
работа "техническое требование" для CMMI имеет по умолчанию шесть типов:
функциональный, интерфейс, операционный, качество обслуживания, безопасность и сценарий.
Вот некоторые дополнительные поля для элементарной работы Requirement:
□ Subject matter experts (Специалисты предметной области) — этот раздел позволяет вам
указать до трех человек, которые могут дать дополнительную информацию экспертного
уровня по данному требованию;
□ Impact assessment (Оценка влияния) — это поле позволяет указать общее влияние
данного требования в том случае, если оно не будет реализовано;
□ User acceptance test (UAT, Приемочное тестирование) — это поле позволяет вам
отслеживать, готово ли требование к приемочному тестированию, либо оно прошло/не
прошло приемочное тестирование.
954
Часть VI. Система командной работы Visual Studio Team System
Элементарная работа Task
Элементарная работа Task (Задача) предназначена для инициирования выполнения работы
членом команды и для отслеживания этой работы. Например, архитектор может разбить
сценарий на несколько задач реализации для разработчиков. Эти задачи назначаются и
отслеживаются менеджером проекта. Задачи могут назначаться всем ролям проекта.
Элементарная работа Change request
Элементарная работа Change request (Запрос на изменение) позволяет вам отслеживать
неизбежные для любого проекта программного обеспечения изменения и управлять ими.
Некоторые проекты могут просто продолжаться с изменениями. Более формальные проекты
требуют документации изменений и оценки их влияния. Затем изменение будет
представлено в совет по управлению изменениями для принятия решения. Если принимается решение
согласиться на изменение, то в результате появляется новый набор элементарных работ типа
"задача" (который повлияет на базовый график и себестоимость).
Обычно бизнес-аналитик (или кто-то вроде него) создает элементарные работы "запрос на
изменение" и делает анализ влияния изменения. Эта информация хранится в нескольких
ключевых областях элементарной работы:
□ Description (Описание) — это поле используется для описания запроса;
□ Justification (Обоснование)— это поле сообщает читателям, почему этот запрос был
4 зарегистрирован, и указывает ту пользу, которую изменение принесет проекту;
□ Analysis (Анализ) — этот раздел элементарной работы позволяет вам приписать
влияние изменения к одному из пяти ключевых элементов проекта: архитектура,
пользовательская среда, тестирование, разработка и техническая документация.
Элементарная работа Risk
Элементарная работа Risk (Риск) позволяет членам команды регистрировать элементы,
которые могут отрицательно повлиять на проект. Элементарная работа типа "риск" в MSF for
CMMI разрешает пользователям внести план уменьшения последствий, а также события,
которые могут запустить этот план. Кроме того, пользователи составляют план на
непредвиденный случай, в котором описывается, что необходимо делать в том случае, если риск в
проекте действительно произошел.
Элементарная работа Review
Элементарная работа Review (Анализ) позволяет вам документировать результат анализа
кода или документа. Передовой опыт большинства проектов разработки состоит в том, что
надо делать анализ сценариев, технических требований, проекта и кода. Эти анализы могут
быть сделаны либо в автономном режиме, либо на совещании. Кроме того, эти анализы
могут быть итеративными в том смысле, что они продолжаются до тех пор, пока данный
элемент не пройдет анализ. Все это можно отслеживать при помощи элементарной работы
"анализ".
Глава 25. Отслеживание элементарных работ
955
Элементарная работа "анализ" имеет поле типа, в котором указывается — был ли анализ
выполнен на совещании или в автономном режиме. Кроме того, имеются поля для указания,
кто делал анализ (или присутствовал на совещании). Эти поля позволяют выполнить до
восьми итераций для анализа. Результаты анализа отслеживаются при помощи поля заметок.
Именно здесь аналитик может описать потребовавшиеся для анализа действия.
Элементарная работа Bug
Элементарная работа Bug (Ошибка) позволяет членам команды указать обнаруженные в
системе проблемы. Эти ошибки документируются, рассматриваются, приоритизируются и
категоризируются по серьезности.
Элементарная работа Issue
Элементарная работа Issue (Проблема) позволяет членам команды регистрировать
проблемы, которые препятствуют продвижению проекта. Это не риски. Проблемы — это реальные
вещи, которые требуют действий (а не какие-то возможные риски). После того как проблема
установлена, необходимо создать набор задач по решению данной проблемы.
Элементарная работа типа "проблема" позволяет задать приоритет, влияние на проект,
эскалацию и корректирующее действие. Приоритет указывает порядок, в котором необходимо
заниматься проблемами. Влияние проблемы описывается как критическое, среднее, высокое
или низкое. Поле эскалации указывает, следует ли повысить уровень проблемы (поскольку
она каким-то образом блокирует проект). И наконец, корректирующее действие позволяет
вам указать согласованный план решения проблемы.
Распознавание общности элементарных работ
Теперь у вас должно быть базовое понимание элементарных работ, определенных в обеих
методиках MSF. Для своего проекта вы выбираете одну методику и наследуете весь набор
элементарных работ, который связан с ней. При изучении элементарных работ обеих
методик вы убедились, что между методиками есть много сходств. Фактически элементарные
работы имеют много общего.
Общность элементарных работ не случайна. Сам термин "элементарная работа" является
обобщенной абстракцией, конкретными реализациями которой являются различные
обсуждавшиеся нами элементарные работы (ошибка, задача, риск и т. д.). Элементарные работы
создаются в инфраструктуре элементарных работ и управляются ею. Поэтому когда вы
поймете, как элементарная работа в этой инфраструктуре работает, тогда вы поймете, как
работают они все. В следующих разделах описываются и обсуждаются эти общности.
Примечание
В остальной части этой главы мы будем обсуждать примеры элементарных работ из
методики MSF for CMMI. Все, что мы обсуждаем, применимо также и к MSF for Agile.
Однако сосредоточение на одной методике упрощает обсуждение. Кроме того,
перейти в случае необходимости от методики MSF for CMMI к методике MSF for Agile будет
несложно.
956
Часть VI. Система командной работы Visual Studio Team System
Области элементарных работ и итерации
Области элементарных работ и итерации позволяют вам категоризировать и группировать
работу, а также описывать, когда эта работа будет выполняться. Эта информация задается
для всего вашего проекта (обычно менеджером проекта). Области и итерации обычно
специфичны для конкретного проекта и поэтому методикой не определяются. Каждая
элементарная работа затем классифицируется по областям и итерациям.
Несмотря на то, что мы изложили основы областей и итераций в главе 23, углубимся в эту
тему и посмотрим, как они связаны с элементарными работами и управлением проектом.
Вы описываете области и итерации в диалоговом окне Areas and Iterations, доступ к
которому можно получить из Team Explorer в Visual Studio. Для того чтобы его открыть, вы
должны щелкнуть правой кнопкой мыши по командному проекту, а затем выбрать Team
Project Settings | Areas and Iterations. На рис. 25.1 показан пример доступа к этому
диалоговому окну.
BUJftfcii
Kfa Team Explorer - Microsoft Visual Studio
T^We Edit View Build Team Data Took Test Analyze Window» Help
y^'. Team Explorer
s. |Э.
. <a
ES
LJ Work Kerns ^
t'J Documents » j
Li Reports i
Ca Builds К |
^ Source Centre j°JTJ!
52Я ..._ _
Show Project Portal..
Project Alerts...
Remove
Refresh
Team Project Settings »
Properties
Security...
Group Membership...
Areas and Iterations...
и
Ready
Рис. 25.1. Доступ к диалоговому окну Areas and Iterations
Области
Область представляет собой категорию для группировки работы. Часто ее называют
модулем или набором функций. Например, проект может разбить работу посредством выделения
модуля профиля учетной записи пользователя, модуля ввода заказов, модуля истории
заказов и модуля инвентаризации. Эти модули (или области) используются для группировки
задач и прочих элементарных работ системы. Эта возможность полезна для отчетности и
Глава 25. Отслеживание элементарных работ
957
отслеживания. Области могут быть определены и в виде иерархической структуры. Это
позволяет описывать подобласти и т. п.
Области создаются при помощи Team Explorer в Visual Studio и диалогового окна Areas
and Iterations. Вы уже видели, как попасть в это диалоговое окно. На рис. 25.2 показано
диалоговое окно с описанием нескольких областей (модулей) для проекта нашего примера.
Areas end Jtf rations
Team Foundation Server 2k3r2-ffs2QQ8
Team projftb. Order Management project
Area t iteration
1 j#X ♦ * *}. ♦>
-, Area
-j User Account Management
User Profile
Authenticate User
[ Authc rue User
Manage Users
'•i Order Management
New Order
Find and View Order
Order History
Э Inventory Management
' f~) Product Management
New and Edit Product
Product Configuration
Product Prtong Module
[ Security** ]
[ 4 bnPiftJ]
Close
* \
£ 1
»
ll
Рис. 25.2. Описание областей для проекта
Project Security
т*
Team Foundation server» 2k3r2-tfs2008
Team project Order Management Project
Users and Groups:
Name f Description *
' Ш* [SERVER]\Team Foundation Administrators Members of this application group can per.
),% [Order Management P^^ of this group can perform all ope *
Add users and groups
•# Team Foundation Server Group
i ) Windows User or Croup
Permissions for [Order Management Project]\Contributors:
| Permission
i Edit this node
AKow Deny *'
Li .-J
ЕКЖ!
w j О
и
View this node
I View work items in thrs node
In order for team project users and groups to view reports or manege the teem project portal, ycu
must also set secumy permissions in SQL Server Reporting Services and in Windows SharePomt
Services Site Administration for more infomwtjon about setting permistions in Team fctundaaon
Server, see M»ntfyipg РСГГТШ1Р'Ц
Рис. 25.3. Диалоговое окно Project Security для области User Profile
958 Часть VI. Система командной работы Visual Studio Team System
Обратите внимание, что вы можете описать иерархию областей. Это позволяет создать
области и подобласти (модули и подмодули). Панель инструментов этого диалогового
окна позволяет вам разместить каждый элемент в правильном порядке и в соответствии с
иерархией.
Обратите внимание на кнопку Security в нижней части диалогового окна. Она позволяет вам
настроить безопасность данной области. Например, вы можете указать, кому из членов
команды разрешено создавать, редактировать или просматривать элементарные работы,
связанные с данной областью.
Нажатие кнопки Security выдаст диалоговое окно Project Security. Важно отметить, что это
диалоговое окно специфично для выбранной вами области (узла). Например, если вы
выберете узел User Profile и нажмете эту кнопку, то будете описывать безопасность для области
User Profile. На рис. 25.3 показано это диалоговое окно и те разрешения, которые можно
настроить.
Итерации
Итерация представляет собой период времени проекта, за который вы выполните некую
часть работы. Назначение итерации состоит в том, чтобы сгруппировать по времени
некоторый набор элементарных работ, который должен быть выполнен за определенный
промежуток времени. Например, вы можете задать 30-дневные спринтерские отрезки. Кроме того,
итерации могут по разным причинам накладываться друг на друга. Обычно это результат
передачи дел между членами или группами команды проекта.
Предположим, что вы. задали для вашего проекта четыре итерации. Каждая итерация может
быть описана как 30-дневный временной блок. В течение каждой из этих итераций вы
выполните полный жизненный цикл разработки определенной группы функций. Вы можете
задать от двух до четырех областей (или модулей), которые будут разрабатываться в
течение каждой итерации.
Предположим, что вы начинаете первую итерацию с разработки архитектуры и проекта для
первых двух модулей. После завершения проектирования этих модулей итерация может
продолжиться передачей спецификаций команде разработчиков. После этого
проектировщики могут начать работать над следующей итерацией. После завершения разработки и
поблочного тестирования .первая итерация может быть передана команде проверки качества.
В это время разработчики могут начать кодирование второй итерации. Этот процесс
продолжается по всем итерациям. Обратите внимание, что итерации накладываются друг на друга.
Совершенно понятно, что для гладкой работы такого процесса требуется опытная команда и
серьезный набор инструментов. Кроме того, в этих циклах может быть много отличий.
Система Team System позволяет вам описать итерации для вашего проекта, а затем
классифицировать элементарные работы по итерациям. На рис. 25.4 показана вкладка Iteration в
диалоговом окне Areas and Iterations.
Обратите внимание, что внутри итерации вы можете описать и подытерации. Эта
возможность полезна для некоторых отчетов. Однако мы выяснили, что для проекта большинству
команд разработчиков вполне достаточно иметь от четырех до шести итераций верхнего
уровня. Каждая может быть упакована по времени в восьминедельные промежутки: две не-
Глава 25. Отслеживание элементарных работ 959
дели на проект, четыре недели на разработку и еще две недели на интеграцию и приемочное
тестирование.
Areas end Iterations
Team Foundation Saver. 2k3r2-tfs2008
Team project Order Management Project
Area Iteration j
~HSH
Iteration 0 - Define Project and Scenarios
Iteration 1 • Create Prototype and Reference Architecture
Iteration 2 - User Management and Security
' Iteration 3 - Order Management
Iteration 3.1 - Order History and Tracking
Z, Iteration 4 - Inventory
Iteration 41 - Product Management
Iteration 4 2 - Shipping Integration
[ Security.^ j
I «a teel&J I
Close j
Рис. 25.4. Описание итераций для проекта
Совет г
Если вы модифицируете области или итерации, то вам придется выполнить
обновление внутри Team Explorer для того, чтобы эти изменения были отражены в описаниях
элементарных работ.
Состояния и переходы элементарных работ
Элементарные работы отслеживаются при помощи полей State и Reason. Совместно эти
поля определяют: состояние, в котором элементарная работа пребывает в каждый момент
времени; состояние, в которое она может перейти; причину, по которой элементарная
работа может перейти из одного состояния в другое. Этот, казалось бы, несложный процесс
используется для отслеживания всех элементарных работ в системе-Team System. Давайте
рассмотрим пример его работы.
В этом примере мы рассмотрим состояния элементарной работы "ошибка". На рис. 25.5
показана диаграмма состояний для ошибки (из руководства по процессу).
Прямоугольники на диаграмме состояний обозначают состояния, в которых может
существовать ошибка. Стрелки представляют переходы между состояниями. Стрелка от одного
состояния к другому означает возможный переход. Слова рядом с переходами представляют
собой причины перехода.
Предположим, что у вас есть ошибка в состоянии "Активна". Эта ошибка может перейти
обратно в состояние "Предложена" либо в состояние "Устранена" или "Закрыта". Переход
ошибки обратно в состояние "Предложена" возможен только в том случае, если ошибка бы-
960
Часть VI. Система командной работы Visual Studio Team System
ла переведена в "Активна" для дополнительного изучения. По завершении этого изучения
она перейдет обратно в "Предложена" для принятия решения. Если ошибка переводится в
"Устранена", то она была либо исправлена, либо это не ошибка (так и было задумано). Если
ошибка переведена в "Закрыта" из "Активна", то возможными причинами этого было то,
что: она была отложена; это дубликат; это не ошибка или она не воспроизводится.
Предложена
Утверждена,
изучить
Изучение
завершено
Активна
Исправлена,
так и задумано
Отложена,
дубликат,
не является ошибкой,
не воспроизводится Исправлена
Не исправлена
Устранена
Отложена,
отклонена,
дубликат
Закрыта по ошибке,
возврат на
предыдущую стадию
Закрыта
Рис. 25.5. Диаграмма состояний и переходов ошибки (из руководства по процессу MSF for CMMI)
<jtt 3ug ЗГ - Microsoft Visual Studio
~ШШ
File Edit View Build Team Dili Took Test Analyze Window Help
zL®l
Bug 31 (Modified}. User Profile address lookup button broken
Iteration path* Order Management Projectslteraticn 2 - Use; Management and Security
Status
Assigned tor Blocked. No
Monty* 2 т State- Closed
Severity. Low ▼ Reason. KJSflfafl*!1
„. r- . Deferred
Tn«fj#. Tnaqed ▼ Кшрря^^^в
Rejected
| ; Description Vm ?HWty[unk* | Attachments | OetatH "
' Found in environment Windows Vista, client application
How found: During Ul automated testing
' Symptorvs
. When clicking on the lookup button for a users address the system presents a
i - - - - -
[ Steps to reproduce
[ ; 4.. 1-U\jirtYJ>HJ Jtl\.ClC V II KJ \y»i-l
i 3. Enter a new user
j 4. Click the address lookup button
—
^^^^^ш^ш
^1?
hard error.
▼ *
w
У 1
^
*)
*l
ll -!
M.Ll li
Щ
Рис. 25.6. Перевод ошибки из состояния "Активна" в состояние "Закрыта"
Глава 25 Отслеживание элементарных работ
961
Все элементарные работы в системе Team System работают таким же образом. Поля State и
Reason элементарной работы позволяют легко управлять этим рабочим процессом.
Редактор элементарных работ внутри Team Explorer обеспечивает реализацию этих переходов и
причин Он позволяет элементарной работе перейти только в допустимое состояние, причем
причины переходов также учитываются. На рис. 25.6 это показано на примере перевода
ошибки из состояния "Активна" в состояние "Закрыта". Для этого вы должны выбрать
причину (как показано).
Отслеживание истории элементарной работы
При изменении элементарной работы система Team System автоматически регистрирует
историю этого изменения. Вы можете просмотреть историю элементарной работы на
вкладке History этой работы. Каждое изменение сохраняется в отдельной записи. Записи катего-
ризированы по дате и времени изменения, а также и по имени того, кто произвел изменение.
На рис. 25.7 показана история элементарной работы Bug (Ошибка).
Обратите внимание, что на рис. 25.7 вы можете определить, какие поля изменились между
записями истории элементарной работы. Кроме того, на этой вкладке пользователи могут
вводить свои комментарии (там, где написано "Type your comment here"). Эти комментарии
сохраняются в истории элементарной работы. Это позволяет вести письменное обсуждение
данной элементарной работы.
tup button broken
^::..»Г..:. .■:.
GOCv. •'■wmumw
Рис. 25.7. Отслеживание истории элементарной работы
На рис. 25 8 показана еще одна запись истории для той же самой элементарной работы Эта
запись появилась в результате перевода ошибки из состояния "Закрыта" в "Активна". Обра-
962
Часть VI. Система командной работы Visual Studio Team System
тите внимание на комментарий в записи истории. Также обратите внимание и на то, что в
истории отслеживаются только изменившиеся поля.
~ШМ
\Г> Bug 31 - Micro»* Visual Studio
File Edit View BuiJd Turn DjU Format Took Teit Arwlyie Window Help
'art
Bog 311
Bug 31 User Profile address lookup button broken
i iS
Iteration path Order Management ProjectUieraticn 2 - Use/ Management and Security
Status
Assigned hr Administrate r
Priority 2
Seventy Low
Tnage Triaged
▼ Blocked- No
▼ State- Active
▼ Reason Closed in Error
I Dttcnpti-on j ftx History j Links j Attachments Detwrs
History
J 4/9/2006 KM*55 PM Edited by msndt
The error is still in the system. I have reopened and added clearer steps to reproduce.
d Show Changed Fields
Field
Rev
4 3/4/2008 7:00:04 PM
Edited by msnefl
я 4JCtrx „••*,., Kr*'v -IW«
|J^Er>cgi<$t
Ittm(i) Stved
Рис. 25.8. Комментарии пользователей сохраняются как часть истории
Связывание элементарных работ
Часто бывает необходимо связать элементарные работы между собой. Связывание работ
помогает обеспечить лучшее понимание системы и выполняемой работы. Оно обеспечивает
также улучшение отчетности. Предположим, что вы пишете пользовательский сценарий.
Было бы хорошо узнать, какие требования были созданы по результатам сценария. Вы
можете также пожелать узнать, какие задачи были сгенерированы по каждому требованию.
Если развить этот пример еще дальше, то вы можете связать проблемы и запросы на
изменения с задачами и/или требованиями.
В конечном итоге вы можете использовать показатели для определения успеха требования
или сценария. Если сценарий не привел к появлению запросов на изменения и создал
меньше проблем, то это означает, что он был хорошо написан, понят1 и согласован с командой.
Если же сценарий породил массу проблем и запросов на изменения, то это может означать,
что он не был понят, не был согласован, либо был плохо написан.
Еще один пример: если у вас есть задача, которая блокирована вследствие проблемы или
риска, то вы можете связать эту задачу с элементарными работами, которые были созданы
для ее разблокирования.
Связь с элементарной работой описывается при помощи вкладки Links для данной работы. На
этой вкладке представлены различные (уже установленные) связи элементарной работы. Вы
Глава 25. Отслеживание элементарных работ
963
можете просмотреть, отредактировать или удалить существующую связь. Вы можете также
создать здесь новую связь. На рис. 25.9 показано диалоговое окно добавления связи Add Link.
ч/> 3ug з! - Microsoft bi;aal£nHio
File Edit ' View Build Team Data Toots Test Analyze Window Help
Pug 31 Tjatrnfaglotgr,
Bug 31 User Profile address lookup button broken
Stems
Assigned to: Administrator
- Blocked No
4
Priority- i
Severity |
Triage 1
rJ
| Link Type j
!
Add Link
Select the link type and details.
Linfctype. (worb&enr»^ ^ ^21
l ""^'"мЙш! И!
1 Wbrkrteni'ers^nediItem
Test Result
Prrrriptfc^Wf!1? , , , ,
Comment
>„
• - -
ШШШШШШШ || щ и-
l>
OK
\ь\ыбШ
• ^
i Caned
i
]
rtem($) Saved
Рис. 25.9. Добавление связи в элементарную работу
Choose Related Work item
Project- Qrrfe Management Project "j
Select one of the following methods to Find available work rtemr
o Saved query. All Wort Items
IDs-
Title contains"
and type; *tl >Vr *. л t ';p-
Select items to add to the work item list:
ID Type Title
11 Task Create Scenarios
12 Task Create Project Plan
13 Task Create Master Schedule
14 Tark Create Iteration Plan
15 Task Create Test Approach Worksheet
33 Task Add New Product
34 Task Find Order
13 work item(s) found
"
State
Proposed
Proposed
Prcpcsed
Proposed
Proposed
Active
Proposed
f -« I
1 V \ш£Ш
find
Reset
[ Саже»
««««ггшшщпгг-мгпмпгшшш ииаяптвии.к^. .<
i
i
1 !
- i
i
i
I
1 '
■i
1
Рис. 25.10. Поиск элементарной работы при настройке связи
964
Часть VI. Система командной работы Visual Studio Team System
Обратите внимание, что при добавлении связи с элементарной работой вас просят перейти к
этой элементарной работе. Нажатие кнопки Browse откроет диалоговое окно Choose
Related Work Item (рис. 25.10). Здесь вы можете выполнить поиск по базе данных
элементарных работ и найти те работы, с которыми вы хотите установить связь. В показанных
диалоговых окнах ошибка связывается с соответствующей задачей разработки.
После того как вы выбрали работу и нажали кнопку ОК, вы возвращаетесь в диалоговое
окно Add Link (рис. 25.11). Идентификатор ID элементарной работы и описание уже за вас
заполнены. Вы можете добавить к связи комментарий, а затем нажать кнопку ОК для
создания связи.
Не всегда связи соединяют две элементарные работы. Вы можете создать связь
элементарной работы и с другими элементами. Это может быть связь с: Web-страницей (гиперссылка),
набором изменений системы управления исходными кодами, версией элемента или
результатом теста. Для каждого такого дополнительного элемента используются аналогичные
диалоговые окна.
Add link
Select the fink type and drtii!*.
1 Linktype. WwkJtem
Link deUtts
Work item IE* 32
Description* ТккЭ£ Address Lockup Feature
Comment Feature not implemented as described in tiikj
С
I _ - _ .
0*
_
ШИйй]
•»
[ Browse.» j |
j ' Cancel ]
1
Рис. 25.11. Добавление связи с элементарной работой
Прикрепление файлов
Вы можете также прикреплять файлы непосредственно к элементарным работам. Эта
возможность полезна тогда, когда вы хотите приложить снимок экрана к ошибке или документ
Word к сценарию.
Интерфейс прикрепления файлов аналогичен интерфейсу создания связей. На вкладке
Attachments перечислены все приложения. Здесь вы можете добавить, удалить, просмотреть и
обновить приложения файлов к элементарной работе.
Использование Team Explorer
для управления элементарными работами
Если вы инсталлировали одну из версий Visual Studio для командной работы, то у вас уже
есть лицензия на подключение к серверу Team Foundation Server. Однако у вас может не
оказаться необходимых инструментов. Вам нужно инсталлировать клиентские инструменты
Глава 25. Отслеживание элементарных работ
965
Team Explorer. Вы можете найти их на инсталляционном дистрибутиве Team Foundation
Server. Эти инструменты являются основным средством взаимодействия с элементарными
работами при помощи Visual Studio. В последующих разделах описаны основные
функциональные возможности этих инструментов. Во время их обсуждения мы будем
иллюстрировать работу различных ролей проекта при помощи этих инструментов.
Создание новой элементарной работы
Вы можете создать новую элементарную работу при помощи Team Explorer или меню
Team. При этом вы должны будете выбрать тип элементарной работы. Доступные для
вашего проекта типы зависят от методики и ее возможных модификаций. На рис. 25.12 показано,
как создать новую элементарную работу Task (Задача) при помощи меню Team.
\^>1®ШШ
-Я «J0U
</> Teem Explorer • Microsoft Visual Studio
| File Edrt View BuiTd (jgwrjj Data Took Test Analyze Window Help
' ~ 1 Add Task... j .If
2 Add Bug-
Add Work item
Go lo Work Item...
Add Query
Show Report Site-
Project Alerts...
Team Project Settings
m
*j) 2K3R2-TFS2008
i£J My Favorites
1 1% MSF-TEST
;-; i^Worlchemt
Ш ^J Team Q
~ 2^ My Que
- Cj Documents!
£| Reports
$ Ca Builds ~"
Team Foundation Server Settings *
Bug
Change Request
Issue
Requirement
Review
Rtsk
Task
ltem(s} Saved
Рис. 25.12. Создание новой элементарной работы
Когда вы выберете тип элементарной работы, то получите экран для описания элементарной
работы. Здесь вы можете указать название элементарной работы, назначить элементарную
работу, ввести описание, добавить приложения и т. д. На рис. 25.13 показано описание
новой элементарной работы типа "задача". Обратите внимание на раскрывающийся список
Discipline. Здесь вы можете указать, что область этой задачи — задача разработки, бизнес-
анализ, тест и т. д.
На рис. 25.14 показана вкладка Details для элементарной работы. Она содержит некоторые
ключевые функции, которые мы до сих пор еще не обсуждали. Большинство этих функций
применимо ко всем элементарным работам. Это планирование задачи, указание ее
построения, пометка о необходимости анализа, а также связывание ее с тестом (не показано).
966
Часть VI. Система командной работы Visual Studio Team System
<S* Мекч Tasfc. 5* - Microsoft Visual Studio
. File Edit View. Build Team Data Took Test Analyze Window Help
$ - „ • J A J & -л 4SW "-<-;*- -*\ * -f
New Task 5* т»щЬФт\ _
New Task 5 Shipping Tracking Web service
Title- Shipping Tracing Web service
1Ы13щ&Ы
1Л
Dlsctphnr
Type
Classification
Area path Order Management ProjectUnventary Managemenl'vShipping Integrator!
Iteration path* Order Management ProjectVlteraticn 4 - EnventoryMteretion 42 - Shipping Integration
Status
Assigned to msneli •«• Blocked- No
Priority; 3 •#• Stale: Prepared
Se»enty Low * Reason: New
Triage* Pending »
• Description Histofy] Links f Attachments | DeMi
Description
Connect to the web service that returns shipping information for a user's order
Test
User Education
User Experience
Рис. 25.13. Диалоговое окно новой элементарной работы
*ч# Task 35 - Microsoft Vhjal Studio
File Edit View Build Team Data Toots Test Analyze Window» Help
Task 35 • Shipping Tracking Web service
Iteration path- Order Management ProjectUteraticn 4 - Inventon/Iteraticn 4 J - Shipping Integration
Status
Assigned to msneli •»• Blocked No
Priority 3 ▼ State Proposed
Seventy Low •» Reason New
Tnager Pending »
[ ОезсгфЬоп | History j Link* | Attachments ]! Details j|
General
Requires review: No
Requires test No
Build Schedule
Integrated in- ▼ Estimate
Task Hierarchy Remaining work
Completed woric
-
-
-
\
*
. 1
•£
\
, '
-
Рис. 25.14. Подробности элементарной работы
Элементарная работа "задача" планируется при помощи оценки. Человек, которому
назначена эта элементарная работа, должен указать примерное количество требуемых часов и
Глава 25. Отслеживание элементарных работ 967
количество отработанных часов; затем количество оставшихся часов используется как
Estimate to Complete. Эта информация используется в Project и других приложениях для
отображения планирования. По этим данным вы можете вычислить свое продвижение —
сколько времени прошло и что осталось. Даты старта и финиша вводятся при начале и
окончании задачи.
Поиск и фильтрация элементарных работ
Вам часто бывает нужно найти ту элементарную работу или набор элементарных работ, с
которым вы хотите поработать. Для этого Team Explorer имеет движок запросов. Каждый
запрос выполняется по базе данных элементарных работ и возвращает информацию. Таким
образом, вы можете быстро найти вашу следующую задачу.
Существует некоторое количество готовых запросов по умолчанию (они зависят от
выбранной методики). Вы можете найти их в каталоге Team Queries. На рис. 25.15 показан набор
запросов для проекта по методике MSF for CMMI.
Командные запросы используются всеми членами команды. То есть каждый член команды
видит список командных запросов. Если вы имеете соответствующую учетную запись, то
можете создать новый командный запрос. То есть вы можете писать запросы, которыми
смогут пользоваться все.
<•> Team Explorer - Microsoft Visual Studio
File Edit View Build Team Data Tools Test Analyze Window Help
3' -~? леи ' J -*-,'-<* ,_Г„_:„
>, Team Explorer.
hf j Щ 2K3R2-TFS2008
I JTj My Favorites
a. ITj msf-test
j _? UJ Order Management Project
i l-„ LUESES
j d i-J Team Queries
I 'J3 Actrve Bugs
^ All My Teem Project Work ilems
Z± All Taste
'_*]) All Work Items
ГЗ Blocked Work Items
^ Change Requests
i t^j Corrective Actions
'Jj Customer Requirements
^ Development Taste
| 3 Issues
i ^3 Mitigation Acticn Status
3 My Work hems
Ij Product Requirement
j ^ Reserved Bugs
, '^ PevieA!
I Г} Risks
I i jMy Queries
i^j Documents
JtemCsl Saved
Рис. 25.15. Командные запросы по элементарным работам
У вас есть также и каталог для хранения ваших персональных запросов — My Queries. Он
полезен для хранения запросов, которые касаются только вас. Например, вы можете создать
-
i t5
1^|£1*аШиГ
*
-х.^
о
S
968
Часть VI. Система командной работы Visual Studio Team System
запросы по вашему идентификатору пользователя либо просто написать несколько
запросов, специфичных для ваших функциональных обязанностей.
Выполнение запроса и просмотр результатов
Для выполнения запроса надо выделить его в дереве Team Explorer и выбрать в меню Team
пункт Run Query (или нажать клавишу <F5>). Вы можете также щелкнуть по запросу
правой кнопкой мыши и выбрать пункт View Results или Open. Имеется также и панель
инструментов для запросов по элементарным работам. Вы можете запустить запрос отсюда при
помощи нажатия кнопки Run Query.
Результаты вашего запроса отображаются в виде списка, который содержит идентификатор
элементарной работы, ее тип, состояние и название. При прокручивании элементов этого
списка в нижней части экрана отображаются подробности выбранной элементарной работы.
В этом окне вы можете полноценно взаимодействовать с элементарными работами. На
рис. 25.16 показан пример результата.
<*> All Work Items [Reso-fc{ - Microsoft Visual Studio
' File Edit View Build Team Data Tods Test Analyze
*Ь „ -14Ы0 t Ал % *i- * -^--4 ^
i a
• °
[8 ||
't 1
1 1
1 !
1
i
i '
1
i !
i !
! !
л5*ЛЛ Work hems [Results] 11<|Щ? &$м«,|
[ЙЙ}.** °S) 70 ггтиИт fmmrl A rwrntry irlrrtrrf)
\jf ID «•■ Work hem Type ■*■ State Assigned To
13 Task Proposed Administrator
14 Task Proposed Administrator
15 T*sfc Proposed Administrator
il Task Active mike
j 34 Task Proposed msnell
35 Task Proposed msnell
Task33: Add New Product
Title Add New Product
С Ossification
Ares path. Order Management Project
Window Help
1
Title
Create Master Schedule
Create Iteration Plan
Create Test Approach Worksheet
Address Lookup Feature
Find Order
Shipping Tracking Web service
"
Discipline*
Type,
Iteration path: Older Management Projedetention 2 - User Management and Security
j Status
Assigned to^ mike -r
ltem(s} Saved
Blocked: No
7~3 ®
Development
Ьэ]ж1Ш]
•:|
«r X
га-а-а-а-а-а-а-а-ав-
^a^a^HF
w
« s
'
•
№
\<л\
Ij j
. r
о
■d
1 '
""
Рис. 25.16. Просмотр результатов запроса
Вы можете настроить список, который возвращается в качестве результата запроса. Для
этого необходимо нажать кнопку Column Options в панели инструментов (крайняя справа)
или выбрать эту опцию в контекстном меню (для того чтобы получить диалоговое окно
Column Options). В этом окне вы можете указать, какие поля вам нужны в списке, а также
ширину каждого поля (при помощи вкладки Fields). Вы можете даже задать здесь
сортировку по нескольким столбцам (при помощи вкладки Sorting). На рис. 25.17 показано это
диалоговое окно.
Глава 25. Отслеживание элементарных работ
969
Совет
Сделанные вами в диалоговом окне Column Options изменения можно сохранить в
определении запроса.
«jft АЛ Woricftetni 'Rriun?! - Mxrmsoft Visua4 Stutfin
Т=Г1и
Pile Edit View Build Team Data Took Test Analyze Window Htelp
'ЗУ0:
s* 1
Al Work Items (Results),;...
3L
J a»
| Query Results* 20j
l/ ГО Г^АЙ
Г 13 Tal
14 T«|
15 tJ
32 T*J
33 Taj
34 Taj
35 Taj
1* T ,~ J
I Task 33: Add Nel
Title AddNd
Classrficabonl
Are* path: 1
Iteration patM
Status |
1 Assigned t«
Column Option;
Fields [Sorting!
Project
Work Item Type:
Available columns:
. Analyst
j AiealD
[ AttachedFileCount
j Authorized As
] Baseline Work
j Blocked
! Called By
> "
ЩЩШШШШШШтШШЩМ
mike
'AIM
ИВ i
RR |f |f
Typn
Selected columns:
Ntm*
ID
Work Item Type
State
Assigned To
Title
L
-r Blocked: No
ГуГ|^Д
!
1
Width
50
75
75
108
450
1
Width:
50
QIC j t Cancel ] j
I
*
Item(s) Saved
Рис. 25.17. Настройка результатов запроса
Создание нестандартного запроса
Вы можете создавать нестандартные запросы внутри Team Explorer. Эти запросы могут
создаваться либо для всей команды (Team QueriesX либо только для вас (My Queries). Для
создания нестандартного запроса необходимо выбрать пункт меню Add Query либо в меню
Team, либо в контекстном меню того каталога, в котором вы хотите сохранить новый
запрос.
Выбор этого пункта открывает запрос. Здесь вы описываете операторы фильтров, которые
позволяют вам сузить ваш запрос. Каждый оператор указывает поле, операцию и значение
(типа оператора where в SQL). Кроме того, вы можете связать операторы друг с другом при
помощи and или OR. Давайте рассмотрим пример.
Предположим, что вы должны рассматривать все предлагаемые ошибки. Вы становитесь
центральным лицом, которое определяет, кто должен работать над ошибкой, требует ли
ошибка дополнительного изучения, является ли она действительно ошибкой и т. д. Для
выполнения этой работы вам может понадобиться создать запрос в каталоге My Queries,
который позволит вам просматривать все предлагаемые ошибки в конкретной области системы.
При настройке фильтра для этого запроса вы описываете три оператора. Первый для поля
Work Item Type. Вас интересуют только ошибки, поэтому операция будет =, а поле Value
970
Часть VI. Система командной работы Visual Studio Team System
должно иметь значение Bug. После этого будут возвращаться все элементарные работы, тип
которых — ошибка. Затем вы добавляете в ваш фильтр еще один оператор для состояния
ошибки. Вам нужно видеть только ошибки в состоянии Proposed. Поле And/Or вы
устанавливаете в значение And. И наконец, вы добавляете еще один оператор для поля Area Path и
настраиваете его соответствующим образом. На рис. 25.18 показан этот пример фильтра.
t/» Prcpc-sed Bugs JQucryl* - V crcioft \fai«* Studio
Fife Edit View Build Team Data
2 . -i Л1 ,
Tools T*st Analyze Window Help
E
Proposed Bugs IQutryr toj&«d8«fl*jJ«S$MJ T^TO Sxpfof
And/Or Field Operator
Work Hem Type =
And State =
► And Area Pith Under
[ Query Results. 0 results found @ cirrrently selected).
\ff ID *. Title
Value
Bug
Proposed
MSF TEST
At Inventory Management
, С 'f t» M»r -<otjo«-ir.i
Rnd and \(^> Order
New Order
Order History
Order Workflo*
3> User Account Management
▼ X
1
Hern(s) Saved
Рис. 25.18. Описание нового запроса
Далее, для выбора отображаемых в результате вашего запроса полей данных используйте
диалоговое окно Column Options, которое позволяет вам также указать порядок
сортировки. Это окно мы уже обсуждали (см. рис. 25.17). Затем вы можете выполнить ваш запрос и
проверить результаты. Когда вы будете довольны полученными результатами, то сможете
дать запросу название и сохранить его для последующего использования.
Примечание
Редактировать запросы можно при помощи этого же интерфейса. Для того чтобы
открыть запрос на редактирование, выберите пункт View Query в контекстном меню
запроса.
Перспективы Team Role
Как мы уже обсуждали, элементарные работы — это ключевой элемент совместной работы,
который соединяет всех членов команды проекта. Они используются для обмена задачами,
статусом, проблемами, рисками и т. д. Они также выдают информацию по статусу и
описывают показатели для отчетности. Элементарные работы касаются всей команды. Поэтому в
Глава 25 Отслеживание элементарных работ 971
последующих разделах мы опишем, как некоторые роли в течение жизненного цикла
разработки программного обеспечения взаимодействуют с элементарными работами. Мы
покажем по несколько обычных действий для каждой роли, а затем продемонстрируем, как эти
действия реализуются в элементарных работах.
Мы обсудим роли менеджера проекта, бизнес-аналитика, разработчика и тестера. В
большинстве процессов описано гораздо больше ролей (в том числе и в процессах MSF). Однако
эти роли максимально взаимодействуют с элементарными работами в любом проекте
программного обеспечения.
Примечание
Предполагается, что только у архитектора, разработчика, тестера и разработчика баз
данных инсталлирована версия командного клиента Visual Studio. Другие члены
команды (такие как бизнес-аналитик, менеджер проекта и клиент) будут подключаться
к проекту при помощи таких инструментов, как Excel или Project. Они смогут также
просматривать отчеты и информацию на сайте (портале) команды проекта. Конечно,
каждый из этих членов команды должен иметь лицензию для клиентского доступа
(client access license, CAL) к серверу Team Foundation Server.
Существует также и Web-клиент, который позволяет получить доступ к элементарным
работам. Его можно скачать. Для этого надо зайти на www.microsoft.com и поискать
"Visual Studio Team System Web Access 2008 Power Tool".
Концепция проекта
Очень полезно обсуждать взаимодействие различных ролей с элементарными работами в
контексте реального проекта. Поэтому в данном, разделе мы делаем следующие
предположения по параметрам и концепции нашего примера проекта:
□ имеется уже существующее приложение электронной коммерции;
□ планируется проект разработки приложения, которое позволит и торговым
представителям, и сотрудникам отдела обслуживания клиентов активно управлять учетными
записями пользователей в этой системе электронной коммерции;
□ торговые представители будут работать с учетными записями клиентов для того, чтобы
делать предложения прямого маркетинга. Они также хотят выполнять анализ данных
для приоритизации самых важных клиентов;
□ сотрудники отдела работы с клиентами будут работать с учетными записями
пользователей и обрабатывать запросы клиентов. Им необходимо просматривать данные,
изменять заказы, вносить информацию по отслеживанию и т. д.
Мы будем использовать это как основу при описании того, как различные роли работают в
данном проекте с элементарными работами. Сначала рассмотрим роль менеджера проекта.
Примечание
MSF для группировки действий по ролям описывает рабочие потоки. Мы рекомендуем
вам ознакомиться с этими рабочими потоками, их действиями, а также связанными с
ними ролями. Кроме того, MSF иллюстрирует использование элементарных работ в
каждом рабочем потоке. Наш подход проще: мы хотим показать обычные действия
32 3ак 3716
972
Часть VI. Система командной работы Visual Studio Team System
каждой роли и проиллюстрировать, как в действие вступают элементарные работы, а
также как эти элементарные работы отражаются в Visual Studio и Team Explorer.
Менеджер проекта
Для нашего примера предположим, что вы являетесь менеджером проекта, который
руководит проектом. Поэтому именно вы должны настроить проект в системе Team System,
выбрать методику, управлять безопасностью и т. д. Поскольку многие менеджеры проектов
имеют небольшой опыт использования Visual Studio, то, возможно, вам понадобится
назначить технического руководителя для помощи в этих вопросах.
Мы не будем описывать здесь эти задачи настройки проекта. Вместо этого предположим,
что для проекта выбрана методика MSF for CMMI, безопасность для каждой роли
определена, итерации и области описаны аналогично рис. 25.2 и 25.3. Теперь сосредоточимся на
нескольких обычных задачах, которые менеджер проекта будет выполнять при помощи
элементарных работ.
Определение элементарных работ для менеджера проекта
Менеджер проекта обычно каждый день занимается задачами, рисками и проблемами.
Многие менеджеры также время от времени сталкиваются с техническими требованиями,
анализами и ошибками. В нашем примере мы будем обсуждать первый набор работ, а второй
будем рассматривать при описании более подходящих ролей.
Использование Excel
Как менеджер проекта вы, возможно, имеете инсталлированную копию Team Explorer (это
рекомендуется). Здесь вы можете делать запросы к элементарным работам, а также и
обновлять их. Однако многие менеджеры проектов любят также работать с информацией как в
Excel, так и в Project. Team Explorer имеет поддержку взаимной интеграции с этими
продуктами (см. главу 23). Поэтому вы можете просматривать, создавать и обновлять
элементарные работы при помощи этих обычных инструментов Office. Конечно, эта возможность
не ограничивается одними только менеджерами проекта; мы просто рассмотрим несколько
ситуаций, соответствующих этой роли.
Просмотр нерешенных проблем
В нашем примере предположим, что вы (как менеджер проекта) хотите просмотреть
список нерешенных проблем проекта, обновить их, а затем поместить этот список обратно на
сервер.
Для начала нужно запустить Excel. Если вы инсталлировали инструменты Team Explorer,
то у вас внутри Excel есть панель инструментов Team. Она обеспечивает взаимодействие с
.сервером командной разработки. Вы можете нажать в этой панели кнопку New List для
того, чтобы открыть диалоговое окно Connect to Team Foundation Server. Это позволит вам
выбрать сервер TFS и проект на этом сервере.
Глава 25. Отслеживание элементарных работ
973
Совет
Списки элементарных работ можно открыть в Excel непосредственно из Team
Explorer. Для этого запустите запрос. Затем в окне результатов нажмите на панели
инструментов кнопку Open Selection in Excel.
Затем вы получите диалоговое окно New List. Здесь вы можете указать, хотите ли вы
сделать запрос по элементарным работам или создать список ввода. Запрос позволит вам
получить список, работать с элементами списка, а затем обновить сервер. Список ввода мы
рассмотрим чуть позже. Вспомните, что вы хотите поработать с нерешенными проблемами
данного проекта. Поэтому отметьте переключатель Query List и в раскрывающемся списке,
в котором содержатся как командные, так и персональные запросы, выберите Issues
(рис. 25.19).
; Bockl - MicKKcft Excel
Home lrutrt Pag* Layout formula* Data я*и«йг View Add-in*
* >&*лав* ti£t Window
le»mSy{tefliH«ip
M*nu LOfflmarSs
omc*l posters
F G H I i К
New L$t
iv) |SO
\ Select which type of work item list you want to с reate:
о Query Us»
• Fill and updete the hit with «II work item» that rr*tch ihe following query
„ Input list
Enter new or get individual work items.
Sheet! , She«t2 Л Shwt3 , t*j „
тшШШл шД
Рис. 25.19. Открываем список в Excel
После выполнения запроса вы получаете все нерешенные проблемы проекта. При помощи
функций Excel вы можете фильтровать и сортировать этот список. На рис. 25.20 показаны
результаты запроса.
Обратите внимание, что панель инструментов Team Add-in теперь имеет гораздо больше
активных кнопок. Здесь вы можете: опубликовать сделанные вами изменения в списке;
обновить список с сервера; настроить список; указать, какие столбцы вы хотите видеть;
управлять связями различных элементарных работ списка и их приложениями.
Предположим, что вам (как менеджеру проекта) необходимо обновить поле Escalation и
дату Target Resolve Date для этих элементов. Для этого вам надо нажать в панели
инструментов кнопку Choose Columns, чтобы получить соответствующее диалоговое окно. Этр
974
Часть VI. Система командной работы Visual Studio Team System
диалоговое окно позволяет вам указать, какие поля отображаются в таблице Excel. На
рис. 25.21 эта задача показана в действии.
|^1Иййша"
/D3>
Boofcl - Microsoft Excel
Table Tools
Нопч hsert Pagelsyoct гЧ-rmgfcs Data Rew**» Vkw AdeHrvs D«2<sn <w - *
Team" & Snaglt £*? V inuow
resrnPtOje<tProcei5Gui<Jan« ^ki.J '|v?f>>'c St*, ^jPubten iJftjfrtJfj ^CantigureLwt j Choose Columns $jLin>5a >
Темп System H*lp
M#n« Ccmmnr ct$ Ct( st* »< Tatars
B6 " J > \ ¥
D
|ло]е<**окш Management Proj^ Stav^SKSRivn^MC» Query; tsitias
Ш Vtterafcon 5 - Order Manage* тоя*П
SKf \lteration 3- Order Manager Jane Doe
Ш V Joftn Tester
*9[
•" rs Powers
Proposed Ш for rmilti^o*t on f tad order
Active Missing scenario for new order
Active Chang* rpanagjemem plan not tigned off on
Active No task? defined for DAT evrtironment build о
Vterabon 1-СгеллРгогс
iteration 2 -User *
Vterason 3 - Ordrr Mdnacert em
iteration 3 • Order Manacenienttiti^
VarafJon -4 Inventory ~
^terabon 4 - lnven(ory\Heratoi 4 '
16
17
H < ►
Ready
SlKtetl 5he«t2 Sbe*t3 .
ТШС
fl{H^^riiito^iiii
£LJ
Рис. 25.20. Список проблем в Excel
,'СЪ , У -*•
* л}
Ноте
Те*т~
Team SPrcjecl РгаЯ
Те йт fystem H*lщ
М<*п« Гстя
&\tteraftt|!J
&7 \iterattf
14
15
16
17
И < ► И
Reedy
Sheety
Choose Co'umns
n
ad
Choose the columns to includ* in th« work item list If you are entering n
all the required fields /or the work item types you are adding.
Work item type:
mm
и sfcork items choose
£2
Available coljmns:
Resolved Date
Root Cause
Severity (Required)
Start Date
State Change Date
Steps To Reproduce (Required)
Subject Matter Expert 1
Subject Matter Eypert 2
Subject Matter Expert 3
Symptom (Re^u.redJ^
Talk Hierarchy
Task Type
Team Project
Test Id
Test Name
Test Path
Triage (Required)
User Acceptance Test (Required)
Work hem Type (Required)
Selected columns
Iteration Path (Required)
Assigned To
State (Required)
Trtle iRequired)
d Required [ Reset
QK | |~ Cancel
mJiSSiiiiSSSSiSUiStt^^SS^St^^^^hiAm
P - «" *
IP en
wild out
u
Рис. 25.21. Выбор полей элементарных работ для отображения в Excel
Глава 25. Отслеживание элементарных работ
975
Следующий шаг— обновление данных для элементарных работ. Хорошая новость состоит
в том, что Excel обеспечивает такие раскрывающиеся списки для ввода данных, которые
совпадают с выпадающими списками элементарных работ в Team Explorer. Это
обеспечивает соответствие данных бизнес-правилам и облегчает ввод данных.
Предположим, что в качестве изменений вы: обновили поля Escalation и Target Resolve
Date, изменили статус элементарной работы с Proposed на Active (и назначили ее). Вам
нужно также ввести новую проблему. Вы можете сделать это в нижней части списка.
При добавлении в список новой проблемы вы должны перейти в диалоговое окно Choose
Columns, выбрать тип элементарной работы (в данном случае это Issue), а затем нажать
кнопку Add Required. При этом в форме будут размещены все необходимые поля.
Совет
Поскольку в Excel вы работаете со многими типами элементарных работ, то одно из
необходимых полей — это Work Item Type. Важно при вводе новой элементарной
работы указать это поле первым. После этого все последующие поля будут обновлены
допустимыми значениями. Вы сможете ввести данные надлежащим образом.
Теперь, когда вы завершили выполнение обновлений и даже добавили в список новую
проблему, следующим шагом необходимо опубликовать эти элементы на сервере. Для
этого нажмите в панели инструментов кнопку Publish. После этого начнется процесс
синхронизации.
Йь\у *
ВосЦ - Microsoft E«:el
Ноте
Team"
Теш Project 9i&
Team System \Щ
N7
|projert:Gnifi|:
9
10
11
12
П
14
15
16
17
14 4 > M'
Sheet^
Work Item Publishing Error»
56 \ПВ(ф
STMterai
m Vterali
0 of S work items have published successfully. Review and resolve the following issues to publish
the lemainmg work items.
Unpublished work rternr
ID Title Issue
36 Ul for mufti-sort on find order Validation Error
37 Missing scenario for new order Validation Error
33 Change management plan not sign . Validation Error
39 Nc tasks defined for UAT evmronrn... Validation Error
Status
Not Published
Not Published
Not Published
Not Published
ШтШ'- ШШШШ*
7F80038* This work item contains unsupported field values. Edit the work item and choose в
supported value
Edit Work item»*
f «. т ;<•
yurtUa^
»uildout
Refttsbtog work item data
Рис. 25.22. Ошибки публикации
976
Часть VI. Система командной работы Visual Studio Team System
Обратите внимание, что при публикации вы можете получить ошибки. Если обнаружены
проблемы, то вы получите диалоговое окно Work Item Publishing Errors. В этом диалоговом
окне приведены результаты операции и показаны элементарные работы, имеющие ошибки. На
рис. 25.22 показаны элементарные работы, которые опубликовались с ошибками.
Для исправления ошибок вы можете нажать кнопку Edit Work Item для каждой ошибки.
Нажатие этой кнопки показывает элементарную работу в обычном виде (не в Excel).
Ошибки показаны в верхней части страницы, ошибочные поля также выделены. Здесь вы можете
сделать необходимые исправления, а затем нажать кнопку Close. На рис. 25.23 показана
ошибка, в которой исправляется поле State. Новая элементарная работа должна начинаться
с состояния Proposed, а не Active. После исправления всех ошибок нажмите кнопку Publish
в диалоговом окне Work Item Publishing Errors.
New Issue
i\ TF20012- Field '"mis' cannot be empty
Title
Classification
Airs path: Order Management Project\Order Management
tteraticn path: Order Management Projr ctUteratian 0 - Define Project and Scenario*
Status
Assigned te. MtkeSnell ▼ State. Proposed
Pnorir/- 3 -w Reason- New
Triage- Pending » Escalate- No
j Description Arvafysti ] Corrective Action | History ] Linb | Attachments j Details |
Cescnpticn:
i
i
*
i -irajMia1!
'
"
'
w
w B\\
1 '
r
j;
!
!
1 c,ose 1 1
Рис. 25.23. Исправление ошибки публикации
Примечание
Вы можете добавлять к элементарным работам связи и приложения прямо из Excel.
Интерфейс аналогичен интерфейсу Team Explorer. Однако вы можете делать это
только после публикации элементарной работы. Поэтому если вы создаете новую
элементарную работу в Excel, то вам будет необходимо опубликовать ее перед
добавлением приложений и связей. После публикации элементарной работы вы можете
делать добавления. Для отправки этих добавлений вам будет необходимо повторить
публикацию.
Глава 25. Отслеживание элементарных работ
977
Создание списка рисков
Для следующего примера предположим, что вы (как менеджер проекта) хотите создать
список рисков проекта в Excel. Каждый риск будет вводиться в пустую таблицу, а
затем.публиковаться на сервере Team Foundation Server. Шаги реализации этой задачи не отличаются от
того, что мы обсуждали ранее. Для создания списка рисков в Excel выполните следующее:
1. Откройте Excel и выберите пункт меню New List в выпадающем элементе Team панели
инструментов Add-In.
2. Подключитесь к серверу TFS и проекту на нем.
3. В диалоговом окне New List (см. рис. 25.19) нажмите переключатель Input list для того,
чтобы указать, что вы не хотите начинать с запроса или набора элементарных работ.
Вместо этого вы просто хотите получить правильную схему для ввода элементов.
4. Вы увидите таблицу Excel, которая позволит вам ввести элементарные работы. Одно из
полей — Work Item Type. Выбор в этом поле определит ввод данных в остальные поля
таблицы.
5. В нашем примере мы хотим ввести элементарные работы Risk. Поэтому вам необходимо
нажать кнопку Choose Columns в панели инструментов. При этом появится диалоговое
окно Choose Columns (см. рис. 25.21). Здесь нужно будет удалить все существующие
столбцы. Затем выберите для элементарной работы тип Risk и нажмите кнопку Add
Required (затем вы можете упорядочить столбцы по своему усмотрению). Потом нажмите
кнопку ОК для того, чтобы опять оказаться в таблице Excel.
6. Введите риски, связанные с проектом. г
7. Когда список рисков будет завершен, нажмите кнопку Publish для обновления сервера.
Эти шаги позволяют любому члену команды создавать элементарные работы в Excel, а
затем публиковать их на сервере.
Совет
Возможно, вы захотите сохранить ваши рабочие книги Excel после их создания. Это
может быть очень удобно для того, чтобы дать членам команды возможность
использовать элементарные работы в Excel. Например, вы создаете рабочую книгу рисков, а
затем публикуете эту книгу на портале проекта. После этого члены команды могут
открыть эту книгу, добавить или отредактировать элемент, а затем опубликовать на
сервере. На портале проекта MSF for Agile есть несколько таких примеров.
Использование Project
Элементарные работы могут просматриваться, редактироваться, создаваться и
планироваться при помощи Microsoft Project. Интеграция элементарных работ и Project практически
идентична интеграции с Excel. Предположим, что вам (как менеджеру проекта) необходимо
распланировать задачи проекта.
Сначала вы можете запустить запрос внутри Team Explorer. Затем в панели инструментов
выбрать Open Selection in Project. При этом откроется файл нового проекта и в него
попадут выделенные задачи из запроса.
978
Часть VI. Система командной работы Visual Studio Team System
u' Microsoft Project
i««:
н<п
[Edit
Proj-ctl
I&t Vjew Insert Fo/mat look Project JJeport
* ""wort"
temO
1
2 1
3.2
M
5 4
e 5
7 6
8
3 12
10 8
11 13
12 14
13 15
14
15 7
16 9
17 10
18 11
19
20 32
•>1 •»
.«.. £'4t^:i >«" *fc***
,XV No '""<m"
Tils
- Project Setup
Setup SetPermfctens
Setup Mgrauonof Source Coc
Setup Migration of WerVtem»
Setup Set Check-In Potaes
Setup Zend mail to users for ii
Setup Greats Protect Structuri
- Project Governance
Create Project P*n
Create Configuration Мапавегг
Create Master Schedule
Greats leraton Plan
Create Teat Approach Worksh
- Requirement* Analysis
Create Visor» Statement
Create Personal
Create Quality of ServJc* Re*
Greats Seen erica
- Development
Address Lookup Feature
AAA М.Ч. О,./».,,-»
< ' Ш "** С
Duration
2 days
С 5 days
С £ days
C5da>a
1day
D 25 days
2 days
«days
3days
2 days
3days
2 days
Iday
17 days
2 days
2 days
Sdaya
15 days
5 days
2 days
с ,♦,.,.
Collaborate
» &-•>>-
Start
Tue 3*4-08
Tue ЗЯ/38,
Tue 3/4/58
Tue 3WCS
Tue 3/4/sa
Tue 3/4,'Bo
Tue 3/4/33
ТиеЗМ/08
Tue awoe
Tue 3/4/28
Fri 3/7>Q3
Fri 17'05
Tue 3/4/OS
Tue 3M/08
Tue 3W!>8
Tue 3/4/C8
Tue vm&
Thu 3/5/C8
Tue H*8
Tue 3/«/38
T... «„«V»
Team Window
j\<. и.»
irJ <Т*:! ' Г>' 4
Finish stress
Wed 3/5ДИ
Tut 3/4/08
Tue 3/44-08
Tue 3/4/08
Tue 3/4/08
Tue 3/4/08 2
Wtd ЗЯЛШ
Tue3/11JW f
ТпиЗчЪ
Wed 3/5/
Tue 3/11/J
,-uH
Й«*р
PuMeti
Refn
CJ Refresh OH
H_jYes
Mori ЗЯС/0В 9
Tue 3/4/00
Wed 3/2eV0«
Wed 3/5/08
Wed 3/5/08
Mon 3/10/08
/Zed 3/2Я/08 16
Мол 3rtWWJ
Thu 3«Ъ08
Нол ЧМЛ-Лв
*<=
and Work K(
sn Type
Ho >
Yes Task
ves Task
Yes Task
Yes Tart
»es Task
Yes Task
23
PI Task
Г Ти*
| Task
'>es Task
/as Task
No i
Yes Task
Yes Task |
Yes Task 1
res Task
«9
res Task
V.r T»pl
^| j*,j]
9 x
_ 1
Ihr'i об А
sfw t _
V"
fri'
t
•
«
r
0
1
m
ш
m
m
»^"
m
ж
ш
V"
a -
*WH-J
Рис. 25.24. Обработка элементарных работ Task в Project
</» Task 33 - Microsoft Visual Studio
File Edit View Build Team Data Took T«t Analyze
Л- --за*',. * л 1 • -« ^-~i -
III
1
j
Task 33 • Add New Product
[ Deitnptrort j History 1 link» [ At&chrnwti | Details | ,
General
Requires review No
Requires test No
Buiid
Integrated in »
Task Hierarchy Development > Add New Product
i
i
i Test
Name.
i Path
i
1 Item is) Saved
Window Негр
7Т~~71Г~Т 771»
~-~~ ---
Schedule
Estimate* 40
Remaining work: 40
Completed worb 0
Start Date. 3/4/2008 8 00 00 AM
Finish Date- ЭЛОЛМОв ДООО РМ
-::::...:.:>:.-. ~~. ж/ж—~.~-
l^i^JalSd]
- 1
- X
s
"«■■■"..v. ~
и j
3 !
1J!
Рис. 25.25. Спланированная элементарная работа
Внутри Project вы можете выполнить связанные с проектом задачи, в том числе:
свертывание задач в группу с названием, определение часов для задачи и ее предшественников,
Глава 25. Отслеживание элементарных работ
979
и т. д. На рис. 25.24 показан пример планирования элементарных работ типа Task (Задача) в
Project.
Затем, после завершения планирования, следует нажать кнопку Publish. При этом
произойдет обновление командного сервера. Синхронизация обновит все строки, помеченные как
Publish and Refresh (рис. 25.24). Поэтому для тех строк, которые не являются
элементарными работами, в этом столбце необходимо поставить No.
Теперь внутри каждой элементарной работы имеется информация планирования для каждой
задачи. Например, если разработчик откроет элементарную работу задачи разработки, то он
сможет щелкнуть по вкладке Details, чтобы увидеть оставшуюся работу и планируемые
даты начала и завершения. Пример показан на рис. 25.25.
Менеджеры проектов могут сохранить свои планы и использовать их как основу для
получения обновлений задач от разработчиков. Таким образом, они могут обрабатывать
элементарные работы тем инструментом, с которым они чувствуют себя максимально комфортно.
Бизнес-аналитик
Бизнес-аналитик будет взаимодействовать с элементарными работами при написании
технических требований и пользовательских сценариев. Эти элементы определяют такое
взаимодействие с системой, которое пользователь должен получить для того, чтобы проект мог
считаться успешным. Поэтому такие сценарии обычно описываются в начале итерации.
Сценарии управляют другими элементарными работами (такими как задачи разработки).
Давайте рассмотрим стандартный метод, которым может пользоваться бизнес-аналитик. '
Для данного примера представьте себе, что теперь вы — бизнес-аналитик. Ваш первый
шаг— встреча с заинтересованными сторонами и мозговой штурм потенциальных
пользовательских сценариев. Предположим, что на этом совещании было описано 25 возможных
сценариев. Первым шагом необходимо создать элементарные работы Requirement типа
Scenario для всех этих 25 сценариев. Это позволит давать названия элементарным работам,
назначать их и отслеживать. Кроме того, менеджер проекта теперь сможет отслеживать эти
элементарные работы в плане (поскольку вы оценили время, необходимое для завершения
каждого сценария).
Затем вы начинаете писать сценарии. Вы можете просмотреть весь набор сценариев, чтобы
определить самые важные и начать именно с них. При написании простого сценария вы
можете использовать вкладку Description элементарной работы. Более длинные и сложные
сценарии вы можете писать при помощи документа Word. Давайте рассмотрим пример.
Предположим, что у вас есть элементарная работа для сценария с названием Login Scenario.
Когда вы пишете этот сценарий, то используете шаблон сценария в формате Word. Затем вы
загружаете этот сценарий в проект. Вы можете сделать это при помощи портала проекта или
через Team Explorer.
Допустим, что вы использовали Team Explorer. Здесь вы раскрываете каталог Documents, a
затем щелкаете правой кнопкой мыши по каталогу Requirements. После этого вы выбираете
Upload Document для того, чтобы перейти к документу и загрузить его на сервер.
980
Часть VI. Система командной работы Visual Studio Team System
V> Team E*pJarer - Microsoft Visual S*ud»
Ftk Edit View BuiJd Team Data Tools
\Ц • . • -J *J # ' A JA -! л -"'
lb JU _
^| Project Management
tJ *Дг Requirements
6] Create New Product.doa
ft] Enter Order.doai
ftj Login Scenano.doc*
§j|] Manage User.dooi
Tert Analyse Window Help
12»
'1
Ready
^K^j T £; http7/2ldf2-tf$MM/She^/Ord«f%20M«nigement9^Projert/Requin » | *t | X 11 lurSec^.o^/ite^vKZ^ ~Р~
ii >& 'zd\' # Rtouirement* X j&Tnep^tannotbeittspL. I | ^' О ' ё*^Р«9«' $ Tools *
i «аяь. Q^di*' "чпвдрте-it "njfct -* Rpq» тт<"\и
I jJ Requirements
View A* Site Content
Site*
. Document*
■ Development
• Project Management
1 • Reeurements
■ Secu'ity
New
14*
* Uptead • Aceen**
Hr«e
Qeate New Product 1
Enter Outer! «ли
Logn Scenario! глн
Manage User b<rw
MfW
Setthe*»
3/4/200B6;24PM
3/4/2*M6'24PM
3/4/2008 6.ИРМ
3/4/2008 6:24 PM
?ew Ml Documents »
'5S*edH*
2K3R2-TFS2CC3Vnsne4
2K3R2-TFS^C8VfeTr1
2K3R2 ТТЗГССЗУтвтеИ
2K3R2-rFS2D0SVTWiell
*•! Local intranetj Protected Mode: On
4tf004 -
Рис. 25.26. Документ технических требований
в представлении Team Explorer и на портале
S/* Bequiremert46 - Microsoft VUiusi Studio
ЧЩЦИ 1РВИ
Committed: No
j Oeacnptton J AnaryffoJll
Folders v
fip Computer *
$» Network
ЙР 2kBr2th2D0B ,
i? sites \
4.1 order management project! i
4e Development >
j» General Documents U
i. images j
i, Lrsts
J* m
^ Process Guidance
is» Project Management
£ Requirements
|i Security
|a Shared Documents
X. Test
filename Logr Scenam door
Date modified Type
Create New Enter Login Manage
Product doci Orderdoar. Scenano-doc User do»
[Mffe<H
I Q*n
Ready
Рис. 25.27. Связывание с документом сценария на портале проекта
Глава 25. Отслеживание элементарных работ
981
Этот документ загружается в ту же самую библиотеку, которая используется порталом
проекта. Имеются два представления: одно в Team Explorer, а другое на портале. На рис. 25.26
показан документ сценария в обоих представлениях.
И наконец, вам понадобится связать документ сценария с элементарной работой.
Интуитивно может показаться, что для этого следует воспользоваться вкладкой Link. Однако в
данном случае это неверно. Такая связь устанавливается на вкладке Attachment. Вы добавляете
приложение и переходите к документу, сохраненному на портале (рис. 25.27). Добавление
такого приложения фактически описывает связь между элементарной работой и файлом.
Таким образом, если файл на портале будет обновлен, то эти обновления будут отражены
при открытии файла из элементарной работы.
Разработчик
Разработчики получают список своих задач из базы данных элементарных работ. Кроме
того, они используют элементарные работы для пояснения технических требований,
пользовательских сценариев, ошибок и т. д. Разработчики являются, вероятно, основными
потребителями элементарных работ в системе Team System. Мы уже обсуждали большинство
этих сценариев. Поэтому сосредоточимся на основном действии разработчика—
связывании кода с элементарной работой.
Связывание элементарных работ и кода дает серверу Team Foundation Server важную
статистику. Оно позволяет сделать отчет по изменениям кода, продвижению задач, а также по
состоянию ошибок. Кроме того, оно предоставляет важную связь для возвращения к коду и
выполнения его обслуживания. Исключительно полезна возможность посмотреть на код, 'а
затем прочитать соответствующие требования, задачи и сценарии.
Совет
Считается хорошей практикой создавать политику возврата, которая заставляет
разработчиков связывать все возвраты с одной или несколькими элементарными
работами. Это обеспечивает надлежащее отслеживание работ по разработке (и
возможность предоставления соответствующих отчетов).
Связывание кода и элементарных работ при помощи возврата
Основной метод разработчика для связывания кода с элементарной работой — это
выполнение такого связывания при возврате кода в системе управления исходными кодами. Мы
описывали управление исходными кодами в главе 24. Однако очень важно
проиллюстрировать здесь этот процесс с точки зрения элементарных работ.
Предположим, что вы являетесь техническим руководителем проекта и перед вами стоит
задача создания скелетной структуры приложения. Конечно, эта задача будет элементарной
работой. Ваши действия как технического руководителя могут включать создание решения
и проектов, а также написание кодовых заглушек для множества элементов проекта.
Когда код будет готов, вы вернете всю структуру кода. Во время процесса возврата вы
свяжете возврат с задачей генерирования структуры кода. Вы сделаете это при помощи
нажатия значка Work Items в диалоговом окне Check In. Выбор этой опции откроет окно, кото-
982
Часть VI. Система командной работы Visual Studio Team System
рое позволит вам выполнить запрос и поиск элементарных работ для связывания с кодом.
На рис. 25.28 показан пример.
Check In - Work Items (Order Management
J
Source Files
1 &
' 1 Work Item*
j u
1 Check-in
j Notes
i £
i Policy
Warnings
1
\
i
i
1
i
1
Query. My Work tterrs
| Work Item. ID
K 1 Task 1
J Task 2
] Task 3
" ) Task 4
. J Task 5
i Task 6
' 1 Task 12
J Task 32
] Task 33
П Task 34
J Task 35
«/| Task 47
Project/Team Quenes/My Work herrs)
<Starch'> •• '' *;
Title
Setup* Set Permissions
Setup Migration of Source Cede
Setup. Migration of Work Items
Setup. Set Check-in Policies
Setup. Send mail tc users for installation and getting
Setup: Create Project Structure
Create Project Plan
Address Lookup Feature
Add New Product
Find Order
Shipping Tracking Web service
Create solution file and projects
JO
State
Proposed
Proposed
Proposed
Proposed
Proposed
Proposed
Proposed
Active
Active
Proposed
Proposed
Active
Check )n
[ЗжЕЫ]
ChecJf-in Action
[p«*ojve •*■]
Associate |
| | Caned . 1
Рис. 25.28. Связывание массива изменений с элементарной работой
i/» G-dprMin/igemrvT Microsoft V suaiStu>fflQllt
File Edit View Project Build
Task 47 Create solution file and p] j
Classification
Area path)' Order Manege)
kerahon path- Order Manage!
Status
Assigned to. msnell
Pnorityt 3
Seventy Low
Tnegr Pending
| Description j History Link
Details for Changeset *5 - Source FTes
~ШВ1
j
1
i
)
Source Files
£3,
1 U
j Workltems
j LJ>
| Check-in
Notes
' -4
1 Warnings
1 Changeset «h
У
Created On:
3 ^el: l/„
Comment-
Name
о DetaAccess
^X OrderManagementsIn
<^3 Cliisl.cs
<3 DataAccess.csproj
!5j DataAccess cspraj vspscc
< Properties
'Jtj AssembMnfo cs
S By Usen
3/4,700810.04 49 PM
Change
add
edit
add
add
add
add
add
msneJI
*
Folder *
S/Order Management Proj~
S/Order Management Proj
S/O'der Management Ptcj
S/Order Management Proj
S/Order Management Prcj
S/Order Management Proj...
$/Order Management Proj»
| Cancel |
Link Type
Changeset
Descnption
Changeset 5
Comments
Source control change.
J IW'WIIH
Optn 1
Ready
Рис. 25.29. Связь элементарной работы с набором изменений
Глава 25. Отслеживание элементарных работ
983
После того как вы найдете задачу, выставите флажок для выполнения связывания. Кроме
того, вы можете указать, выполняет ли возврат данную задачу. Сделайте это посредством
настройки действия Check-in Action (крайний правый столбец). Такая настройка
автоматически помечает статус задачи как Resolved.
И наконец, этот процесс создает также обратную связь с элементарной работой. Когда вы
откроете элементарную работу и щелкнете вкладку Links, то увидите набор изменений,
который был возвращен в предыдущем процессе. Этот связанный набор изменений
представляет собой историю того, какой код был возвращен в связи с данной элементарной работой.
На рис. 25.29 показана эта связь и открытый массив изменений.
Совет
Чаще всего вы будете связывать возврат с несколькими элементарными работами
Такая возможность полностью поддерживается и считается хорошей практикой.
Например, если ваш .возврат исправляет ошибку, связан с требованием и выполняет
задачу, которая была создана для исправления ошибки, то лучше всего организовать
связь со всеми тремя элементарными работами.
Связывание кода с элементарными работами
Вы можете также связать код с элементарной работой (при помощи вкладки Link
элементарной работы). Эта возможность полезна в том случае, когда вы хотите выполнить связь
вне возврата (либо вы забыли это сделать).
*f* Q'derManagemer* - Microsoft V sual Studio
file
Edit View Project Build Team Debug Data Tools Test Analyze Window Help
" ~J ai 0 > i ■> ' • <<: * ♦ ' . > Debug - An/CPU
lmkU\j^^K.i ^ _ _ ;
Task 48 ' Create Order Class
Title: Creite Order Class
Classification
Are» path* Order Manage]
Iteration path: Order Manage]
Status
Assigned to* rmnell
Priorrty 3
Severity; Low
Triage: Pending
j Pescnptom { History j Links
Discipline Development
Type
Link Type
Describe
Select the link type <nd details.
Link type, Versionedbem
Link details
Jtems
Linktc [latest Version
Comment:
• *Ъ
kj£ •>s'u! У* Cnangeij
ltem(s} Sawed
Рис. 25.30. Добавление связи версии с элементарной работой
984
Часть VI. Система командной работы Visual Studio Team System
Для связи кода перейдите к элементарной работе и выберите вкладку Links. Нажмите
кнопку Add для того, чтобы получить диалоговое окно Add Link. В этом диалоговом окне
выберите в поле Link type значение Versioned Item. Затем нажмите кнопку Browse. Пример
показан на рис. 25.30.
В этом примере ваша задача— создать класс Customer. Класс создается и регистрируется.
Теперь его нужно вручную связать с элементарной работой. После нажатия кнопки Browse
вы можете перейти по дереву исходных кодов (для нахождения нужных файлов кода, с
которыми вы будете связывать работу). На рис. 25.31 показан этот процесс в действии. После
выбора вы сможете указать, должна ли связь всегда указывать на самую последнюю версию
или на набор изменений.
</> OrderMinagerrwrt - Microsoft Visual Studio
Fife Edit View Project Build Team Debug Data Tools Test Analyze Window Help
S' ' £ У ** * i л ^ ' "' ' ^' -* > Debu9_ ' Any CPU
#| T*tk4al iim^tomrl „ __
Ш
Task 48 • Create Order Clan
Titte- Create Order С tan
**+"*«*> П~****~*
x h
"I?
Clawrficai
Area path)
Iteration
Status
Assigned!
Priority;
Seventy
Triage:
i [ *™
Link Type
AddL«nk
Select the link type and de
Link type |VcrPorwlitcTdj
Link details
hem-
Link to; latest Уст
Comment
Description
Ljl P*"i« ►ig- Cluirje»!
Changeset б successfully checked in.
Look irv
^J BuiinessDomain
Li Properties
ipBusmeuDomttn csproj
5j BusinesiDomaKcrpfoj.vspscc
№
hem name S/Order Management ProjecV'OTderrVUnagement'BuuneuDcrnain/Oi
Items of typr [aB files (V) ~|
Рис. 25.31. Выбор версии для связи с элементарной работой
Тестировщик
Тестировщик взаимодействует с элементарными работами при описании и отслеживании
ошибок и проблем проекта. Вы уже видели примеры таких задач. Здесь мы хотим обсудить
то, как тестировщик может связать тест с элементарными работами.
В качестве простого примера давайте рассмотрим элементарную работу Requirement.
Каждое техническое требование в системе должно быть проверено каким-то представителем
пользователя. Это называется приемочным тестированием пользователя (user acceptance test,
UAT). На вкладке Details элементарной работы Requirement есть место для отслеживания
статуса UAT (рис. 25.32). Таким образом, команда знает о том, какие технические
требования прошли UAT (и готовы к отправке).
Глава 25. Отслеживание элементарных работ
985
<jtt OrderManagement Microsoft Visual Studio
File Edit View Project BuUd Teem Debug Djta Tools Test Analyze Window Help
' Jb ' -J А Ш * -J i& '' • *' ' P- "\ > ^bug - Any CPU
5
1
i i
Requirement 46 }.^W^JfegnftIfe»l8riJ.lBiBft6»hMftf.l
Requirement 46 Login Scenario
Status
Assigned to Jane Dee » Blocked. No
Triage: Pending т Reason New
Committed- No *•
[ Description | Analysis | Subject Matter Experts j History [ Links [ Attachments] Details
Build Schedule
Integrated in » Estimate;
! Remaining work.
Completed work.
Test
User acceptance test "ШНЧФИ
Fail
Not Ready
илшшшшшгшшшшшшшшшшшшшшшшшшшшшшшшшшшшшшш
_^
, Ъ\Ши
J^Prwing Iharges[
i Changeset 6 successfully checked iru
\^\m'm&m&}
' ^ *ll
- X
i
j
|
i
N
Mr ! i
<*|j
^ I
T 1
'! I'
ll
I
f
Рис. 25.32. Ввод результатов UAT для технического требования
\# OrderManagenwr* - Microsoft Visual Studio
(^,13I^5?
File Edit View Proje<t Build Team Debug Data Tools Test Analyze Window
Д- " J? У tf * 4* & ' • " " £J~ "' ► Debug - AnyCPU
d" ^ *> ы **' ^ п э з з с * *
Test List Editor
*i> ' $ is*] ^J < Group By: [Ncne] - [All Cclumr » <Type keyword-
,0 Item(s) checked 8
Л
у f^ Lists of Tests
</ Ji CustomerUnrtTests
f^l Tests Not in a List
/.£ All Loaded Tests
Test Name
V ^J StateTest
у *_j PcstalCodeTest
VJ^JNameTest
Л <J IdTest
• ^J CrtyTest
Task 49*
Task 49 (Modified) Create Customer Class
i Test
Name: Older Manage/nent Customer Unit Tests
IT> CustomerUnrtTests
Path' Lists of Tests/СustcmerUnrtTerts
Project
OrderMgmtTests
OrderMgmtTesta
OrderMgmtTests
OrderMgmtTests
OrderMgmtTests
• j
L^Pend ->g Charges
Ready
Рис. 25.33. Заполнение подробностей теста для задачи
Тестировщиков могут также попросить указать, какой тест удовлетворяет данному
требованию, ил и задаче. Предположим, что вы (как тестировщик) имеете задачу разработки по соз-
986
Часть VI. Система командной работы Visual Studio Team System
данию класса Customer. В этой элементарной работе на вкладке Details может быть
указано, что перед завершением данного элемента требуется тест. В этом случае необходимо
будет заполнить информацию по тесту.
Вы вводите информацию по тесту для элементарной работы задачи в группе Test на вкладке
Details. К несчастью, не существует способа связать тесты и элементарные работы внутри
интегрированной среды разработки. На данный момент это ручной процесс. Вам
необходимо ввести следующие сведения о тесте: название теста, его идентификатор, а также путь к
тесту. Эта информация доступна на экране Test Manager. На рис. 25.33 показан экран Test
Manager и подробности элементарной работы в нижней части экрана.
Модификация элементарных работ
Вы можете модифицировать и расширять функции системы Team System в нескольких
областях. Модификация — это подстройка имеющейся функциональности под ваши
потребности. Это самая обычная ситуация для большинства фирм-разрабочиков. Для расширения
необходимо использовать интерфейс прикладного программирования Team System и
движок отчетности. Вот возможные точки модификации и расширения:
□ методика процесса — вы можете модифицировать существующие методики или
написать собственные. Сюда входит также изменение рабочих процессов для элементарных
работ;
□ элементарные работы — вы можете редактировать существующие элементарные
работы (добавлять новые поля и данные) или создавать новые элементарные работы;
□ отчетность — вы можете создавать новые отчеты и модифицировать существующие;
□ портал проекта — вы можете модифицировать портал проекта для того, чтобы
выложить на нем свои шаблоны и документы проекта.
Мы не сможем описать здесь все эти возможности. Вместо этого мы рассмотрим два
стандартных варианта, связанных с элементарными работами: заполнение вашего процесса
стандартными элементарными работами и модификацию существующей элементарной
работы.
Заполнение процесса элементарными работами
Когда вы создаете новый проект на базе одной из методик MSF, то командный сервер
заполнен начальным набором элементарных работ. Эти работы представляют собой
стандартные задачи, необходимые для осуществления проекта. Некоторые из этих задач запускают
процесс в движение (такие как создание плана проекта и главное расписание).
Начальный набор элементарных работ является частью общей методики. Обычным делом
является внесение ваших собственных задач (элементарных работ) в существующую
методику. Давайте посмотрим, как это делается.
Глава 25. Отслеживание элементарных работ
987
Примечание
Вы можете применить этот процесс добавления в методику элементарных работ и
для расширения методики. Вы можете даже использовать его как основу для
написания собственной методики.
Выгрузка (экспорт) методики
Методики в Team System описываются как шаблоны процесса. Шаблон процесса — это
набор файлов, которые Team System может использовать для описания процесса или
методики. Как мы уже обсуждали, система Team System поставляется с двумя шаблонами
процессов: MSF for Agile и MSF for CMMI. При настройке вашего процесса вам наверняка
захочется подстроить и эти шаблоны (для их соответствия).
Для модификации шаблона процесса необходимо использовать Process Template Manager.
Этот инструмент позволяет вам экспортировать процесс, настраивать его, а затем
импортировать. Доступ к этому инструменту вы можете получить через Team Explorer. На
рис. 25.34 показана структура меню для доступа к инструменту.
Ч/> OrderManagement - Microsoft Visual Studio
&
File Edit View Project Build Team Debug Data Tools Test Analyze Window Help
Jb I * J? d 0 L> > ' Л 1 - ^ ' ^ * 'I ► Debug * Any CPU
''. Tea,m Explorer
--- —
?2j|T: 55; Add Existing Team Project..
ti ^J ЬЛЦ .£} New Team Project
U 1Ъ О'* Disconnect
C3
Tj Refresh
Team Foundation Server Settings ►
^ Properties
Security—
Group Membership
Process Template Manager.
Source Control hie Types
Й
Г2* Pf ndtftq С *wno«
Ready
Рис. 25.34. Доступ к Process Template Manager
Process Template Manager показывает инсталлированные на вашем сервере TFS шаблоны
процессов. Здесь вы можете экспортировать (выгрузить), импортировать (загрузить),
установить процесс в качестве процесса по умолчанию, а также удалить процесс в случае
необходимости. На рис. 32.35 показано это диалоговое окно.
988
Часть VI. Система командной работы Visual Studio Team System
2K3R2-TFS20G8 Settings P-oeess Template Manager
Piocess templates*
MSF for Agile Software Development - v42 (default)
MSF lor Agile Software DeveJoprnent - »-4.
Pow"|otd «fd'fa'ttl PfP*tt> I«np|i1« »'llir«
Process templates summary:
Choose the MSF for CMMI Process Improvement process for projects with
longer life cycles and that require »record of decisions made Choose MSF
for CMMI Process Improvement over MSF for Agile Software Development,
if your organization is undertaking a broad quality assurance and process
improvement initiative or your team needs the assistance of explicit process
guidance rather than relying on tacit knowledge and experience.
Пйв
Upload
Make Default
Delete
- С ._-c^*.™ ]
Рис. 32.35. Process Template Manager
В этом примере вы будете экспортировать шаблон процесса MSF for CMMI. Затем вы
добавите в этот шаблон несколько нестандартных элементарных работ и импортируете его.
Process Template Manager сохраняет в отдельный каталог при выгрузке все файлы,
описывающие процесс. Этот каталог содержит XML-файлы, которые описывают основную часть
процесса. Он содержит также документы по умолчанию, запросы, а также руководство по
процессу (для данной методики). На рис. 25.36 показана структура каталога, который
описывает процесс СММ1.
Date modified
i*i
V MSF for CMMI
i MSF for CMMI Process Improvement • v4.2
i; Classification
j; Croups and Permissions
ji Reports
-< Version Control
it Windows SharePomt Services
i General Documents
Process Guidance
, i Supporting Files
■< Cede
i> Css
h EULA
|i images
i Project Management
i< Requirements
yi Security
J, Test
i Woddtem Tracking
* Queries
i TypeDefinihons
^- VVorkttems xml Date -ncd.« >Л 11/&-90071012 PM
P.*! XML Document bit- 156 KB
££ OJ« re»re«l ШБг'200710'12 РМ
cfep
Workltemsjcml
Рис. 25.36. Экспортированный шаблон процесса
Глава 25. Отслеживание элементарных работ
989
Обратите внимание, что файл Workltems.xml (с которым вы будете работать в этом
примере) выделен. Вы будете редактировать его в Visual Studio. На рис. 25.37 показан этот файл,
открытый в Visual Studio.
В этом файле есть три раздела: определения типов элементарных работ, элементарные
работы, а также запросы. Раздел определения типов указывает положение XML-файлов,
используемых для описания каждой элементарной работы. Раздел элементарных работ указывает
набор элементарных работ, которые будут загружены при создании проекта (именно это нас
и интересует). В разделе запросов имеется список местоположений всех файлов запросов,
которые будут загружены как часть методики.
Is Л
sft OrderMMagemcnt - Microsoft Visual Studio
File
s
8
Edit View Project Build Team Debug XML tot* Tools Test Aiwlyie Window Help
-J- f& H 0 & Ъ 8&И * * ' 0' * I ► D*ug_ Г AnyCPU ^ ^ ^ &
^
*?janl ve'»ior""*1.0" 4ncodinij"*,utx'-B" 7> -
D <c«sk iJ-""WIT*" Ji*i»»"'*,HaTlrttr#«T^p(i detiaisisne" j,J4«J.«","HicTO«oft Proj«ctCc#*ticnHi.2»rd.Ki:rkIt*f
<КОЙКГТ2ЭСГГРМ>
<М0аК1Т2КГТК fia«>M*jr«-,,1lorkIu«in Tx*ckiaa\Typ*D*r*n±tlon*\Bug *anlV>
<Ж»аЖГГКМГГЗге fil*H*ew»-*4loxkIewn Tr*cklR9\Typ»Definiticne\T*»lt.Heil"'/>
«WCaKITSMTxPI nT«Waje»-"HorkIt«n TxackiaoATypeBefinitionaMaeu» *»!"/>
«*SC2JCITSSTYPS f i.J.*MAja»-w*lorkrtan TraeklngXTypeDafinJ.Cion»\Changaa«(iua*c„ xsl"/>
<UCSl(CTTBMITP8 *и«Кетж--Нохк1г*ж Tr»cktTie4Typ*Oiifinic±oe*\ai*k.x»L,'/>
<ТОаК1Т£И1ТР8 ^М«Н«гж--ИагкГ1:«и Tr»eking4Tsp»0e*initlon«\ae7ulr«ir*iit elV>
««ORKIT2K7TPZ 4il*HuM«"HoxkICui Tr*ckJjg4Typ*Daf ±nitiona\JI*viav.*»l"/>
</t.uik>
<c»*k td»"WT»" г*жж»"'Кегк1т.1Н1«" pla^^r^'TlteroettfС PxBjectCr««uiantH»cd ИolkTt.<ыиIx*rkitцr,' ~пв$>1 <
<dapar.da.ne-1 «jb>
«dependency tH»*kIj4»"HITe" />
</d«pand«rcl*s>
<t*a«)t»I>
<«05ас:тт>и>
<M1 гуум»-"Г»вк->
«FIELO 7w<r«JA»w«"Sy*t4ie.Tifcl«" v«Im»*Sattup Set Fexauaaixra'' />
«flELD r»+''j*«*»'",,Sy*T:*»-D*»er±ptAon* v» r*«"Jit!d taam инкчп to on* of the four «emrity
<FI£U> r*iaAfl»=y*C*e.Icex»tianP*ca" vzlu»-'*ME'aOJXCT№UC2*t4Itaz*tloa 3" />
<FT2LD r«>^A«i»«"Sv*cwB9 Scat»' v*.;u«—"Proposed* />
^riELC г*Хглгж-"8у«с«ш Reason1* x«*X^A*н■,'•J■w', /v
ч/«1>
Reedy
Рис. 25.37. Файл Workltems.xml
Добавление элементарных работ в методику
Центром данного примера является набор элементарных работ для начального заполнения
проекта. Если вы посмотрите на существующую элементарную работу, то сможете понять
ее структуру. Это поможет вам создать несколько новых задач и настроить существующие.
Далее показана задача "Setup: Set Permissions" (описание мы удалили):
<WI type="Task">
<FIELD refname="System.Title" value="Setup: Set Permissions" />
<FIELD refname="System.Description" value="Add team members to ... " />
<FIELD refname="System.IterationPath"
value="$$PROJECTNAME$$\Iteration 0" />
990
Часть VI. Система командной работы Visual Studio Team System
<FIELD refname="System.State" value="Proposed" />
<FIELD refname="System.Reason" value="New" />
</WI>
Видно, что для наполнения методики дополнительными элементарными работами вам
необходимо задать тип, описание, состояние и т. д. Теперь вы можете добавлять элементарные
работы так, как это сделано в листинге 25.1.
[ Листинг 25,1. Новые задачи
<WI type="Task">
<FIELD refname="System.Title" value="Setup: Execute setup checklist" />
<FIELD refname="System.Description"
value="Fill out the Excel file,
'ProjectStartupChecklist.xls' from the portal." />
<FIELD refname="System.IterationPath"
value="$$PROJECTNAME$$\Iteration 0" />
<FIELD refname="System. State" value="Proposed" />
<FIELD refname="System.Reason" value="New" />
</WI>
<WI type="Task">
i <FIELD refname="System.Title" value="Create billing report" />
<FIELD refname="System.Description" value="Fill out the Excel file,
'ProjectBillingReport.xls' from the portal." />
<FIELD refname="System.IterationPath"
value="$$PROJECTNAME$$\Iteration 0" />
<FIELD refname="System.State" value="Proposed" />
<FIELD refname="System.Reason" value="New" />
</WI>
<WI type="Task">
<FIELD refname="System.Title"
value="Enter project in Time Tracking Sys" />
<FIELD refname="System.Description" value="Go to TimeTrack2008
and enter new project information." />
<FIELD refname="System.IterationPath"
value="$$PROJECTNAME$$\Iteration 0" />
<FIELD refname="Systern.State" value="Proposed" />
<FIELD refname="System.Reason" value="New" />
</WI>
Загрузка (импорт) методики
Следующий шаг— импорт улучшенной методики. Для этого вам необходимо вернуться в
Process Template Manager и выбрать Upload. Затем вы увидите экран выбора каталога. Этот
Глава 25. Отслеживание элементарных работ
991
экран необходимо использовать для перемещения в тот каталог, который содержит
обновленную методику.
Название шаблона процесса очень важно. Если оно совпадет с названием существующего
шаблона процесса, то Template Manager попросит вас подтвердить перезапись
существующего шаблона. Это хорошо в том случае, если именно это вы и хотите сделать. Однако если
вы хотите сохранить основные шаблоны Visual Studio, то вам следует переименовать ваш
шаблон процесса перед его загрузкой.
2JGR2-TT-S2008 Settings - Ргобви Template Manager
ИЪш
Process templates-
MSF (or Agife Software Development - v4 2 (default)
M5F lor CMMI Process Improvement- v4 2
№ШШ№ШШ1Р
' [ Upload ]
1 Download j
[ Moke Default [
(~ Delete ]
Download addifronal Process Templates online
Process templates summery*
Choose the MSF for* CMMI Process Improvement process for projects v^ith
longer life cycles and that require a record of decisions made. Choose MSF
for CMMI Process Improvement over MSF for Agile Software Development,
if your organization is undertaking a broad quality assurance and process
improvement initiative or your team needs the assistance of explicit process
guidance ratherthan relying on tacit knowledge and experience.
Рис. 25.38. Загруженный шаблон процесса
<лЛ Aft Work Items [Resets} - Microsoft Visual Studio
File Edit View Build Team Data Tools Test Analyze Win do* Help
J'„'^je ;.-i \( " N ' '<*" ~',- > """"" ~j
! 3 i iJ ® ti- *** ' 1 ^«i3 «
JL»
l SU** \ \S1 4$VnU$99A^
-
АЙ Work Hems PtewNL T^Jttfciw» \
Query Result:: 18 results found C currently selected).
J ID * Work Item Type * State Assigned
шш^шшшшшшшшшшштшш
Тик
Task
Task
Task-
РШшщ~"ШШ
Proposed Admmistra Setup: Set Permissions
Proposed Admmistra... Setup: Migration of Source Code
Proposed Admimstra», Setup: Migration of Work hems
Proposed Administra,.. Setup Set Check-in Policies
Task 50 • Setup: Execute setup checklist
Title Setup- Execute setup checklist
Classification
Area path: Unleashed Custom Template
Iteration path: Unleashed Custom TemplateMteratton 0
Discipline;
Type
s$ Ere» list
hem (s) Saved
Рис. 25.39. Новые задачи в новом проекте
992
Часть VI. Система командной работы Visual Studio Team System
Переименовать шаблон процесса можно в верхней части файла ProcessTemplate.xml,
который находится в корневом каталоге шаблона. Вы можете также использовать этот файл для
изменения описания шаблона процесса, которое видно в Template Manager. На рис. 25.38
показан загруженный шаблон процесса.
Примечание
Если вы решили перезаписать, существующий процесс, то это не повлияет на уже
описанные с его помощью проекты. Эти проекты используют копию методики. Вы
перезапишете методику для новых проектов.
Теперь вы можете применить ваш новый модифицированный процесс для создания новых
проектов. Вы можете использовать этот процесс экспортирования, модификации и
импортирования для того, чтобы делать любые модификации командных систем. Вы можете
также использовать импорт для загрузки процессов сторонних организаций. На рис. 25.39
показаны результаты этой работы: новый проект с новым исходным набором элементарных
работ.
Модификация существующей элементарной работы
Вы можете модифицировать описание существующей элементарной работы при помощи
таких же шагов, которые были описаны в предыдущем разделе: экспорт, настройка и им-
пррт. Модификация существующих элементарных работ является, вероятно, самой часто
встречающейся модификацией системы Team System. Давайте рассмотрим пример.
Предположим, что вы хотите модифицировать элементарную работу Bug. Вы хотите
добавить поле для указания типа ошибки. Это позволит категоризировать ошибки тому человеку,
который рассматривает ошибки. Затем вы сможете делать отчеты и приоритизировать
ошибки по типу: ошибки, косметические недостатки и т. д.
Для редактирования необходимо экспортировать методику. Для нашего примера
используйте ту, которую мы уже экспортировали ранее (CMMI). Затем перейдите к определениям
типов элементарных работ (\WorkItem TrackingYTypeDefinitions). В этом каталоге содержатся
описания для каждой элементарной работы, определенной в процессе. Конечно же, вас
интересует файл Bug.xml.
Файл описания содержит основные поля, определенные для ошибок, а также стандартные
для большинства элементарных работ поля. Описание длинное, и здесь мы его повторять не
станем. Вы добавите ваше новое поле к основным полям в этом XML-коде. Новое поле
представлено в листинге 25.2.
| Листинг 25.2. Новое пая* внутри Bug.xml
<FIELD name="Bug Type" refname="Unleashed.BugType" type="String"
reportable="dimension">
<HELPTEXT>Represents the type of bug</HELPTEXT>
<REQUIRED/>
<ALLOWEDVALUES>
Глава 25. Отслеживание элементарных работ
993
<LISTITEM value="Error"/>
<LISTITEM value="Requirement"/>
<LISTITEM value="Change"/>
<LISTITEM value="Navigation"/>
<LISTITEM value="TextV>
<LISTITEM value="Cosmetic'7>
</ALLOWEDVALUES>
<DEFAULT from="value" value="Error'7>
</FIELD>
Это поле добавлено в раздел field в XML-коде. Обратите внимание, что вы ограничиваете
значения, которые можно ввести в это поле (при помощи использования узла
allowedvalues). Это дает указание Team System отображать данное поле для
пользователей как раскрывающийся список. Это поле также помечено как требующееся
(<required/>) и имеет значение по умолчанию, установленное элементом default. И
наконец, описание поля указывает, что по данному полю можно делать отчеты. Тем самым
дается указание для Team System включать это поле в анализ при составлении отчетов.
Вам необходимо также описать, как данное поле должно выглядеть на форме. Вы делаете
это внутри раздела FORM в XML-коде. Вы хотите, чтобы это поле появилось в верхней части
формы справа от поля Title. Для этого вы добавляете столбец в элемент Group, который
содержит поле Title. В листинге 25.3 показано добавление поля Bug Type в эту группу.
<*» New Bug l* - Microsoft Visual Studio
1«Л
{ Rte Edit View Buttd Trtm Data Tools Test Analyze Window Help
}£ , NewBugl't
-iC
4.
Ji New Bug 1: TF2QQ12: Field Title' cwvwt be empty.
Title <Required>
Classification
Are* path. Unleashed Custom Template
Iteration path; Unleashed Custom Templite
Bug Type 333
Change
Error
Navigation
Requirement
Text
Assigned tot msnell ▼ Blocked: No
| Priority; 3 w states Proposed
Severity; Low w Reason; New
Triage: Pending •»•
Description | R* ] Hetojy ] link» ] AtUchrrwnts | Detail* |
Found-in environment;
How found:
i Symptom*.
Ы
TSn
-
-
i
w 1
~l\
*j
Ready
I 4
Рис. 25.40. Новое /юле типа ошибки в действии
994
Часть VI. Система командной работы Visual Studio Team System
I Листинг 25.3. Добавление norm на форму j
<Group>
<Column PercentWidth=M70">
<Control Type="FieldControl" FieldName="System.Title" Label="&Title:"
LabelPosition="Left'7>
</Column>
<Column PercentWidth=0">
<Control Type="FieldControl" FieldName="Unleashed.BugType"
Label="&Bug Type:"LabelPosition="Left"/>
</Column>
</Group>
И наконец, вы загружаете новый шаблон процесса. На рис. 25.40 показаны результаты этой
работы.
Резюме
Элементарные работы являются движущей силой командной работы при использовании
системы Team System. Если их применять правильно, то они могут описать всю работу, а
затем отслеживать продвижение процесса и соответствующие показатели работы. В этой
главе мы обсудили многие элементарные работы, определенные как в MSF for Agile, так и в
MSF for CMMI. Мы описали основы этих элементарных работ (в том числе рабочие
процессы, историю элементарных работ, связывание, файловые приложения и т. д.).
Элементарные работы интегрированы в среду разработки Visual Studio. Вы можете делать
по ним запросы и работать с ними непосредственно внутри Visual Studio. Эта возможность
чрезвычайно ценна для разработчиков и тестеров. Например, вы видели, как разработчики
могут связать элементарные работы со своим кодом (во время процесса возврата).
Система Team System обеспечивает интеграцию с Excel и Microsoft Project для тех, кто не
является разработчиком (как менеджеры проекта). Элементарные работы можно втянуть в
эти программы, обновить (и даже добавить новые), а затем опубликовать обратно на сервер.
В этой главе были изложены оба варианта.
И наконец, в этой главе мы показали несколько способов, которыми вы могли бы
модифицировать элементарные работы и систему Team System под потребности вашей команды.
Мы продемонстрировали процесс выгрузки, модификацию кода XML, а также загрузку
результатов в качестве нового процесса системы TFS.
Глава 26
Версия Development Edition
Версия Development Edition системы командной работы Visual Studio Team Systems
предоставляет набор ориентированных на командную работу инструментов, которые работают
поверх версии Professional Edition. Как уже обсуждалось в других главах, работающие с
командными системами разработчики смогут использовать возможности системы управления
исходными кодами сервера TFS, а также работать с Team Explorer для отслеживания своей
работы.
Кроме этих функциональных возможностей Development Edition предоставляет различные
важные для командного разработчика инструменты. Сюда входит и профилирование
производительности, которое позволяет вам создавать отчет по производительности
выполняющегося кода. Этот отчет можно использовать для выявления проблем производительности/
Есть также и статический анализатор кода, который позволяет вам выполнять
автоматизированный анализ кода на соответствие общепринятым лучшим практикам для .NET.
Development Edition теперь также содержит инструмент измерения кода для отыскания тех
областей вашего кода, которым требуется дополнительное изучение.
В данной главе мы опишем все эти инструменты. Кроме того, мы обсудим использование
визуального конструктора классов для визуальной разработки вашего кода. Это увеличит
производительность вашего труда и поможет вам понять уже имеющийся код. Мы опишем
также создание модульных тестов для разработчиков и проверку их эффективности.
Примечание
В этой главе мы описываем и визуальный конструктор классов, и модульное
тестирование Однако эти функциональные возможности не являются уникальными для Visual
Studio Team Systems 2008 Development Edition. Фирма Microsoft сделала обе эти
функции доступными для всех разработчиков, использующих Visual Studio Professional
или Team Edition.
Визуальная разработка кода
Многие разработчики привыкли к использованию схем. Очень полезно представлять себе
свое приложение как классы с определенной семантикой и связями между ними. Многие
996
Часть VI. Система командной работы Visual Studio Team System
разработчики создают схемы такого типа при помощи унифицированного языка
моделирования (Unified Modeling Language (UML)) или чего-то похожего. Эти инструменты и языки
моделирования предлагают абстрактное представление систем. Однако при изменении
ваших объектов актуальность этих представлений поддерживать сложно. Они также почти
ничего не дают в смысле увеличения производительности вашего труда или рефакторинга
кода.
Визуальный конструктор классов Class Designer в Visual Studio 2008 предоставляет
графические средства для создания и модификации классов, которые составляют вашу
предметную область. Вы можете использовать его для описания классов и их связей, добавления в
эти классы свойств и методов, и даже для рефакторинга кода. Дополнительйое
преимущество визуального конструктора состоит в том, что он позволяет выполнить быстрое
обнаружение кода. При помощи визуального конструктора Class Designer вы можете добавить в
модель несколько классов, позволить инструменту определить имеющиеся в коде связи, а
потом быстро разобраться, как работает приложение.
Самая сильная сторона Class Designer состоит в том, что он не только умеет представлять
ваши объекты визуально; он обеспечивает также и представление вашего кода в реальном
времени (причем вы можете редактировать это представление). При помощи Class Designer
вы можете моделировать ваше приложение и одновременно визуально разрабатывать код.
Совет
Визуальный конструктор Class Designer является отличным средством освоения
существующего кода. С его помощью вы можете открыть существующий набор объектов
и быстро понять, как они работают друг с другом.
Визуальный конструктор классов Class Designer
Схема классов позволяет вам получить статическое представление о вашем коде. Вы также
получаете синхронизацию в реальном времени между моделью и фактическим кодом.
Лучше всего представлять себе визуальный конструктор классов как визуальный редактор кода,
а не как схему. Если вы делаете в коде изменение, то оно отражается на схеме. Когда вы
изменяете схему, то ваш код также меняется.
Создание схемы классов
Существует несколько способов создания схемы классов. Первый — добавить в ваш проект
схему классов из диалогового окна Add New Item. Здесь нужно выбрать шаблон схемы
классов (с расширением cd) и добавить его в проект. Затем вы можете добавить на эту схему
элементы из панели Toolbox или из существующих классов в Solution Explorer.
Второй способ добавить в проект схему классов — выбрать пункт View Class Diagram в
контекстном меню проекта. При этом Visual Studio сгенерирует схему классов для
существующего проекта. Этот вариант показан на рис. 26.1.
В любом случае вы получаете в вашем проекте cd-файл, который представляет собой
визуальную модель ваших классов. Конечно, вариант с View Class Diagram экономит время на
Глава 26. Версия Development Edition
997
перетаскивание всего необходимого на схему. На рис. 26.2 показан пример файла
визуального конструктора классов Class Designer. Мы опишем каждое окно этого конструктора.
</) Unleashed26 - Microsoft Visual Studio
1 File Edit View Project Build Debug Data
P *
1 ;
1' 8 ; *
1
1
L ~®~
1
Г
1
.[J& Error List^
Rudy
1сз| Ofagfojl
Tools Test Analyze Window Help
# Hi
1
1> 1
^
I
I
*
. ^ Solution 'Unleashed26 Q. project)
! - *^AСЯв*я
& -A Properties C£] Build
! j* ^ Reference! ] Rebuild
1 Ц fC"rtom^ ClUn
. U Order cS ' Run Code Analysis
j £ Product 6 ; Calculate Code Metrics
1 Add ►
j Add Reference .
1 Add Service Reference..
j > $j„ View Class Diagram к
j j | Set as StartUp Project^
j j ^ Debug ►
' ^5 A**0" Solution to Source Control...
' [ * j Cut
. *X . Remove
! I Rename
i ^Л -x ,™. , ; . Unload Project
$ Open Folder in Windows Explorer
-aj Properties
^
Рис. 26.1. Визуальный конструктор классов Class Designer
<Ф Urteashed26 - Microsoft Visuel Studio
; File Edit View Refactor Project Build Debug Class Diagram Data Tools Test
1 ."«]£ ii - d !ПаТ «i ^ «t ido% ., 2 *
JTeolbo* ^ a xj CtesDagramLcd*5
«-, Ом* Designer
Ь Pointer !
Ill Class f
О Enum
j i. Interface
* Abstract С lass
U Struct
l_\ Delegate |
4- Jrihentante
«г. Association
i «f Comment j
j BusfriessEntity '*• J
Interface
t ^ ^ _ _ j
| - !
j Customer fr |{ [ Order
q Class p CI»«j
il A 1
* «1 ~
!['•♦, General " . „
; Cfss$ Detsiti - Customer
<4 ■* ! Name Type
^v J H Methods
| ^ * -",,,,
1 ' Ы Properties
i a? ~*
< ^ |4 Ffefch
| V ^Ifs.'
i Я Events
■/ *<J*v ,r>
LtS Efc? list
Ready
•
5]
J 1
Modifier
Analyze Window
Product
Clan
ГЛЛЛгтТГГ rrr....wrr ™*
Summary
[ о j Щ Щ&Ы&
Help 1
» X
,
.,
~
_
1
J
*"
|jr'«
6
3
4.
Г
Г5
f»
Из
' 1
,
<r Д xj 1
Hide
Рис. 26.2. Визуальный конструктор Class Designer
998
Часть VI. Система командной работы Visual Studio Team System
Отображение членов
Для показа или сокрытия в визуальном конструкторе членов каждого объекта используйте
значок со стрелкой в правом верхнем углу объекта. Эта возможность полезна в том случае,
когда вам необходимо разместить на экране множество классов, либо вас интересуют
только члены определенного класса.
Вы можете также использовать панель инструментов визуального конструктора Class
Designer для того, чтобы указать, как члены группируются для показа и какая дополнительная
информация отображается. Например, вы можете сортировать члены в алфавитном порядке,
группировать их по типу (свойство, метод и т. д.) или по доступу (общие, закрытые и т. д.).
Затем вы можете указать, хотите ли вы показывать только названия членов, их названия и
типы, либо полную сигнатуру.
Добавление элементов в схему
Элементы в визуальный конструктор классов добавляются при помощи либо панели
Toolbox, либо Solution Explorer. Панель Toolbox служит для добавления новых элементов.
Solution Explorer применяется для добавления в схему уже существующих классов. В обоих
случаях вы просто перетаскиваете элементы в окно визуального конструктора Class
Designer. Если элемент уже существует, то Visual Studio создаст для вас подробности класса.
Если файл класса содержит более одного класса, то каждый класс будет помещен на схему
как отдельный объект.
На рис. 26.3 показан пример инструментов Class Designer в панели Toolbox. Обратите
внимание, что вы можете описать здесь все ориентированные на объект концепции, в том числе
классы, интерфейсы, наследование и т. д.
Toolbox
\{z. OftSS DeSigner
>t Pointer
£i Class
О Enirm
,"w Interface
L ** ^ Abstract Class
[ Cj Struct
CJ Delegate
4- Inheritance
tt. Association
\~fi Comment
*= General
Ш
There are no usable controls in this group. :
Drag an item onto this text to add it to the ]
toolbox. i
Рис. 26.3. Панель инструментов
визуального конструктора Class Designer
Когда вы добавляете в визуальный конструктор новый элемент (такой как класс или
структуру), то он запросит у вас название и местоположение. Вы можете выбрать: сгенерировать
Глава 26. Версия Development Edition
999
ли новый файл для этого элемента или разместить его в существующем файле. На рис. 26.4
показано диалоговое окно New Class. Здесь вы можете дать классу название, задать
модификатор доступа, а также указать имя файла.
Совет
Визуальный конструктор Class Designer может автоматически добавить на схему
родственные классы. Предположим, что вы добавляете класс из Solution Explorer.
Если вы хотите показать классы, которые наследуют от этого класса, то можете
щелкнуть по классу правой кнопкой мыши и выбрать пункт Show Derived Classes. При
этом в модели будут добавлены все классы, которые наследуют от выбранного
класса.
New Class
' Class name:
j Orderlterr^
j Access:
| . public
hie name
j '9 Create new file
j Orderltem.es
1 ''j Add to existing file
j
i
i
OK
[ У У£5ий11
v
1 *
| Cancel | M
* J
Рис. 26.4. Добавление в визуальный конструктор нового класса
Описание отношений между классами
Одним из самых главных преимуществ схемы классов является то, что она визуально
представляет связи между классами. Эти отношения гораздо легче увидеть на схеме, чем в коде.
Могут быть представлены следующие связи:
□ Inheritance (Наследование) — указывает наследование от другого класса;
□ Interface (Интерфейс) — указывает, что класс реализует один или несколько интерфейсов;
□ Association (Связь) — указывает связь между классами.
Давайте рассмотрим реализацию всех этих связей в примере.
Наследование
Сначала посмотрим на наследование в визуальном конструкторе. Предположим, что у вас
есть базовый класс Product. Этот класс в вашей системе представляет собой обобщенный
продукт. Затем вы хотите создать конкретный класс Book, который наследует от Product.
Чтобы сделать это при помощи визуального конструктора Class Designer, убедитесь в том,
1000
Часть VI. Система командной работы Visual Studio Team System
что оба класса находятся на экране. Затем выберите в панели Toolbox инструмент
Inheritance. Он имеет собственный специальный значок, на котором изображена стрелка вверх.
Эта подсказка означает, что вы хотите нарисовать наследование от класса реализации к
базовому классу (рис. 26.5).
</> Unleeshcd26 - Microsoft Visual Studio
кя SI
F3e Edit Vtc* defector Project Build Debug Class Diagram Data Tools Test Analyze Window Help
ILLiM/ !Ul4T "LA э. ЩИ м^Л
ТооЁок t«x
^ Pointer
© Class
CD Enum
**"» interface
?; Abstract Class
□ Struct
CD Delegate
[4- Inheritance ~]
♦u Assoc tabon
i_Jf Comment
There are no usable
controls ш this group
Drag an item onto this
ted to add it to the
toolbox.
J3 Error!иЕ J3£foyPft*H$l
BurinesrfnHtf 111
Interface
CusUmer
m
fOrder'
j Clan
forderlle-
i Clas;
iVSeok"
| Clan
•' (ft
■ У Properties
4 2f
j| 3»
!i Я
il tf
Я
Height
Pnce
Weight
Width
i Product
,|И5 Properties
^ Name
S Methodi
♦ Getlnventory
* Purchaie
«И.
Ready
Рис. 26.5. Описание наследования
Когда вы закончите рисовать, стрелка наследования должна указывать по направлению к
базовому классу. Пример показан на рис. 26.6. Обратите также внимание, что в классе Book
теперь имеется значок, который указывает, что класс наследует от Product.
Book
Clew
-*• Product
W Properties
3P Height
^ Price
3* Weight
H? Width
©
flu*
s Properties
;3P Name
:§p sku
Ы Method!
♦ Getlnventary
* Purchaie
Рис. 26.6. Описание наследования
Глава 26. Версия Development Edition
1001
Интерфейс
Следующая визуальная связь, которую мы рассмотрим — это интерфейс. Для нашего
примера предположим, что все бизнес-сущности нашей системы реализуют одинаковый
контракт. В этом контракте могут быть описаны свойства: идентификатор и название. В нем
могут быть также описаны такие методы, как Get, Delete и Save.
Для реализации этого интерфейса вы опять используете инструмент Inheritance из панели
инструментов визуального конструктора Class Designer. Перетащите его от класса (который
делает реализацию) к интерфейсу. На рис. 26.7 показан результат реализованного
интерфейса. Обратите внимание на значок-леденец над классом Customer; он обозначает реализацию
интерфейса.
<ф Unleashed26 - Microsoft Visual Studio
File Edit View Project Build Debug Class Diagram Data Tools Test Anafy
ПорЙдас * * X' OauOuqramLcri*
- СЬк* DcfSgeer
l( Pointer
Г Class
С Enum
Interface j
* Abstracters
LJ Struct
О Delegate
<r Inheritance J
«т. Association
1 _^f Comment
(J General
There are no usable
controls in this group.
Drag an item onto this
text to add rt to the
toolbox.
i
j3 Error L гЛ'З (-,iiC -)ela
1 Read>-
!«
DusinnsEntity ..'5
Interface
^ Propertiei
j^f Dzxriptwn
jf Ш
ГЗ* Name
-' Method;
V Deitte
•» Gti
■<* Gettkt
V Saw
V Update
V 1Вияпе»ЕпМу
Customer *
CI3M
" Properties
±f Addresi
If Cty
jf Deicription
ГЗ* Email
^ Id
_T Name
Zf Phone
if PostalCode
*? State
" Method?
V Delete
V Get
V GetLirt
V Save
V Update
[^ ИЩУ
2e Window Herp
» X
- '
i !
\щ
У»
5*
rr>
■и 1
3" 1
\щ
'
Рис. 26.7. Реализация интерфейса
Связь
Последнее — это связь. Это отношение в мире UML обычно очень нестрогое. Однако в
визуальном конструкторе Class Designer связь очень реальна. Обычно это означает, что два
класса связаны через использование одного из них. Это отношение необязательно в смысле
показа. Оно может существовать, но вы не обязаны показывать его в схеме.
Предположим, что у вас есть объект Order. Этот объект может предоставлять свойство
OrderStatus. Допустим, что он также имеет свойство Customer для доступа к записи,
связанной с заказом. Эти два свойства являются связями. Вы можете оставить их как свойства
или показать их как связи.
1002
Часть VI. Система командной работы Visual Studio Team System
«/> UrJf ashed26 - Microsoft Visual Studio
•
l^iBkuJj
F le Edit View Refactor Project Build Debug Class Diagram Data Tools Test Analyze Window Help
Ul^ ii ;i ' [Т|«т ao ^ -d. 1M% - ^ -
4
rr
CbssDugrwnlxd*
Order ^
aeu
i
1 ' ~ Properties
Jordersi P
1 Sr
■factor ►
row as Association f
»ow es CoMection AsL^iahon
. ' Hide
i £-; Adjust Shapes Width
* Cut
-^ Copy
\ r a-
>< Delete Code
i tj View Code
£i Properties,
[ j$ Ere Lisl'^Cfe» Pets fc]
Ready
!> IBusineisEntity
} Customer -
, Class
i ® Properties
, & Method!
| OnterSutus *
Enum
New
InProcest
Shipped
Returned
Cancelled
Hold
- X
A
\
i
<Ц
1
"f j
Щ
r
Рис. 26.8. Отображаем как связь
"GSL®
ч/» Urleash*d26 Microsoft Visual Studio
File Edit tfew Project Build Debug Class Diagram Dtta Tools Test Analyze Window Help
QassDtaqrarnLcd*
Order
Class
I^Wlttf^Oaw Delate'
Rudy
lBusmessEntaty
Customer
^J* Customer class
■** Properties
* Methods
OrderSUtttf
fcnum
New
InProcess
Shipped
Returned
Cancelled
Hold
!3* OrderStatus
Рис. 26.9. Создание связи
Вы можете также нарисовать эти свойства-связи на схеме. Для этого выберите инструмент
Association из панели Toolbox. У этого инструмента такой же значок, что и у Inheritance.
Глава 26. Версия Development Edition
1003
После этого нарисуйте связь от класса, который содержит связь, до того класса, который
является объектом связи. Вы можете также щелкнуть правой кнопкой мыши по тому
свойству, которое представляет связь, и выбрать в контекстном меню пункт Show as Association
(или Show as Collection Association для связей, которые являются частью коллекции). На
рис. 26.8 показан пример.
В результате свойство-связь будет отображаться на стрелке связи. Это означает, что класс,
из которого начинается связь, содержит это свойство (однако оно отображается только на
этой линии). Это показано на рис. 26.9.
Описание методов, свойств, полей и событий
Самое замечательное в визуальном конструкторе Class Designer — это то, что он позволяет
вам не только описывать классы и связи. На самом деле вы можете делать заглушечный код
и рефакторинг (подробности см. в главе 9).
Есть два способа добавлять код в ваши классы, структуры, интерфейсы и т. п. Первый
способ позволяет вводить его непосредственно в визуальном конструкторе. Например, если вы
находитесь в разделе Properties класса, то можете щелкнуть по нему правой кнопкой мыши
и выбрать добавление нового свойства. При этом свойство будет помещено в ваш класс, и
вы сможете редактировать его в схеме. Этот метод работает и для других членов класса.
Однако он имеет и несколько недостатков. Например, вы не можете описать полную
сигнатуру метода или указать уровни доступа. Для этого вам нужно окно Class Details.
ЧГ> Un!eashed26 - Microsoft Visual Studio
File Edit View Refactor Project Build Debug Class Diagram
\£\fb 1\ r* '} ,«T «» ^ 'Я 10Q% ' 1Л ;
о
I*-
CbssDegrwnlxd*
i
i Order -
cms
"* Method»
V Cancel
п
i
1
1^ $Ы&шА'
Data Tools Test Analyze Window HeJp
| !3* Customer
4 ' m
~~ ~ — ~ ~" ~ '
r&tfffi^-^^^^ '"- — IJ-^
у * Name Type
aV *"' M<*<bod& ,
»чи й V Cancel void
~ * f reasonCode
В Properties 1
'*? Customer 1
3* OiderStatus j
'*? **dc i '0{-<trV> j
$ Rrtds 1
<* ' adc S - i • J
| | "Й ErrorLht *^ Class Details | \
rej
-i£ Queueo
4$ Random
Л% RanlcExceptior»
~*i% ResolveEventArgs
Jl ResolveEventHandfer
■$* RuntJmeArgurnentHandle
■$* RuntimeFieldHandle
Ф RuntimeMethodHartdle
Ready
L ".... • " • ..• ...
Customer '*
Class
*" Properties
*' Methods
~"~ -"- -' ' '
00СДГ . mm, 1Щ
Modifier Summary
public
None
*
и
w\
enum BusinessDamai
|
V
h
«™«* ^ -^ -
Hide
П *
л 1
1
1
; i !
n ReascnCodes ; ]
A !
~
1
i
i
Рис. 26.10. Окно Class Details
ЗЗЗак 3716
1004
Часть VI. Система командной работы Visual Studio Team System
Второй способ предполагает использование окна Class Details, которое позволяет вам
полностью описать методы, поля, свойства и события класса. Оно работает также и с другими
конструкциями, такими как интерфейсы, делегаты и перечисления. Для использования этого
окна вам необходимо щелкнуть по классу правой кнопкой мыши и выбрать в контекстном
меню пункт Class Details. Выбор этого пункта откроет редактор Class Details для
выделенного класса. На рис. 26.10 показано окно редактора Class Details.
Обратите внимание, что при работе в окне Class Details вы по-прежнему имеете поддержку
технологии IntelliSense. В этом примере в класс Order добавляется метод Cancel. Вы
можете указать возвращаемый тип метода при помощи столбца Туре. Вы можете задать
модификатор доступа при помощи столбца Modifier. Вы можете также указать параметры
метода. В данном случае метод принимает параметр reasonCode.
И наконец, имеются еще столбцы Summary и Hide. Столбец Hide указывает, хотите ли вы
показывать данный элемент на схеме. Эта возможность позволяет вам скрывать различные
члены при распечатке или экспорте в виде изображения. Столбец Summary позволяет вам
добавлять в класс свою XML-документацию. Нажатие в этом поле кнопки с многоточием (не
показана) приведет к отображению диалогового окна Description. Здесь вы можете ввести
свою XML-информацию для данного члена. На рис. 26.11 показан пример для метода Cancel.
TUBS'
Description
Summary:
The Cancel method 15 called when a user cancels and order (before
shipping)
Returns
bool indicating true if the cancel was successful
Remarks:
OK Cancel
Рис. 26.11. Диалоговое окно Description для метода .
Модульное тестирование разработчиком
Разработчики всегда отвечали за тестирование своего кода (перед его передачей тестерам).
В прошлом это означало прохождение по всем строкам кода в отладчике (в том числе кода
Глава 26. Версия Development Edition
1005
всех условий и ошибок). Прохождение по всему коду было отличной вещью, но
выполнялось не всегда (и его было очень трудно проверить). После изменений и обновлений кода
эта проверка часто вообще не делалась. В результате к тестерам уходили менее
качественные построения.
Очевидно, что здесь есть необходимость автоматизации модульного тестирования. В
результате были разработаны инфраструктуры модульного тестирования. Первой такой
инфраструктурой для .NET была NUnit (проект с открытым исходным кодом), позволяющая
вам писать код, который тестирует другой код. Аналогичная инфраструктура была встроена
в Visual Studio 2005, имеется она также и в Visual Studio 2008. С ее помощью разработчики
могут писать модульные тесты, которые вызывают их код и тестируют возможные условия
и результаты.
Примечание
Модульное тестирование в Visual Studio 2008 не является специфичным для версии
Development Edition данного продукта. Оно имеется также и в версии Professional, и в
более высоких.
Инфраструктура модульного тестирования в Visual Studio позволяет вам создавать тесты
при создании ваших приложений. Либо (если вы используете управляемую тестами
разработку) вы можете написать ваши тесты до того, как напишете свой код. В любом случае
дисциплинированный подход к модульному тестированию может привести к созданию
полного набора тестов одновременно с вашим приложением.
Этот полный набор тестов часто является регрессивным тестированием большинства
компонентов или всей системы. Результатом будет повышенная уверенность в прежде чрезвы1-
чайно рискованных действиях, таких как: выполненные в последнюю минуту исправления,
рефакторинг и поздние добавления. Когда происходят такие события, то вы можете
использовать полный набор ваших модульных тестов для обнаружения возможных мест
повреждения вашего кода.
Примечание
Модульное тестирование для баз данных специфично для версии Database Edition и
поэтому рассматривается в главе 29. Автоматизированное тестирование (которое
обычно проводится тестерами при пЬмощи Team System Test Edition) описывается в
главе 28.
Пример модульного теста
Прежде чем продвигаться дальше, есть смысл рассмотреть модульное тестирование (чтобы
лучше его понять). Помните, модульный тест— это просто тестовый код, который вы пишете
для вызова кода вашего приложения. Этот тестовый код подтверждает, что в результате
вызова вашего кода некие условия становятся либо истинными, либо ложными. В зависимости от
этого тест либо проходит, либо нет. Если, например, вы ожидаете результата "истина", а он
оказывается "ложь", то тест не прошел. Давайте рассмотрим реальный пример.
Предположим, что у вас есть Web-сервис, который возвращает профиль клиента из базы
данных. Этот Web-сервис принимает в качестве параметра идентификатор клиента. Вы мо-
1006
Часть VI. Система командной работы Visual Studio Team System
жете написать простой тест для вызова этого Web-сервиса и передачи ему заранее
известного идентификатора из базы данных. Этот тест может подтвердить, что ваш код не только
работает, но и работает правильно. В листинге 26.1 показан пример такого теста.
j Листинг 26,1. Пример модульного теста
[TestMethodO ]
public void GetCustomerProfileTest() {
CustomerProfile custProfileService = new CustomerProfile() ;
int customerld = 1234;
Customer customer = custProfileService.GetCustomerProfile(customerld) ;
Assert.AreEqual(customer.Id, 1234);
}
Обратите внимание, что этот код похож на обычный код на языке С#. Вы помечаете метод
как тест посредством добавления атрибута TestMethod. Внутри кода вы создаете объект и
делаете вызов метода. Если этот вызов заканчивается неудачно (или возникает исключение),
то тест не проходит. Затем" в тесте вы делаете проверку, чтобы убедиться в том, что
возвращенный объект совпадает с ожидаемым результатом. Если эта проверка не проходит
(значения не равны), то тест не проходит. Если проверка проходит, то тест тоже проходит. Для
полноты в этот тест можно было бы добавить еще несколько проверок. Кроме того, вы
могли бы создать для этого метода еще несколько дополнительных тестов. Однако теперь вы
уже должны иметь представление об основах модульного тестирования. Мы углубимся в эту
тему чуть позже.
Создание эффективных модульных тестов
Чем больше модульных тестов вы напишете, тем лучше вы станете с ними справляться. Есть
несколько принципов (лучших практик), которые необходимо помнить для того, чтобы
писать эффективные модульные тесты.
□ Каждый блок должен тестироваться независимо. Если ваш метод имеет несколько
возможных результатов, то вам нужен модульный тест для каждого из них.
□ Модульные тесты должны существовать независимо от других тестов. Для модульного
теста перед его выполнением не должно требоваться выполнение других тестов (или
последовательности тестов).
□ Модульные тесты должны покрывать все случаи. Эффективный набор модульных
тестов охватывает все возможные условия для данного метода (в том числе проверки
границ, нулевые значения, исключения, условную логику и т. д.).
□ Модульные тесты должны работать без дополнительной настройки. Ваши тестовые
блоки должны выполняться легко. Если вы создадите такую среду, в которой при
каждом запуске тестов необходимо будет делать настройку, то это существенно снижает
вероятность того, что команда будет пользоваться вашими тестами.
Глава 26. Версия Development Edition 1007
□ Тестируйте стандартное состояние приложения. Если ваши модульные тесты
работают с данными приложения, то вам следует перед каждым выполнением модульного
теста возвращать эти данные в их обычное состояние. Так вы обеспечите отсутствие
ошибок в других ваших тестах. Вы также даете разработчикам общую платформу для
тестирования.
Эти лучшие практики представляют собой несколько указаний по созданию эффективных
тестов. По мере того, как вы будете писать все больше и больше тестов, вы создадите
собственные правила написания эффективных модульных тестов.
Классы и методы модульных тестов
Visual Studio 2008 предоставляет пространство имен
Microsoft.VisualStudio.TestTools.UnitTesting, которое содержат классы
атрибутов для описания тестов. Атрибутами метят классы и методы для их выполнения
инфраструктурой модульного тестирования. В табл. 26.1 представлен список часто используемых
классов атрибутов для модульного тестирования.
Пространство имен UnitTesting содержит также статический тип Assert. Этот объект
содержит методы для определения, соответствуют ли результаты теста ожидавшимся
результатам. В табл. 26.2 перечислены некоторые основные методы определения.
Таблица 26.1. Классы тестовых атрибутов Visual Studio
Тест
TestClass
TestMethod
Testlnitialize
TestCleanup
ClassInitialize
ClassCleanup
ExpectedException
Описание
Используется для указания, что класс является тестовым классом,
содержащим модульные тесты
Используется для пометки метода как модульного теста Тестовые
методы не должны иметь возвращаемого значения (void) и не
должны ожидать параметров (поскольку параметры в метод передавать
некому)
Используется для указания, что данный метод должен выполняться
перед каждым тестом. Эта возможность полезна тогда, когда вам
необходимо установить исходное состояние системы перед каждым
тестом
Используется для указания, что данный метод должен выполняться
после каждого теста. Эта возможность полезна тогда, когда вам
необходимо сбрасывать состояние системы после каждого теста
Используется для указания, что метод должен быть выполнен перед
запуском любых тестов класса
Используется для указания, что метод должен быть запущен после
выполнения всех тестов класса
Используется для указания, что в данном тесте предполагается
возникновение исключения. Эта возможность полезна для тестирования
ожидаемых ошибочных условий
1008
Часть VI. Система командной работы Visual Studio Team System
Таблица 26.2. Методы проверки
Метод
Are Same/AreNot Same
AreEqual/AreNotEqual
IsNull/IsNotNull
IsInstanceOfType/IsNotlnstanceOfType
IsTrue/IsFalse
Описание
Выясняет, являются ли два объекта одним и
тем же объектом
Выясняет, являются ли два значения
равными
Выясняет, содержит ли объект ссылку типа
null
Выясняет, имеет ли объект указанный тип
Выясняет, является ли условие истинным
Многие из перечисленных в табл. 26.2 методов содержат по несколько перегрузок. Эти
перегрузки позволяют вам сравнивать различные типы данных, обобщенные коллекции и т. д.
Кроме того, существуют такие перегрузки, которые позволяют вам просто сделать
проверку, а также и такие, которые делают проверку и позволяют вам указать сообщение, которое
будет выведено в случае неудачной проверки.
Пространство имен UnitTesting содержит также дополнительные классы проверок. Класс
CollectionAssert используется для проверки содержимого коллекций. Например, вы
можете вызвать метод Contains для проверки, содержит ли данная коллекция определенный
Элемент. Класс stringAssert содержит методы для проверки совпадений строк и частей
строк. Например, вы можете использовать метод startswith для проверки, не начинается
ли строка с определенного набора символов.
Создание модульных тестов
Существует несколько способов создания модульных тестов. Вы можете сделать это
вручную путем создания файла класса и добавления соответствующих ссылок, атрибутов и т. п.
Вы можете также добавить модульный тест в тестовый проект при помощи меню Test или
контекстного меню тестового проекта. Эти методы создают пустой модульный тест, в
который вы можете добавлять свой код.
Visual Studio обеспечивает средство автоматизации создания модульных тестов. Вы можете
щелкнуть правой кнопкой мыши по существующему классу и выбрать в контекстном меню
пункт Create Unit Tests. В этом случае Visual Studio сгенерирует набор модульных тестов
на базе кода вашего класса. Вы можете также щелкнуть правой кнопкой мыши по тестовому
проекту и выбрать Add | Unit Test. Это позволит вам выбрать классы решения, для которых
вы хотите сгенерировать модульные тесты.
Генерируется не только заглушечный код. Visual Studio изучает методы и свойства вашего
класса и пишет реальные тесты. Конечно, вам придется добавить в них соответствующие
значения и проверки, но генерируется вполне неплохой вариант для начала работы.
Рассмотрим пример. Допустим, что у вас есть объект Customer, который содержит такие
стандартные свойства, как Name, Address, Phone и Email. Он может также содержать такие
методы, как Save, Update и Delete. Предположим также, что вы хотите добавить в ваш
Глава 26. Версия Development Edition
1009
тестовый проект новый модульный тест. Visual Studio выдаст вам диалоговое окно Create
Unit Tests. Пример показан на рис. 26.12.
Стеаж Unit Tests
Current selection;
Types
б АО Buxine»Entiti«
E <*$ BusinessEnribes.Book
1:2^ BusinessEntitieiCustomer
[</) $ CustomerQ
[Vl V DeleteO
IV] ^ GetO
; fc/i * GrtListO
| M * SiveQ
И Е ♦ UpdrteO
' 122? Addresii
i\
1
(Vljy AddicssZ
Etf Crty
ly]2? CantictVwEmail
F/l^? ContactVuPhone
[vi!2f Description
| W2f En»*
1 1 Miff Id
| .ИЗ» Name
*l
4
lyj^f Phone
WIS State
FV ' " "V P»^n«TFntr+Ff^JRu«in«,'Fnr»V
Output project CSCustomerTests
i Sertfng*... ] [ AddAonmbly», J
;;;..v;w;i w ,; ■,;;■;■;■. fc
[J$ Цй£|шГ
Filter * :
i
|i 1
ig
i
i
' -1
'
I
1
;
' Г
i
1
~ '
V Г
[ OK J [ C*iwd
Рис. 26.12. Диалоговое окно Unit Test Creation
Test Generation Settings
Naming settings
File Name;
Class Name:
4 Method Name
ц
General
[ClaisTTest.ci
tClassTTert
[MrthodJTtst
Ж Mark all test results Inconclusive by default
2 Enable generation warnings
f] Globallyqualrfyall types
J2 Enable documentation comments
I gj Honor Intema1sVi5ibleTo Attnbute
| ■ С
«—][
I fl,|gf^
II
Cancel | |
Рис. 26.13. Диалоговое окно Test Generation Settings
В этом диалоговом окне вы можете выбрать те члены, для которых вам необходимо
сгенерировать тесты. В этом примере были выбраны члены объекта Customer. Кнопка Settings
открывает диалоговое окно, которое позволяет вам указать различные настройки для гене-
1010
Часть VI. Система командной работы Visual Studio Team System
рирования ваших модульных тестов. На рис. 26.13 показан пример этого диалогового окна.
Обратите внимание, что вы можете использовать макротекст [File], [Class] и [Method] для
того, чтобы указать, что Visual Studio должна использовать ключевые элементы класса для
того, чтобы дать названия частям теста.
Visual Studio генерирует тест для каждого метода и каждого свойства объекта. Для примера
рассмотрим свойство Name. В листинге 26.2 показано то, что Visual Studio сгенерировала в
качестве модульного теста для данного свойства. Обратите внимание, что этот тест создает
новый экземпляр объекта Customer. Затем он пытается установить значение свойства Name.
И наконец, он подтверждает, что это присваивание свойству было успешным. Это
правильный тест для свойства. Все, что остается сделать разработчику, — это поместить в
переменную expected допустимое значение (обратите внимание на TODO) и удалить вызов
Assert.Inconclusive.
j Листинг 26.2. Пример автоматически сгенерированного модульного теста
[TestMethodO ]
public void NameTestO {
Customer target = new Customer();
// TODO: инициализируем соответствующим значением
string expected = string.Empty;
// TODO: инициализируем соответствующим значением
string actual;
target.Name = expected;
actual = target.Name;
Assert.AreEqual(expected, actual);
Assert.Inconclusive("Verify the correctness of this test method.");
}
Выполнение модульных тестов
Вы можете запускать свои тесты из панели инструментов Test Tools или из меню Test. У вас
есть два варианта: выполнять их в отладчике или без него. Первый позволяет вам при
неудаче теста выйти в отладчик. Эта возможность полезна в том случае, если вы ищете
неполадки в коде при помощи тестов. Второй вариант более вероятен. Вы просто хотите
выполнить свой набор модульных тестов и получить их результаты.
Панель инструментов Test Tools выполняет все тесты данного проекта. Для того чтобы
запустить группу, список или подмножество всех тестов, вам придется использовать редактор
Test List Editor. Например, если вы просто хотите выполнить модульные тесты Customer, то
можете открыть редактор Test List Editor из меню Test.
В окне редактора Test List Editor выберите Class Name в раскрывающемся списке Group
By. Это позволит вам видеть только тесты CustomerTest. Вы можете выделить все эти тесты
и выставить флажки для их выполнения (рис. 26.14).
Глава 26. Версия Development Edition
1011
<S> Cjstomf f Management Microsoft Visual Studio
File Edit View Project Build Debug Data Tools
vJ *>*> Ы *<И £-3 31] qi : r 9
Nl
a
\
1
J
v.^r_ ^"^ Ш£&*Т22Я
Test Analyze Window Help
Test Iht Editor д^я1М9£°^ЩШ^Мш1, ШШШйШШЯк! CMstpjrjetf^ilflisstcs] - *
i a> " $0 i'A %J ^1 СюирВу. Class Name - (AHCotumr* Customer - Q
\jj Group By. Class Name- Uerr{s) checked 12
i- i£ Lists of Tests
Л| CRM User Inter
jL Customer Gas:
y,jjj TestsNotinaLirt
|« )
Test Let Full..
B3 [No Class Name]
ft BookTest
л CustomerProfiteTert
l£ CustomerTest
V4J
*<J
i* OrderTest
't ProdurtTest
* UnhTertl
^ but bit 3'Atpcti
Ready
Test Name Project
AddresiITest CustomerManagerTests
Addres.s2Test CustomerManage/Tests
CrtyTert CustomerManagerTests
ContactVlaEmailTest Custome/ManagerTtsts
ContactVtaPhcneTert CustomerManagerTerts „
DescriptionTert Cu5tomerMar»agerTesti
EmailTest CustomerManagerTests
IdTest CustomerManagerTerts
NameTest CustomerMaoauerTeits
PhoneTest CustomerManagerTests
StateTest CustomerManagerTests
ZipTrst CustomerManagerTests
H
p
4j|
1
Рис. 26.14. Выбор тестов в редакторе Test List Editor, панель All Loaded Tests
Вы можете также ввести фильтр для того, чтобы найти те тесты, которые хотите выполнить.
Для этого введите свой критерий поиска в самом правом текстовом поле панели инструмент
тов Test List Editor. Затем нажмите зеленую стрелку для применения фильтра. Если ваш
тестовый список будет выполняться часто, то вы можете создать новый список для
сохранения тех тестов, которые вы хотите выполнять группой. Вы можете сделать это при помощи
щелчка правой кнопкой мыши по узлу Lists of Tests в окне Test List Editor и последующего
выбора пункта New Test List. Здесь вы можете добавить в список новые тесты и сохранить
этот список для последующего использования.
Когда у вас есть список тестов, которые вы хотите выполнить, то вы можете сделать это из
панели инструментов Test List Editor. Для этого необходимо выбрать Run Checked Tests.
Примечание
Когда вы запускаете тестовый проект, то перекомпилируется только сам тестовый
проект. Если вы сделали изменения в тестируемом проекте, то должны
перекомпилировать этот проект. Этот подход отличается от выполнения приложений в отладчике,
и к нему, возможно, понадобится некоторое время привыкать.
Просмотр результатов тестов
Окно Test Results дает обзор пройденных удачно и неудачно тестов. На рис. 26.15 показано
это окно в действии. Обратите внимание, что если один или более тестов завершились
неудачно, то и тестовый прогон считается неудачным. В данном случае прошли 11 из 12
тестов. Однако общий тест был неудачным (из-за сбоя в одном тесте).
1012
Часть VI. Система командной работы Visual Studio Team System
Вы можете просмотреть результаты в окне Test Results. Если вы дважды щелкнете по тесту,
то получите статистику этого теста.
Т^ЩйШГ
*& Customer Management - Microsoft Visual Studio
Tools Test Analyze Window Help
File Edit View Project Build Debug Data
у i *> *> у tf. щ |5 з а =з /j с т в
OtyTestfRestaltilj
- Common Results
Test Run. MSneJI©LAPTOP002M 2008-03-08 10-44 51
Test Name. City Test
Result. О Failed
Duration 00:00.003018626
Computer Name: LAPTOP00288
Start Time: 3/8/200610:44:54 AM
End Time 3/8/700810 44.54 AM
,- Error Message
AssertAreEqual failed. Expected<Seven Relds>. Actuab<PCH> BusinessEntiues.Customer.City was not set correctly.
"г Егтот Stack Trace
CustamerManagerTesti.CustomerTest CityTestQ
flMy StwffWriwl Stodi? aQflVPcbtfBgirt9\Curt«
Copy
Copy
| T«t Reiutts
lE/S ^f frj MSnelieiAPTOP00288 2008-03-0* «>Run
' О Test run failed Results 11/12 passed. Iterots) checked. 1
IrjJ Debug
J ЛУ-
Result
'^J^ Passed
^ 1чЛ^д P«ssed
rfi^O F«M
' J«J«> *»"«*
^irrori'itt^duTput^
Test Name
AddresslTest
Address2Test
CrtyTest
«
ContactVtaEmailTest
Test Results |
Project
CwtomrrMansgerTests
CustomerManagerTests
CustomerManagerTests
CustomerManag erTests
Error Message
AssertAreEqual failed. Exper
-
1 ii
"i
Ready
Рис. 26.15. Результаты теста
%jh Customer Management - Microsoft Visual Studio
File Edit View Project Butld Team Debug
4J "?*> У^йЗЗЗЗ^.^!:
ill
8 I
Bui
TVctlWtMtt/wt
|jj=^*jj СЭ <j MSnellOLAPTOP00288 2008-03-0-
О Test run railed Results 11'12 passed; Itemfsjch
Result Test Name
' 1<JS2 P*««* AddresslTest
;<J-J Passed AddresslTest
^<d<& P«»ed ContactViaEmaiTTest
^ l^ils^ Passed ContsctViaPhoneTeit
I^Jv^ Passed DescnpticnTest
' i*Ji2 Pmed FmailTest
;^'«i Passed IdTest
i^J^ Passed NameTest
—!<tJ<d Passed PhoneTest
lyJ-^ P*»«* StateTest
!<^ч4 Passed ZipTest
|j) E"y Ut Zl Output ZjTest Results
Id succeeded
Data
eckec
3
Tools Test Arujlyte Window Help
* ► Debug • Mixed Platforms - ($
«. x I SeWori Sq&loter
Run - If») Debug -J i lJj
.1
Project E
CustomerManagerTests
CustomerManagerTests
ИШ¥П1Ш1РВНПГР
Step 7 «-Л Fen
View Test Results Deta'iK
View Run
Open Test
Create Work Item ►
Add to Work Item-.
Create Performance Session... '
Copy .
Select All
Add/Remove Columns !
\
Code Coverage Results
rcr Message
Issue
Change Request
Risk
Requirement
Review
bi^U
•
^ Д x
Рис. 26.16. Регистрация элементарной работы по результатам модульного теста
Глава 26. Версия Development Edition
1013
В верхней части рис. 26.15 показана информация по сбою для City Test; там содержится
сообщение об ошибке и трассировка стека.
Вы можете также опубликовать результаты вашего тестирования на сервере Team
Foundation Server. Это даст важную статистику по качеству данного построения (какие тесты были
выполнены и с какими результатами). Кроме того, вы можете щелкнуть по тесту правой
кнопкой мыши и сгенерировать элементарную работу для системы Team System. Эта
возможность полезна в том случае, если у вас есть сбой. Вы можете щелкнуть по нему правой
кнопкой и зарегистрировать его как ошибку или как задачу на исправление. На рис. 26.16
показан пример регистрации ошибки по результатам теста.
Когда вы добавляете элементарную работу Bug по результатам теста, то часть элементарной
работы будет заполнена за вас Visual Studio (в том числе и информация по тесту). На
рис. 26.17 показан результат добавления City Test в качестве элементарной работы типа Bug.
Обратите внимание, что путь к тесту, его название и его идентификатор автоматически
заполняются инструментом.
</> easterner Management Microsoft Visual Studio
! File Edit View Project Bu«W Tum Debug D«U Tools Test Analyze Window Help
1о|@ШУ:
Щ
It
N1
1 1
i
i
!
t
i
j
|
i
I
1
i
[j
NewBugl-U^lj^Btoa
^ New Bug 1: TF20012: Reld 'Symptom' cannot be empty
Seventy) Low -r Reason: New
Triage; Pending ▼
Descriptam | Fpt | Hetory | imks | AttachmtntsJ Details 1
Root cause: Unknown
Build Schedule
Found mt » Estimate
integrated in: » Remaining work:
Completed worfc
Test
Name CrtyTert
Щ-. 3da4bl35-€cfli-5093-e4c6-5Sb6862b4dM
Pith: CurtomifManagerTestsXustornerlert.CrtyTest
i
1
^JL^^*** Ш foffiy Tl feft ft8*0***'
j Build succeeded
▼ X
.J
т :
Щ
о
■«■ь «J.J
Рис. 26.17. Информация о тесте внутри элементарной работы типа Bug
Анализ покрытия кода
Автоматизированные модульные тесты — это замечательно. Однако вам нужна будет
определенная гарантия того, что модульные тесты обеспечивают покрытие всего кода вашей
системы. Это особенно актуально для менеджеров процесса и прочих заинтересованных
участников. Им нужен показатель количества тестируемого кода. Они не могут просто
положиться на слово разработчиков (которые также часто и сами не знают этого точно).
1014
Часть VI. Система командной работы Visual Studio Team System
Для решения этой проблемы Visual Studio обеспечивает анализ покрытия кода. Этот анализ
сравнивает модульные тесты с кодом и указывает, какой код был покрыт, а какой — нет.
В результате получается определенное представление о состоянии тестирования. Возможно,
например, что все ваши тесты завершились успешно. Однако этот отчет приобретает
совершенно иной смысл, если эти тесты вызывают только 30% вашего кода.
Настраиваем анализ покрытия кода
Учет покрытия кода может помочь разработчикам писать эффективные модульные тесты.
Он может помочь также измерять эти тесты. Настраивайте (включайте) анализ покрытия
кода для сборки в файле с расширением testrunconfig (находится в каталоге Solution Items).
Этот файл показан на рис. 26.18. В этом примере анализ покрытия кода включен для
проекта BusinessEntities.dll.
ПП^Ы
localtertrurMestnmconfig
General
.^Р.^Т.?!!е/.?™?. Agent
Deployment
Hosts
Setup and Cleanup Script!
Test Timeouts
Web Test
Select artifacts to instrument
Artifacts to instrument
I ] ^ CustomrrAdministratton
~~\ 15$ CustomenManagerTests.^
J *& DataAccessLfcb dtl
^Debugging
l^EntityS«vices.dll
_ ] *£J 5alesArulysi5.exe
] Jfr SalesAnalysisServices
~~ ] ^ UnleashedServjceLayer
Path
ШБШВВ&
as
<Solution D«fectory>\CustomerAdmtmstrerion\lj
<Solution Directory*\CustomerManagerTest5\b[
<SalutK>n Dtrectory>\DataAccessLib\bin\Debug.
< Solution Directory>\Debugging I
«Solution Directory>\EntityServices\bin\Debug \
«Solution Directory»\SalesAnalysrs\bin\Debug
<Solution Directory>\SafesAnalysiiServices
* Solution Directory!»\Ur»leeshedServiceLayer
i
[ Add Assembly.. J
""] Instrument assemblies in place
Re-signing key file |
Code coverage measures what source code is executed during test execution Select
the artifact to instrumentfor code coverage analysis Art/facta are assemblies and
ASP,NFT Web sites
Рис. 26.18. Настройка анализа покрытия кода
Оценка покрытия кода
Следующий шаг — повторное выполнение ваших тестов. При этом Visual Studio собирает
данные по покрытию. Эти данные затем предоставляются вам в окне Code Coverage
Results. Вы можете получить доступ к этому окну из панели инструментов окна Test
Results. На рис. 26.19 показан пример таких тестовых результатов.
Обратите внимание, что в классе Customer покрыто только примерно 78% кода. Вы можете
просмотреть этот список для того, чтобы найти пропуски. К тому же вы можете сразу
заметить, что несколько методов не имеют модульных тестов (покрытие 0%).
Вы можете перейти к этому коду непосредственно из окна анализа покрытия. Вы можете
включить цветовое расцвечивание из панели инструментов Coverage. Цветовое
расцвечивание выделяет синим тот код, который вызывается из теста. Красным выделяется тот код,
Глава 26. Версия Development Edition
1015
который не вызывается. Эти цвета дают вам легкий способ поиска мертвых зон вашего
тестирования.
vft Customer Management - Microsoft Visual Studio
File Edit View Project Butrd Team Debug Data Tools Test Analyze Window Help
i ' Ф * U * 3 d 00 i * ■&&,*** ** * li * ->* . ► Debug • Mixed Platforms
i y>*p*> w«?jзазззч-: c<<^
If
i
j
■
■
i
'
^ТДГАШШШМШММ^^ №Ш||1Н!!!|||!ВД,ЭД№Щ^
MSr«ll!5LAPTOP002M 2008-03-0811:22:13 + { £ *j 4t J j 13 )<
Hierarchy Not Covered (Blocks) Not Covered (% Blocks) Covered (Bloc
Btfj MSnel№LAPTOP00288200B-03-„. 34 4857% 36
i- & BusinessEnWies dll 34 4857 % 36
Э <} BusinessEmitiej 34 4857% 36
Ш U Book 12 100jOO% 0
H ^| Customer ЩЭДМВ||в|РМЩЩ^
V DeleteQ 2 100.00% 0
ф GrtQ 2 100.00% 0
* GrtLMtO 2 100.00% 0
V SaveO 2 WOjOO % 0
V UpdateO 2 100» % 0
V get.AddresslO 0 0.00% 2
* get_Address2Q 0 0 00% 2
<* get_CityO 0 0.00% 2
9 get.ContactViaEm.. 0 0 00% 2
V get.ContactVtaPb 0 000% 2
<3» get.DescripticnQ 0 0.00% 2
| j& E«o* U* 3 Output ^J r«st 8wvte
Jtem(s) Saved
• Э
яд^^чаш
Covered (%
51.43 %
51i3%
51,43%
0j0O%
0.00%
0.00%
оло%
OjOO%
0.00%
100.00%
10000%
10000%
100ЛЯ%
100.00%
100.00%
lg|Bj^3ad'
;!
ШЦПвШ1)
Blocks)
*
i 1
1 j
шии5!
Щ
f
3
i j
24;
§r i
j 1
i
i
,
, 1
!
j
""<
- - -
Рис. 26.19. Результаты анализа покрытия кода
i#> Customer Management Microsoft Visual Studio
I» tiH
Fife Edit View Project Build Team Debug Data Tools Test Analyze Window Help
0»
Customer.cs! ______ '
^BusinessEntrties Customer
'^DdeteQ
public ant Id {
zatnirn __id;
I
••c f
_id « value.
}
)
public void SaveO I
public void 0pdat*U f
IN
^
ПГЩ
I MSnellgLAPTOPOO» 2008-03-08 llt22:13 ^ j ^> <ц ^ Й 3 JK ' . #
Hierarchy Not Covered (Blocks) Not Covered (% Blocks) Covered (Bloc Covered (% Blocks) |
Ф DeieteO
* GrtO
Ready
Рис. 26.20. Расцвечивание покрытия кода
1016
Часть VI. Система командной работы Visual Studio Team System
На рис. 26.20 показан пример такого расцвечивания (хотя в этой черно-белой книге разницу
увидеть сложно). Свойство id покрыто выполняемыми тестами, но нижний метод— нет.
Профилирование производительности
Visual Studio предоставляет инструмент для профилирования производительности вашего
приложения. С его помощью вы можете анализировать проблемы производительности
вашего приложения и принимать меры для их исправления. Профилирование
производительности и отчеты делаются внутри интегрированной среды разработки.
Основным средством оценки и анализа производительности в Visual Studio является сеанс
анализа производительности. Вы создаете сеанс анализа производительности для профилирования
вашего приложения. Процесс профилирования включает в себя следующие действия:
1. Настройка приложения для анализа производительности.
2. Сбор данных по производительности.
3. Просмотр/анализ собранных данных.
Performance Explorer в Visual Studio предоставляет интерфейс работы мышью для
создания сеансов анализа производительности и анализа полученных наборов данных. Он имеет
простой интерфейс с панелью инструментов- и клиентской областью (где и отображаются
данные). Performance Explorer способен одновременно отображать множество сеансов
производительности, а также управлять ими.
Примечание
Профилирование производительности теперь поддерживается и для 64-битных
компьютеров.
Создание сеанса анализа производительности
Доступ к Performance Explorer вы получаете из меню View | Other Windows | Performance
Explorer. При этом открывается окно, которое аналогично Solution Explorer или Server
Explorer. Вы можете также получить доступ к действиям Performance Explorer из меню
Analyze. Это позволяет вам запустить анализатор производительности, посмотреть метрики
кода (об этом чуть позже) и сравнить отчеты.
Launch with Profiling Stop
i i "i i
Launch Performance Wizard—Ц| U^/.;.. i -<Л|3—I—Attach/Detach
Method
New Performance Session
Рис. 26.21. Панель инструментов Performance Explorer
Глава 26. Версия Development Edition
1017
Окно Performance Explorer имеет в верхней части панель инструментов, которая содержит
различные полезные элементы. На рис. 26.21 показан общий вид этой панели инструментов.
Эта панель инструментов позволяет вам создавать новые сеансы анализа
производительности при помощи мастера Performance Wizard или кнопки New Performance Session.
В табл. 26.3 описаны эти кнопки (а также и другие кнопки с рис. 26.21).
Таблица 26.3. Кнопки панели инструментов в Performance Explorer
Кнопка
Launch Performance
Wizard
New Performance
Session
Launch with Profiling
Stop
Attach/Detach
Method
Действие
Запускает мастер Performance Wizard для создания нового сеанса
анализа производительности
Создает новый (пустой) сеанс анализа производительности
Запускает сеанс анализа производительности для указанной цели
Останавливает текущий сеанс анализа производительности
Прикрепляет профилировщик к текущему выполняемому процессу или
открепляет от него. Это действие допустимо только тогда, когда в
раскрывающемся списке Method выбрано значение Sampling
Позволяет вам указать метод профилирования (Sampling или
Instrumentation) для сеанса анализа производительности
Мастер Performance Wizard соберет информацию относительно нижеследующего:
□ тип сборки, о которой вы собираете данные;
□ местоположение сборки;
□ метод профилирования производительности, который необходимо реализовать.
Совет
Если решение загружено в Visual Studio, то вы можете выбрать один из его проектов
как цель сеанса анализа производительности (вместо того, чтобы искать сборку на
диске).
Профилирование производительности выполняется либо при помощи выборки, либо при
помощи инструментирования. Выборка используется для профилирования всего
приложения; инструментирование — для конкретных модулей внутри приложения.
После сбора основной информации о сеансе мастер закроется, и Performance Explorer
покажет древовидное представление данных сеанса. Это древовидное представление
организовано в два крупных родительских узла: Targets (указанные вами в мастере сборки или
модули) и Reports (данные производительности, собранные для указанных целевых сборок
или модулей). На рис. 26.22 показан сеанс анализа производительности внутри Performance
Explorer.
Performance Explorer может отображать множество сеансов одновременно. Контекстное
меню сеанса предоставляет несколько полезных команд, в том числе команды запуска
сеанса, установки сеанса в качестве текущего, а также редактирования свойств сеанса.
1018
Часть VI. Система командной работы Visual Studio Team System
</» jtwareHRLVS20Q3 - Microsoft Visual Studio
\®т£Ы
File Edit
View Project
Build Debug Date Tools
i ^ - - - - $J * -'
^5 JO' Sampling » ~
•r L> Targets '
£3 Shelf
ii3 Infrastructure Interface
«3 Litware.HR j
£3 LitwareHR Portfolio d
_ bj Repcrts
ijft SheIIOS0308tl).vip .
Test Analyze Window Help
' - - $«.i * „*' V Debug * Any CPU
Shctt080308(D.vsp
Current View Summary
- \3
Performance Report Summary
Functions Causing Most Work
Name
|mscoree*dli]
lmdll.dll]
[KERNEL32.dll]
[BCRVPT dil]
Unknown Framt(s)
Samples
18
15
14
12
12
10OQQ
8333
77 78
66.67
6667
Functions Doing Most Individual Work
Name
[BCRVPT dll]
[ntdll dill
[mscorwlo.,dll]
System Resources ReseurceManagerGetString(stri
System Resources ResourceManagerlrrternalGelR
Sarrples
11
S
6111
1121
16j67
I ^Performance,,, rgData Coitecti..
Reedy
Рис. 26.22. Сеанс анализа производительности в Performance Explorer
Настройка сеанса
Для редактирования индивидуальных свойств любого сеанса щелкните правой кнопкой
мыши по узлу сеанса (на рис. 26.22 это узел Shell) и выберите команду Properties.
Диалоговое окно Properties предоставляет различные базовые и расширенные свойства выбранного
сеанса.
Общие свойства
Страница общих свойств General позволяет вам настроить общие свойства инструментиро-
вания. Вы можете выбрать метод профилирования (выборка или инструментирование), а
также включить/выключить профилирование памяти во время сеанса.
Сбором статистики по времени жизни и размещению объектов управляют два флажка. Если
флажок Collect .NET Object Allocation Information не установлен, то подотчет Allocation
не будет доступен для анализа. Если не установлен флажок Also Collect .NET Object
Lifetime Information, то не будет доступен подотчет Objects Lifetime.
Вы можете также управлять именованием и сохранением отчетов:
□ Report Location — физический каталог для хранения отчета анализа производительности;
□ Report Name — название отчета;
□ Automatically Add New Reports— новые отчеты будут автоматически появляться в
узле Reports внутри Performance Explorer;
Глава 26. Версия Development Edition
1019
D Append Incrementing Number— для предотвращения конфликтов имен к названию
отчета и файла будет добавляться постоянно увеличивающееся число;
□ Use a Timestamp — для номера отчета будет использоваться временная метка.
Свойства запуска
Страница свойств Launch управляет запускаемыми двоичными файлами и их порядком.
Имеющиеся двоичные файлы представлены в виде списка. Отметьте те, которые
необходимо запустить в сеансе анализа производительности, и используйте стрелки вверх и вниз для
изменения порядка запуска.
Свойства выборки
События выборки — это тот механизм, при помощи которого сеансы анализа
производительности собирают данные через указанные интервалы времени во время выполнения.
Откройте страницу Sampling для изменения используемого профилировщиком события
выборки. Вы можете также изменить интервал выборки (время между событиями выборки).
Например, вы можете принять решение делать отсчет производительности после каждых
пяти страничных ошибок. Для того чтобы это настроить, необходимо выбрать Page fault в
качестве события выборки и изменить интервал выборки на 5.
Shell Property Pages
General
Launch
Sampling
Binary
Instrumentation
CPU Counters
Windows Events
Windows Counters
Advanced
Tsbasad
Sample event:
Sampling interval'
[ Performance counter
Available performance counters:
'♦i General
S Front End Events
'±i Branch Events
Si Memory Events
fc) Platform Events
Si Data Cache
Si Instruction Fetch Unrt
S» U Cache
S) Floating Point Unit
S> Memory Ordering
jt> S1MD Extensions
£ interrupts
HW Interrupts Masked
» HW Interrupts Masked Pending
..^.RfFnrhEwnts
Summary:
Sample every 1000000 HW Interrupts Received
OK ] | Caned fiwfy
Рис. 26.23. Настройка событий выборки для сеанса анализа производительности
1020
Часть VI. Система командной работы Visual Studio Team System
Если вы выберете событие выборки Performance counter, то после этого сможете выбирать
из списка всех имеющихся счетчиков производительности. На рис. 26.23 показан пример
выборки на основе аппаратных прерываний. Обратите внимание, что раздел Summary
(в нижней части диалогового окна) дает текстовое описание выделенного события выборки
и интервала.
Свойства двоичных файлов
В процессе инструментирования в целевые сборки автоматически вставляются зонды.
Страница свойств Binary может изменить это поведение и заставить профилировщик сначала
сделать копии двоичных файлов и разместить их в указанном каталоге (до того как изменять
их). Вот опции двоичных файлов:
□ Relocate Instrumented Binaries — целевые двоичные файлы перед инструментировани-
ем будут скопированы в каталог. Исходные двоичные файлы изменяться не будут;
□ Location to Place the Instrumented Binaries — указывает физическое положение
инструментированных двоичных файлов.
Свойства инструментирования
Страница свойств Instrumentation используется для указания тех исполняемых или
пакетных файлов, которые вы хотите выполнить перед или после инструментирования сеанса.
Например, вы можете использовать это для того, чтобы выполнить некоторые изменения
среды компьютера перед профилированием, а после него вернуть компьютер в его исходное
состояние. Вот опции инструментирования:
□ Pre-Instrument Command Line — команда, которая будет выдана перед инструменти-
рованием; она обычно используется для указания файла с расширением cmd или bat,
либо исполняемого файла, который будет выполнен перед инструментированием сеанса;
□ Pre-Instrument Description — описание выполняемой перед инструментированием
команды (в свободной форме);
П Pre-Instrument Exclude— установка этого флажка приведет к пропуску выполняемой
перед инструментированием команды (но не удалит ее из текстового поля);
□ Post-Instrument Command Line — команда, которая будет выдана после
инструментирования; она обычно используется для указания файла с расширением cmd или bat, либо
исполняемого файла, который будет выполнен после инструментирования сеанса;
□ Post-Instrument Description — описание выполняемой после инструментирования
команды;
□ Post-Instrument Exclude — установка этого флажка приведет к пропуску выполняемой
после инструментирования команды (но не удалит ее из текстового поля).
Свойства счетчиков процессора
Процессоры обычно реализуют собственные счетчики производительности. Выставляя
флажки на странице свойств счетчиков процессора CPU Counters, вы даете профилиров-
Глава 26. Версия Development Edition
1021
щику указание собирать данные непосредственно из одного или нескольких этих счетчиков.
Для выбора счетчика раскройте дерево имеющихся счетчиков до интересующего вас
счетчика, выделите его, а затем щелкните кнопку со стрелкой для того, чтобы перенести его в
список выбранных счетчиков. На рис. 26.24 показано, как нужно выбирать счетчики
производительности процессора.
Shell Property Pages
General
launch
Binary
Instrumentation
CPU Counters
Advs need
J
[_§_ШШ1]
{/ Collect CPU Counters
Available counters Selected counters: | i
H Platform Events *
9 Data Cache
. DCU Modified Lines In
DCU Lines Out
К Instruction Fetch Unit
Instruction Fetches
Instruction Fetch Mesas
> Instruction Fetch Stall Cycles !
InstrFetchLengthDecoderSUB ! \
О LZCache | j
L2 Instruction Fetches ,
:■ L2 Data Loads jg|
U Data Stores j \
L2Lmestn '
L2 Lines Out {
L2 Modified Lines In j I
\2 Modified Lines Out j_j
I*'- Floating Point Unit
[+1 Memory Ordering
(У| L2 Lines In j i
Instruction Fetches j
< DCULinesIn i
i j
! у
j [i
i 1
i ;
CPUCourten 1
In instrumentation mode, data from multiple CPU hardware counters can be collected The deti *ill
appear as extra columns in each view, in addition to the default time columns. ;
! OK || Cane* | «op* 1 |
.„.,. .Jj
Рис. 26.24. Выбор счетчиков производительности процессора
Примечание
Имеющиеся счетчики зависят от аппаратного обеспечения и будут отличаться в
зависимости от типа процессора и его производителя.
Свойства событий Windows
.NET-приложения (а также и сама исполняющая среда) способны регистрировать и
предоставлять различных провайдеров трассировки событий. Performance Explorer может
собирать данные от этих провайдеров во время сеанса анализа производительности (рис. 26.25).
Свойства счетчиков Windows
Вы можете также собирать данные счетчиков производительности Windows (в качестве
составляющей части процесса профилирования приложения), в том числе счетчиков ASP.NET,
.NET CLK, баз данных и т. д. На рис. 26.26 показана настройка этих счетчиков.
1022
Часть VI. Система командной работы Visual Studio Team System
Shell Property Pages
"TT
General
Launch
Sampling
Binary
Instrumentation
CPU Counters
Windows Events
Windows Counters
Advanced
Select event trace providers to collect data from;
j_ Process
Iv'Thread
I IlmageLo-ad
|J Disk I/O
[ File J/O
LjPageFaulfc
HHard Page Faults
L Network
I 'Registry
[</ ASP.NET Events
(jbUSfc SSL Filter
\ П5 6 WWW Server
L_IIS б Actrve Server Pages (ASP)
Г~ US 6; WWW ISAPI Extensic n
L NET Common Language Runtime
Event information ts only Available for view in ETWtext reports
Ust Vsperfrepcrt /summary;ETV/' to generate th» report from the command line
* /QK J [ Cancel
Рис. 26.25. Сбор данных провайдеров трассировки событий
Shell Property Pages
General
Launch
Sampling
Binary
Instrumentation
CPU Counters
Windows Events
Windows Counters
Advanced
UJftfitf'
>j] Collect V/indows Counters
Collection interval (msecs; 500
Counter Category r- ■
ASP NET -r *-*"
Instance
Application Restarts
Applications Running
Audit Failure Events Raised
Audit Success Events Raised
Error Events Raised
Infrastructure Error Events Raised
Request Error Events Raised
Requests Current
Requests Disconnected
Requests Queued
Requests Rejected
State Server Sessions Abandoned
State Server Sessions Active
Windows Con*en
*
I»J
@
PI
\(_Tctal)V
\{_Tctaf)\
vASP.NETVRequest Wait Time |
\ASPNET\Requests Current 1
\A5PNET\Requests Queued 1
\ASP.NET\Requests Rejected 1
it
Windows Counters are system performance counters that can be collected at regular interval dunng - ;
profiling In the Marks view, there is a row labeled AutcMark* for each collection interval. The row
contains columns that describe the performance counter values at that interval To restrict the analysis
to a period of time between raro particular marks, select the marks, right-click, and then choose' Filter
By Marks".
- ~ '
•ТМИТГ.7-
-
_
| OK " ] [ Cancel | ' *o*
__ __ _ _ _ _ _ —_
Рис. 26.26. Свойства счетчиков Windows
Глава 26. Версия Development Edition
1023
Расширенные свойства
Инструмент командной строки VSInstr используется для инструментирования и запуска
сеансов профилирования внутри интегрированной среды разработки Visual Studio. Это
происходит "за кулисами", когда вы используете Performance Explorer для создания и запуска
этих сеансов. Однако иногда вам может понадобиться передать в инструмент VSInstr опции
командной строки. Для этого используется страница свойств Advanced.
Цели сеанса
Каждый сеанс может иметь,множество целей; однако при выполнении сеанса
профилируется только одна цель. Цель "запуска" обозначена зеленым треугольником "run". Щелчок по
цели правой кнопкой мыши выдаст контекстное меню для цели. В этом меню вы можете
удалить цель из списка, настроить ее как цель "запуска", а также отредактировать свойства
цели. Пункт Properties приведет к появлению диалогового окна Object Property, в котором
вы можете указать расширенную информацию, которая не собирается мастером Performance
Wizard.
Свойства запуска
Используйте страницу свойств Launch для указания тех исполняемых или пакетных файлов,
которые вы хотите выполнить до или после инструментирования сеанса. Вот свойства
запуска:
□ Override Project Settings — установка этого флажка позволяет вам вручную указать
аргументы и целевой исполняемый файл;
□ Executable to Launch — исполняемая сборка, которая будет запущена как цель сеанса;
□ Arguments — аргументы, передаваемые целевому исполняемому файлу;
□ Working Directory — рабочий каталог для целевого исполняемого файла.
Свойства инструментирования
Страница свойств Instrumentation по своей форме и функциям идентична странице
Instrumentation в диалоговом окне Session Properties.
Расширенные свойства
Эта страница идентична по своей форме и функциям странице Advanced в диалоговом окне
Session Properties.
Отчеты
Узел Reports дерева Performance Explorer (см. рис. 26.22) содержит отчеты анализа
производительности. Щелчок по отчету приведет к показу его содержимого в окне с вкладками
(аналогичном окну редактора Visual Studio).
1024
Часть VI. Система командной работы Visual Studio Team System
Данные отчета могут быть экспортированы в более удобные форматы: для этого
необходимо щелкнуть правой кнопкой мыши по узлу отчета и выбрать в контекстном меню пункт
Export Report. Откроется одноименное диалоговое окно (рис. 26.27). При экспорте отчета
вы можете выбрать необходимые подотчеты и формат экспорта (CSV или XML).
Export Report
Choose views to ex port'
С J CallerCallee
Г J CallTree
I J~] Function
П Header
Ш Marks
[13 Module
Prefix reports with:
ShdD80308(l)~
Exported report location?
C;\LrtwareHR\5olution\LitwareHR-SC
Exported report format
[ШРолмШЭД
щшшт¥Ш^^-:^*^—-т
1 XML Format (Ш1)
[У_ЫШ'
i
- 1
"~'Щ
4 w\
— .:*SI
L£.. I 1
Рис. 26.27. Экспорт отчета
Отчеты по производительности
Сгенерированные в сеансе анализа производительности отчеты будут отличаться по своей
форме и содержимому в зависимости от характера сеанса — был ли он
инструментированным или получен при помощи выборки. Данные профиля организованы в несколько
подотчетов. За исключением сводки Summary, каждый подотчет отображается в
табличном формате со столбцами и строками; столбцы представляют собой различные точки
сбора данных (такие как Number of Calls или Application Exclusive Time). Строки
представляют собой специфичные для подотчета объекты. Например, для подотчета Functions
это будут функции. i
Совет
Вы можете отсортировать подотчет при помощи щелчка по заголовку столбца. Это
приведет к переключению порядка сортировки по данным этого столбца с
возрастающего на убывающий. Эта возможность очень полезна для таких отчетов, как отчет
Functions: вы можете отсортировать в убывающем порядке по столбцу Number of
Calls для того, чтобы почувствовать, какие маршруты используются в данном
приложении или модуле чаще всего.
В табл. 26.4 дан полный список всех возможных точек сбора данных во всех отчетах по
производительности.
Глава 26. Версия Development Edition 1025
Таблица 26.4. Столбцы отчета анализа производительности
Столбец
Application
Exclusive Time
Functions
Application
Inclusive Time
AVG Application
Exclusive Time
AVG Application
Inclusive Time
AVG Elapsed
Exclusive Time
AVG Elapsed
Inclusive Time
Class Name
Class Token
Elapsed Exclusive
Time
Elapsed Inclusive
Time
Exclusive
Allocations
Exclusive
Allocations %
Exclusive Bytes
Allocated
Exclusive Bytes %
Exclusive Samples
Exclusive
Transitions
Подотчет
Functions,
Caller/Callee
Functions,
Caller/Callee
Functions,
Caller/Callee,
Call Tree
Functions,
Caller/Callee,
Call Tree
Functions,
Caller/Callee,
Call Tree
Functions,
Caller/Callee,
Call Tree
Allocation
Allocation,
Objects
Lifetime
Functions,
Caller/Callee
Functions,
Caller/Callee
Functions,
Caller/Callee,
Call Tree
Functions
Functions,
Caller/Callee,
Call Tree
Functions,
Caller/Callee,
Call Tree
Functions,
Caller/Callee
Caller/Callee,
Call Tree
Описание
Время выполнения для функции, которое не включает
время инструментирования, вызовы из функции или
переходные события
То же самое, что и Application Exclusive Time, но
включено время вызовов
Среднее время Application Exclusive Time для всех
экземпляров функции в течение заданного промежутка
времени
Среднее время Application Inclusive Time для всех
экземпляров функции в течение заданного промежутка
времени
Среднее время Elapsed Exclusive Time для всех
экземпляров функции в течение заданного промежутка
времени
Среднее время Elapsed Inclusive Time для всех
экземпляров функции в течение заданного промежутка
времени
Имя класса
Идентификатор метаданных для класса
Время выполнения функции; включает переходные
события, но не включает время вызываемых функций
Время выполнения функции; включает переходные
события и время выполнения всех вызываемых
функций
Размещения объектов, выполненные в функции; не
включает вызываемые функции
Exclusive Allocations как процент от общего
количества размещений объектов
Размещенные в функции байты; не включает
размещения в вызываемых функциях
Exclusive Bytes в процентах от всего количества
размещенных байтов
Все выборки, сделанные в функции (за исключением
выборок в вызываемых функциях)
Общее количество переходных событий,
произошедших в функции (исключая вызванные функции)
1026 Часть VI. Система командной работы Visual Studio Team System
Тцблица 26.4 (продолжение)
Столбец
Exclusive
Transitions %
Function Address
Function Name
Gen 0 Bytes
Collected
Gen 1 Bytes
Collected
Gen 2 Bytes
Collected
Gen 0 Instances
Collected
Gen 1 Instances
Collected
Gen 2 Instances
Collected
Inclusive
Allocations
Inclusive
Allocations %
Inclusive Bytes
Allocated
Inclusive Bytes %
Inclusive Samples
Inclusive
Transitions
Inclusive
Transitions %
Подотчет
Functions,
Caller/Callee,
Call Tree
Functions, *
Caller/Callee,
Call Tree,
Allocation
Functions,
Caller/Callee,
Call Tree,
Allocation
Objects
Lifetime
Objects
Lifetime
Objects
Lifetime
Objects
Lifetime
Objects
Lifetime
Objects
Lifetime
Functions,
Caller/Callee,
Call Tree
Functions
Functions,
Caller/Callee,
Call Tree
Functions,
Caller/Callee,
Call Tree
Functions,
Caller/Callee
Caller/Callee,
Call Tree
Functions,
Caller/Callee,
Call Tree
Описание
Exclusive Transitions как процент от всех переходных
событий
Адрес функции в памяти в шестнадцатиричном виде
Имя функции
Общее количество байтов, собранных сборщиком
мусора NET для данного поколения
Общее количество байтов, собранных сборщиком
мусора .NET для данного поколения
Общее количество байтов, собранных сборщиком
мусора .NET для данного поколения
Общее количество экземпляров объектов, собранных
сборщиком мусора .NET для данного поколения
Общее количество экземпляров объектов, собранных
сборщиком мусора NET для данного поколения
Общее количество экземпляров объектов, собранных
сборщиком мусора NET для данного поколения
Размещения объектов в функции (в том числе и во
всех вызванных функциях)
Inclusive Allocations как процент общего количества
размещений
Размещения байтов в функции (в том числе и во всех
вызванных функциях)
Inclusive Bytes как процент общего количества
размещенных байтов
Все выборки функции (включая выборки всех
вызванных функций)
Количество переходных событий в функции (в том
числе все переходные события во всех вызванных
функциях)
Inclusive Transitions как процент от общего
количества переходных событий
Глава 26. Версия Development Edition 1027
Таблица 26.4 (продолжение)
Столбец
Instances
Instances Alive at
End
Large Object Heap
Bytes Collected
Large Object Heap
Instances Collected
Line Number
MAX Application
Exclusive Time
MAX Application
Inclusive Time
MAX Elapsed
Inclusive Time
MAX Elapsed
Exclusive Time
MIN Appliqation
Exclusive Time
MIN Application
Inclusive Time
MIN Elapsed
Inclusive Time
MIN Elapsed
Exclusive Time
Module Identifier
Подотчет
Allocation,
Objects
Lifetime
Objects
Lifetime
Objects
Lifetime
Objects
Lifetime
Functions,
Caller/Callee,
Call Tree,
Allocation
Functions,
Caller/Callee,
Call Tree
Functions,
Caller/Callee,
Call Tree
Functions,
Caller/Callee,
Call Tree
Functions,
Caller/Callee,
Call Tree
Functions,
Caller/Callee,
Call Tree
Functions,
Caller/Callee,
Call Tree
Functions,
Caller/Callee,
Call Tree
Functions,
Caller/Callee,
Call Tree
Functions,
Caller/Callee,
Call Tree
Описание
Общее количество экземпляров данного объекта
Общее количество экземпляров данного объекта,
находящихся в памяти при завершении сеанса анализа
производительности
Общее количество байтов экземпляров больших
объектов (размещенных в куче), которые были собраны
сборщиком мусора NET
Общее количество экземпляров больших объектов
(размещенных в куче), которые были собраны
сборщиком мусора NET
Номер строки начала функции (в исходном файле)
Самое большое значение Application Exclusive Time,
которое было записано в сеансе анализа
производительности для всех экземпляров функции
Самое большое значение Application Inclusive Time,
которое было записано в сеансе анализа производи- г
тельности для всех экземпляров функции
Самое большое значение Elapsed Inclusive Time,
которое было записано в сеансе анализа
производительности для всех экземпляров функции
Самое большое значение Elapsed Exclusive Time,
которое было записано в сеансе анализа
производительности для всех экземпляров функции
Самое маленькое значение Application Exclusive
Time, которое было записано в сеансе анализа
производительности для всех экземпляров функции
Самое маленькое значение Application Inclusive Time,
которое было записано в сеансе анализа
производительности для всех экземпляров функции
Самое маленькое значение Elapsed Application
Inclusive Time, которое было записано в сеансе анализа
производительности для всех экземпляров функции
Самое маленькое значение Elapsed Application
Exclusive Time, которое было записано в сеансе анализа
производительности для всех экземпляров функции
Последовательный номер, присваиваемый внутри
процесса модулям при их загрузке
1028 Часть VI. Система командной работы Visual Studio Team System
Таблица 26.4 (продолжение)
Столбец
Module Name
I Module Path
Number of Calls
Parent Function
Address
Percentage of Calls
Process ID
Process Name
Root Application
Exclusive Time
Root Application
Inclusive Time
Root Elapsed
Exclusive Time
Root Elapsed
Inclusive Time
Root Node
Recursive
Source File Name
Time Exclusive CAP
Overhead
Подотчет
Functions,
Caller/Callee,
Call Tree,
Allocation
Functions,
Caller/Callee,
Call Tree,
Allocation
Functions,
Caller/Callee,
Call Tree
Call Tree
Functions,
Caller/Callee,
Call Tree
Functions,
Caller/Callee,
Call Tree,
Allocation,
Objects Lifetime
Functions,
Caller/Callee,
Call Tree,
Allocation,
Objects Lifetime
Caller/Callee
Caller/Callee
Caller/Callee
Caller/Callee
Functions,
Caller/Callee,
Call Tree
Functions,
Caller/Callee,
Call Tree,
Allocation
Functions,
Caller/Callee,
Call Tree
Описание
Имя модуля
Физический путь к модулю
Количество вызовов функции
Адрес вызывающей функции в памяти (в шестнадца-
теричном виде)
Количество вызовов функции как процент от всех
вызовов всех функций
Числовой идентификатор данного процесса
Название процесса
Время Application Exclusive Time для той функции,
которая является корневой для данной функции
Время Application Inclusive Time для той функции,
которая является корневой для данной функции
Время Elapsed Exclusive Time для той функции,
которая является корневой для данной функции
Время Elapsed Inclusive Time для той функции,
которая является корневой для данной функции
Показывает, была ли функция вызвана напрямую или
косвенно в рекурсивной цепочке
Исходный файл, который содержит данную функцию
Общее время в пределах времени Exclusive по всем
зондам, которые были вызваны родительской
функцией
Глава 26. Версия Development Edition 1029
Таблица 26.4 (окончание)
Столбец
Time Inclusive CAP
Overhead
Total Bytes
Allocated
Type
Unique ID
Unique Process ID
% Application
Exclusive Time
% Application
Inclusive Time
% Elapsed
Exclusive Time
% Elapsed Inclusive
Time
% of Total Bytes
% Time Exclusive
CAP Overhead
% Time Inclusive
CAP Overhead
Подотчет
Functions,
Caller/Callee,
Call Tree
Allocation,
Objects Lifetime
Caller/Callee,
Allocation
Functions,
Caller/Callee,
Call Tree
Functions,
Caller/Callee,
Call Tree,
Allocation,
Objects Lifetime
Functions,
Caller/Callee,
Call Tree
Functions,
Caller/Callee,
Call Tree
Functions,
Caller/Callee,
Call Tree
F mictions,
Caller/Callee,
Call Tree
Allocation,
Objects Lifetime
Functions,
Caller/Callee,
Call Tree
Functions,
Caller/Callee,
Call Tree
Описание
Общее время в пределах времени Inclusive по всем
зондам, которые были вызваны родительской
функцией.
Для данного типа данных или экземпляра класса это
общее количество размещенных байтов
Число, обозначающее отношение
"вызывающий/вызываемый"'
• 0 — корневая функция,
• 1 — вызывающая функция;
• 2 — вызываемая функция
Шестнадцатеричное число, используемое для
идентификации функции
Последовательное число (целое без знака),
присваиваемое процессу по порядку его активации
Время Application Exclusive Time для данной функ- I
ции, выраженное как процент от суммы Application
Exclusive Time для всех функций
Время Application Inclusive Time для данной
функции, выраженное как процент от суммы Application
Inclusive Time для всех функций
. Время Elapsed Exclusive Time для данной функции,
выраженное как процент от суммы Elapsed Exclusive
Time для всех функций
Время Elapsed Inclusive Time для данной функции,
выраженное как процент от суммы Elapsed Inclusive
Time для всех функций
Total Bytes Allocated, разделенное на общее
количество байтов, размещенных для всех типов данных
или экземпляров классов в течение сеанса анализа
производительности
Time Exclusive CAP Overhead как процент от суммы
всех Time Exclusive CAP Overhead
Time Inclusive CAP Overhead как процент от суммы
всех Time Inclusive CAP Overhead
1030
Часть VI. Система командной работы Visual Studio Team System
Внутри отчета по производительности существует всего шесть подотчетов (называемых
также представлениями). Каждый подотчет имеет небольшой набор отображаемых по
умолчанию точек сбора данных. Вы можете добавить или удалить точки сбора данных (что
приведет к добавлению или удалению столбцов в подотчете) при помощи щелчка правой
кнопкой мыши в отчете (или в заголовке любого столбца) и последующего выбора пункта
Add/Remove Columns. Появится список всех допустимых точек сбора данных для текущего
подотчета, что позволит вам просто отметить те, которые вы хотите просматривать (см.
табл. 26.4).
Подотчет Summary
Подотчет Summary предоставляет сводку статистики по функциям (такую как наиболее
часто вызываемые функции и функции, которые занимают максимальное количество
времени при выполнении). Двойной щелчок по любой из перечисленных функций немедленно
перенесет вас к данным по этой функции в подотчете Functions (см. следующий раздел).
Эта вкладка очень полезна для того, чтобы быстро получить представление о "горячих
местах", имеющихся в профилируемом приложении или модуле.
Подотчет Functions
Подотчет Functions предоставляет полный список всех функций, которые были вызваны во
время сеанса профилирования. Для каждой функции приведены временные данные, а для
случая инструментированного сеанса — еще и количество вызовов функции.
Подотчет Caller/Callee
Вкладка Caller/Callee представляет в трех отдельных панелях информацию о
вызывающей/вызываемой функции. В средней панели содержится выбранная (вызываемая) функция.
В верхней панели появляются те функции, которые вызвали выбранную функцию
(вызывающие функции), а в нижней панели появляются функции, которые были вызваны целевой
функцией (вызываемые функции).
Это представление полностью динамичное: щелчок по любой из функций в одной из трех
панелей приведет к выделению этой функции. При этом она будет помещена в среднюю
панель, а панели вызывающей и вызываемой функций будут соответствующим образом
обновлены.
Подотчет Call Tree
Представление Call Tree показывает вам трассировку дерева вызовов, сгенерированного во
время сеанса анализа производительности. Каждый вызов функции представлен в этом
дереве вызовов, и вы можете развернуть или свернуть списки вызванных функций внутри
данной корневой функции.
Вы можете переместить любую вызывающую функцию в корневой узел (гфи помощи
выбора в контекстном меню пункта Set Root). Вы можете повторно отобразить корневой узел
посредством выбора Reset Root в контекстном меню.
Глава 26. Версия Development Edition
1031
Это представление особенно полезно для того, чтобы получить представление о времени
Inclusive/Exclusive для функций. Эти данные помогают вам понять, в каком месте ваше
приложение затрачивает больше всего времени. Теперь есть опция Hotpathing для того,
чтобы помочь вам использовать эту информацию. На рис. 26.28 показано представление
Call Tree отчета профилирования производительности. Здесь на панели инструментов вы
видите значок с пламенем. Когда вы его нажмете, отчет будет отфильтрован для того, чтобы
показать те области вашего приложения, которые занимают максимальное количество
времени при выполнении. Эти области будут обозначены таким же значком с пламенем (как
показано).
ТЫЖ
<«*"> Lrtv»afeHR.VS:038 - МюгсиоК Visual Studio
t Vte*> Project
^ Sbdll*
J2 Targft*
&2She
jD Jnfmtmcti
j3 inlr.T*t»utU
1 Wrestmctt.
23 Litvsere HR.
33 IrtvunrHft.
v$ lihwureHU
C23 Shp Runti-т
^u Report»
Tta Atuilyit
> Debug
3uW Debug D*U» "lod*
-Л * - - • ♦ ' • -
Sbe«0B0309.vsp
Current Vhtw Call Tree
Li) Noise R«Ijc* or is endbtaJ Ьа tit it д*ч«- Q
- Any CPU
Ready
.:ш^у„,
i-unction N*n«
И $ »av*s foldtd ending »n "LitvwifeHR Ir'r«*truttute
Lftv**r e HR Jr'r sstf LCturel ibr*^ .Scrvic к Dep«
~ 1& row* fc'dfrf fnc na in "I ttw'ffHR PubhrApt
16 4B2i
ИМ.&4Р Л
0 33 150.379 40
117 12МЮ84
i6,422 83 16423-25
11 73 10S.C 48 Л
130,3?M9
12М8ДО
& Mkroscft-Practicts ComposeeULSmart
104 68308
1Ш
91,750 76 104,633 03
Ш iMftM
Рис. 26.28. Переход к "горячему месту" вашего приложения
Подотчет Allocation
Подотчет Allocation — это список типов/объектов, размещенных во время сеанса анализа
производительности. Каждый тип показан вместе с той функцией (или функциями), которая
отвечает за его размещение.
Отображаемые по умолчанию столбцы этого представления можно использовать для
определения типов или функций, которые интенсивно используют память.
Подотчет Objects Lifetime
Представление Objects Lifetime аналогично представлению Allocation, но сосредоточено на
времени жизни всех типов/объектов, размещенных в течение сеанса анализа
производительности. Каждый класс представляется в подотчете в виде строки.
1032
Часть VI. Система командной работы Visual Studio Team System
Примечание
Несмотря на то, что наличие большого количества точек сбора данных полезно при
анализе производительности, среди них выделяются две точки, которые отлично
служат для выявления такого кода, который ведет себя не так, как ожидалось: Number of
Calls и Elapsed Exclusive Time. Если функция делает больше циклов, чем ожидалось
или ее выполнение занимает больше времени, чем ожидалось, то эти две точки
(которые по умолчанию показаны в представлении Functions) моментально помогут вам
найти такие процедуры.
Сравнение отчетов
Вы можете также использовать Visual Studio для сравнения отчетов. Это можно сделать из
меню Analyze (пункт Compare Performance Reports).
Select analysts files for comparison
Baseline File;
G\LrtwareHR\solution\LituvBreHR^SC\SKeJK)8030e
1 Comparison File:
CALttwareHR\solution\LitwareHR-SC\ShrlJ08090S
I 1 OK I
я
и?лщзв"
Browse-, | 1
Browse*.. | 1
Г
Cancel ]
B^B^^^^K._ к
Рис. 26.29. Выбор отчетов анализа производительности для сравнения
V> UtwaieHR.VS20O8 - Microsoft Visual Studio (Administrator)
File Edit View Project Build Debug Data Tools
' JP • ~ - 2Sda» *.*»-& V *" -# ' Л
Щ
Comparison Report j
Comparison File»
Baseline File Sh«JJDaX>308(l).vfp
1 Comparison File: 5ЫЮ80308лг*р
!
i
'
1
{\) Conpartsonсопфмо
[=> ® £2 Jl
Test Analyze Window Help 1
► Debug
Comparison Column Delta Baseline Value
[mscorwks dll) t 51.19
[KEPNEL32 <M] t 357
_outptit_s_l ♦ 357
CLRStucOrUnknownAddres t 3 57
System Reflection.Runtimef ♦ 3.57
System Reflection Runtime!» "t 3 57
System.RuntimeMethodHar ♦ 3.57
[ntoUdll] £ -П31
[BCRYPT.dlll 1 -61I1
Reedy
16JS7
OjOO
OjOO
0.00
0.00
0.00
OJOO
2222
61U
- AnyCPU • &
w X
Comparison Options
Tabte [FunctrW ^
Column. |b(dW¥e Sample» % ^
Threshold- 1
[ Apply ]
Comparison Value
67J6
357
357
357
357
357
357
10.71
0Ю
*1\
Щ
с j
э
Щ
1!
i-3
rr 1
1|
Рис. 26.30. Просмотр сравнения отчетов
Глава 26. Версия Development Edition
1033
При этом появится диалоговое окно (рис. 26.29). Здесь вы можете указать базовый отчет и
тот отчет, с которым вы хотите его сравнить.
Результаты простого сравнения показаны на рис. 26.30. Здесь вы видите изменения между
самым первым выполнением простого .NET-приложения и его вторым выполнением.
Сравниваемые данные зависят от тех данных, которые вы поручили собирать профилировщику.
Анализ кода
Как уже обсуждалось в главе 24, вы можете определить специальные политики, которые
влияют на то, что именно разработчики кода могут вернуть в решение. Эти политики
регистрации позволяют вам описать те лучшие практики, которых вы планируете
придерживаться, а затем и обеспечить реализацию этих политик. Одной из важных политик возврата
является политика анализа кода. Анализатор кода способен изучить ваш код на предмет
соответствия набору предопределенных лучших практик (которые следует соблюдать с
целью предотвращения проблем еще до их возникновения). Этот инструмент можно
использовать как совместно с политиками возврата системы управления исходным кодом, так и
самостоятельно.
Настройка правил для исполнения
Набор исполняемых правил вы настраиваете для каждого проекта отдельно. Это позволяет
вам управлять тем, какие правила будут применяться к данному типу проекта в вашем ре->
шении. Например, вы можете иметь один набор правил для вашего пользовательского
интерфейса и несколько иную конфигурацию для вашего кода промежуточного уровня.
Хорошая новость состоит в том, что ваши настройки сохраняются. Кроме того, они
регистрируются в решении и затем распространяются другим разработчикам. Таким
образом, вы можете описать общий набор правил, которые будут выполняться при возврате кода
каждого члена команды, и обеспечить их выполнение.
Правила настраиваются через диалоговое окно Project Properties (щелкните по файлу
проекта правой кнопкой мыши и выберите пункт Properties). В этом окне необходимо
щелкнуть слева по вкладке Code Analysis (для того чтобы увидеть имеющиеся опции). Пример
показан на рис. 26.31.
В верхней части окна настройки Code Analysis вы можете указать тип сборки, к которой
применяется ваша конфигурация. Таким образом, вы можете иметь одну конфигурацию при
отладке и другую при выпуске версии. Вы можете даже отключить анализ кода при отладке.
Для этого надо использовать флажок Enable Code Analysis on Build. Когда он выставлен, то
Code Analysis запускается каждый раз при построении вашего решения. В противном
случае он запускается только тогда, когда вы это указываете.
Существует список правил, которые используются статическим анализатором кода при
анализе. Этот список категоризируется по таким элементам, как проект, глобализация, удобство
сопровождения, мобильность, именование и безопасность. Каждая категория содержит
правила, которые применимы к данной категории. Вы можете просмотреть этот список и
выбрать только те элементы, которые хотите выполнять.
1034
Часть VI. Система командной работы Visual. Studio Team System
чЛ Customer Marvegenent- Microsoft VisualStudjo{Aomrnirtratorj >^*~* ^Р&аЩ
File Edit View Project Build Debug Data Tools Test Analyze Window Help
Jl-.J*^id£!' J» * v * ^J ' - ! ► Dd>ug • Mixed Platforms - fc§
к* .:....$!9.^^йг*Ш9РШ*.
3 i
i — i i
1 j Application
!&№&£*' Bu*if»esiEntlties* -
Configuration: [Active (Debug) ■» Platform Acbve (Any CPU) ▼
{ Build j
j „ ., ir | 1/ Enable Cod* Analysis on Build (defines CODF ANALYSIS constant)
Build Events | J
j j>/j Suppress results from generated code
Debug
Resources
■ Services
i Settings
j Reference Paths
i v Signing
j 1 Code Analysts*
j '
Rules Enabled During Code Analysis Treat Warning as Error
It p) Naming Rules ( | *
[£ [V| Performance Rules ]
Lt |V] Portability Rules > J
(♦ [7] RebabiTrty Rules Ц 5*
I* H Security Rules '3
[-I iaj Usage Rules 'J
/] CA1S0L Review unused parameters i ]
И СА1806 Do not ignore method results [ 1
>/] CA1816: Call GCSuppressFinalize CDrrectfy | ]
'У\ CA2200. Rethrow to preserve stack details [ I
_ ] CA2201 Do not raise reserved exception types [_J
У) CA22D5: Use managed equivalents of Win32 API П
Э СА2207 Initialise value type stettc fields inline Щ
^jtncLibt
1 Ready
~\
'ЛИ Щ\
Л.
;f^
;|
rr
»
Рис. 26.31. Выбор политик, которые вы планируете реализовать
Каждое правило маркируется уникальным идентификатором. Он связан с дополнительными
подробностями о данном правиле, его соблюдении и с предложениями по такому созданию
вашего кода, чтобы он соответствовал этому правилу. Обратите внимание на рис. 26.31, что
СА2201 исключено из анализа кода Code Analysis. Это правило Usage, которое говорит о
том, что в вашем коде не должно быть зарезервированных исключений .NET. В данном
случае нарушения этого правила будут игнорироваться.
Примечание
Анализатор кода Code Analyzer теперь включает правила, которые могут проверить
орфографию вашего кода. Например, правило СА1703 проверяет правописание строк
ресурсов. Правило 1704 обеспечивает правильное написание ваших
идентификаторов (типа имен классов).
Обработка нарушений правил как ошибок кодирования
Вспомним из главы 24, что вы можете настроить соблюдение правил при помощи политики
возврата. Эти политики создаются в Team Explorer (щелкните по проекту правой кнопкой
мыши, выберите пункт Source Control Settings, затем щелкните по вкладке Check-in Policy,
а потом нажмите кнопку Add). Описанные здесь политики применяются на уровне решения.
Это означает, что все проекты решения получают одну и ту же политику Code Analysis.
Редактор политики тот же самый, который обсуждался ранее; в данном случае он просто
применяет политику ко всем проектам решения.
Глава 26. Версия Development Edition
1035
У вас может иметься как глобальная настройка, в которой описана группа правил анализа,
так и специфичная для проекта группа. Специфичная для проекта группа будет применяться
при разработке. Однако политика решения будет соблюдаться при возврате. Вы можете
заменить ваши специфичные для проекта настройки настройками политики возврата при
помощи меню Analyze. На рис. 26.32 показаны имеющиеся у вас опции. Вы можете заменить
ваши настройки или объединить эти два набора правил.
I Analyze. | Window Help
rVj Launch Performance Wizard
Compare Performance Reports..
Profiler
Run Code Analysis on BusinessEntrtfes
Code Analyst* Settings for Solution
Calculate Code Metrics for Selected Project^)
Calculate Code Metrics for Solution
Windows
Replace *»th Check-in Poltcy
Merge *rth ChecL-tn Policy
fc
Рис. 26.32. Замена или объединение
наборов правил для анализа кода
По умолчанию нарушения правил анализа кода обрабатываются в Visual Studio как
предупреждения. Это означает, что ваш код будет по-прежнему компилироваться и выполняться
без исключительных ситуаций, но вы получите список предупреждающих сообщений.
Для того чтобы изменить такое поведение, вы можете установить рядом с правилом флажокг
Treat Warning as Error. Эта настройка дает указание компилятору обрабатывать
нарушение данного правила как ошибку (а не как простое предупреждение).
На рис. 26.33 показан пример установки этого флажка для правила анализа
производительности СА1822. Это правило указывает, что члены класса, которым не требуется объект,
должны быть помечены как статические (для улучшения производительности). Проблемы
этого типа теперь будут помечаться анализатором кода как ошибки (а не просто
предупреждения). Мы рассмотрим это чуть позже.
Rules Enabled During Cede Analysis Fteat Warning as Error
~Щ СА1813. Avoid иг seeled attr bules П
V| CA18H: Prefer jagged a/rays ovfrouftidimenstonal ]
\t} CA1F1S: Overr.d* eqi«l* and operateгequate on wlw t_j
"Щ CAlSlJfc Properties should net return «nay* П
V! CA1820: Test for empty strings using string tength ~]
У]
1 'V| UUliJ! AVo»d ur.Used pnvilebeldi "j
/j СЛШ4; Mark assemblies with №eutralftesourc«sl«ngu<U
Lt • Portability Rules , j
& £ Reliability Rules _j
f-f V4 Security Rule* П
Lt Ш Usage Ruin ~]
Рис. 26.33. Помечаем правило,
которое будет обрабатываться как исключение
34 3ак 3716
1036
Часть VI. Система командной работы Visual Studio Team System
Подавление правил
Существует несколько способов подавления правил. Один из способов — просто отключить
их для данного проекта в окне свойств (как мы уже видели). Другой — применить к вашему
коду атрибут Suppressives sage.
Атрибут SuppressMessage позволяет вам указать конкретное правило (при помощи его
категории и идентификатора), которое будет подавлено, причину подавления правила, а
также область действия подавления (вся сборка, пространство имен, модуль, член, тип,
ресурс или параметр). Если вы не укажете область действия, то областью будет считаться
уровень атрибута. Если, например, вы примените атрибут к методу, то он будет применен
только к данному методу.
Вы должны указать, как минимум, категорию правила и его идентификатор. Например, для
подавления правила, которое указывает, что вы должны избегать выходных параметров
(ByRef в VB), вы должны применить к проблемному методу следующий атрибут:
[SuppressMessage("Microsoft.Design", CA1021) ]
Вы можете также добавить поясняющее сообщение с разъяснением причины подавления
правила.
ч/> Customer Management - Microsoft Visual Studio (Administrate*)
| File Edit View Project Build Debug Data Tools Test Analyze Window Help
I ЛЗ'^-^ЙЙР £ -t* & * * И » Л у "i ► Debug * Mixed Platforms
1гНиШг'Д|,-|)''м""эк
S, 2 CA1014. Microsoft.Design. Mark 'BusinessEn
because it exposes externally visible types.
X 3 CA1716: MicrosofLNaming; Rename virtual/
0' so that it no longer conflicts with the resen
reserved keyword as the name of * virtuel/int Jfe
consumers in other languages to override/rm-
О * CA1S22: Microsoft Performance - The 'this' p
'Order.Cancel(ReasonCodes)' is never used К
visual Basic) or use this VMe" in the method
if appropriate.
L 5 CA18Q1: Microsoft Usage: Parameter 'reason
is never used. Remove the parameter or use it
t> 6 CAI7Q4 : Microsoft .Warning • Correct the spelling cf 'Cancellled' in member ni.
Jj Error t is*
Sort By
Show Columns
Show Error Help
Copy
Next Error
Previous Error
Create Work Bern
►
►
t
■Get
|a
r
if
edin
ssor,
Get IBusinessEntity. 28
Project j
11ВЯЩ
BusinessEntities i'
BusinessEntities
Suppress Mes»ge(s) ► !
InSccee
In Project Suppression F
jessEn
Rebuild All failed
Рис. 26.34. Подавление правила в результатах анализа кода
Примечание
Подавлять правила необходимо с умеренностью. Назначение анализа кода Code
Analysis состоит в том, чтобы находить проблемы в коде. Если вы будете подавлять
Глава 26. Версия Development Edition
1037
выдаваемые им сообщения, то можете ослабить его способность помочь вам
написать более хороший код.
Вы можете также пометить элементы как подавленные непосредственно в окне результатов
анализа кода. Здесь вы можете выделить элемент и выбрать опцию Suppress Message(s) (как
показано на рис. 26.34). Некоторые элементы могут быть подавлены в исходном коде,
другие же должны быть глобальными. В этом случае подавление должно происходить на
уровне сборки.
Когда вы подавляете сообщения на уровне сборки, то Visual Studio добавляет в ваш проект
глобальный файл подавления. Этот файл содержит вызовы атрибута SuppressMessage,
которые применяются ко всей сборке. Это показано на рис. 26.35. Обратите внимание, что
Visual Studio также зачеркивает подавляемое правило.
Совет
Вы можете также подавить результаты из сгенерированного кода. Обратитесь к
рис. 26.31. Обратите внимание на флажок, который позволяет вам выключить анализ
кода для сгенерированного Visual Studio кода. Эта опция по умолчанию выключена.
*/> Customer Management - Microsoft Visual Studio {Adminitirflcf)
l^lBiiM
File Edit Vie* Project Build Debug Data Tools Test Analyze Window
• JJ ' JJ ' w? *. «? '. * U % Л • * * ^ 'i ► Debug
Mved Platforms
»
v
•3
!
i
<tloiu6uppr*isJom.cs*
i
/< Ir.,«set-level 3jpsntS3ijrm c*~hci .»av* 'it. turcjet л lit j-v«:i
1 , Tc *<ic л aupj,xe»j(icri tc чип f.i*. rj.<;ti.-cli.ck the 2tt*««?« i» the
'/ Zrrsr !:«-., f-oin- tc ""Sujviex* M»»ffsji» si", *лй cll't
"Microioft.. Scaler.", "CA2SI3 A9«ftabli««Shoul<14*vcV*lldScrDngHAa»s'
'..^j чС ^ .4W «,« ..,,. ,,,,,,. JL^.^ ,,,...,,,...,,..,,,,,,,,, ,..,,,..,. .,..,■,.....,
"
n
►
X
-|
Zl
I |
ш
: $ *
ji j?ua^^
!r
E«cf List
Description
Ум»
5 Errors J
L.. Project
BusinessEntrties
С M31Q i HurwBft.PMiy i Sign Bunnwtintitiw.dll' with a
Strang narwa U>.
CA1014: Microsoft Design: Mark BusinessEntrties dll' with BusinesiEnuties
CLSCompliantfuue) because it exposes extemaJry visible types.
CA1716: Microsoft Naming'Rename vtauat/interface member IBus 28 BusinessEntjttes
'IBusinessEntity Getfl so that it no longer conflicts with the
reserved language keyword 'Get'. Using a reserved keyword as
the name of a virtual/interface member makes it harder for
consumers in other languages to override/implement the
member
a£3 Solution Customer Manager -
♦, ^j Default System
♦, „j Solution Items
-/^2Э BusinessEntrues
i Щ.Л Properties '
A jM References :
* £ Book.cs
A^ ClassDiagraml.cd ,
#J Customer cs '"
«V*}1 Delegate! cs j
'^~>rfj| ii^ IBusinessEntity.es ;
fi-^J Ofdfr.u j
fi^j OrderStatus.cs
,- «*33 Product cs '_
«VjJ ReasonCodes.es
* <^ C\...\Debugging\
¥ ^ СД . \SaltsAnalyiiiSer.ic<
3b *]P C:\ . \UnleashedServiceLa
GL t\£J3 CustomerAdministrauon
♦, &3 CustomerManagerTests
i x «J CustomerTests (unavailat ,
! < «■ j »
„ {^Propfftie7|i5pSolution Eaplorer |
Ready
Рис. 26.35. Файл GlobalSupression.es
Выполнение анализа
Вы можете вручную выполнить анализ кода при помощи щелчка правой кнопкой мыши по
проекту и последующего выбора пункта Run Code Analysis. Вы можете также получить
доступ к этой опции в меню Analyze (рис. 26.36). Кроме того, если вы настроите выполне-
1038
Часть VI. Система командной работы Visual Studio Team System
ние анализа кода при каждом построении, то при выполнении построения или запуске
приложения будет производиться также и анализ кода.
^ С jstomer Managerr*"rt - Microsoft Visual Studio {Administrator;! iJELi
File Edit View Project Bmld Team Debug Data Took Test [Anj|fy;e | Window Help
sJ3 ' wJ " J* У 0 & 1 >";» < * *: ' -- " -Л > Debug „*£ Launch Performance Wizard..
Compare Performance Reports
Profiler
Run Code Analysis, on BtninesiEnuAtes
Code Analysts Settings for SclutiorU^
> Calculate Code Metrics for Selected Projects}
Calculate Code Metrics for Solution
Windows
Щ0, ClawDiagraml cd
&»<£) Customer.cs
*\J3 Delegetel.es
о £] GlobatSuppression:,cs
<i ^j IBusrnessEntrty cs
S'ij Order cs
U'jCj OrderStatus cs
a\3 Products
i'£] ReasonCodes c$
,♦' ^ C:\ ^Debugging;
j^ ijl С \ \SalesAnalysisServtces\
'*• tj^ СД MlnfeashedSrrviceiayerv
+1 4i3 CustomerAdminiftraticn
it &3 CustomerManagerTests
<t »j CustomerTests (unavailable)
Ready
Рис. 26.36. Выполнение анализа кода
Просмотр результатов
Результаты анализа кода можно просмотреть в окне Error List. Это окно показывает вам
сгенерированные компилятором и статическим анализатором кода ошибки, предупреждения
и сообщения. Этот диалог должен быть знаком всем разработчикам под .NET. На рис. 26.37
показан пример результатов статического анализа кода.
Вспомните, что на рис. 26.33 мы указали, что СА1822 необходимо обрабатывать как
ошибку. Здесь вы видите, что имеется пять случаев появления этой проблемы, причем все
рассматриваются как ошибки. Остальные проблемы (кроме тех, которые мы подавили)
показаны как предупреждения.
В этом окне вы можете просмотреть проблему, получить помощь по способам ее
устранения, создать соответствующую элементарную работу (типа "ошибка"), либо подавить ее. Вы
можете также перейти непосредственно на соответствующий исходный код (при помощи
двойного щелчка).
Указания по исправлению
Для того чтобы получить дополнительную информацию относительно исправления
проблемы, вам необходимо щелкнуть по ошибке в списке правой кнопкой мыши и выбрать пункт
Глава 26. Версия Development Edition
1039
Show Error Help. Каждый элемент статического анализа кода имеет соответствующее
описание в библиотеке MSDN.
IО S fttwj Jfr U Warning* | U 0 Memges
Description
X 1 СА1014 . Microsoft Design: Mark 'BuimessEnttties dtl with CLSCompliant(true) because it
exposes externally visible types
JL 2 CA1716 • Microsoft Naming Rename virtual/interface member 'IBusinessEntity GetQ' so
that it no longer conflicts with the reserved language keyword 'Get Using a reserved
| keyword as the name of a virtual/interface member makes il harder for consume» in other
; languages to override/implement the member
шттшятккцмттт
L Project
BusinessEnnties
essEnt 28 BusinessEntities
[Шш|ш1ш
,' 4 CA1801. Mtcrosoft.Usage Parameter'leasonCode'of'Order Cancel(Re#sonCodes)'is Order cs 13 BusinessErvtities
never used Remove the parameter or use it in the method body
X 5 CA1704 Microsoft Naming* Correct the spelling of Cancellled' in member name OrdfrStahJs.il Business Entities
OiderStatus Cancellled' or remove rt entirely if it represents any sort of Hungarian notation
0 б СА1822 ' Microsoft Performance The 'this' parameter (or 'MY in Visual Basic) of Product cs 27 BusinessEntities
ProductGetlnventoryO is never used Mark the member as static (or Shared in Visual Basic)
or use thts'/Me' in the method body or at least one property accessor, if appropriate.
О 7 CA1822 • MicrosofLPerf ormance. The'this'parameter (or'Me'in Visual Basic) оГ Product cs 8 BusinessEntities
'Product Name' is never used Mark the member as static (or Shared in Visual Basic) or use
tWir <"U« iitvtb» па**Ьлх4 ЬплЬхлг at l»»rt n>v*mRn«hi шггшгчпг Л uiwiuini»>
BuiEd failed
Рис. 26.37. Результаты анализа кода
ад) Mnrk members as static M crowft Vituai Studio 2008 Documentation - Microsoft Document fxptorer (Admirst*star{
File Edit View Tools Window Help
Filtered by
(urtftfte »|
Look for !
CA1822 S
CA1822 *
CA2823 .
CA1824 ,
СА1Ж0Г
СА1Э01 j
CA2001 I
CA2D02 j
СД2003 I
СД200Д I
CA2006 |
CA2101
CA2102 j
CA2I03
CA2W4
CA2105
CA2106
CA2107
CA21Q8
CA2109
СА2Ш
CA2112
CA2114
CA2115
СД2116 w
Reedy
Mark members as static
URb ms-helpv'/MS.VSCCv90/MS MSDNQTIlv%.eri/dv_«el$a03^tml/743f0af7 41dl-4852-8d97-ef06fl8b31118.htm
* Expand All > Code- All
Vi jdl 5tu--o Teju S, >t.-r
Mark members as static
Send Feedback
CheckJd
Category
Breaking
Change
CA1B22
Microsoft.Performance
Non Breaksng - IF the member ts not visible outside the assembly, regardless of
the change you make. Non Breaking - If you simply change the member to an
instance member with the this keyword.
Breaking - If you change the member from an instance member to a stabc
member, and it is visible outside the assembly
■t Cause
t Rule Description
+ How to Fix Violations
* When to Suppress Warnings
•*• Related Rule» _ .
Рис. 26.38. Помощь по правилам анализа кода
1040
Часть VI. Система командной работы Visual Studio Team System
Вы можете найти эти описания в индексе по их номеру. На рис. 26.38 показана помощь для
правила СА1822. Вы видите причину, описание и руководство по исправлению нарушения.
Имеется также информация по возможному подавлению данной проблемы.
В этом примере вы можете просто пометить данный код как статический метод, и правило
будет выполнено.
Метрики кода
Метрики кода (Code metrics) — это новый инструмент, встроенный в Visual Studio Team
System 2008 Development Edition. Он предназначен для измерения кода по целому набору
категорий. Эти измерения оценивают ваш код по такий показателям, как удобство
сопровождения и сложность. Задача — обнаружить те области вашего кода, которые представляют
потенциальный риск для проекта. Затем вы сможете сосредоточиться на этих областях и
произвести их дополнительную разработку и тестирование (для того чтобы снизить свои
риски).
Измерения
Существуют пять ключевых областей вашего кода, которые измеряются. Каждая должна
дать вам конкретную оценку (для того чтобы помочь вам понять, как обстоят дела с вашим
кодом). Далее эти области перечислены и дано их краткое описание.
□ Maintainability (Коэффициент сопровождаемости) — здесь производится оценка вашего
кода по удобству сопровождения. Например, если в вашем коде имеется большое
количество косвенной адресации и уровней, то его будет трудно понять и протестировать
(и вы получите более низкий балл). Высокий балл означает высокий уровень удобства
сопровождения (и более низкий уровень сложности). Оценка удобства сопровождения
может быть от 0 до 100 (где 100 — это высший балл).
□ Cydomatic Complexity (Цикломатическая сложность) — оценивает ваш код на общую
сложность. Ваш код оценивается на ход выполнения между объектами. Чем больше
маршрутов кода, тем выше сложность. Этот балл определяется только кодовыми
маршрутами вашего приложения.
□ Depth of Inheritance (Глубина наследования) — здесь ваш код проверяется на количество
классовмнеобходимое для достижения корня иерархии. Если у вас есть много объектов,
которые наследуют друг от друга, то у вас будет большая глубина наследования. Это
означает, что ваш код будет труднее понимать и сопровождать.
□ Class Coupling (Связанность классов)— ваш код проверяется на взаимозависимость.
Чем выше степень сцепления, тем меньше вероятность того, что код можно будет
повторно использовать и тем менее стойким он будет к внесению изменений.
□ Lines of Code (Количество строк кода) — подсчитывается количество строк кода 'на
промежуточном языке. Ищите классы и методы с большим количеством строк.
Возможно, их следует разбить на части для повторного использования, снижения
дублирований, а также облегчения сопровождения.
Глава 26. Версия Development Edition
1041
Вычисление метрик кода
Вы можете выбрать вычисление метрик кода либо только для выбранных в Solution
Explorer проектов, либо для всего решения. Это можно сделать в меню Analyze. Пример
показан на рис. 26.39. Щелчок по любой из этих опций запустит анализ кода и выдаст окно с
метриками кода.
Вычисление метрик кода может занять некоторое время. Вы можете вычислять их для
каждого проекта отдельно (а не для всего решения сразу).
"Т^ТЖ
<*> LrtwareHR.VS20M - Microsoft Visual Studio
Fife Edit
View Project Bu*W Debug Data Tools Test lAo*fe*| Window Help
Launch Performance. Wizard.
Compare Performance Reports-
Profiler
Code Analysh Settings for Solution
Calculate Code Metric* for Selected Project**)
Cakufete Code Metrics for Solution
fc
>ш
Ы £3 Infrastructure Layout
~* Module
~9 Lhv/are.HR
^t Original
ft] 3 LitwareHR.PcrtfolM» Contract
£j|3 LitwareHFLRecrurting Contract
y8 Shp.Runtiroe.Cont/acl
y^wperties ji^ Solution Exploi
Рис. 26.39. Запуск вычисления метрик кода в меню Analyze
Работа с результатами
Метрики кода отображаются в иерархическом виде. Иерархия идет от проекта к
пространству имен, классу и члену. Метрики кода группируются на каждом уровне. Это позволяет
вам просматривать список в поиске проблем, а затем углубляться в данную область для
поиска причин проблемы.
Вы должны помнить, что все баллы должны сравниваться только с баллами на данном
уровне. Например, показатель сложности 10 для отдельного метода может считаться
высоким. Однако при группировке по пространству имен даже показатель в пять раз больший
может быть нормальным.
На рис. 26.40 показан пример окна Code Metrics* Results. Здесь вы видите, что исходный
код оценивается по всем ранее перечисленным метрикам. В данном случае мы исследуем
такую ситуацию, когда удобство сопровождения низкое, сложность немного высоковата для
1042
Часть VI. Система командной работы Visual Studio Team System
отдельного метода, количество строк относительно высоко по сравнению с другими
методами, а связанность классов очень высокая.
ч/> UtwareHHVS2C0S - Microsoft Visual Studio
File Edit View Project Build Debug Data Tools
I)
1
i
i
i
1
J • - Л A 0 * 44 ^ > - ^ - *J - ^
1^т^«««А^ДМд;^стШ^88^^^^^МД^ш
C«tfeMftrififi«uit» -' "°^""!J-™W^ w" -™™щ
=) Filter. None
1 сз I tsJ ШйШУ |
Test Апагуге Window Help
► Debug » Any CPU * \£
ШШШШШШШШШШШтшшЛШ
' M,r 1 J'*5** [ „ 'J *v ! V
Hierarchy MeintainabilL, Cyctomattc С Depth of Inh. Cla« Coupling Lines of Code
i- {) LrtoareHR PublicApp.WmlfiC <A
Э ^J OpenPositianVtewPresenter <£
Л ^ OpenPositionView У
:3s WPFUlElementAdapterjetfJVVPiJ
^J* WPFUIEIementAdaptergetf. Г£3
j* ValiA>tePosition(List<ErvtityFieJtf
;j^ StartSyncAnirrwitionO'void &
J* SetValuesToSearchGrid(Pc5rtio Ш
sJ<* SetupControlstEntrtyFieidlJ): v id
2f Presenter 5et@penPostfaonVie*s3
^ OpenPosrtionViewO &
* OpenRleDialogCobject, Routed У
V OnLc-ad(object, RoutedEventAi &
^ OnBulkSave.Chcklobject, Rent J
5JV NotilySchemaChangesQ • void sj2
J* LoadReiourcesQ. void ^
J1* lnitializeCornpcnentO: void jd
^ lComponentConnector.Conne Л
~ U,_Jl.rv~. Ы^Г|..и/.1 ► D-. 4
|_3»">,дгд
Ready
82 643 9 205 1.263 *
66 38 2 29 112
64 110 9 66 255
95 1 11
98 1 11
69 2 5 6 -j
75 1 6 4
45 14 14 27 -
98 1 11
I
=•
Э
jT
5
86 1 3 2 ||
82 1 3 3 i
98 1 2 1.1
79 1 7 3'
98 1 2 1 '
75 1 6 4
89 1 5 1
75 2 3 4 M
43 30 15 34 i
•»* 1 4 ■: ,
I
Рис. 26.40. Окно Code Metrics Results
<«*> Ln>afeHR.VS20CJ8 - M>aosoft Vhml StudiD
bite Edit View Project Su*i Debug D*t* ТоЫ* Test Arufyi* Window Help
-iV Ь J- У It? ^44 *4 <J * f * J • . » ► Debug *■ Any CPU
•13
1&)шШ»Г
* ;,££%еГ1&%яс>Г%
I Filter Maintainability Tidex
- Mir* 0
. M*x 50
h.
®w-ww
Hierarchy
Maintamabrt» , CyelcmaticC. Depth of !!nh,„ Cla« Coupling Lin«*ofCode
. 3 Source\Module\Lrtware HR (Debug) ь* 85 1,567
" 3 Source.sWwstructure^nfrastwctufB.Librai У 80 158
H <} Li*wv*MrHRinff^4t;uctwe.Ubr»ry.S«rr.4cyj 82 148
Ь 4% DepeidentMcduttLcederStrvice M3
3 Source\lrrfr«twrture\lnfr*strutti«e,l*yo» Ш. /4 16
J О L twsreHRJnfrestructure Layout S3 74 16
-, **% SMJLayoutVie* Ш 56 10
^* IniMrajeCoropenentO > void Ш 31 1
Ready
3.226
335
309
Рис. 26.41. Фильтрация результатов измерения
Глава 26. Версия Development Edition
1043
Этот метод является хорошим кандидатом на рефакторинг и дополнительное тестирование.
Конечно, вы можете перейти к нему при помощи двойного щелчка в окне Code Metrics
Results.
Вы можете использовать панель инструментов в окне Code Metrics Results для фильтрации
ваших результатов (для поиска тех областей вашего кода, которым необходимо уделить
дополнительное внимание). Для настройки фильтра необходимо выбрать измерение в списке
Filter. Затем необходимо настроить значения Min и Мах для фильтра. Например, на рис. 26.41
показан фильтр для тех областей кода, в которых Maintainability Index меньше 50.
Вы можете также использовать панель инструментов для экспорта результатов в Microsoft
Excel или для создания элементарной работы (с целью решения данной проблемы).
Резюме
В этой главе вы увидели многие из функциональных возможностей Visual Studio Team
Systems Development Edition, которые улучшают среду профессиональной разработки. Этот
инструмент основан на остальных функциональных возможностях, обсуждавшихся в
предыдущих разделах книги (и в том числе системе управления исходными кодами и
политиках). В этой главе было рассмотрено, как версия Development Edition может быть
использована для того, чтобы делать следующее:
□ создваать визуальные модели ваших классов, которые остаются синхронными с вашим
кодом;
г
П разрабатывать тесты, которые проверяют выполнение написанного вами кода. Сюда
входит и проверка этих тестов на процент покрываемого кода;
□ профилировать ваш код для обнаружения узких мест по производительности;
□ анализировать ваш код по определенному набору правил на такие вещи, как
глобализация, безопасность, дизайн и производительность;
□ оценить ваш код на сложность, удобство сопровождения, количество строк кода и т. д.
Глава 27
Редакция Architecture Edition
Большинство разработчиков согласится с тем, что основательно продуманная архитектура и
возможность визуализации кода позволяют создать улучшенную среду разработки и
усовершенствованный конечный продукт. Однако очень часто документы по архитектуре
разрабатываются в самом начале проекта (если вообще разрабатываются) при помощи
инструмента вроде Visio и очень быстро устаревают на стадии построения. Никогда нет лишнего
времени на то, чтобы вернуться и обновить диаграммы. Прямо на ваших глазах они быстро
превращаются в документы "первоначального проекта" или "концепции системы" — новые
ярлыки навешиваются на то, что когда-то представляло реальную, физическую структуру
приложения. Эту проблему должна была решить двусторонняя синхронизация между
инструментом моделирования и проектом разработки. Однако такое решение оказалось чревато
собственными проблемами. Главная из них состоит в том, что разработчики хотят видеть
свой код в интегрированной среде разработки, а не еще в одном инструменте.
Visual Studio 2008 — это первый шаг компании Microsoft по переносу моделирования
программного обеспечения из этого "документарного" режима в интегрированную среду
разработки. Присутствие моделей в интегрированной среде означает, что теперь они находятся
ближе к коду и системам, которые вы создаете. Это обеспечивает полезность этих моделей
для процесса разработки и команды разработчиков, а также повышает шансы на то, что они
будут сохранять синхронность с проектом.
В данной главе мы сосредоточимся на моделях и соответствующих инструментах,
используемых для разработки программного обеспечения в Visual Studio 2008. Эти модели
включают следующие диаграммы:
□ Application (Приложение)— диаграмма приложения используется для описания тех
компонентов, которые составляют ваше приложение;
□ System (Система) — диаграмма системы служит для группировки приложений в
системы (для целей развертывания);
□ Class (Класс) — диаграмма классов используется для визуализации кода и для
выполнения изменений его структуры (подробности см. в главе 26)\
□ Logical Datacenter (Логический центр данных)— диаграмма логического центра данных
применяется для описания инфраструктуры, в которой будет находиться ваше приложение;
Глава 27. Редакция Architecture Edition
1045
П Deployment (Развертывание) — диаграмма разцертывания представляет логическое
развертывание ваших систем в центре данных.
Каждая из этих диаграмм имеет соответствующий набор инструментов или визуальный
конструктор, которые могут быть использованы для создания и редактирования диаграммы.
В остальной части данной главы мы описываем все эти архитектурные диаграммы и
соответствующие им инструменты.
Примечание
Все, что мы обсуждаем в данной главе, относится к продукту Visual Studio Team
System 2008 Architecture Edition (или Team Suite).
Элементы Team Architect
Visual Studio Team Architect инсталлирует пару дополнительных шаблонов проектов и
несколько новых шаблонов элементов. Эти шаблоны предназначены для роли архитектора.
Однако в большинстве организаций имеется деление на архитекторов инфраструктуры и
архитекторов приложений. Обычно это две разные роли, которые исполняют люди с
различными навыками. Например, архитектор по инфраструктуре обычно занимается
программным обеспечением серверов, сетей, межсетевых экранов и виртуальными частными
сетями (VPN). Архитектор приложений определяет тип интерфейса приложения (Web-
интерфейс или приложение Windows), будет ли оно использовать Web-сервисы, к каким
внешним интерфейсам оно будет подключаться и т. д. Visual Studio Team Architect стараетая
объединить эти роли и улучшить взаимодействие между ними.
Шаблоны проектов
Team Architect имеет шаблоны проектов как для архитекторов инфраструктуры, так и для
архитекторов приложений. Эти шаблоны можно найти в диалоговом окне New Project в
типе проекта Distributed Systems. Пример этого диалогового окна показан на рис. 27.1.
Оба шаблона— Application Design и System Design— предназначены для архитектора
приложений. Первый позволяет вам моделировать приложение, а второй — группировать
части модели приложения во взаимосвязанные системы. Вы можете начать с одного из этих
проектов. Однако вам не удастся добавить проект такого типа в уже существующие
решения. Для существующих решений вы можете только добавить файлы диаграмм в само
решение (поскольку оно уже описано).
Примечание
В решении может содержаться только одна диаграмма приложения. Причина состоит
в том, что содержимое данного файла должно представлять собой все ваше решение.
Шаблон Logical Datacenter предназначен для архитектора инфраструктуры. При выборе
проекта этого типа Visual Studio создает новое решение с пустым файлом диаграммы
Logical Datacenter Diagram. Его также нельзя добавить в уже существующее решение. Вместо
этого вы можете добавить в решение (но не в проект) саму диаграмму.
7046
Часть VI. Система командной работы Visual Studio Team System
New Project
Project types:
TempUrteK
►NET Framework 3.5
Н0П
Visual C#
Database Projects
Other Languages
Distributed Systems
Other Project Types
Test Projects
Visual Studio installed templates
$ м si
Application Logical System
Design Datacent... Design
My Templates
3
Search
Online Te„
A solution with • blank application diagram. Use to define and connect underlying applications for designing systems
Name* ApplicationDesignl
Location. C\Us*rs\msnell\Documents\Visujl Studio 2008\Projects
•' «t»'»** 4h л-»» •* J'eatt dir« •*•€;-> *rr cc'u* tr
<* > -'" Д.р'Лс;Ло1 * «^-j»V Л Add to Source Control
Рис. 27.1. Шаблоны Distributed Systems
Шаблоны элементов
Visual Studio Team Architect предоставляет три шаблона элементов: Application Diagram
(файл с расширением ad), Logical Datacenter Diagram (ldd) и System Diagram (sd). Эти
шаблоны можно добавлять в существующие решения через диалоговое окно Add New Item
(рис. 27.2).
Add New Item - Solution Items
> liiQtrili
Categories.
Templates;
General
Performance
Distributed System Diagrams
Test Run Configuration
Visual Studio installed templates
ii M jy
Application Logical System
Diagram Datacent . Diagram
A diagram for defining and visualizing applications in the solution
Name* ApplicattcnDiagraml.ad
Рис. 27.2. Диаграммы архитектора команды разработчиков
Глава 27. Редакция Architecture Edition
1047
Все диаграммы для распределенных систем добавляются в каталог Solution Items в Solution
Explorer. Причина в том, что они относятся ко всему решению и не являются
специфичными для проектов.
В списке шаблонов не хватает диаграммы классов (cd) и диаграммы развертывания (dd).
Диаграмма классов не привязана исключительно только к Team Architect. Ее можно
добавить в проект из диалогового окна New Item Template. Мы описываем эту тему в главе 26.
Диаграмма развертывания не имеет шаблона. Ее можно создать только при помощи
диаграммы логического центра данных (см. разд. "Развертывание приложения" далее в этой
главе).
Проектирование вашего приложения
Визуальный конструктор Application Designer позволяет архитекторам создать модель
определения системы (system definition model, SDM), которая описывает, как различные
"приложения" комбинируются для данного решения. В данном случае "приложение" может
означать Web-сайт, Web-сервис, базу данных и т. д. Например, решение может содержать Web-
сайт, который ведет обмен с множеством Web-сервисов. Эти Web-сервисы в свою очередь
могут обмениваться с базой данных или очередью сообщений. Конструктор Application
Designer позволяет выполнить такое моделирование. Архитектор может указать, какие
приложения обмениваются друг с другом, и описать ограничения, накладываемые на эти связи.
Обычно на первом шаге проектирования приложения архитектор приложения описывает
компоненты, которые составляют приложение, обмен между этими компонентами, а также
их настройки и ограничения. Диаграмма приложения поддерживает эти действия.
Выполнение этого шага процесса первым позволяет архитектору приложения компоновать
составляющие части системы и перед развертыванием проверять их при помощи диаграммы
логического центра данных. После проверки эти компоненты могут генерировать заглушечные
проекты и код для решения. Это дает команде разработчиков хорошую основу для старта.
Далее приведен логический порядок использования диаграмм в Visual Studio 2008 для
создания нового приложения:
1. Создать диаграмму приложения для описания клиентов, сервисов, компонентов и
способов обмена приложения.
2. Сгруппировать приложения для формирования системы при помощи визуального
конструктора System Designer.
3. Создать диаграмму логического центра данных, которая представляет инфраструктуру, в
которой будет развернуто приложение.
4. Использовать визуальный конструктор Deployment Designer для проверки того, что ваше
определение приложения (диаграмму) можно будет развернуть в логической
инфраструктуре.
5. Использовать диаграмму приложения для генерирования заглушек проектов для вашего
решения.
1048
Часть VI. Система командной работы Visual Studio Team System
В оставшейся части данной главы мы рассмотрим все эти шаги. Наши примеры помогут
проследить проектирование приложения, которое представляет собой систему управления
клиентами для существующего приложения электронной коммерции.
Совет
Если вы добавите диаграмму приложения в уже существующее приложение, то Visual
Studio сгенерирует модель вашего приложения. Это может быть отличным способом
для того, чтобы понять связи между компонентами приложения. Это также отличная
отправная точка для того, чтобы начать работу по расширению функциональности уже
существующего приложения.
Все модели приложений синхронизируются с тем решением, в котором они
содержатся. Это обеспечивает соответствие модели имеющейся кодовой базе.
Работа с диаграммой приложения
Мы уже видели, как можно добавить диаграмму приложения в решение. Теперь мы готовы
рассмотреть диаграмму приложения более подробно. На рис. 27.3 показана диаграмма
приложения, которая открыта в визуальном конструкторе Application Designer интегрированной
среды разработки.
Четыре главные части визуального конструктора Application Designer — это сама
диаграмма, панель Toolbox, окно Settings and Constraints, а также меню Diagram. Эти четыре
элемента позволяют вам проектировать ваше приложение. Давайте же рассмотрим их более
подробно.
</» ApplicrtonDestgnl - Microsoft Visual Studio
File Edit View Project Build Debug Diagram Dm Toots Test Analyze Window Help
Tw$wi "-Tx 'AppemfamOflslgnlad |ADJ;
Gi
Ц Pointer
-x l&;
<Jp WmdowsApplJcatton
& ASPMTWeWMvice
J> ASP.NETWebApplication
S\ OfficeAppbcauon
fl|, ErternalWebSeivtce
Sj| ExtemalDatebase
Cus'omerProfire T
l^# CrmSwrvfceUytr
jjj) ASPNETWehAppJicel.cn
f^lP^ ^^Ш^Жи^"
R fcSfr logical Srrver Constraints
5У» nSV/ebServer
у «w» Operating System
M '«* User Defined
[=> Ji*> Application Setfcnys
- Ja3 Directory
$ JiJ Conriguration
JSl WepApplication
iil Custom
CrmServiceLayer supports Operating System
Product type
_j WindcwsVeta
7] Windows2D03
^") Wmdovrt2D00
U WindowsXP
Suite type
Vj Server
'jJ, DomainController
DataCenter
I[/| Enterprise
L Personal
f i Rnilrf nnmhfr
Constraints the Operating System configuration required to host this application.
?Л Settings and Constraints [^ Wtb Service Dei»M*
Ready
'Ui
!T^
Рис. 27.3. Визуальный конструктор Application Designer
Глава 27. Редакция Architecture Edition
1049
Меню Diagram
Меню Diagram активно только тогда, когда у вас в активное окно загружена архитектурная
диаграмма. Содержимое меню меняется в зависимости от типа загруженной вами
диаграммы. Даже меню Diagram приложения изменяется в зависимости от того, что выделено в
диаграмме. На рис. 27.4 показан пример этого меню для диаграммы приложения, в которой
выделено приложение Web-сервиса.
</> AppitcetonDrstgni - Microsoft Viiuei Studio^
i He Ш View Project BoiW Deb^
,:'* 4 10C* у "'-.за*--»
General De»§r»er * ( \
I... Appfcjrtkms
\ Pointer
^j WtrdOMViApplicatior
^ ASP NETWeofcrvJM
£p ASP-NFTWebApphcjtmr»
^ QffireAppltcatvnn
*£ btemAfWebServkr-
j^ Ыеш*Ю*1аЬам:
$| R.tblkWetServite
П 6tttcicAftalic«Uon
Settings «r>tt torretewnft
Л<& l<>gka<b*rv«*Cornlrirfi*b
* O&w* BSWebServtf
V *» Operating $>itt*n
,t; «* User Defined
В ti& Application Setting*
у £Ц Directory
I*, HI Configuration
S3 WebApptictticm
Ш Custom
h 0)»|il|i j OaU ГооН l«t AiMlyir
1*
u
1
li
1
I
;
В
Ij -utS
2eoro!n 1
Zoom Out
Zoom ►
lmp!ement*bon *
AddtoTeoibox..
(Mm* Deployment
Drttgn Application Syrtem .
Add ►
Connect.»
Settings «id CwnilMirrti
Properties Aft* Enter
„ j'»™ "
Window Help
"i J*
Г
С
h-c
» 3
'Li
CrmU*erlnlerf*ce mpports Oper*t no Syvtem
Gpeultng iystem type Operating «ystem deUiis
Product type
Suite type;
j# Server
S bckOHirr-
Corutwinh the Operating System configurrtjor» requited to host this application.
Щ Setting* ind Constraints ^Vnrh <**Аг* *1*ta&*
tody
Рис. 27.4. Меню Diagram
В этом меню есть некоторые пункты, которые стоит обсудить — это Define Deployment,
Design Application System, а также Add to Toolbox. Пункт меню Define Deployment
позволяет вам указать подробности развертывания приложения. Мы опишем этот пункт позже
(при обсуждении диаграммы развертывания). Пункт меню Design Application System
позволяет вам создать систему из компонентов вашего приложения. Мы опишем эту тему в
следующем разделе. И наконец, пункт меню Add to Toolbox разрешает вам взять уже
существующее приложение, конечную точку или группу приложений и создать из них элемент
панели Toolbox. Это свойство полезно в том случае, если вы постоянно используете данный
элемент в различных диаграммах.
Панель Toolbox визуального конструктора Application Designer
Панель Toolbox визуального конструктора Application Designer дает доступ к элементам,
которые можно добавить на диаграмму приложения. Эти элементы сгруппированы в три
раздела: General Designer, Endpoints и Applications (рис. 27.5). Раздел General Designer
содержит элементы, которые являются обычными для многих проектировщиков архитекту-
1050
Часть VI. Система командной работы Visual Studio Team System
ры. Раздел Endpoints группирует конечные точки, которые описывают обмен между
приложениями. И наконец, раздел Applications группирует различные приложения, которые
можно определить на диаграмме.
Toolbox
&
F бсоетэШЫдпег
j~4 Potnttf
"Ц Connection
# Comment
F Eodpofcrts
It Pointer
;J-i NETWebServiceEndpoint
jF] WebConientEndpoint
[ 1 GenericEndpoint
Ц Pointer
y] WindowsApphcation
£$ ASP NETWebService
^ ASP.NETWebAppNcalion
!P| OfficeApphcetion
j^, External WebServi ее
| i ExtemalDatabase
Щ BtiTalkWebServke
"~l GenencApptication
P Geoer*
There are no usable controls in this group
Drag an item onto this text to add it to the
toolbox
Рис. 27.5. Панель Toolbox визуального конструктора Application Designer
Все эти элементы панели инструментов имеют соответствующие названия, поэтому у вас не
должно быть трудностей при их использовании. В следующем разделе мы опишем
добавление приложений и использование конечных точек.
Примечание
Приложения в панели Toolbox— это клиенты, Web-сервисы или базы данных.
Поддержки добавления в визуальный конструктор Application Designer инфраструктур или
библиотек классов нет. Эти элементы не являются частью визуального конструктора
Application Designer.
Диаграмма приложения
Диаграмма приложения представляет собой холст для архитектора приложения. Именно
сюда вы перетаскиваете приложения из Toolbox и здесь объединяете их в решение. На
рис. 27.6 показана диаграмма приложения в процессе разработки.
На диаграмме имеются два Web-приложения ASP.NET. Верхнее— CrmUserlnterface —
представляет собой пользовательский Web-интерфейс для приложения управления
клиентами. Под ним находится CrmServiceLayer— это Web-сервис для сервиса CustomerProfile.
Глава 27. Редакция Architecture Edition
1051
Обратите внимание, что после того, как они размещены на диаграмме, очень трудно
отличить Web-приложение от Web-сервиса. Так и задумано, поскольку любое из них может
содержать как aspx-, так и asmx-файл.
к/) AppticabonDesignl - Microsoft Vtsja! Stud о
File Edit View Project Build Debug Diagram Dati Toots Test Analyze Window
ib-j-uya' * £,*> + ** - „>-->,^ l j
<5i ^ 100% ,,^ ,j^ _.
k* . AppeattanDerignLadJADj*
£ i
CrmUstrfntorfact
" 'ф ASP NETWebApplication
CuitorerProfile
^ ,s CrmS«rvic«Lay*r
ф ASP.NETWebApplicatJon
i
i
1 Л1 v* *b Service Persitejgjfcj, Setting* mi Corrtttinti
Automate Synchronization Code Updated
Help
.
71 э
:с=|аЫЕЫ
*x ё
*{ "S
о
»
Рис. 27.6. Диаграмма приложения
На диаграмме есть стрелка, соединяющая эти два приложения. Эта стрелка — элемент
Connection; он используется для соединения конечных точек приложений. Обратите внимание,
что каждое приложение имеет соответствующую конечную точку. Каждая конечная
точка — это конечная точка Web-сервиса. Конечная точка CrmUserlnterface имеет пустой (или с
белым фоном) кружок, а это означает, что это — клиентская конечная точка. Конечная
точка CrmServiceLayer имеет сплошную закраску для того, чтобы указать, что она представляет
собой сервер. Стрелка также указывает направление от вызывающего (клиента) к серверу.
И наконец, стрелка содержит метку. Эта метка указывает Web-сервис, который соединяет
два этих приложения (CustomerProfile). Эта связь станет Web-ссылкой при реализации.
Давайте теперь рассмотрим добавление на диаграмму нескольких новых приложений и их
соединение.
Добавление приложений
Приложения на диаграмму добавляются при помощи перетаскивания. Например, вы можете
добавить внешнюю базу данных, к которой может подключаться уровень сервисов. Эта
внешняя база данных принадлежит уже существующему приложению электронной
коммерции, которое будет расширено приложением управления клиентами. Вы добавите также
пользовательский Windows-интерфейс для того, чтобы отдел продаж и маркетинга мог
выполнять свою работу по анализу данных. Результаты показаны на рис. 27.7.
1052
Часть VI. Система командной работы Visual Studio Team System
<W> CurtomerMsnegemeni -MicrosoftVisual Studio
Ftfe Edit View Project Build
ф % 1009b »[% >\0
|Тсс1Ьоч *Л* " * 2 X**
Л Oewnt Designer •
*] Endpotob
U Appfccatioro
>t Pointer ^ ]
| <j3 WindowsApplkation
sjr* ASP NETWebService
i> ASP.NETWebApplication
•^ OfficeApplication
3ftj ExtemaiWebSen/ice
\^ ExtemalDatabase
Ц BuTalkWebService
GenencApplieatmn
U <*enefal
1 There are no usable controls in
1 the group» Drag ал item onto j
this text to add rt to the toolbox, j
'
Debug
Diagram Data Tools Test Analyse Window Help
Customer ManagmenLad [ADl*j
CrmUtt (interface
* ^ASPNfTvVebApplicaHon S.I«An.ly«l.
"""* Window&Appltcation
__
CustcmerProfile i
p> & CrmServiceLayer
j§ ASP.NETWecApplication
1
tcorrmerceOB EcommerceDB
j | External Database
J||S«ltin.g» »nd Constraint*-) jj ^*k Service Detsili 1
1 Automatic Synchronization; Code Updated
"RiHl
- * 'ц|
*%isl
, ? * i 1
.
!
1
- {
•!^м
' if* •
•o •
5 i
i
;
(
i
1
' '
Рис. 27.7. В модель добавлены дополнительные приложения
Соединение приложений
Теперь вы готовы добавить в приложения конечные точки и соединить их. В панели
Toolbox есть три конечных точки, но на самом деле существует еще и четвертая —
DatabaseServerEndpoint. Эта конечная точка присутствует по умолчанию в приложениях баз
данных. Ее также можно перетащить для соединения приложений. Далее перечислены
возможные конечные точки для соединения приложений на диаграмме.
□ .NETWebServiceEndpoint — используется для соединения Web-сервисов на базе SOAP.
Каждая конечная точка Web-сервиса представляет собой реальный Web-сервис. Вы
можете создать взаимнооднозначную связь между приложением Web-сервиса и конечной
точкой Web-сервиса. Либо вы можете создать для вашего приложения Web-сервиса
столько конечных точек, сколько вам необходимо.
□ WebContentEndpoint — служит для соединения с Web-контентом (таким как файлы) по
HTTP.
□ GenericEndpoint— применяется для настройки конечной точки без указания
конкретного протокола обмена. Она описывает соединение, но не его механизм.
□ DatabaseServerEndpoint — служит для соединения с сервером базы данных.
Вы будете использовать эти конечные точки для соединения приложений. Сначала
клиентское Windows-приложение SalesAnalysis должно соединиться с CrmServiceLayer через
конечную точку Web-сервиса. Затем для CrmServiceLayer потребуется соединение с базой
данных EcommerceDB.
Глава 27. Редакция Architecture Edition
1053
Сначала вы добавляете в приложения все конечные точки. Затем для соединения конечных
точек можете использовать элемент Connection из панели Toolbox. Либо вы можете нажать
клавишу <Alt> и, не отпуская ее, выделить и перетащить конечную точку от одного
приложения к другому.
Когда вы соединяете приложение с приложением базы данных, то Visual Studio выдает вам
диалоговое окно Connection Properties (для установления соединения с реальной базой
данных). Вы можете отменить этот шаг или описать подробности реального подключения
(если они настроены).
На рис. 27.8 показаны соединенные приложения. Обратите внимание на добавление нового
уровня Web-сервиса: SalesAnalysisServices. Клиентское приложение SalesAnalysis будет
соединяться как с уровнем управления клиентами, так и с этим новым уровнем. Обратите
также внимание на названия конечных точек. Вы можете отключить эти метки для каждой
конечной точки, показать их для каждой, либо показать только для одной конечной точки.
Метки соединения с Web-сервисом представляют реальное название Web-сервиса (который
описан конечной точкой).
</> CuitefnerManagenwnt - Microsoft Visual Studio Iй- ЩА
File Edit View Prefect Build Debug Diagram Data Tools Test Апагуге Window Help
bttt€iioo% -ХХШМ1Л'*
*1
11
CustMiHvManapnentad W>V\ - X
| CrmUitrlnttrlfcct
J <* ASP.NETWebApplicallon '
■■.*>
2\
SataAnaiyiis J
T"j WindowsApplication
V- A
> GetHiitoncalData i
CustoroerProfile '** ~~,
, (m SalttAnifysbScrvlaei
1 CrmS«rvfc«Lay«r
| «1 ASP.NETWebApplicatmn
J» ASP NETWebAppJicacion j
1 'v 1
i EcommerceDB
t 1
1
I EcommerceDB
|j| ExtemalDateba**
i
|
$jj Setting «*d Cmitsmte Й| w**> *•»** Р***Й*|
[ Automatic Synchronintiom Code Updated
* Г
N
ho
з
о
* ;
•3
Щ
\Щ
Си-
о
'И
о
а
—
5
-
Рис. 27.8. Соединенные приложения
Настройки и ограничения приложения
Каждое приложение на диаграмме имеет свой набор свойств, настроек и ограничений. Эти
метаданные помогают описать, как данное приложение будет собираться и разворачиваться.
Предположим, что пользовательский Web-интерфейс должен быть размещен на сервере
Windows 2008 Enterprise, на котором работает .NET Framework 3.5.
1054
Часть VI. Система командной работы Visual Studio Team System
Для того чтобы указать такую настройку, вы должны выделить на диаграмме приложение
CrmUserlnterface, щелкнуть по нему правой кнопкой мыши и выбрать пункт Settings and
Constraints. Visual Studio выдаст соответствующее окно (рис. 27.9).
Sitting* and Constraints
ы
[^ i^J 1«**}лл1 Server Cowlrawits
£| У *■*> HSWebServer {
• <** Operating System j
u им User Defined j
M " vt. ' f, ъм ' < . n<)er\
„ £» i>n«zi~r-. !
Л» . »ч^ -к ' >J«-nD«'l
£k ">. te; [
F I2i? Application Settings j
3 a3 Directory j
"^ JJ Configuration I
£} AppSettingsSecticn
jil ConnecttonStringsSecti i
В J£] NetSectionGmup J
is] MattSettingsSecticn!
jj SenalirationSectionGro»!
H jj SystemWebSertionGroi
- У AuthenticetranSect)
R i^ FormsAuthenbc
iJ FormsAuthei
i
iSl CompilationSettion
ili HttpHandlersSectioij
ill HttpModulesSectioi
U PagesSection ;
£ iil RoleManegerSecboi'
IJI SystemWebCachmg
id TransactionsSecticnGrc -
_з) WrbApplicaticn
CrmUserlnterface supports Operating System
Operating system type
Operating system details
Product type>
-. и llllllllilllllllll
I J] DomainController
Service pack
Suite type:
_ DataCenter
Personal
Build number
NFJ Framework version |3>5ftfl
1000
1100
2000
3000
Constraints the Operating System configuration required to host this application,
^Settings and Constraints 3 Л'«Ь Settee Details
Рис. 27.9. Окно Settings and Constraints
Обратите внимание, что окно Settings and Constraints содержит два узла: Logical Server
Constraints и Application Settings. Первая группа представляет собой тот сервер, на
котором будет развернуто приложение. Введенные здесь ограничения будут соблюдены при
развертывании в соответствии с диаграммой логического центра данных. Раздел Application
Settings — это по существу конфигурационный файл для приложения. Здесь вы можете
сделать все соответствующие настройки. Эти настройки будут выданы при реализации
диаграммы приложения.
Вы можете модифицировать настройки в правой части экрана. Обратите внимание, что для
данного примера указаны операционная система, тип сервера, тип версии и версия .NET
Framework.
Свойства приложения
Вы можете описать дополнительные подробности реализации приложения при помощи окна
свойств Properties. Выделите приложение на диаграмме, щелкните по нему правой кнопкой
мыши и выберите пункт Properties. При этом откроется окно Properties для данного
приложения. Конечно, настройки в этом окне будут зависеть от типа выбранного приложения.
Предположим, что команда разработчиков клиентского Windows-приложения SalesAnalysis
собирается работать на языке Visual Basic. Вы можете добавить это свойство разработки в
Глава 27. Редакция Architecture Edition
1055
окне Properties (рис. 27.10). Данная настройка повлияет на то, как Visual Studio создает
проект при реализации диаграммы.
~*т&оегчс-%
SatesAnatysis WindowsApplicstian
В ' » j*«;*{ «
Settings and Con strsints [...]
Description
Name SatesAnatysis
Q 1щ t я »>*"<*<•»
1Ш1!!'|?11>"С1^ШЦИИЙ1 Visual Basic
Project
Sf ii*i»r *'/ Itr
Target Framework
Template
В SI ^l'w«<iif
Comments
Company Name
Copyright
Friendly Name
SDM Description
Trademark
В StVM Hot u «*«•»* Id* г-П%<
Culture en-US
Document Name SalesAnalysis
Platform
frolic *•<?< !<><*•>
ra
Language
The programming language used to implement the
Windows Application. Read-only after implementation.
Рис. 27.10. Окно свойств Properties приложения
■saf» CustomerMsnagerrvent Microsoft Visual Studio
File Edit View Project Build Debug Diagram
>% Ч 1005b „ X >\ ,f „\9
>£ CutfornerManaginenUd [AD]*
a >
! • }
[ j_ Cus*ometPrafile
.1
CrmS«rvic*Uy«r
*ф ASP.NETWebApplica;ion
1
!« w
"-— ■—-
^^Шв™™^* №«-«
Name Type
h Ш CustomerProfile
b Л) тШНШЩ Customer
' ( customerld int
) <<lt -,ЛГ*Г«П»
^ - »(.dc»4 VCC->
4?lSrpttng$ and Constraints) jl Web Service Details
1 R*
«*y
,:u^ | £Б jre£&d
Data Tools Test Analyze Window Help
SalcsAru
<ф ASP N
- . ^ „ , ,,.w,.
•"**" ""* "" —4rrx
Modi.. 5ummary
Allows user to get a curt с
ByVel
GetCustomcrPrafile Operation ~ <ч' ,
в..-.,-..., - P
. Buffer Respons True '4
Cache Duratior 0 ""
-. Enable Session False
Message Name GetCuslomerProfiU
Name GetCustomerProfil»
Summary Allows user to get i
Transaction Op Disabled
Type Customer
i в *л?о*
' 50AP Action http //lempuri erg;
; SOAP Body Sty Document
! SOAP Encodinc Default
WSDL One Wa> False
i WSDL Paremet Y/rapped
WSDL Request
> WSDL Request
i WSDL Respcns.
Г Nam*
The name of the Web service operation
Рис. 27.11. Окно Web Service Details
1056
Часть VI. Система командной работы Visual Studio Team System
Настройки Web-сервиса
Вспомним, что каждая конечная точка в приложении Web-сервиса представляет собой
реальный Web-сервис, который будет реализован. Визуальный конструктор Application
Designer позволяет вам указать подробности реализации каждого из этих Web-сервисов. Позже
вы сможете сгенерировать заглушки для всего этого кода.
Для того чтобы добавить эти подробности, необходимо выделить Web-сервис, щелкнуть по
нему правой кнопкой мыши и выбрать в контекстном меню пункт Define Operations. Выбор
этого пункта приведет к появлению окна Web Service Details. На рис. 27.11 показан пример
этого окна с окном свойств Web-сервиса.
При указании подробностей Web-сервиса вы можете добавить операции, настроить их
возвращаемые типы и указать параметры. Вы можете также указать сводную информацию,
которая будет использоваться для ХМL-документации Web-сервиса.
Определение системы
Мы описали основную архитектуру системы. Следующим шагом необходимо сформировать
реальные системы при помощи визуального конструктора System Designer. Уловить
концепцию и принцип использования системных диаграмм может быть совсем не просто. Они не
являются обязательными, что делает их еще более непонятными. Проще говоря, система —
это конфигурация из одного или нескольких приложений, которые вы хотите развернуть.
Такое определение может показаться запутанным, поскольку на диаграмме приложений уже
представлена конфигурация (настройки и ограничения) приложений, которые вы
собираетесь разворачивать. Именно это и делает системные диаграммы необязательными. Вы
можете просто использовать диаграмму приложения и перенести ее в вашу инфраструктуру.
Однако от системных диаграмм есть и реальная польза.
Системные диаграммы могут группировать приложения в систему. Единственная причина
для этого — реальное развертывание. Кроме того, система основана на исходной
архитектуре приложений. Однако для реального развертывания системную диаграмму можно
изменить.
Нам поможет пример. Предположим, что вы собираетесь развернуть ваш уровень сервиса
дважды: один раз в зоне вашей интрасети, а второй — в зоне Интернета. Базовая
архитектура приложения при этом не меняется. Изменяются настройки конкретного развертывания.
Поэтому вы создаете две системы, по одной для каждого развертывания. Каждая из них
основана на базовой архитектуре приложения. Системная диаграмма не только позволяет
вам заменять конфигурацию, она дает вам также возможность управлять тем, какие части
приложения реально развертываются в данной системе.
Системная диаграмма
Существует несколько способов добавить в ваше решение системную диаграмму. Вы
можете использовать шаблон элемента (как описывалось ранее); либо вы можете выделить одно
или несколько приложений, щелкнуть правой кнопкой мыши и выбрать пункт Design Appli-
Глава 27. Редакция Architecture Edition
1057
cation System. В любом случае вы будете работать с приложениями, описанными в вашей
диаграмме приложений.
ТЫ*
</> CustoroenManogement - Microsoft Visual Studio
File Edit View Project Build Debug Diagram Data Tools Test Analyze Window Help
i, ~7~ ~~~ ~~"
CrmUierlnttrfftc»
•Л ASP.NETWetoAppkabon
CrmServteclayw
*ф ASP NETWebAppJicatfon
^
0
J Л
&
SainAnalysis
a» .w— ... J
Define Deployment... 1
Design ApplicatwnSy*eni... I
Add ^ ► L
Implement Alt Appffcariens... 1
Pa* tt W
Select All |
Properties 1
1
EcommerceDB
|i ExtemaJDatibase
Automatic Synchronization, Code Updated
:-. з
*U!
Рис. 27.12. Описание системы приложений
<J> CustomenManagement - Microsoft Vbuel Studio
1Ш
File Edit View Project Build Debug Diagram Data Tools Test Analyse Window Help
g .' У Ш Applications
f i i > t4^ CrmServiceLayer
5 , $ CrmUserlnterface
{£ EcommerceDB
£] SalesAnatyits
$ SalesAnalysuServi<
i £j System*
Service Layer
*$>« System
lt.4
CustomerProflle
CrmSenrfctLayer ,4
> «§ ASPMETWebApplicati EcommerceDB
EcommerceDB
ji EnlernalDatab..
GetHlsiorlcalDati
SaleMiMfyiiiSflrvlcM
*C A ASPWETWebAppteatl .
Щ Setting* and ConsttaintsJ
Automatic Synchronization, Code Updated
i
is
N
Рис. 27.13. Визуальный конструктор System Designer
1058
Часть VI. Система командной работы Visual Studio Team System
Вспомните, что решение может содержать только одну диаграмму приложений. Все
системные диаграммы будут использовать приложения, описанные в этой диаграмме. На
рис. 27.12 показан пример выделения трех приложений и начало создания проекта системы
на их основе.
Визуальный конструктор System Designer содержит окна System View и System Designer.
Окно System View подобно панели инструментов с элементами, которые можно добавлять в
окно System Designer. Его содержимое напрямую связано с вашей диаграммой архитектуры
приложений. Каждое описанное там приложение можно добавить в систему через окно
System View. На рис. 27.13 показан пример системы в визуальном конструкторе.
Обратите внимание, что это системное представление похоже на то представление, которое
у вас было на диаграмме приложений. Разница в том, что это представление ограничено
одной данной системой. У вас есть также доступ из этого визуального конструктора к окну
Settings and Constraints. Это позволяет вам производить замену настроек для системы (как
уже обсуждалось).
Создание конечных точек прокси
Внешняя рамка окна System Designer представляет тот способ, которым вы собираетесь
предоставлять свою систему для связи с другими приложениями и системами. Обратите
внимание, что на рис. 27.13 на этой внешней рамке имеются две конечных точки: одна
указывает на CrmServiceLayer, а другая — на приложение SalesAnalysisServices. Эти конечные
точки называются конечными точками прокси, они позволяют вам описывать обмен,
который разрешается системе.
Конечные точки прокси не находятся на внешней рамке по умолчанию. Вы должны явно
выбрать и перетащить конечные точки приложения на внешнюю рамку (для того чтобы
создать конечные точки прокси).
Соединение приложений с системами
Вы можете использовать визуальный конструктор System Designer для соединения
приложения внутри одной системы с другой (предварительно описанной) системой. Таким
образом, вы можете использовать конфигурацию системы для описания новых систем.
Предположим, что вы хотите описать систему клиентского приложения для продаж.
Вспомните, что это Windows-клиент, который соединяется с уровнем сервиса. Было бы полезно
создать одну или несколько систем для реального развертывания этого клиента. Однако
каждая система будет обмениваться с развернутой системой уровня сервиса.
Поэтому добавьте в решение новую диаграмму системы. На эту диаграмму перетащите
приложение SalesAnalysis. Окно инструмента System View дает вам доступ к другим созданным
вами системам. В каталоге Systems вы увидите систему ServiceLayer, созданную в
предыдущем примере. Мы и ее перетащим на панель визуального конструктора.
Фигура ServiceLayer будет видна как система (а не как приложение). У вас есть доступ
только к конечным точкам прокси, предоставляемым системой. Для соединения с двумя
конечными точками прокси системы ServiceLayer используйте конечные точки SalesAnalysis. Диа-
Глава 27. Редакция Architecture Edition
1059
грамма обеспечит подключение вами подходящих конечных точек (при помощи языка Web
Service Description Language (WSDL)).
На рис. 27.14 показана законченная диаграмма системы. Мы вернемся к этим диаграммам
тогда, когда будем развертывать приложение в логическом центре данных.
Совет
Полезно помнить, что описанные здесь системы физически не существуют. Они
описывают конфигурации приложений во время их развертывания.
|03ЫВЫ
V* C«»stamerManagemer4 - Microsoft Visual Studio
File Edit Vie* Project Build Debug Diagram Data Tools Test Analyse Window Help
% '3t 9B% . , X ^ * ? < J -
S* jiilfltomW^^ * k X \ SalesCltentsd [SD]« | SemLt^tfj^sd {Щ£±С^тгщЬА£ю^ж1лй1А0}$
' ■.-, i~J Applications
<j£ CrroServiceLayer
<i£ CrmUserfnterface
;^ EcommerceDB
Q] SalesAnalysis
tjP SalesAnarystsServic
L, iJ? Systems
~ .><a\
SalcsCiient
<%** System
Sal«sAn»ly*is
***H WindoiVsApplicati
CustcmerPrc'ile
\
Get^istcncslData
ServfceLayer
^>i System
i
l-Si *<*'n9* «id Constraints j
Loaded SalesClient sd
Рис. 27.14. Создание системы, которая использует другую систему
Описание инфраструктуры
Важный (но часто упускаемый) шаг каждого проекта программного обеспечения — это
обеспечение развертывания в производственной инфраструктуре того продукта, который
команда разработчиков планирует построить. Сюда входят вопросы по аппаратному
обеспечению, версиям программного обеспечения, конфигурированию этого программного
обеспечения, а также по связи между различными используемыми серверами. Чем скорее вы
определитесь с этими вопросами (или определите имеющиеся риски), тем больше будет
шансов на успешное завершение йашего проекта.
В обязанности архитектора приложения и архитектора по инфраструктуре входит
обеспечение одинакового понимания проекта (пока он имеет вид простой диаграммы). Когда этот
1060
Часть VI. Система командной работы Visual Studio Team System
проект становится кодом, то неверные предположения по инфраструктуре могут вызвать
(как минимум) дорогостоящие задержки в разработке.
Моделирование вашего центра данных может упростить передачу информации между
командой инфраструктуры и командой разработчиков. Visual Studio 2008 позволяет вам
описать границы внутри вашего центра данных (зоны), разрешенный между этими зонами
трафик, а также находящиеся в этих зонах серверы. Кроме того, можно применить к
элементам этой логической модели ограничения, в том числе: версии программного обеспечения
на компьютерах, разрешенные на компьютерах типы трафика, пулы приложений,
информацию глобального кэша сборок, управление состоянием сеанса и т. п. И наконец, эти модели
можно подписывать и присваивать им версии (поскольку они редко меняются), а дизайн
приложения можно проверять по этой логической модели.
Диаграмма логического центра данных
Диаграмма логического центра данных (файл с расширением ldd) позволяет вам
представить в модели среду инфраструктуры. Для большинства проектов вам понадобится более
одной модели инфраструктуры. Весьма вероятно, что у вас будут инфраструктуры
разработки, демонстрационная, а также производственная. Знание особенностей этих инфраструктур
очень полезно. Наличие этих логических представлений инфраструктур позволит вам
протестировать развертывание вашего смоделированного приложения.
Текущая версия визуального конструктора Logical Datacenter Designer не является сетевой
диаграммой или каким-то аналогичным инструментом. Такие инструменты важны для
команды разработчиков инфраструктуры. Данная диаграмма больше полезна для
архитекторов приложений. Команда разработчиков инфраструктуры занимается коммутаторами,
маршрутизаторами, межсетевыми экранами, доверительными отношениями, защитой от
вирусов, VLAN и т. д. Диаграмма логического центра данных этой информации не
содержит. Она предназначена исключительно для логического представления серверов и
конфигурации их программного обеспечения, а также их разрешенных точек подключения. Это
дает архитектору приложений и команде разработчиков инфраструктуры уверенность в том,
что проект нового приложения можно будет развернуть в данной среде.
Логический характер этого визуального конструктора очевиден с самого первого взгляда.
Например, логическим сервером в диаграмме центра данных будет Web-сервер IIS, сервер
базы данных, обычный сервер и т. д. Эти логические серверы не имеют физических
соответствий. Наоборот, один сервер IIS может представлять целую ферму Web-серверов, или
сервер базы данных и Web-сервер могут быть размещены на одном компьютере. Такая
информация важна для команды разработчиков инфраструктуры, но она не нужна архитектору
приложений для того, чтобы обеспечить правильное развертывание нового проекта.
Вместо этого в центре внимания находится программное обеспечение, его конфигурация, а
также каналы связи между серверами. Например, как архитектору приложения вам может
понадобиться обеспечить, чтобы ваша производственная среда поддерживала версию .NET
Framework 2.0, или чтобы сервер IIS (на котором размещены ваши Web-сервисы) мог вести
обмен с базой данных. Именно такую информацию можно встроить в диаграмму
логического центра данных.
Глава 27. Редакция Architecture Edition
1061
Панель Toolbox визуального конструктора Logical Datacenter Designer
Панель Toolbox диаграммы логического центра данных дает доступ к элементам, которые
можно добавлять на диаграмму логического центра данных. Эти элементы сгруппированы в
три раздела: General Designer, Endpoints и Logical Servers (рис. 27.15). Раздел General
Designer содержит обычные для многих архитектурных проектировщиков элементы. Раздел
Endpoiilts группирует подключения конечных точек, которые описывают обмен между
серверами центра данных. И наконец, раздел Logical Servers группирует различные логические
серверы и зоны, которые могут быть описаны на диаграмме.
Toolbox Щ
I a General Designer j
Б It Pouittr I
I "^ Connection 1
I & Comment \
| о Endpgints I
I It Pointer I
В .ЦЗ WebSiteEndpoint j
I JD] HTTPCIientbidpoint j
| «V Data baseClierrtEnd point 1
I _J GenericServerEndpomt j
I J GenericClientEndpoint |
I ^ ZaneEndpomt jj
j Tflogicil Sgivw | ] i
f ^ Pointer I
I *j WindomClient I j
tfj OSWebServer j
| Uj DatabaseServer 9
б j GenericServer |
I Щ Zone I
j н бепмя! J
I There are rm usable controls in trus group |
I Drag an Hem onto thH text to add it to the 1
I toolbox. 1
Рис. 27.15. Панель инструментов Toolbox
визуального конструктора Logical Datacenter Designer
Описание зон
Зона в логическом центре данных используется для группирования серверов и
абстрагирования от них. Зоны по умолчанию ничего не представляют. Вы можете описывать зоны для
группирования серверов так, как вам нужно. Вы можете даже вкладывать зоны в другие
зоны (для того чтобы описать сложные связи).
Принципиальное преимущество использования зоны состоит в том, что можно указать тип
трафика, который разрешен для входа в зону и выхода из нее. Серверы внутри зоны могут
обмениваться друг с другом, но подключение к зоне — уже совсем другое дело. Например,
зону можно использовать для представления любого количества элементов (в том числе
таких как интранет, экстранет, Интернет, межсетевой экран или VPN).
1062
Часть VI. Система командной работы Visual Studio Team System
Для примера предположим, что вы хотите определить зоны, которые будут содержать
серверы для поддержки приложения и систем, описанные вами ранее. Клиентская зона будет
представлять клиентское приложение Windows для анализа продаж. Вы создадите также
зону Интернета (зону публичного доступа) для пользовательского интерфейса системы
управления клиентами, а также для предоставления набора прокси для уровня сервисов.
Затем вы опишете зону для интранета; вы назовете эту зону ServiceLayer. И наконец, вы
создадите зону для базы данных. На рис. 27.16 показан пример этих зон.
Следующим шагом в эти зоны необходимо добавить серверы. После этого вы опишете
соединения между зонами и серверами в зонах. Затем вы создадите ограничения для серверов
и зон.
<S) CustomerManegement - Microsoft Vrsuat Studio
Fife Edit View Piqjett Build Debug Diagram Data Tools Test Analyze Window Help
hi* it iqo* - X & .f .' -
[V CrmLogkaiDatocenterJdd [LDDr
h»,j Client
; H
i
!
PublicAccessProxy
i Internet ™
. e
j
i
i
U Ш
j ч^ S«tiwg$- a iji <. ou»;lMtr-41
j Ready
Services
©
Service Layer
D
Database
0
Secure Data Ьак
*
!са|@ЫЗУ1
,
J 3,
'•n j
T»
r"''
I
\
Рис. 27.16. Зоны логического центра данных
Добавление серверов
Серверы в зону добавлять не обязательно. Их можно добавлять непосредственно на
диаграмму. Однако полезно представлять себе серверы находящимися внутри зон. Поэтому в
примере при добавлении серверов будут использоваться зоны, которые вы описали ранее.
Визуальный конструктор Logical Datacenter Designer позволяет вам использовать на вашей
диаграмме несколько различных типов серверов:
□ WindowsClient — компьютер пользователя под управлением Windows;
□ IlSWebServer — Web-сервер IIS;
□ DatabaseServer — сервер центра данных, на котором работает реляционная база данных;
Глава 27. Редакция Architecture Edition
1063
□ GenericServer
данных.
нестандартный сервер (или сервер любого другого типа) в центре
Для нашего примера мы ограничимся одним логическим сервером в каждой зоне. Очень
часто у вас в зоне будет больше одного сервера. Например, если у вас есть сервер
приложения и интерфейсный Web-сервер в вашем интранете, то вы можете внести их в одну зону.
Серверы будут вести обмен друг с другом, но входящий и исходящий трафики будут
определяться границей зоны. Пример показан на рис. 27.17.
ч?» CistomerManagement - Microsoft Visual Sturfro
File Edit View Prcje<t Build Debug Diagram Data Tools Test Anatyre Window Help
% * 75% . X . Л t
yl
CnnLogtuiDaUceiTterJdd [ID DP
Cliwit
PiiblWAccttfPfiny
S*t*tCNmtM««hin»
«til
m
SacuraDatalMMr
«4
BjMtMf «•'«*• fv<« W(l.;i' > J
Cr<n$*olc«Uy»r
•Ce*nm«fc«0bS*-.
(^Settings and Const'einls
Rfsdy
Рис. 27.17. Зоны и серверы логического центра данных
На диаграмму добавлено пять серверов. Зона Client содержит два сервера — по одному для
каждого типа клиентов, которые будут подключаться к решению. Они не являются
настоящими серверами; скорее, они являются хостами приложений, которые также имеют
ограничения по конфигурации. В зону SecureDatabase добавлен логический сервер базы данных.
Затем были добавлены два Web-сервера. Web-сервер в зоне PublicAccessProxy предназначен
цля того, чтобы служить хостом приложения CrmUserlnterface. Кроме того, этот сервер
имеет прокси Web-сервисы, которые делают вызовы сервера в зоне ServiceLayer. Они
используются для приложения SalesClient. Следующий шаг— подключить коммуникационные
каналы между этими серверами и зонами.
Соединение серверов и зон
Серверы и зоны соединены через конечные точки. Конечные точки описывают тип трафика
^и соответствующие ограничения), который разрешен для зоны или сервера. Например, если
конечная точка разрешает только входящий Web-трафик, то никакой другой метод входя-
1064
Часть VI. Система командной работы Visual Studio Team System
щей связи для данной зоны не разрешается. Серверы внутри зоны могут иметь собственные
конечные точки и обмениваться друг с другом при помощи трафика другого типа.
Визуальный конструктор Logical Datacenter Designer позволяет вам определять несколько
различных конечных точек:
□ ZoneEndPoint— представляет поток трафика в зону и из нее. Эти конечные точки
указывают также направление этого трафика (при помощи стрелок). Направленная внутрь
зоны или сервера стрелка представляет входящий трафик, в то время как направленная
наружу из зоны или сервера стрелка— исходящий трафик. Двунаправленная стрелка
представляет двунаправленный трафик. Конечные точки ZoneEndPoints могут также
иметь ограничения с указанием допустимого типа трафика;
□ HTTPClientEndpoint— используется для ограничения обмена от клиента к
Web-серверу;
□ WebSiteEndpoint — служит для управления трафиком Web-сервера;
□ DatabaseClientEndpoint— применяется для управления обменом между клиентом и
сервером базы данных;
□ GenericClientEndpoint— используется для управления обменом между клиентом и
обычным сервером;
□ GenericServerEndpoint — используется для управления трафиком обычного сервера.
W&
CustomerManagement - Microsoft Visual Stud»
File Edit View Project Build Debug Diagram Data Tool» Test Analyze Window Help
L5 '4 78*l. •!!•"*«* J *
F
г
I Re
&mlogfcalD*tacefiterJdd ILDDf ftiftPfrflfi)
Cbant ftiMcAcMMPiwcy
j ™ H«m«t ™
w. ~ j „ ~ . *W
5>вцСИ атМасЫи» [ СгапСЙмИ ^.n»v CmScrvar
.... I ..
j
j *
SeciaVeOttttbeM
Л
SfllHt»!
^ SiftMiiiyif
*
«CoinmarcataSaratr
|
1 '« &+
;. ) rfhConpi«tl-Hi Cittkbt»*
' * m
A&f
»*Л>«.#*
~ ~$ . .
Fi ~ ~
i-ч^Л]
*
«J
ir
3*
5"
я j
1 1.
t
Рис. 27.18. Соединенные зоны и серверы логического центра данных
Например, ваша цель — соединить зоны и серверы внутри зон. Когда есть входящий в зону
трафик, то обычно этот трафик предназначен для сервера (а не просто проходит через зону).
Глава 27. Редакция Architecture Edition
1065
То же самое справедливо и для исходящего трафика. Исходящий из зоны трафик обычно
идет с сервера.
На рис. 27.18 показаны конечные точки, добавленные на диаграмму и соединенные
соответствующим образом.
Далее пошагово описан процесс соединения элементов диаграммы:
1. В каждый клиентский сервер (или хост) добавьте HTTPCIientEndpoint. Это позволит
данным компьютерам обмениваться при помощи протокола HTTP. Затем соедините эти
конечные точки с исходящим трафиком зоны Client.
2. Соедините конечную точку входящего трафика зоны PublicAccessProxy с конечной
точкой WebSiteEndpoint на логическом Web-сервере (CrmServer). Это позволит вам
соединить исходящий трафик из зоны Client с оконечной интернет-точкой зоны
PublicAccessProxy. Клиентский трафик HTTP теперь направлен на Web-сервер.
3. Сделайте то же самое для сервера в зоне ServiceLayer. Соедините входящую конечную
точку зоны с оконечной точкой WebSiteEndpoint сервера CrmServiceLayer. Далее
соедините конечную точку HTTPCIientEndpoint сервера CrmServer с исходящей конечной
точкой зоны PublicAccessProxy. Затем можете соединить две зоны (исходящий
PublicAccessProxy с входящим ServiceLayer).
4. Удалите конечную точку HTTPCIientEndpoint с сервера CrmServiceLayer. Замените ее
конечной точкой DatabaseClientEndpoint. Затем соедините входящую конечную точку
зоны SecureDatabase с сервером базы данных. Последний шаг— соединить исходящую
конечную точку зоны ServiceLayer с входящей конечной точкой зоны SecureDatabase.
Описание настроек и ограничений
Настройка зон и серверов — это последний этап. Диаграмма логического центра данных
будет представлять вашу инфраструктуру, по крайней мере, для задач архитектора
приложений. Он может использовать эту зону для того, чтобы определить, подойдет ли
предлагаемая архитектура для реальной инфраструктуры. Конечно, диаграмма логического центра
данных работает только тогда, когда она точно соответствует физической конфигурации
вашей системы.
Настройка зоны
Для зон вы можете сделать несколько настроек. Эти настройки включают: возможность
ограничить типы логических серверов, которые могут быть добавлены в зону; разрешенный
обмен с зоной; возможность вложения зон; возможность определения нестандартных
настроек. Визуальный конструктор Datacenter Designer эти ограничения соблюдает. В
частности, он не позволит вам добавить Web-сервер в зону, которая сконфигурирована только для
серверов баз данных.
Например, все ранее описанные зоны должны быть ограничены по типу разрешенных в них
серверов. Клиентская зона должна разрешать только клиентов, две зоны с Web-трафиком
должны разрешать только Web-серверы, а зона баз данных должна быть ограничена
серверами баз данных. Эти ограничения вы настраиваете в окне Settings and Constraints (так же
как и в диаграмме приложений). Пример показан на рис. 27.19.
1066
Часть VI. Система командной работы Visual Studio Team System
i/» CwtomerManwjwnent Microsoft Visual Studio
File Edit View Project BuTId Debug Diagram Data Tools Test Analyze Window Help
tl 4 100% - \ ^ ;, i A .
uJ?
3
<T
3
! s.
i
i
CrmLogkilDatacenterJdd |LDD]*
Services
» * f
S«rvk« Layer j
**» i» services
CrmS*rvk«Laytr
Ц^ DSWebSeivcr
t
* л '
;ШгфШЗгМ*$ ""■ '* ™mmw wwwwn
! -' s£? Zone Containment Comtraetti
; ш .««* DatabaseSefver
W ** GenericServer
I i-i • ** nSWebServer
i [£ • ** User Defined
j 4j ^ Wi CcmmonLanguage
i л» Directory
j 5} v* Intemetlnfofmebor
J &e OperattngSystemD
«ws Rotes
i g »» WindotVsCltent
* ServiceLayer supports Corr
|{ Name
jj F Settings
monLanguageRuntime
Operator Value
| у |Ve;5ion ШШШШ№ШЯ$ШтШЯШ
!
l^Bkead]
- X
i
- -
м'шш""" i * ш"Щ
Щ\
3 I
i
Erior Message | |
MESBiSIS^i
i
\\ Four part version number «scented with this installation of the Common Language ■ <
i Runtime !
| |
[^trcrlisl^
Ready
Рис. 27.19. Настройки и ограничения зоны
Enter the error text for the Version;
Servers in tkiszone must have the settings, %SettmgName% = %
RequiredValue1^
Name
%SettingName%
%CurrentValue%
%RequrredValue%
%Saurce%
%Guest%
Value
Version
35.0.0
OK
Cancel
Рис. 27.20. Специальное сообщение об ошибке ограничения
В примере выделена зона ServiceLayer. Обратите внимание, что в левой части окна Settings
and Constraints для данной зоны деактивированы любые серверы, кроме HSWebServer.
Затем для этого типа серверов добавлено еще одно ограничение: Web-серверы в данной зоне
должны иметь версию .NET Framework 3.5.
Для каждого настраиваемого ограничения вы можете создать специальное сообщение об
ошибке, которое будет отображаться при его нарушении. Для этого необходимо нажать
Глава 27. Редакция Architecture Edition
1067
кнопку с многоточием в поле Error Massage данного ограничения. При этом вы получите
диалоговое окно (рис. 27.20). Здесь вы можете указать сообщение об ошибке. Обратите
внимание, что вы можете использовать макроподстановку для показа в сообщении
специальных полей.
Настройка сервера
Серверы настраиваются аналогично. Вы выбираете сервер, а затем изменяете его настройки
в окне Settings and Constraints. Здесь можно указать типы приложений, которые
разрешается выполнять на сервере, ограничения для каждого из них, а также различные настройки
сервера.
На рис. 27.21 показан пример. Выделен сервер CrmServiceLayer. Для того чтобы ограничить
данный сервер выполнением только ASP.NET и приложений Web-сервисов, вы можете
воспользоваться флажками в левой стороне окна.
*f} CustomerMansgement - Microsoft Viitiel Studio
'■ File Edit View Project Buttd Debug Diagram Data Tools Tut Analyze Window Help
CnnlogkjJDatownterJddllDDr Шёщ1
Ciw5»rvk«L*y»f
I t2j AppJ-citwi» Constraint*
Ы у» **■ ASP NETWebApphcaticn
ы» ASP NET Membership
** ASP.NET Securrty
У «-* ASP.NET Session State
i+ ** User Defined
1-1 • **■ Externa I BiiTelkWebServire
E ** User Defined
у у «йо Externa WebSen, ice
'♦ м> User Defined
g *";>*» GenencApplicafcon
it w> User Defined
u2? logical Server Settings
R 12) IntemetlnforrrMtionServkes
I*4 ii ApplicstionPoots
IV ^ WebSitei
13 OperatingSystemDescription
£j Directory
•> ti r—, д.-, r<TfP.-» —
CrmSer/iceLayer supports ASP NET Session State
SessK>n state mode: State server settings
This constraint requires specific ASP.NET session state settings
?*
Off
InProc
StateServer
^Щ$£!ШШШШШ
Session timeout
002(МЮ
Http cookie mode*
__ AutoDetect
^J UseDeviceProfile
UieUri
*
„
_~
Ш-
Sql server settings
IP address.
Integrated security
1921681101
True
1
Is
i
i
Ready
Рис. 27.21. Настройка ограничения сервера
Затем вы можете указать различные настройки для сервера. Обратите внимание, что
выделен параметр ASP.NET Session State (на рисунке слева, в дереве настроек). Теперь вы
можете использовать конфигурационные данные в правой стороне диалогового окна для
настройки этих ограничений. На рис. 27.21 указано, что состояние сеанса управляется через
сервер SQL Server.
Ваши настройки должны точно соответствовать серверам вашей среды. Эти настройки
будут использоваться для того, чтобы ограничить то, что может разворачивать архитектор
приложений.
15 3ак 3716
1068
Часть VI. Система командной работы Visual Studio Team System
Импорт настроек сервера
Диаграмма логического центра данных является логическим представлением ваших
серверов. Однако вы можете воспользоваться функцией импорта для того, чтобы указать сервер
на реальном (физическом) компьютере и импортировать его настройки. Эта возможность
может быть полезна, если у вас есть доступ к серверам, которые уже настроены должным
образом.
Доступ к этой функции вы получаете через меню Diagram (пункт Import Settings). Выбор
этого пункта меню запускает мастер Import IIS Settings Wizard. Импортированные
настройки применяются к серверу, который вы выделили на диаграмме., Мастер проведет вас по
процессу импорта.
На рис. 27.22 показан ключевой шаг мастера. Здесь вы должны указать учетные данные для
сервера, а также то, какие настройки вы хотите импортировать. Если вы импортируете
настройки Web-сайта, то диаграмма может добавить новую конечную точку для каждого Web-
сайта вашего сервера. Вы можете также выбрать сайты для импорта (на другой странице
мастера).
Import IIS Settings Wizard
Import IIS Settings Wizard
Wh*t is the name or address of the US Web server you want to import from?
2fc3r2-rfs2DDB
Administrator name
ц Administrator
Password-
( I Import settings from atl Web sites and create a new Web site endpomt per site
У W\ Import Web server global configuration
[7] Import application pools
j
I <Piev»ous Ц Next» J ' - »$>
J - ч^шшшщ ягг^яшп» ~ .i-^
La ШпЩ]
Щ
[ Brew**-. ^ 1
r
|. Cancer | j
Рис. 27.22. Мастер импорта Import IIS Settings Wizard
Развертывание приложения
Само приложение и визуальный конструктор Logical Datacenter Designer были бы просто
красивыми картинками, если бы не было визуального конструктора Deployment Designer. Этот
инструмент позволяет вам протестировать развертывание вашего приложения в вашем
логическом центре данных. Цель моделирования логической инфраструктуры — избежать проблем,
которые могут возникнуть при развертывании приложения. Будет очень обидно, если ваше
приложение будет собрано и успешно протестировано в одной среде, но не сможет быть раз-
Глава 27. Редакция Architecture Edition
1069
вернуто в другой (производственной) среде. Часто такие проблемы не выявляются до самых
поздних стадий проекта и приводят к большим задержкам и прочим проблемам.
Если у вас уже есть кое-какой опыт разработки, то вы наверняка сталкивались с
высказыванием: "Развертывай рано, развертывай часто". Это изречение адресовано тем, кто
столкнулся с подобными проблемами. Надо поблагодарить разработчиков за Deployment Designer,
который был создан во избежание таких проблем. Он позволяет вам развертывать так часто,
как вы хотите.
Этот инструмент проверяет, что вам разрешено выполнять развертывание, позволяет
перетащить мышью приложение на сервер, а также проверяет развертывание при помощи
компилятора развертывания. Например, этот инструмент не позволит вам поместить Web-
приложение на сервер базы данных, который не допускает Web-трафик. Кроме того, во
время компиляции инструмент развертывания может определить, имеет ли целевой сер-1
вер необходимое программное обеспечение для выполнения вашего приложения. Ошибки
выводятся в виде списка задач (аналогично ошибкам кодирования). В результате ошибки
разверть вания обнаруживаются до того, как код попадает на производственные серверы,
где ошибки могут обойтись очень дорого.
Диаграмма развертывания
Инструмент Deployment Designer связывает приложение и диаграмму логического центра
данных. С его помощью вы можете использовать диаграмму приложений для выполнения
тестового развертывания в вашей логической инфраструктуре. Это тестовое развертывание
покажет, где есть ошибки в развертывании вашего приложения. г
I Define Deployment !:JuHaHJ |
Choose a logic»! dttacenter diagram to validate against for deployment. Press Fi
for more information.
Logical Ditecenter Diagram*
1 С>т1рд*с«Юа1?1сепигДДДAenrUS ▼] { Brawie^
Version: 1ДА0
Г Modified: Thursday, March 06,2008 &0ЭД5 AM
Company;
N
И Signed; False
Г file Path; CЛU$en\mя^eJ^DocumentЛV^$ualSh»dю200в^Projectt\Appljtatlon[
Description:
У
[ OK 1 [ QHHtt . 1
Рис. 27.23. Диалоговое окно Define Deployment
Для начала вам необходимо создать диаграмму развертывания (файл с расширением dd). Вы
можете сделать это из существующей диаграммы приложений. В открытой диаграмме вы
можете воспользоваться меню Diagram (или контекстным меню и выбрать пункт Define
Deployment). Выбор этого пункта выдаст диалоговое окно Define Deployment (рис. 27.23).
1070
Часть VI. Система командной работы Visual Studio Team System
Здесь вы можете выбрать диаграмму логического центра данных, которая представляет ту
среду, в которой вы хотите протестировать развертывание.
После этого Visual Studio открывает диаграмму развертывания. Помните, что она
предназначена для того, чтобы соединить диаграмму вашего логического центра и диаграмму
приложений. Пример показан на рис. 27.24. Обратите внимание, что сама диаграмма выглядит
как ваша инфраструктура. Причина в том, что вы развертываете свое приложение на эту
диаграмму. Каждый сервер инфраструктуры имеет внизу квадратик, в который вы можете
добавить приложение. Приложения из диаграммы приложений перечислены в дереве
(System View) в левой части рисунка. И наконец, обратите внимание на то, что каждое
приложение добавлено на свой соответствующий сервер.
■У* С.wtorrvefManageTiertt - Microsoft Visual Studio
File Edit View Project
■Jst \ 75% * ' f
i ivtfw* <fov* ~ й. x
' <t Default
<Jf CrmServkelaye
<jt OmUserlnterfac
j*j EcommerceDB
l^J3 SalesAnarysu
ijfr SalesAnalyiisSer
>
< HI { *
Loaded DefaultSysteml dd.
Build
Si
Debug Diagram Data
:3e
D*UdtSy*«TLLdd [DOr Cu&
« !
KSyttoail
Lcxjujl Uiw»£.«nl<#<
i<
Cltent
m
S«lMCB*ntMa<hto«
& M<4}-v%LUi
S*cur»Oa«abcM
•Com martvObfctrvtr
I j O»»*»»»****'
'
L-
Took Test Analyze Window Help
ю^Ш»ятсвМк*1АШ! ОпШютЛшяшШ |ШЩ' \
CtmlogK«iD»t*v#iit«i JiAumti; N*"*. Оч&цдуаЮаМсг «• (v«n*Hi IjJ ОЧ
@ НшЕЗшГ
"X
PubtlcAicmtProiy
1т.Гм« Ф
*0
.
j
•-H
i CimCtWnt №1VKM CrmSeivar |
<? A.-ctrwtOwit Л ^
S»rvk*Uy»r
«
.UW.ti.Kv! j
i (j
1
wt i
* !
4"" j
* ""Л |
CrmS«n>ic*La j
<
llitfeoM e. 1:0» ПлЫч-к
1
JSrt'(bi.k<\ 1
► !
Рис. 27.24. Диаграмма развертывания
Проверка развертывания
Следующий шаг — тестирование развертывания. Некоторые тесты выполняются при
добавлении приложений на серверы. Визуальный конструктор Deployment Designer не позволит
вам добавить приложение, если вы нарушаете правило развертывания. Например, вы не
можете добавить Web-приложение на сервер базы данных.
Для проверки развертывания выберите пункт Validate Diagram (из меню Diagram или из
контекстного меню). При этом происходит проверка ваших приложений по всем элементам
диаграммы инфраструктуры. Затем для вашего просмотра генерируется список
предупреждений и ошибок. На рис. 27.25 показаны результаты нашего примера. Вы видите, что
ошибок нет, но имеется множество предупреждений, над которыми необходимо поработать.
Глава 27. Редакция Architecture Edition
1071
ч#* CbstomeiManagement - Microsoft Visuaf Studio
File Edrt View Project Build Debug Diagram Dale Took Test Anafyze
<4Г4 75«ь . \f /j , ^ 9
Window
Help
.^i^fesgadl
SVitartf*» ^ - tt X Def^ltfysTeml^W^i^ ' X |
-i jj Default <
i^ CrmServiceLaye;
ijfr CrmUserlnterfac<
ь A, EcorrimefceDB i
1 ~2
1 ;£p SalesAnalysis I.
i J$ SalesAnalysrsSerj j
i '|
!
.i
Client
Ii
■ S.*lwCKw4M»<Htn«
i $ Wb«b*4t <*nl
'* ' * .
[ EVorLtst
Щ 0 Enorsj f j\7 W«mt^i| ф 0 Messages
Description
i 1 The ASP.NETWebApplicaoon system 'CrmUserfnterf ace' does
not contain a provider ertdpotnt An ASP NETWebAppltc abort
system must expose one of the endpotntst WebServiceEndpoint
crWebContentEndpeint.
1- 2 Servers in this zcne must have the settings. Version = 35SJ3
I i- 3 The applicattcn SalesAnafysis from system DEFAULT к net
I bound in the deployment diagram DefauttSysteml
I i* 4 The appficattcn GroUseilnterface from system DEFAULT is not
I bound in the deployment diagram DefaultSysteml
IL 5 The application CrmSrrviceLayerfrom system DEFAULT rs not
bound in the deployment diagram DefauttSysteml.
Validation of DefaultSyrteml.dd complete 7 errors/warnings found
CtmOWnt
#. VVmdn*s;Cli«H
File
DefaultSysteml dd
DefaultSysteml.dd
DefaultSysteml dd
DefaultSysteml dd
DefaultSysteml dd
|
1
i
Line
0
0
0
Q
0
PubliiAcrestProxy + |
|Л1«М*1 Ф
*%
J
1
Column Project
1
1
1
1
1
is
CimS«rver
^ UVfrrfita, \
?
V > X
1
'I
)j
г л
'
\
-
Рис. 27.25. Предупреждения,
сгенерированные для проверяемой диаграммы
ч?* CustomerMarwgenent - Microsoft Visual Studio
i File Edit View Project Buttd Debug Data Tools Test Analyze Window Help
, >b*J л У $\ $ft A* & How Do! - ^Search ^lndex <Ц Contents 33HelpFavorites , J
Deployment Report j
%)MSDN Forums *.& _
i^^l^.I.£TOb$a^^«^MKt^i^Pi:iJi<rtPjggiJ
| UP.L- C\Users\msnelf\Documents\Visual Studio 200o\Projech\ApphcaticnDesignl\DefaultSysteml html
Legend
zone
system or application host
application
0 endpoint
|3 resource
Ц setting
Bindings
Deployment Diagram
■ Client
Sal«sCH«ntMachin*
IK WindowsClient
г <
Pub licAccessProxy
Internet 'в
CrmCHant ««,,r« CrmServer
' «j WincowrtClient . Щ HSWebServe „.
m , r
1-& £пГ*Г"*1
Рис. 27.26. Отчет по размещению
1072
Часть VI. Система командной работы Visual Studio Team System
Отчет по развертыванию
Вы можете также сгенерировать отчет с подробностями вашего развертывания. В этом
длинном документе указан каждый аспект приложения, центра данных, а также развертывания.
Вы можете настроить несколько опций генерирования этого отчета. Например, вы можете
указать, хотите ли вы видеть в отчете копии диаграмм. Эти опции вы настраиваете в окне
свойств Properties самой диаграммы развертывания.
Для доступа к инструменту генерирования отчетов необходимо использовать меню Diagram
или контекстное меню (и выбрать опцию Generate Deployment Report). При выборе этой
опции создается подробный отчет. На рис. 27.26 показана часть отчета. В отчет включается
все. Возможно, вам будет удобнее выбрать несколько разделов и сохранить их в виде
небольшого отчета для архивных целей.
Реализация приложения
После того как вы спроектировали приложение и протестировали его при помощи
развертывания, следующим шагом является настройка реального проекта для команды
разработчиков. Эту задачу выполняет архитектор приложений. Визуальный конструктор Application
Designer позволяет архитектору реализовать приложения, описанные в диаграмме. Эта
реализация используется для генерирования проектов с соответствующими настройками,
ссылками, а также файлами шаблонов.
Настройка свойств реализации
Перед генерированием реальных проектов вам необходимо будет описать детали
реализации для каждого приложения на диаграмме. Вы можете сделать это в окне свойств
Properties. Когда вы просматриваете свойства приложения, то в окне Properties увидите подраздел
Implementation. Свойства в этом подразделе зависят от типа настраиваемого вами
приложения. На рис. 27.27 показаны свойства реализации Web-приложения.
Обратите внимание, что вы можете настроить язык, на котором будет создаваться
приложение. Вы можете также указать шаблон проекта, пространство имен по умолчанию и т. д.
Выберите приложения и по очереди настройте их свойства реализации. Когда вы будете
удовлетворены результатами, наступит время для генерирования реализованных шаблонов.
Генерирование проектов
Реальная реализация выполняется при помощи пункта Implementation в меню Diagram.
С его помощью вы выбираете реализацию всех приложений диаграммы или единственного
приложения.
Обратите внимание, что если вы работаете в решении, которое уже содержит некоторые из
приложений, использованных в диаграмме приложений, то эти приложения будут
недоступны для реализации (поскольку они уже реализованы). Именно это и происходит в нашем
Глава 27. Редакция Architecture Edition
1073
примере. Если вы выберете Implement All Applications, то появится диалоговое окно
подтверждения (рис. 27.28). Обратите внимание, что в существующее решение будут добавлены
только два дополнительных приложения.
<4> CustomerMwiagement Microsoft Visual Studio
File Edit View Project Bu&J Debug Diagram Dili Tods Test Anar/ie Window Help
ОгЛотыНтчпктШ ДО}* |
la) 22
• ft X
^Application
l CustomerProfile
<m ——
fotUyer
ETWebApplication
SatesAnalysls
T] WindowsApplkAtion
GetHistortcalData
Sa tetAni lyiieS* rvfce
9 j§ ASP.NETWebApplication
£* '^П
EcommerceDB
Ecommerct-DB
.J si Fvtf»m*ir}*Mh*w>
™L
J& Error List;
SaJccAnaJysfcSafvkes ASP.NETWebApplicatio»
ai^p,., „
IB £дп»*)диг.а1к»г
i Settings and Comtrai [...]
j Description
Name SalesAnaiysisServices
Web Content Dynamic
DefaultClass Namesc SalesAnaiysisServices
Language Visual Basic
Project SalesAnaiysisServices
Project Location Typ« File System
lv tUu'i Folder
Target Framework
jB W!k< *»*?nt
Comments
ТешрШе
i The project template us|
; application. Read-only
.NET Framework 3.5
ASP.NET Web Site |T
Empty Web Site
ASP.NET Web AppH«|
Custom Template...
^Properties E^ScJutfer Btpierfer Г
Ready
Рис. 27.27. Настройка деталей реализации
i я jfitfftjtf
Confirm Application Implementation
jf^ 4 of 4 Applications will be implemented To continue implementation, Cbck OK.
Щ& Project creation cannot be reversed. Certain implementation properties cannot be modified after project
creation.
^Application) CrmServiceLayer
Language; Visual Save
Template Empty Web Site
Project Location; G\Usm\rmne№Documertts\VUual Studio 2008\ProjecU\AppticationDesignl\Crn
0 Application: OmUserinterface
Language. Visual Basic
Template- ASP NET Web Site l
Project Location: G\Uscrs\rnsne1l\Documents\Visual Studio 20Q8VProjects\AppiicalionDcsignl\Cm
|| Application; SaletAnarys»
Language Visual Basic
Template; Windows Forms AppBcation
Project Location: C:\Usm\mtnell\Documertts\Visual Studio 20P8\Projects\ApplicationDesignl\Saii
<$) Application; feiesAoarys'tsServkes
Language Visual Bask
cue
Cancel
Рис. 27.28. Диалоговое окно подтверждения
Confirm Application Implementation
1074
Часть VI. Система командной работы Visual Studio Team System
По завершении будут сгенерированы новые проекты с настроенными свойствами и
ссылками. Теперь вы можете начать кодирование архитектуры ваших приложений. На рис. 27.29
показаны результаты реализации в Solution Explorer.
-yft CtttomerManage'nent - Microsoft Visual Studio
~iraliiiw
File Edit View Project Build Debug Diagram Data Tools Test Analyze Window Help
it % 100%
CustomerMww9m*ot*d (AD)>
Л p
«bApplfcation
SaluAnaiysis
"""j WindovwApplicabon
J
GeiHr'stoncalData
CustamerProfile
ic«Lay«r
ETWebApplica»ion
SataAnalystsSajrvtcas
*M ASP.NETWebApplication
Ecomm«rc«DB
& F*Wnairtamb»v
& Er,'*r List
Automatic Synchroruzation* Model Updated
iPP
ШЩЧ k
34
^ Default System
'^ Solution hems
tj^ C:\ .\CrmServiceLayer\
H *-У App_Code
$| CustomerPrafilevb
^j CrmServiceLayersdrn
4l) Cu£tomerProfile.asmx
^Jf web config
^|C\ \CrmUierlnterface\
^ App.Data
iij CrmLherlnterfacesdm
0) _J Default asp»
-£ web.conftg
^ C\ \SaleiAnarysisServices\
nj9 SelesAnalyvs
jtf My Project
W ~4 Web References
Jfc app conHg
^ Foiml.vb
J?) SalesAnatysis.idm
'<;*}» Properties!35Solution Explorer
Рис. 27.29. Реализованные приложения
Резюме
Вы увидели, как можно использовать Visual Studio Team Architect не только для
документирования, но и для моделирования программного обеспечения. Создаваемые с ее помощью
модели — это нечто гораздо большее: это инструменты, которые помогают повысить
производительность и уменьшить количество ошибок.
В этой главе мы рассмотрели стандартный подход моделирования приложений. Сначала вы
создали диаграмму приложений (для представления интерфейсов, сервисов и базы данных,
имеющихся в примере). Далее создали диаграмму системы для группирования ключевых
элементов приложения. Затем вы изучили, как можно использовать диаграмму логического
центра данных для представления физической инфраструктуры. Эта диаграмма стала
основой тестового развертывания приложения. И наконец, вы узнали, как визуальный
конструктор Class Designer можно использовать для одновременного создания диаграмм и кода.
Эти инструменты формируют основу моделирования в Visual Studio 2008. Они также
представляют собой большой шаг в направлении к блестящему будущему визуального
моделирования приложений и кода.
Глава 28
Редакция Test Edition
Тестирование — это одна из самых важных частей жизненного цикла разработки
приложения (Software Development Life Cycle, SDLC). Однако слишком часто тестирование
откладывается до самой последней стадии проекта. Или (что так же плохо) разработчикам
поручается самим тестировать собственный код. В любом из этих случаев вы получите плохие
результаты. Если вы когда-либо выпускали программное обеспечение таким образом, то
знаете, что выпуск версии — это всего лишь дата в календаре. Реальное тестирование
начинается тогда, когда приложение получают пользователи. Фактически именно здесь мы
получаем альфа- и бета-версии. Разработчики и тестировщики не имеют инструментов,
которые могли бы обеспечить уверенность в выпускаемой версии программного обеспечения.
Поэтому они просто "перекидывают его через стену" на поле пользователей с названием
вроде "альфа-версия", чтобы получить данные о том, какие проблемы есть в этом коде.
Приставки "альфа" и "бета" означают, что пользователи не должны слишком сильно злиться
тогда, когда что-то не работает. Однако этот типичный подход начинает меняться.
Версия Visual Studio Team System 2008 Test Edition предоставляет разработчикам и тести-
ровщикам инструменты, которые позволяют выполнять повторяемые и автоматизированные
тесты. Эти инструменты приносят тестирование на все этапы жизненного цикла разработки
программного обеспечения (включая и саму разработку). Эти инструменты позволяют вам
начинать тестирование на ранних стадиях и тестировать часто. Результатом становится
повышенная уверенность в программном обеспечении. Эта уверенность поможет справиться с
альфа- и бета-версиями. Вместо вылавливания ошибок пользователи могут сосредоточиться
на удобстве использования и соответствии требованиям. В результате приложение будет
поставлено в предсказуемые сроки и с меньшим количеством ошибок.
В этой главе мы сосредоточимся на инструментах тестирования, встроенных в версию
Visual Studio 2008 Team System Test Edition. Они включают: управление тестовыми случаями,
Web-тестирование, тесты нагрузки и прочие. Эта глава даст вам представление о том, как
надо создавать программное обеспечение более высокого качества.
Примечание
Модульное тестирование разработчика описано в главе 26, а модульное
тестирование баз данных — в главе 29.
1076
Часть VI. Система командной работы Visual Studio Team System
Создание, настройка и управление тестами
Тестирование больше не является ручным процессом, который отслеживается при помощи
электронной таблицы Excel. Тестирование теперь встроено в интегрированную среду
разработки Visual Studio. Здесь вы можете создавать проекты тестов и сами тесты. Вы можете
контролировать, настраивать, а также управлять тестами из одного места. Вы можете также
выполнять тесты и публиковать результаты на сервере Team Foundation Server (TFS). В
следующих разделах мы рассмотрим основы проектов тестов, управление тестами, а также
настройку тестирования.
Проекты тестов
Тесты описываются внутри проектов тестов. Это знакомая для пользователей Visual Studio
парадигма: создайте проект, добавьте в него элементы. Таким образом, вы можете
сгруппировать тестовые элементы в одном или нескольких проектах. Вы можете также
зарегистрировать этот проект (и соответствующие элементы) в системе управления исходными кодами
(точно так же, как и любой другой проект).
В большинстве случаев вы создаете для приложения один тестовый проект. То есть если
ваше приложение содержится внутри решения, то вы добавляете проект теста в это
решение. Конечно, существуют и исключения. Для больших проектов вам может понадобиться
выделить проекты тестирования компонентов, модулей или даже итераций.
Тестовые проекты
Тестовый проект создается точно так же, как и любой другой. Вы можете выбрать пункт
New Project в меню File, либо щелкнуть правой кнопкой мыши по решению и выбрать
такой же пункт. В любом случае вы получите диалоговое окно New Project (рис. 28.1).
В окне New Project перейдите к узлу Test. Это позволит вам использовать шаблон Test
Project. Обратите внимание, что при добавлении нового тестового проекта вы можете указать,
должна ли Visual Studio создать новое решение или добавить ваш новый проект в уже
существующее решение.
Настройка создания тестовых проектов
По умолчанию при создании тестового проекта в него добавляются новый ручной тест и
модульный тест. Шаблон вашего проекта также дает автоматическую ссылку на
пространство имен UnitTestFramework. На рис. 28.2 показан Solution Explorer с новым тестовым
проектом, а также и с его соответствующими файлами.
Шаблон проекта Test Project можно настроить. Для этого вы должны открыть диалоговое
окно Options (при помощи выбора Tools | Options), а затем выбрать узел Test Tools | Test
Project (рис. 28.3).
В этом диалоговом окне Options вы можете указать тип тестового проекта по умолчанию
(С#, Visual Basic и т. д.). Вы можете также указать элементы по умолчанию, которые
добавляются в тестовый проект при его создании. Обратите внимание, что в соответствии с на-
Глава 28. Редакция Test Edition
1077
стройками по умолчанию включены: модульный тест, ручной тест, а также файл
вступления. Вы можете изменить эти настройки посредством выставления флажков.
New Project
Project types.
Templates*
NET Fwmevwxk.3.5 *
Visual О
Windows
Web
Smart Device I
Office
Database
Reporting '
Srfverlight
Tert
WCF
Workflow
Database Projects
Other languages
Detnbuted Systems
Other Project Types
Test Projects
Visual Stucfio installed templates
S3
Test Project
My Templates
3
Search
A project that contains tests (.NET Framework 35)
Name; TestProjectl
location- G\lrserc\rmnetf\DacumentsWisual Studio 200eAProjects
Solution! [Cr«»*rvwSoHit»n £] И Create directory for solution
Solution Name: TestProjectl Г Add to Source Control
Browse,,.
LJ1
Рис. 28.1. Создание нового тестового проекта
<Л TestPtOj«rtl - Microsoft Visual Studio Iе3 Э й I
File Edit View Project Build Debug Data Tools Test Analyze Window Help |
& * ^3' 2Ш 0 ! *3 !&JV *' ' *' * ~* > Debug • AnyCPli - g> ;j
,.U!4>*> HHitfi 5 U2323=3' . С * ;
M
I*
Щ
и
Ш
a
ill
!
R«
AuthorinfTes4s.fa(t| ■»• X
( -J
Vi.au«1 Studio Teas Syitn: OvarvieiJ^
s!
This cvaxview deacrlbea the xeac-jrei fc
7iaua>X Studio Теаи Sj-ateei end Vlrual S\- "
Opening Taata
Тэ ораш • teat, open * teat project or
excenalon .vaadif thet containe cne da:
teat projects and sietadeta £ll*a in Sol
Viewing Teata
Та ем whxen teata are available со yoi
It" you have initialled Teas Edition tor
the Teet Lire Xdlccr window cc view tei
To open the Teat View window, click tbi
then elixir Teat View. To open the Teat
installed Teax Edition Cor Sefcwaze Tei
and then click Teat Liat Sdltcr
Banning Taata
Г "" ~ Щ^~ ~л'~ >
^ Error Ы1(
dy
S^LticflE^terer-loTuttDn Items » •? x]
& j £ д)
*^3 Solution 'TestPrcjectl' (I project) 1
*.-! ~* Solution hems j
^| LocefTestRun testrunconfig
^j TestPrqjectl.vimdi
'- <3 TestProjectl
Ш M Properties
H Jk References
- -L3 Microsoft.Vi5uaiStudio.QuslityTocls.linitTe*tFramework
> -L3 System
< -Q System.Core
ja] AuthonngTests.bit
jO^j Manua|Te5tl,mht
<$J UrutTesU.cs
. dSJ Solution Explorer ^pPrcperttre 1
Lnl Coll Chi INS j
Рис. 28.2. Новый тестовый проект
1078
Часть VI. Система командной работы Visual Studio Team System
"ЩЙ'
Environment
Performance Tools
Projects and Solutions
Source Control
Tort Editor
Database Toots
Debugging
Device Tools
HTML Designer
Office Tools
Test Tools
Default Dialog Box Action
Test Execution
Test Project
Text Templating
Windows Forms Designer
Workflow Designer
Default test project language:
[Visual C* test project
When automatically creating a test project, disregard the default
fv| language setting and use the language of the production-code project
instead.
Select the files that wilt be added to each new test project, by default
ЩШ®ШтШШШ | ~ Database Unit Test
Vsual Basic test project | 4 ЩЩ^ШЕШт
Generic Test
\ZZ Load Test
Manual Tcit (text f ermat)
|(/, Manual Test (Word format)
Ordered Test
\'J Unit Test
Web Test
L <* if "^ 1
Рис. 28.3. Опции нового тестового проекта
Элементы тестов
Для Visual Studio описаны различные шаблоны элементов тестов. Каждый представляет
собой отдельный тест или версию теста. Эти элементы добавляются в тестовый проект.
Каждой является файлом, которому может присваиваться версия внутри системы управления
исходными кодами. На рис. 28.4 показано диалоговое окно Add New Test.
Add New Test
Templates*
4
Database
Unit Test
&
Manual Test
4 (Word for
№fcQ
Test Name*.
Add to Test P
■d *21
Generic Test Load Test
*|] *i
Orde/ed Test Unit Test
WebTesU webtest
reject 3Test;3roJectl
«J
Manual Test
(text format)
4J*
Unit Test
Wixard
^ItfM
iD
Descnption
Use a Web test to verrfv the funcfconality
of a Web application After you create a
Wrb test, you can assign properties that
govern its behavior
You can use a V/eb test within a load test
to test the performance of a Web srte.
[ OK ^ J | Сгпсе 1 J
Рис. 28.4. Диалоговое окно Add New Test
На рисунке показан полный список имеющихся элементов тестов. В этой главе мы опишем
все эти элементы. В табл. 28.1 приведен краткий обзор этих элементов тестов.
Глава 28. Редакция Test Edition
1079
Таблица 28.1. Элементы тестов Visual Studio
Тест
Database Unit Test
Generic Test
Load Test
Manual Test (text
format)
Manual Test (Word
format)
Ordered Test
Unit Test
Unit Test Wizard
Web Test
Описание
Модульный тест базы данных. Это тест для тестирования кода SQL
и хранимых процедур. Дополнительную информацию см в главе 29
Обычный тест Это приложение или инструмент сторонней
организации, с которым нужно обращаться как с тестом Данный тест служит
оболочкой такого приложения
Тестовая нагрузка используется для тестирования вашего приложения
при одновременном доступе к нему большого числа пользователей
Ручной тест является набором шагов, которые должны быть
выполнены тестировщиком Этот тест написан в текстовом формате Когда тест
выполняется, то тестировщик должен указать его результаты
Ручной тест (см. ранее) в формате Microsoft Word
Упорядоченный тест позволяет вам выполнить существующие тесты
в указанном порядке
Модульный тест. Это код, который выполняет часть вашего
приложения и проверяет результат Дополнительную информацию
см. в главе 26
Данный тест позволяет вам автоматически генерировать модульные
тесты для существующего кода
Web-тест используется для тестирования вашего Web-приложения
Эти тесты могут быть записаны, а затем заполнены данными для ис- г
пытания всего Web-интерфейса пользователя
Управление тестами
Чем больше проект, тем больше тестов у вас будет. Проект может иметь сотни тестов.
Каждым модульным тестом, Web-тестом, тестом нагрузки или ручным тестом необходимо
управлять. К счастью, для решения этой проблемы Visual Studio предоставляет редактор
Test List Editor. С его помощью вы можете организовать тесты в списки, группировать
тесты, фильтровать подробности тестов, искать тесты, выполнять группы тестов и т. д. Это
основной инструмент тестировщика для наведения порядка в его работе. Вы получаете доступ
к этому редактору через меню Test | Windows | Test List Editor или через панель
инструментов Test Tools. На рис. 28.5 показано окно редактора Test List Editor в интегрированной
среде разработки.
Обратите внимание на дерево выбора слева. Оно позволяет вам просматривать списки
тестов, создавать новые списки, а также выбирать тесты для выполнения группой. Сами тесты
показаны в списке справа.
Вы можете группировать список тестов по пространству имен, проекту, типу хоста,
названию класса (и т. д.) при помощи элемента Group By в панели инструментов редактора Test
List Editor. Эта панель также позволяет вам фильтровать список по значению столбца. Ко-
7080
Часть VI. Система командной работы Visual Studio Team System
нечно, вы можете также выполнить выбранные тесты прямо из этой панели (крайняя левая
кнопка).
<Л Customer Management - Microsoft Visual Studio {Administrator}
1 File Edit View Project Build Debug Data Tools Test
. A ' _d ' i3 d 0 i. Л А 'Л ' * . - '-J • -# ►
! и *>*> ы^еязаэ^ с * *
И
г°
PJ:
i
i j
I
i |
i
T«t Urt Etfltorj
Analyze Window
1«|B
Help
Debug • Mated Platforms - j/0
; ' ' $ isfl Vtf Sa< Gr0uP ty Clii$ N**"* ' 'АИ tolumr «■ <Type keyword>
P „ ^ L**1 o* Tests
~'jfc CRM User Interface
w^l Customer С lass Tes
'jp Tests Not in • list
' (£3 All Loaded Tests
1 < ! m •• >
Test List FuR-
m-ilrfoOanNiroe]
Ф BookTut
№ CmtwiKi Pi wtHeTtt
Ы GistomcrTeft
ЧИ
4
! f ry
Ш OnferTest
№ ProductTcst
.ЛЫЛяИТяШ „-,„■■,„■■■
, Ready
L -^
Test Name
AddresslTtst
AddressZTest
CrtyTest
ContactVtaEmatTTesl
ContactViaPKoneTest
DescrfptionTest
EmaiFTest
Idlest
NameTest
PhoneTest
SiateTest
ZrpTert
imnnimniir.. -lit— -iTTTiiiT-
-
• л
Project
- ~ ~ ' ~ ]
CustomerMinagerTests
CustomfrManagerTests
CustomerMinagerTests
Customer Mj nagerTeste
CustomerMsnagerTests
CustomerMBnagerTerts
CustomerManagerTests
CustomerMinagerTests
CustomerMa nagerTests
CustomerManagerTests
CustomerManagerTests
CustomerManagerTests
.17 -„„„|r ,; , , „„ ^,
*
X
1
k\
*
\щ\
—
•3
\-i j
rr
N j
Рис. 28.5. Редактор Test List Editor
Списки тестов
Узел Lists of Tests в древовидном представлении позволяет вам выбирать группы тестов для
выполнения, а также создавать новые списки тестов. Эти списки хранятся для
последующего использования в сеансах тестирования. Вы можете определить собственные списки, а
затем добавить в них тесты. Возможно, самым большим преимуществом списка тестов
является то, что вы можете выполнить список как один модуль. Это дает вам возможность
управлять группировкой тестов (например, для того, чтобы сформировать модульный тест).
Для описания списка тестов вы должны щелкнуть правой кнопкой мыши по узлу Lists of
Tests в древовидном представлении Test List Editor. Вы можете также выбрать пункт
Create New Test List в меню Test, который выдаст одноименное диалоговое окно (рис. 28.6).
В диалоговом окне Create New Test List укажите название списка, задайте описание, а
также определите, где этот список должен находиться в иерархии списков тестов. И
наконец, добавьте тесты в список при помощи перетаскивания их в интегрированной среде
разработки.
Вы можете задать тесты для добавления в список при помощи фильтра. Предположим, что
вы хотите добавить в созданный новый список все модульные тесты. Вы можете
воспользоваться панелью инструментов редактора Test List Editor для того, чтобы установить
значение фильтра в Test Type и затем ввести ключевую фразу Unit Test. Потом нажмите зеленую
Глава 28. Редакция Test Edition
1081
стрелку для фильтрации списка. Теперь у вас будут выбраны только тесты Unit Tests: Вы
можете выбрать все эти элементы и перетащить их в новый список тестов (рис. 28.7). Либо
вы можете выбрать все элементы в отфильтрованном списке и щелкнуть по ним правой
кнопкой мыши для формирования нового списка из выделенных элементов.
"TjU^H
Create New Test List
Hunt*
Business Domain Unit Tests
Description:
Executes all unit tests far business domain classes.
Select wherein test list hierarchy to place this list
4 Jfc CRM User Interface Tests
^A Customer Class Tests
QIC j I Cancel
Рис. 28.6. Диалоговое окно Create New Test List
т^щш
ДО Customer Management - Microsoft Visual Studio (Administrator)
Pile Edit View Project Buifd Debug Data Tools Test Analyze Window Help
: & T Л " %S d tf ' $ -Л Л Л ' f4 * **< * ~~> \ ► D*b"9 - MaedPlatforms
,\B
и\г>*> ыииоияая.
Ready
Рис. 28.7. Добавление тестов в список при помощи фильтра
1082
Часть VI. Система командной работы Visual Studio Team System
Совет
Тест может присутствовать в нескольких списках. Эта возможность очень полезна Вы
можете использовать тесты в различных списках, а затем выполнять эти списки.
Например, вы можете внести данный тест в список тестов регрессивного тестирования, а
затем использовать его же в модульном тесте.
Настройка тестирования
Когда вы создаете тестовый проект, то Visual Studio добавляет в решение файл настроек
тестирования. Этот файл (с расширением "testrunconfig) можно найти в каталоге Solution
Items. Используйте этот конфигурационный файл для настройки различных установок,
связанных с покрытием кода, Web-тестами, настройкой и очисткой тестов и т. д. Пример
диалогового окна показан на рис. 28.8. По мере нашего продвижения по данной главе мы будем
ссылаться на эту конфигурацию.
loceltestrun testrunconfig
- ЩШШШ! Г Щ|1ШШУиМШ|ММ
Controller and Agent
Code Coverage
Deployment
Hosts
Setup and Cleanup Scripts
Test Timeouts
Web Test
Name:
Local Test Run
Description
This is a default test run configuration for a local test run.
Test run naming scheme
о Default naming scheme
Example; MSnell0LAPTOPOQ288 2008-03-0913:47:55
<,' User-defined scheme
Prefix text
Example. B00g-0i-0913.47 55)
| Enter the name and the description of the test run configuration
1
Save Aw , - t | CJose
■■:::::::.: „::: m.,.:;:. -
Рис. 28.8. Редактор testrunconfig-файла
Web-тестирование
Тестирование Web-интерфейса пользователя не должно быть ручным процессом. Если это
ручной процесс, то не стоит ожидать, что тестировщики смогут протестировать все
возможные варианты этого управляемого данными пользовательского интерфейса. Вместо этого
они часто тестируют основной маршрут работы с системой и полагаются на то, что
остальные варианты дадут аналогичные результаты.
Visual Studio 2008 предоставляет инструменты Web-тестирования для его автоматизации.
Эти инструменты позволяют вам записывать маршруты продвижения по вашему сайту,
управлять этими запросами, привязывать запросы к данным в базе данных, а затем повторно
Глава 28. Редакция Test Edition
1083
выполнять эти тесты. Вы можете также просмотреть и сохранить результаты тестирования
на сервере TFS (для того чтобы сделать отчет по качеству данного построения).
Запись Web-теста
Новый Web-тест создается посредством добавления шаблона Web-теста в тестовый проект.
Когда вы это делаете, Visual Studio автоматически запускает инструмент записи Web-теста в
браузере. Назначение этого инструмента — позволить тестировщику записать набор Web-
запросов. Эта запись будет служить основой для описания Web-теста.
Допустим, что вы хотите описать Web-тест для приложения Customer Manager.
Предположим, что текущая (тестируемая) версия содержит Web-формы, которые позволяют
пользователю делать поиск клиентов и редактировать их профили. Тестировщик должен зайти в
каждую из этих функций при включенном инструменте записи. Пример показан на рис. 28.9.
G
[—> и W&W
5$ Untitled Page - Windows Irrtemel btptorer
Q!^ ; ♦ H; http//lo£alho5t52768/CastonierMan»g«r>FJndCastDm«r.eipx
& 4* j^jUnWedPage
Web Test Record* :
£> " Ш v »* * CJ P*9* "
p ■
% Toots »
>J Record 1 ii Pause У Stop ^J X
_£ bttp .• /tocalhost 527^'CudQrnerMarager/FJ
-i Ji rfitp /^а!Иой,52768Л^а«огп«Малавег/Н
L. tJf Form Peat Parameters
.U _VlEWSTATE-FrfbcMNE5ipll>hod
Ъ aKasCortertFlaceHolder1$Te4Bo[
3 ctlSSSCortenlFlaceHolderlSflUlon
-S _V1EWSTATEENCHYPTED-
.& _EVENP»'AUD^T«N4g34Sli?A|
'i j* http //tocatioa 527£S/Cus(omerManager/F]
5) ^h^vV1ocalhoM5276&',CustomerManaser'iF
R J. hrtp /Vtasahost 527€с,СийотвгМападег/Н
rI J. http /4осаЫй 527^/Cus(omerManaser/d
j% QuaryStnng Parameters
ч Q} custlc «BERGS
X LI/ Form Post Рагвтйея
f J- Wp/docatiBil 5275S/i:usJDmerManager/F|
F: J> hJpy^ocalhost 527&8/Cudomer№neger/F
4» J* http /dosahosL 527€S.tuitDmerManager/d
+ j. http //locaihost 527Ш^«1огпегМападвг/Н
Ш ^ httpyVJocalhajt 527fiM^*omertonager/F
comoso
New Cjstc-ne'
Fine1 Order
Hone: Find Customer
Customer Manager
instructions Find Customer
Enter a customer
id of name and
click th*ttnd
button to return a
Ы of customers
matching your
search criteria
Enter a Customer Name
an
Cu6t«j*eri&-Ccnt»*^^
AliATR
ant on
EASTC
GOtRL
IAMA1
TRADH
Ana Trujillo Owner
Antonio
Moreno
Mexico
DF
Mexico
DF.
Ann Devon Sales Agent London
Andre Rwbecd
Saies
Associate
Campinas <"Hf
Annette Routet Sales Manager Tot,[ousp 31C
Anabela
Dom nques
Sales Sao
Represented e РгЫо
/ Trusted sites | Protected Mode: Off
•*„1QQ%
Рис. 28.9. Инструмент записи Web Test Recorder
Обратите внимание, что запись производится в левой части окна. Инструмент Web Test
Recorder предоставляет панель инструментов для приостановки или остановки записи, для
удаления запроса из списка, а также для добавления комментариев (примечаний) между
запросами. И наконец, обратите внимание, что записаны и подробности запросов
(содержащие QueryStrings и публикации форм). Чуть позже мы опишем это подробнее.
Visual Studio записывает запросы в Web-тест при остановке записи. Сохраняется полный
набор запросов, который записывается в тест. На рис. 28.10 показаны подробности примера
Web-теста (в средстве просмотра Web-тестов).
1084
Часть VI. Система командной работы Visual Studio Team System
Обратите внимание на панель инструментов Web-теста (над списком Web-теста). Кнопки
этой панели позволяют вам (слева направо): повторно выполнить тест, привязать тест к
источнику данных, указать данные учетной записи пользователя для выполнения теста,
продолжить запись, указать дополнительный модуль для Web-теста, указать дополнительный
модуль для запроса, сгенерировать код из Web-теста, параметризировать Web-серверы,
превратить динамические параметры в параметры Web-теста, создать сеанс профилирования
производительности из Web-теста. Мы опишем большинство этих элементов в
последующих разделах.
S* 92714 - Microsoft Visual Studio
i Rle Edit View Project Build Debug Data Toots Test Analyze Window
К» ^iiiiMl
Help
! Л • jd ' \3 Ц 0 A "& Л i *"* " **" * -*ь - ««* ► Debug » Mmed PlaLfomw • &
. £J *> H ' У fe$, & £3 13 Л =3 ': : ? ;
1*
iSf
IS
\m .
'Ъ '
i»
'X
.2
'1
.8,
!
•
i
i
!
ММРШМ)" WebT«U.webtesl Г X
«>- {j ^'53 suit**! A
<tj WebTestl
•"it J^ bttp://loc»lhort'52768/'CustomerMana9er/FindCustemer asp*
Cu _£ http.//loc»lhosh52768/CustomerWenager/FindCu5tomeraipx
& _£ http.'//localhost5276B/CuitomerManager/Fir>dCustcmeratpnr
5) Jr http;//localhosfc52768/CurtomerManager/FindCustcrner.aspx
3j _i- http://localhD5t52768/Cu5tomerMenager/FindCustcmer.aspx
4 ^ httpt//localho5t52768/CurtomerManager/CustomerEdit2 aspx
- <2J QueiyStnng Parameters
< d 1J Form Pent Parameters
a 1^2 Extraction Rules
X ,_£■ http,//localbost:52763/CustomoManager/FindCuitomef>a5pjt
X ■_£• httpV/localhost:5276e/CustomefManager''FindCu&tomer»aspx
.7 ^J- httpV/focalhostS2768/CustomerManager''Customer€drt2,upx
71 _J. http//localhost52768/CustomerManager/FindCustorner,a5p«
♦ _i> Kttp'://locBlhostS2768/CustomerMariager/FindCustomer^spx
t U Validation Rules
1 ; ; .. jr - ■-■■ ■ ■ '
-4 !!I^i!^lSiS*;i?5!i^l
Ready
SeluUen Exoiorer- Sctutterv 51714 8 „ •» Д
j ^3 Soluttcn "92714' C projects)
i 'tl -i Solution Items
1 Si &C\ S92714A
| '£ jjfc GV-\Customef Manager\
, j у ,ji CurtomenVlgrTesti
; ) v^l Properties
! "£' ;&Я References
;~ ^ WebTestl w,ebtest
, РтореНим ▼ A
j i Microsaft.VisualStudio.TestTools.WebStres5.Q
i U t ' -*>
I'l^jii!^
. В Mis>.
P'";i'fbVV «* eF-O-
],B r«»wM
Name custld
j' URL Encode Fabe
•. Value BERGS
|[ Misc
—
X 1
xl
*
I
~
Рис. 28.10. Записанный Web-тест
Управление запросами Web-теста
Запросами Web-теста можно управлять. Вы можете переместить их вверх или вниз по
списку (они выполняются по порядку), удалить их, а также добавить между ними новые
запросы. Когда вы описываете эффективный Web-тест, то должны обязательно охватить все
запросы и возможные условия запросов. При этом в ваших записанных запросах обычно
получается большая избыточность. Поэтому есть смысл пройти по каждому запросу и
сократить ваш тест до необходимого объема.
В нашем примере вам нужен следующий список запросов:
□ начальный запрос FindCustomer.aspx;
□ публикация формы в FindCustomer.aspx, которая делает поиск клиентов (посредством
нажатия кнопки Find);
Глава 28. Редакция Test Edition
1085
□ еще одна публикация формы в FindCustomer.aspx, которая происходит тогда, когда
пользователь нажимает кнопку редактирования клиента в представлении GridView. Эта
публикация перенаправляет к CustomerEdit2.aspx и передает идентификатор клиента в
QueryString;
□ совмещенный запрос с публикацией в CustomerEdit2.aspx, который показывает
пользователям клиента и сохраняет подробности клиента при нажатии пользователем кнопки
Save.
Вы видите, что этот список охватывает все основные функции тестируемых нами страниц.
На рис. 28.11 показан уже сокращенный список.
1тШШУ
ч* 92714 - Microsoft Visml Studio
File Edit Vie* Project Build Debug Data Tools Test Analyze
u44 »^ «*] SQ 1=123 =3! ft * * "~
Window Help
* Miied Platforms
I
ДИаМШйЮРЩ* WeWe*l.w«att«tj
j^WebTertl
- _J> httpy/loci№io5t52761/CuitomexMinigef/FindCiKtomerjip*
■ g CJ Eatractwn Rules
£ ^ hktpr//loca№oit5776B/CustomerMarMgrr/FmdCustotneT.asp>
Л СЭ Form Post Parameters
3 !I3 Extraction Rules
1 _aV httpy,1ocifhoft'527M/Curtome/Menag«r/FindCurtomer.aspi
M '^Л Form Poat Parameters
S Ji Extraction Rules
u J- http.'//localhoit5276S/CuKtomerManagcr/Ct»tomerEdrt2.upm
l+j-^a QucryStrmg. Parameters
i*l !2fl Form Port Parameters
V L£ Validation Rule*
■■9%
j ^ Error list J3 T*rt ^f^fi
Ready
SolUiofdrxpfrt/et
1 ^) Solution *9271*' C projects)
№ J Solution hems
Й ^ OV \M714\
© # C.-V-\CiHte«HErMjnag«r\
4 ^3 CustomerMgrTerts
6}~ c^l Properties
Ш jkl References
^ WebTertl.webtert
^Wp'tetifi "" w"t *
Microsoft VisualStudio TertTools.WebS -
Рис. 28.11. Сокращенный список Web-теста
Выполнение Web-теста и просмотр результатов
Вы можете выполнить свой Web-тест из панели инструментов Web-тестов. При этом Visual
Studio выполняет каждый запрос и записывает всю относящуюся к нему статистику. В нее
включаются: результат запроса, его размер, время отклика, подробности происшедшего. На
рис. 28.12 показаны результаты созданного ранее Web-теста.
Обратите внимание, что вы можете просмотреть подробности каждого запроса. Эти
подробности могут быть сохранены для последующего анализа. Так сохраняется свидетельство
того, что происходило при выполнении теста. У вас есть доступ к возвращенному HTML,
подробностям запроса, подробностям ответа, контексту запроса, а также и прочим
подробностям — таким как исключительные состояния и правила извлечения (которые мы
рассмотрим чуть позже).
1086
Часть VI. Система командной работы Visual Studio Team System
iff 92714 - Microsoft Visual Studio
. File Edit View Project Build Debug Data Tools Test Analyze Window Help
Si" " <_i Oil Ш i. -ii J. "l - { v x " ~% Ъ Debug » MutedPlatfопте
U •> **> ы & ~> 23 э 13 ^ ; t * s
yrf
3
1
о
i
WebTestl 14:07 PMj; ^TttQ.ttffet** j _ . _
I . >' * Д:^>Мш1 -* -? *ЭЛ
Request HTTP Status
|s^ Я _^ hrtpy/localhcsfc52768.'CustomerMBnager/FindCu$tQmeraspx 200 OK
L? И £ http//lotaUiosfr52763/CustomerManager;TindCustorr«r.aspx 200 OK
L£ Ч ^ http7/localhcst5276S/CustomerManager/FindCustcmer aspit 502 Found
Ll S -^ bttp //loc*lhost5276e7CustomerMarwger/CurtomefEdrt2 aspx?c 200 OK
*£ Ы lir* httpvVloculhost52768/CustomerManager<;Cu£tonr>erEdi.l2.Bspx?cu&ti302 Found
[ Web Browser i[ Reqget [ Response f Contert [ DetaiU |
-tarre . ^Ird Custon sr. Edit Customer
Customer Manager
Instructions Edit Customer
Instructions Contact Name Title
Antonio Moreno Owner
Phone Number Fax
E) 555-3932
Jj, b'z (Itatjp Test Result*'
Ready
total Time
1.041 sec
0.022 sec
0JJ23«c
0.035 sec
[^(©«йУдвГ
• & Jli
~ X
Request Time Bytes
lJ529sec 9,253 *
0.013 sec 15,489
0J012 sec 165 "
0004 sec 11,085
0015«c 151 -|
|&
1
"M
M
T
и
>
Рис. 28.12. Результаты Web-теста
Заполнение Web-теста данными
Реальная сила автоматизированного Web-теста состоит в его способности заполнить тест
данными из базы данных. Таким образом, вы можете протестировать гораздо больше
возможных вариантов вашего Web-приложения. При ручном тестировании это практически
невозможно.
В нашем примере у вас есть несколько вариантов заполнения из базы данных.
Предположим, что вы хотите вызвать экран редактирования профиля для каждого пользователя из
базы данных. Затем вы хотите сохранить эти профили обратно в базу данных. Другой
вариант: вы хотите заполнить данными страницы поиска и отфильтровать списки. Выполнение
этих нескольких тестов с большим количеством строк данных будет хорошим испытанием
для Web-интерфейса.
Описание источника данных для Web-теста
Первым шагом необходимо задать источник данных, которыми будет заполняться ваш
Web-тест. Вы можете сделать это в панели инструментов Web-тестов (значок базы
данных). Нажатие этой кнопки запускает мастер New Test Data Source Wizard (рис. 28.13).
Первым шагом этот мастер позволяет вам выбрать в качестве источника базу данных, csv-
или xml-файл.
В этом примере мы создадим два источника данных. Сначала мы создадим csv-файл,
который содержит строки поиска для проверки функции поиска клиента. Следующий шаг —
Глава 28. Редакция Test Edition
1087
выбор csv-файла. Для нашего примера предположим, что у нас имеется простой csv-файл,
который содержит все буквы алфавита. Этот файл показан на рис. 28.14 в мастере
источника данных.
Kev» Test Data Source Wizand
1 с
-~J3 S«*e<*tbe type of d*t» source
Data sourer name
FindCustomersSource
| Dit* source type
11 Щ Ш
Database CSV file XMLFile
A CSV file rc selected as the source of data
w»
:>. )L N«t» ]
r-H^
j
I
!
fe
> Caned
Рис. 28.13. Мастер New Test Data Source Wizard
При помощи этого же мастера мы добавим источник данных Database, который будет
соединяться с таблицей Customers. Мы будем использовать эту информацию для передачи
всех клиентов из базы данных в страницу редактирования клиентов нашего сайта. После
завершения этого добавления источники данных появляются в списке Web-теста. Это
показано на рис. 28.15.
Эти источники данных специфичны для каждого теста. То есть они не влияют на ваш код.
Обратите также внимание, что на рис. 28.15 таблица Customers выделена и показаны ее
свойства. Здесь для каждого Web-теста вы можете указать, как осуществляется доступ к
данным или их загрузка. Вы можете извлечь эти данные одним из следующих способов:
□ Random — случайный доступ к строкам таблицы;
□ Sequential — последовательный доступ к строкам таблицы по порядку. После
выполнения всей таблицы процесс запустится сначала (в цикле) и будет продолжаться в течение
длительности теста нагрузки;
П Unique — то же, что и последовательный, но без цикла.
Эта настройка метода доступа более важна для теста нагрузки, когда тест идет в течение
длительного промежутка времени. В Web-тесте вы указываете количество строк, которые
вы хотите выполнить в качестве теста.
1088
Часть VI. Система командной работы Visual Studio Team System
New Test Data Source Wizard
•Jp
Select the CSV fie the data source h based on
Choose a CSV file
C:\Users\msne^DocumentsWr5ualStudb20Q^ProjectsN92714\findcustomer.c»v
Preview data
I \'\ [шшк'дшу!
В
search.stnngs
Finish
Рис. 28.14. Источник данных CSV
ч*> 92714 - Microsoft Visual Studio
Fife Edrt View Project Build Debug Data
:л- ja-и ы АР ма -a a ** -j; * i
"JJJT WebTestLwebtest*)
Tools Test Analyze Window Help
' ■<■ '. ► Debug » Mixed Platforms
i? _
▼ X
'i».
|*>* i'j ^ » ^iai^j^-jg ^M j
^WebTestl
a _!■ http.7/localhosL52768/CustomerMar»ger/F»ndCustomer.aspx
±1 _^ htrpv//Jocalhast52768/CustcmerManager/FindCustomer aspx
71 jj» http:/yiocalhDst52768/CustomerManager/FmdCustDmer.asp
i) ^ http://localhost£2768/CustomerManager/CustomerEdit2 asp*
j d yJ Data Sources
К J FindCustcmersSource
К 13 Tables
^ findcustcmer^csv
(-, J Customerfds
Ы ^ Tables
i"*l Customers
D L3 Validation Rules
.ib E'f» tut Z3TcstR«iuits|
Ready
i Properties •* £ X '
i Microsoft.VisualStud1o.TestToQlsAVebSuessJ3ala* « i!
В i;ata
Sequential
i Access Method
Рис. 28.15. Источники данных Web-теста
Глава 28. Редакция Test Edition
1089
Привязывание публикаций форм к данным
Следующий шаг — привязывание тестов к данным. Обычно привязка производится к
параметрам строки запроса и значениям передачи форм. Давайте сначала рассмотрим привязку к
параметрам передачи форм. Предположим, что вы хотите выполнить поиск для каждого
элемента в csv-файле. Вы можете сделать это посредством привязки текстового поля поиска
(страницы поиска клиента) к столбцу данных в csv-файле. Пример показан на рис. 28.16.
В этой конфигурации форма будет передавать значение из csv-файла так, как будто
пользователь ввел его в текстовое поле. Для нашего теста мы хотим также имитировать выбор
пользователем первого возвращенного элемента в сетке. Это можно сделать при помощи
перехода к параметрам передачи формы страницы FindCustomer.aspx. Пример приведен на
рис. 28.17. Здесь вы видите, что EVENTARGUMENT=Editltem$0. Текст Editltern— это
текст команды для кнопки просмотра сетки. Число указывает выбранный пользователем
элемент. Для выбора первого элемента мы установили его в ноль. Если не будет возвращено
ни одного элемента, то тест приведет к ошибке.
Мы также настроили для страницы CustomerEdit2.aspx привязку custid строки запроса в
пустое значение. Это позволяет выбранному элементу быть переданным на страницу. Вы
можете это видеть на рис. 28.17.
<*> 92714- Microsoft Visual Studio .
File Edit View Project Build Debug Dili Took Test Anaryu
№1
*
i»
|I
I*1
m
И
111
i
1 i
WeVTestLwefatest*) - X
[^ WebTestl 1
н ± http://locilhDSt5276t/CustofnerMefM9er/FindCuEtcmer^spK
: ■ t 13 Extraction Roles
-) J- http//loc»IKo*t5276e/CLJrtomerManager/,nndCostcmcr.t$p«.
< л ui Form Post Parameters
j > ^j_VIEWSTATE=f{SHlDDEM._VIEWSTATEH
> Ly «tCO$ContentPI»ceHokled5TextBo«F»ritr4#me=«
1 . Jij ctDOSContentPlexeHolderl$B<ittcml=hnd
i ' $ .WEWSTATIENCRYPTEDsHSHroDENl _VIEWSTA1TENCR1fj
l^_EVtNTVAUDATTON=USHH>DEKtt._EVENTVALDATION}}
> & 12 Extraction Rules
'il LaV http://loc«lhcsfc5276a/CustomerM*njger/FindCiHtomer^sp«
-J Jb r)ttp://1ocalhosfcS2768/CustomerManager/Customerfdit2^spir
й £j QueryString Parameter?
' jfo custid={{CustomerIds.Cu«tomen CustomerlD}}
< jj Cl Form Post Parameters
3} Ф Date Sources
Л) Dl Validation Rules
«i\~ ^ 4 j 4
J4 ttrct Let! J3 Test Results!
. Ready
<= Б)
Window Help
- Mued Platforms - j j^
j Microsoft.VisuafSludio.TestToofs.WebStres5FormPostPa -
aflii -4
В Мъ:
Rrcardri «л.о-1 ?
! Name cttOOSConlcntFlaccHoldcrlSTe
i URL Encode True
[Value
E fj FinrJCustomersSource
3 13 rmdcustomer*csv
*i \i CustemerIdV.i
J Add Data Source
33 Refresh Columns
L .
и "
Is
II
Рис. 28.16. Привязка к параметрам передачи формы
Перед тем как выполнить тест, вы должны сообщить инструменту о том, что необходимо
выполнить Web-тест для каждой строки базы данных. Вы можете также указать
фиксированное число повторений для вашего Web-теста. Это значение изменяется в testrunconfig-
файле. Пример показан на рис. 28.18. Здесь выбрана опция One run per data source row.
1090
Часть VI. Система командной работы Visual Studio Team System
«/> 9271* - Microsoft Visual Studio
jgai ОЭкцГшГ
File
Edit View Project Build Debug Data Tools
ЫйС^тшлш^ WebTestLwebtert
Test Analyze
j* Debug
Window Help
» Mixed Platforms
В
- _|. Kttp //localhost52768/CustomerMaruger,TindCu5toruer aspx
Э U Extraction Rules
- _£ httpy/1ocelhost5276e7Custome/Manager/FindCustemer.aspii
f+1 ^J Farm Post Parameters
Ш <_J Extrartion Rules
- ^ http//localhosfc5275B/CustomerMari4grr/FindCustomer.aspx
c-J Li Form Post Parameters
lolderlSGrtdVwwl
^ctlMSContentPtaceHolderlSTextBoitFirstNamesUFindCustomersSoii^i a f/i
ij, _VIEWSTATEEfOYPTID={{$HmDE№._VTEWSTATEENCRYPTED}r
a _EVENTVAUDATiaN={t$HroDENl _EVENTVAUDATION}|
,*f ZA Extraction Rules
J. httpy/localhostS2768/Custome;Menager/CostomerEdrt2.aspx
i QueryStrtng Parameters
Solution Explorer/ ▼ИХ
^ j? 23 _ „ „ .
^5 Solution 92714' C projects)
i-j ^ Solution hems
^ 92714 vsmdi
^ LocalTestRuntestrunconfig
Ы JP СЛ..\92714\
Q $ GV..\CustomerManager\ *•
РгорейГеГ"' "™^ """ * a x
Microsoft VisualStudio TestToofs.WebSlress Forml -
t: и
"i v
В Pa»*-»* *>
Name
URL Encode
Value
_EVENTARGUMENT]
True
EdttltemSO
\ Form Post Parameters
-jj Data Sources
_J Validation Rules
j J& Eror list ^3 Test Results
Ready
Рис. 28.17. Настройка выбора в представлении сетки
tocaltestruntestrunconfjg [Modified!
General
Controller and Agent
Code Coverage
Deployment
Hosts
Setup and Cleanup Scripts
Test Timeouts
Number of run iterations
- < Fixed run count i
«* One run per data source row
Browser type.
Internet Explorer 7<0 *j
Network type-
LAN J
J Simulate think times
I Set properties to control how Web tests are run. Note that any Web tests in a load
I test will use the settings of the load test.
Apply
Рис. 28.18. Настройка Web-теста на выполнение
по одному разу для каждой строки данных
Когда вы выполните тест, то он будет выполнен для каждой буквы алфавита, хранящейся в
csv-файле B6 раз). Вы можете это увидеть на рис. 28.19. Обратите внимание, что
результаты даны для двадцать шестого прогона (для буквы z). Обратите также внимание и на
сообщения об ошибках. Вы можете использовать кнопки поиска Next и Previous Error (красный
Глава 28. Редакция Test Edition
1091
кружок с белым крестиком) в панели инструментов для быстрого перемещения между
ошибками. В нашем случае ошибки были сгенерированы тогда, когда мы дали тесту
указание выделить первый элемент в сетке, а поиск не вернул ни одной строки.
<J* 927I4 - Microsoft Visual Studio
Rfe Edit View Project Build Debug Dale Tools Test Analyze Window
Help
-0' -jj* 3 У 0 $> 4A \ '** * *x r */» * I > Qtkuq - Mued Platforms
j.Q *>** >ifc£> "i iJ3 3f3i it> e
' ^' WebTesIl [5-15 PMJ ^аШЩявщщ^...ШШШФШй
m
1ЙГ
ч
я
В
i
i
Bui
': г 1,J ?;^l|Sk| Р'Л*ь а
Request HTTP Status
«2 Я -> http.^1ocalbost52768/CustomerMsnager/FmdCust 200 OK
£? В ton 26
^ W J. http-//localhort52768/CurtcmerMan*ger/FindCurtom-200OK
$ fB Ji http://rocalhoA52768/CustcmerMeneger,'FindCustomi2DOOK
>*? P J- http://Jocalhost5276a7CurtcrnerManager/FindCustorni 302 Found
^ vj jy http.7/locjlhost52768/CustomerM»ruger/Cu«tom«200OK
Web Browser Request j Response [ Context | DeUii»
Customer Manager
instructions Edit Customer
Instructions Contact Name Trtle
Zbyszek Piestrzeniewicz Qwnei
Phone Number Fax
Tctal T»me
0 019 sec
0 043 sec
0 016 sec
B6} 641-7012 B6N42-7012
Address City
j£ Error List 3^e$t Р-иийа.
d succeeded
• 3
Request T»
0004 sec
0007 sec
0.033 sec
0003 sec
0006 sec
State
1 -vxu Ш imK^imI 1
-
ij
Bytes
9.258 *
9.258
10.840
165
11Д14 -
*
i !
11
JL,
Mb:
dt
m
s
" *
Postal Co. " \
Рис. 28.19. Просмотр результатов
Привязывание строк запросов к данным
Для привязывания к параметру строки запроса необходимо выбрать параметр в запросе
Web-теста. Затем нужно просмотреть свойства параметра. Здесь вы можете присвоить
свойству значение поля базы данных. На рис. 28.20 показан пример привязывания параметра
custld строки запроса (страницы редактирования клиента) к полю
Customers . CustomerlD таблицы базы данных.
Предположим, что в этом примере вы хотите попасть на страницу редактирования клиента
для каждого элемента базы данных. Вы хотите проверить, что элемент правильно
открывается и отображается. Вы хотите также выполнить сохранение для каждого элемента. В
нашем примере мы будем использовать для этого одну таблицу— Customers. Однако у вас
могла бы быть одна таблица для чтения данных, а другая — для сохранения изменений.
Вы уже видели первый шаг на рис. 28.20. Здесь мы привязываем запись клиента из базы
данных к параметру строки запроса. Это позволит форме загрузиться должным образом.
Однако нам нужны данные при передаче нашей формы. Поэтому мы привяжем эти же
элементы базы данных к передаче страницы редактирования клиента. На рис. 28.21 показана
привязка этих элементов.
1092
Часть VI. Система командной работы Visual Studio Team System
<4> 927 U - Microsoft Visual Studio
, File Edit View Project Build Debug Data Tools Test Analyst
I. 0| * SiJ Г 'J Ы^\Л,МЩ,Л:^.^^'Л * Debug
.u *>*» «m*isi3233 4:2i: « *
Ml
■3
l#
il
■•
'
R«
W«bTastl.«mlrtest» - X
LjjWebTestl " " 1
Л Jr httpv'/localhoftS2768/CuftomefMana9tr/FindCuilomer^spi
t Jt> hnp>y/1oc«fhostS2768/CustomerMana9er/FindCustomef.asp>
tJ laV httpy/localhostS276S/CustQmerMana9er/FindCu«tomerjtpx
S J- hltp://lot.alhoit5276BVCuitom*rManager/Cu>lomerEdrt2.«pM
H CJ QueiySbno Parameters
^]l cuctld=({Cust(m)edds.Custome».CirstomerD)}
3 !Л Form Poet Parameters
i <ч|1 Data Sources 1
f i£| Validation Rules
3, Errer List 3 T«rt B«uJn!
•dy
Window Help
• Maed Platforms • £§
. ^roperSe» % ^
l.= a
й 0
-j
>r Д X
MraoscftVi»ualStudio.TeslTooliWebStress.QueryString •
!b mw
I KrVsHdHv'flUc Am 0П
В Par^welr»
j Name сшШ
! URL Encode fahe
nJ
3 1
r
1
n
■шЯ^вааааааааааааааанШ XuttomcrsjCustofneflDTw
IB ftrpatiu
j Show Sep
iVatucT
3 *21 Customers
! 3 Address
j 3Gty
j 23 CompanyName
\ 3 CorrtactName
j U CantactTitle
< 3] Countn/
2] Phone
j Ц PostalCode
(j Add Data Source
31 Refresh CoiLmns
*
i |
Рис. 28.20. Привязывание теста к данным из базы данных
Н^И»
S*> 9ЛК - Microsoft Visual Studio
File Edit View Project Build Debug Data Tools Test Analyze Window Help
'•4f -^' 4 jsL*l V V..4..*}...'..**..'..*.!r."..* * ?*"? 'J*?d?!!tfom?. _ • Ш
\
0\
if
*I
4 и
*
*
i
i-" i
Bu
) «p*> ►j3*#,^53JE33J^'r ,
O^fMW^altJSiaiPid^QrtTMWebTert.weiHest! - X
[*мю -* • «spioat^jjt
<;] QstringWebTest • I
- _aV httpy(/localhost5276e/CustomerManager/CustomerEdrt2.a$p)i
U ili QueryStrfng Parameters
s {Щ custld={{Customerids Customers CustomerlD}]
A Li Extraction Rules
~ _^ http:/Vlocelhost527^CustomeiMeruger/CustornerEdilfospji.
M ^3 QueryString Parameters
!*Q custId=l{Custornerlds,Customers.CustomerIDH
Q CJ Form Post Parameters
& _VIEWSTATE=HJHIDDEN1._VTEWSTATE))
^ ctlOOS(jntentPtBc^o»dermeiiiBoih»Bme=KCustornerid^
> ^ctW$CortenlP(«CHoldwlST«xlBoITrt)e={{Curtom«idsCuitofnen.Cc>nt*ctTiUe}}
V|uj ctnQSContentPfaceHoldeflSTellciid>hc«es{{CuslomefTdisXustomen.PhonrH
-vft ctCOSContentPUceHoUerirTelBoi[Fa>={{Customerids.Customen.Fax}}
4j cUOOSCorrt«ntPlaceHoldtrl$TedBoiAddres={[Clrttomeridt.CurtWTiarsJVddreK(}
4i rtCO$ContentPlaceHoldernTertBo«City={{Cu£tomer]d».Customers.C*rtyH
> .Jjj rtl00$ContemJ>laceHolderlSOropDownLijtState=|select state]
^ .^ ctlQOSContm(PlaceHoldwlSTcilBo«PostalCode^{{CustomerIdc.CustomenJ>ostarCodeH
Jft ctOHContentPleceHolded SButtonSave=Save
eft _EVENTVALmAT10N= H$HID0EN1._EVENTVALIDATI0NH
[ i, <$J Data Sources »j
J^ Error List T} Test Results
Ed succeeded
»♦
?
jo
II
3
■o
N
L3-
li*
i 3
g.
Рис. 28.21. Привязывание теста к данным из базы данных
Когда вы запустите этот новый тест, то получите выполнение для каждой клиентской записи
в базе данных (в данном примере таких записей 91 штука). Конечно, вы можете использо-
Глава 28. Редакция Test Edition
1093
вать результаты теста для создания элементарной работы по исправлению любых
обнаруженных проблем.
Совет
Visual Studio предоставляет полный контроль над Web-тестами для тех тестиров-
щиков, которые могут писать код. На панели инструментов Web-теста есть кнопка
для генерирования кода. Нажатие этой кнопки создаст файл класса, который
представляет собой Web-тест. Этот Web-тест использует пространство имен
Microsoft.VisualStudio.TestTools.WebTesting и может быть
отредактирован вручную.
Извлечение значений из Web-тестов
Вы можете усовершенствовать ваши Web-тесты посредством создания собственных правил
извлечения. Эти правила позволяют вам извлекать из запроса ключевую информацию и
сохранять ее как часть результатов теста. Например, вы можете извлечь значения из HTML-
атрибутов, такие как URL якорного тега или имя кнопки. Можно также извлечь текст
страницы, значения полей формы, значения скрытых полей и т. д. На рис. 28.22 показан пример
диалогового окна правила извлечения.
Add Extraction Rule
{■-ЫйЫ
Select в rule
[^Extract Attribute Value
О Extract Form Field
jij Extract HTTP Header
^Extract Regular Expression
,J|Extract Text
jjExtract Hidden Fields
и** л
[B Options
Context Parameter Name
В Parameters
ШЕЗЖЁШГЯвваЯ
Html Decode
Required
CurtomerName
Щ ContentPlaceHDlderlSTextBoxName
True
True
Form Field Name
i The name of the form Held whew value should be extracted»
Description for selected tbic
Extract the value of a specified form field in the response and place it into the test context
Рис. 28.22. Описание правила извлечения
Вы можете получить доступ к этому диалоговому окну при помощи щелчка правой кнопкой
мыши по запросу Web-теста и выбора пункта Add Extraction Rule. Здесь вы можете опи-
:ать различные типы правил. Для нашего примера вы создадите правило для извлечения
шачения из поля TestBoxName формы. Обратите внимание, что мы установили Context
Parameter Name этого правила в значение CustomerName. Это имя позволит нам
идентифицировать данный параметр в результатах теста.
1094
Часть VI. Система командной работы Visual Studio Team System
Результаты показаны на рис. 28.23. Извлеченные значения вы найдете на вкладке Context.
На вкладке Details (не показана) вы сможете просмотреть результаты ваших тестов
извлечения. Если извлечение даст ошибку, то она появится на вкладке Details.
File Edit Vie* Project Build Debug Data Tools Test Analyze Window
Help
П ' -J " —i -I & j & "^ 1~ ! "* ' " ' »>-*->* ► Debug «■ Mixed Platforms
c<D *>*•> ^ ^ z з з а ц ■ с г т ч
\&
lfl
ti
<j
EdilCustomer» [5:56 PM], ШСиЙЙГОвГ5.£ШШ1] EditC^teme«ja«ibt«t]
' *< ! л ' & 4j feB ^ * ** **
^ P«netf Click here to run again Internet Explorer 7.0 LAN F.drt. run settings
Request HTTP Status
^г [^ F КипЗ
н i^ Я J- httpy/lo«lhost52768/Cu5tom«rMen*9er/Curtomer€di200OK
2. i^ R _^ http://'tacalhosfc52768yCuslomerMdnager/CurtcrnerEdi302 Found
i 1 |^ T -» bttp //localharti52768/CustornerMar»ger>FindCurt 200 OK
<j E Кия4
Rea
Web Browser j Request f Response Context Detads
j Name Value
j Customerlds Customers ContactNeme Antonio Moreno
Custcmerlds Customers ContactTitle Owner
1 CustcmerldvCustomervCustcmerlD ANTON
| Customerlds Customers F«
i Custcmerlds Customers Phone EM55-3932
CustomerIds.Customers.PostalCode 05023
ШШШтМШж^ ■>-ш---у- ; \ ■;; l ШшШш» - ■"
< j m >
$ Error 1 f<t j% TMt B«uta|
r
Total Time
0019 sec
0046 sec
- " "
-.»
Request Ti..
0 004 sec
0.013 sec
0 01S sec
Icsi&Mtfttfail
- X
Bytes
11.085
151
9.253 ~
-
2
>
-
1
4Н
•3 i
a.
&
о
r\
Рис. 28.23. Просмотр извлеченного значения
Связывание страниц с извлеченными значениями
В дополнение к просмотру этих извлеченных значений вы можете использовать эту
информацию для связывания запросов. Вы можете извлечь значение из одной страницы, а затем
передать его в другую. Например, при описании правила извлечения вы дали параметру имя
CustomerName. Это название становится именем переменной, которое вы можете
использовать внутри окна свойств Properties при привязывании элементов теста к значениям.
Правила проверки
К каждому запросу вашего Web-теста вы можете добавить правила проверки. Правила
проверки позволяют вам проверить страницу (или запрос) на определенные ожидаемые
значения. Эти дополнительные проверки выполняются при запросе. Правила проверки
допускают: возможность проверки значений полей форм, HTML-тегов, времени запросов и т. д.
Правило проверки можно добавить при помощи щелчка правой кнопкой мыши по запросу
Web-теста и выбора пункта Add Validation Rule, который выдаст одноименное диалоговое
окно. Здесь вы можете описать тип правила и его параметры. Например, следом за запуском
пользователем поиска на странице FindCustomer.aspx появится гиперссылка для редактиро-
Глава 28. Редакция Test Edition
1095
вания (если данные есть). Мы можем добавить правило проверки Find Text для
определения, вернул ли поиск какие-либо строки. Для этого необходимо создать правило проверки
Find Text и ввести соответствующие параметры. Пример показан на рис. 28.24.
[?1»£Ы
Add Validation Ri-ie
Sdect a rule
V* Form Field
Ъ? Find Test
J Maximum Request Time
•^ Required Attnbute Value
у Required Tag
■^ Response URL
Properties for selectee
E)ai|*j
В Options
В Parameters
i Fmd Text
Ignore Case
Use Regular Expres
Pass» Text Found
rule.
sion
Ц High
[edit] < /a
False
False
True
FI
Level
' Sets the validation rule level Only rules at or above the load test
level ere executed when a Web test is tun under load
Descriptton for selected rule'
Verifies the existence of the specified text in the response.
Рис. 28.24. Описание правила проверки
V**» 9271-1 - Microsoft Visual Studra
File Edit View Project Build Debug Data Tools Test Analyze Window Help
• i"r J'J Jdi )l & ;!*"- s" " " * ► Debug - Mixed Platforms
У "> *> Ы № > Z 313 3 -3 "i* - ^
\$ fipdCiiStomers [6.-04 PM]; Ш&щ^мм»шЙ>мД
-п
"С
'С
Я
1».
Bui
<^ ь Л.(зг чь 1БНр%^ л
0 Faled Click here to run aoam Internet Explorer7JO LAN Edit run settmus
Request HTTP Status Total Time
О F R«n21
<J Я J- http..Vlacalhost52768/CustomerManager/FindCustom.200 0K 0.021 sec
О Я J. http://localhost52768/C4J5tomerManager/FindCustomi200 0K 0040 sec
О £ http://lacalhost5276S/Custome/Manager/FindCustomi 500 Internal Server 0 011 sec
WebBrowser j Request j Response [ Context j Det
Validation and Extraction Rules
Rule Type Result
aj Response URL VafidatL. Passed
О Find Text . Vahdati The req
«J Extract Hldderj^lds Extracti Passed
Fine 1Ы
.. * ч ■' FindT«t:|<tdit]--/.i5'
Exception tqroreC-ses-Fel^
< UseRfg-iLirExprtisions False
л Pass^^TeA+Foiind^Tfije
j$ Err«r list 13 Test «to«fr*|
d succeeded
sils
jiietf text '[edftj</a>' did not appear in the HTML resp<
- --
- 13
Request Ti.„
0 012 sec
0 021 sec
0 011 sec
Para met
unse FirvdTert
Required
[са.ШйШЫ]
> T3
D.
Bytes
• *l ^j
9.258- f
9.268 §
7.514 .. g
i *
rledrtjc/1 |
=True, H
t 1
!
Рис. 28.25. Результаты правила проверки
1096
Часть VI. Система командной работы Visual Studio Team System
Примечание
Правила проверки иногда могут влиять на производительность. Поэтому вы можете
использовать свойство Level для того, чтобы указать, когда необходимо выполнять
данное правило проверки. Обычно вы указываете здесь High, но для тестов нагрузки
тестов необходимо указать Low (для того чтобы не искажать производительность).
Результаты правила проверки показаны на вкладке Details запроса. На рис. 28.25 показаны
результаты правила проверки из нашего примера.
Тестовая нагрузка
Важно знать, как ваше приложение справляется с нагрузкой от пользователей. Обычно для
приложения описывается тест производительности. Такой тест лучше всего характеризуется
числом одновременных пользователей, которых может поддерживать приложение. Без
тестовой нагрузки очень трудно понять, достигли ли вы своей цели. Понятно, что вы не хотите
дожидаться размещения приложения только для того, чтобы обнаружить, что вам не хватает
производительности.
Visual Studio Team Test предоставляет для этого инструмент нагрузочного тестирования.
С его помощью вы можете создать тестовую нагрузку. Нагрузочный тест может быть
настроен таким образом, чтобы имитировать одновременный доступ к сайту множества
пользователей. Во время выполнения теста вы записываете вывод от средств инструменирова-
ния. Эти данные позволяют вам узнать, как ваша среда и ваше приложение держат нагрузку.
Создание теста нагрузки
Для помощи в создании нагрузочного теста Visual Studio предоставляет соответствующий
мастер. Хорошая новость состоит в том, что нагрузочные тесты используют Web-тесты и
модульные тесты, которые вы уже описали на начальных стадиях тестирования приложения.
Проходя по шагам мастера, вы можете выбрать существующие тесты (которые будете
использовать для имитации нагрузки), а затем и настроить нагрузку. Затем нагрузочный тест
добавляется в тестовый проект, где он может быть сохранен, отредактирован, может
получить версию, а также может выполняться еще и еще.
Давайте пройдем по примеру при помощи мастера New Load Test Wizard. Вы будете
имитировать нагрузку на приложение управления клиентами и использовать созданные ранее
Web-тесты. Вспомните, что эти тесты имитировали поиск клиентов и редактирование
сведений об этих клиентах. Каждый тест получал данные из базы данных.
Запуск мастера New Load Test Wizard
Мастер New Load Test Wizard запускается простым добавлением нагрузочного теста в
тестовый проект. Первая страница мастера — вводная (рис. 28.26).
Глава 28. Редакция Test Edition
1097
•YewLoad Test Wizard
W^
Z> Welcome to the; Create New Load Test Wizard
Scenario
Lead Pattern
lest Mr* Modrl
Test Ma
Browser Mm
Network Mk
Counter Sets
Run Setting?
This wuard <*ill u>*Jk you through the steps to create a load test that contains
A load test scenario to which you will ш4й tests.
A load pattern, test тгц biowser лш and netwefK mat
Counter sets for target computers from which /eu will colled performance datt.
Run settings such as the duration of your test and a description.
When you have completed the wuatd and clicked Fmeb, a load test is generated in thetest project
Vou can add additional scenanos and edit the test in the Load Test Editor.
For mofe information press Fl to seiect a related Help tcptc
Click: Next to proceed.
Finish J | Cancel
Рис. 28.26. Экран приветствия мастера New Load Test Wizard
Описание вашего сценария нагрузки
На втором экране мастера New Load Test Wizard вы задаете название для вашего сценария.
Это название — просто метка для теста (для того чтобы остальные понимали, что именно
вы хотите тестировать). Для нашего примера мы подвергнем нагрузочному тестированию'
страницы FindCustomer.aspx и EditCustomer2.aspx. Поэтому мы назовем этот сценарий Find
and Edit Customers.
New Load Test Wuard
1 «X
toCw Ы* actringi lor a load lest iumric
| Welcome gnter , name fcr tne |0»^ test scenario
^^^^^^а^а^а^а^а^а^а^а^И Find and Edrt Customers
1 Load Pattern
Test Мвс Model Think time profile
Test Mr* . *Л Use recorded think times
1 ' Browser Mu в Use normal distnbuhon centered on recorded think times
Network Ми } Do not use thmk times
Counter Sets
Run Settings
Think time between test iterations 3 -* seconds
[ < PrevKai* J [
N«t>
)'
Fin«h
1 vl шМ
( Cancel |
Рис. 28.27. Описание сценария при помощи мастера New Load Test Wizard
1098
Часть VI. Система командной работы Visual Studio Team System
Второй экран позволяет описать также профиль времени обработки. Время обработки
представляет собой то время, которое пользователь проводит в размышлении между
запросами. Это время используется для чтения страницы, ее заполнения и т. д. Время обработки
важно в том смысле, что вы хотите в вашем загрузочном тесте имитировать настоящих
пользователей. Здесь у вас есть несколько вариантов.
Вы можете использовать записанные времена обработки. Эти времена были записаны при
создании Web-теста. Поэтому это хороший вариант. Вы можете сгладить эти записанные
времена обработки (посредством указания стандартного распределения на основе
записанных времен обработки). И наконец, вы можете совершенно отключить время обработки.
Этот вариант полезен только тогда, когда вы хотите создать пиковую нагрузку на сервер
(а не имитировать пользователей).
И наконец, второй экран позволяет вам указать время между итерациями теста. Это
значение выражается в секундах. Оно полезно в том случае, когда вы знаете ваших
пользователей. Например, если вы знаете, что примерно каждые пять секунд пользователь запускает
процесс поиска и редактирования клиента, то вы можете указать это значение именно здесь.
На рис. 28.27 показана настройка сценария для нашего примера.
Описание шаблона нагрузки для вашего теста
Следующий экран мастера используется для указания шаблона для нагрузочного теста.
Здесь имеются два варианта: постоянная нагрузка и ступенчатая нагрузка. Первый вариант
^позволяет вам выполнять тест с постоянным числом пользователей. Если вы хотите
проверить, как система работает при постоянной нагрузке, то необходимо использовать именно
этот вариант.
New load Test Wucd
•4> -,
\ . fdil toad partem tettmgc for * toad test scenario
Welcome Select a lo»d pattern for your simulated load
I S«"'"o _ Constant Load
I т ,*»» k* j i User Count * itttis
Test Mfx Model
TesiM« * Step toad
Bro««Mix Start user count 5 ** users
Net*crk Mw ,5 .
Step duration: * seconds
Counter Sets
Pun Setting» **«P""' «°unt '" uwn/step
1 Maximum user count » users
[
< Previous
\ Si №4&rtT
i
1
1
[ Next> " [ Fmah j [ Cancel ] j
Рис. 28.28. Описание шаблона нагрузки при помощи мастера New Load Test Wizard
Ступенчатая нагрузка — это использование нагрузочного теста для стрессового
тестирования. Например, вы хотите определить, как система ведет себя при добавлении к нагрузке все
Глава 28. Редакция Test Edition
1099
большего количества пользователей. Эта возможность очень полезна тогда, когда вы хотите
найти точку отказа вашего приложения или узкое место при нагрузке на сервер и
приложение. Для описания ступенчатой нагрузки вы указываете начальное количество
пользователей и максимальное их количество. Затем вы задаете период времени между ступеньками и
величину самой ступеньки. На рис. 28.28 показан пример ступенчатой нагрузки.
Выбор набора тестов для имитации нагрузки
Следующий экран мастера позволяет вам описать, как вы хотите составить ваш набор тестов
нагрузки. У вас есть три варианта: по общему количеству тестов, по количеству
пользователей или по пользовательскому темпу. Вот эти категории.
□ Total number of tests (Общее количество тестов) — здесь можно задать процент для
каждого тестз вашего приложения. Например, если у вас есть три теста, то вы можете
указать, что первый будет выполняться 25% времени, второй — 40% всего времени
тестирования, а последний — все оставшееся время C5%).
□ Number of users (Количество пользователей) — здесь можно указать, что ваш тест
должен выполняться по распределению действий пользователей (а не по распределению
тевтов). Например, вы можете здесь указать, что 7 из 10 пользователей должны
выполнять поиск, а оставшиеся 3 делают покупки. Если у вас есть тест для каждой операции,
то вы указываете, что 70% пользователей всегда выполняют тест поиска, а 30%
пользователей выполняют тест покупки.
□ User pace (Пользовательский темп) — эта настройка позволяет вам указать, что каждый
тест должен выполняться указанное количество раз в течение часа. Тесты выполняются,
всеми пользователями. Например, если вы знаете, что каждый час 100 пользователей
делают поиск в вашем приложении и 10 пользователей покупают, то вы можете
настроить тест для каждого действия и указать соответствующий темп.
New Load Test Wizard
1 4
Select a test root modX for the load lest
Welcome
Load Pattern
Test Mix
Bio#ser Mix
Network Mix
CcunterSrts
Run Settings
Ho* jitould the test mu
be modeled?
Bated on the total number of tests
адааааъща ° Based cnthe number of virtual users
Bated сп user расе
j ^ ~***ф^
| <A] ^Ш%,Л1
|4) ~ьшщ>Д
t «a) '«&) - tfi) «si
иш
^t.
JU3S&
■vjjffiffiMtfefr
4
«tti'5%
vjj J5%
i This model of te*t mm determines the percentage of |
', virtual men «who will run a parbcuia
test At any point
t in the load test the number of users who are running • |
J particular test matches the aistgnrd
dnlrtbuOon Fellow
this mode) when you are basing the test trnx on the 1
percentage of useis running « particular lest
1
f „ ;
j <P«vw»4J j Nert> [ fir»«rtr
т..
— —ar
If C«K«i 1
Рис. 28.29. Описание модели составления набора тестов
ЗбЗак 3716
1100
Часть VI. Система командной работы Visual Studio Team System
На рис. 28.29 показан пример этого диалогового окна. В нашем примере мы выбрали
вариант Based on the number of virtual users. Следующий экран зависит от того, что вы здесь
выберете.
На следующем экране вы выбираете тесты для имитации пользовательской нагрузки (при
выбранной ранее смеси пользователей). Вы можете добавить Web-тесты и модульные тесты
(в зависимости от вашего сценария). Затем вы сможете выбрать процентное распределение
(в зависимости от вашей модели составления набора тестов).
В нашем примере у нас есть Web-тест для имитации редактирования клиентов и еще один
Web-тест для поиска клиентов. Предположим, что мы знаем, что на каждые пять поисков у
нас делается одно редактирование. В таком случае мы распределим два этих теста по
нашему нагрузочному тесту следующим образом: 80% нагрузки составит Web-тест поиска
клиента, а 20% — тест редактирования клиента. На рис. 28.30 показан пример такого
распределения.
New Load lest Wca-d
I +~l
„ """j Add testa tea load lest scenario and edit the lest mb»
Welcome
Scenario
Load Pattern
Teit Mm Mcdel
Browser Mn
Network Mu
Counte/ Sen
Run Settmgi
Add со* or more leit» to the mi» and tpeufy a distribution
j Test Nam*
ЩЛ rnJCuatoown
^— 2 EdtCurtonwi
^
Total
I < Previous
- - - ~~^
% ' DiUnbution
2C!
1
100 [
II — .1
' * L
i. •
.
Fmteb j [
-.-. тяг
\Л?ШШ'
Add.» |
Rjeowve J
Cancel |
[
Рис. 28.30. Описание распределения тестов
Примечание
Не забудьте настроить источник данных Web-теста таким образом, чтобы данные из
базы данных извлекались либо последовательно, либо случайным образом. Если вы
используете настройку Unique, то каждая строка будет извлечена из базы данных
только один раз и нагрузочный тест закончится ошибкой (с указанием, что для
завершения теста данных было недостаточно).
Указываем типы браузеров
Следующий экран нагрузочного теста позволяет вам имитировать используемые вашими
пользователями браузеры. Вы опять можете указать их процентное соотношение
(рис. 28.31).
Глава 28. Редакция Test Edition
1101
New Load TrsiWfcard
*-L
Add browser types to a load test scenario and edit the browser mbc
Welcome
Scenario
Load Pattern
Test Ми Model
Test Mix
Network Mur
Counter Sets
Run Setting»
Add cne or more browser types to the mac «ltd specify • dutnbuticn
I Browser Type
l 1 internet bplortr 7-0 '
\ ; Distribution
I f irefox 2Л
Э Internet Explorer6.Q
4 Intern* Explorer 5,5
| Add
Remove
Distribute
Total 100
Ik J^L J fH>ilh J I C*nC*1
Рис. 28.31. Описание типов браузеров
Указываем типы сетей
Затем вы указываете типы сетей пользователей. Если вы знаете, что 100% пользователей
находится на локальной сети, то можете указать это здесь. Однако если часть пользователей
получает доступ извне локальной сети, то вы можете указать здесь их процент. Конечно, для
этого необходимо иметь данные по вашим пользователям (или сделать прогнозы). На
рис. 28.32 показан пример этого экрана.
New Load Test WizMrd
#"*L
1 v , Add network types to a load test scenario and edit the network mb
Welcome
Scenario
j Load Pattern
1 Test Mu Model
Test Mm
I Browser Mat
я Counter Sets
j Run Setting»
Я
Add one or more network types to the mrx and specify a distribution:
1 Network Type
1 flAN
(ЩсоЫалжзэд.
: 3 ICable/QSlLSMbpi »
ejajajl ' 4 [o^upSGk
i ]
f
f
Total
1 < Prevno
% Distribution
40 С
30
5Г С
10O
is f Next» ] [_
-4
£
+
-
Finish
ЛЫШ
Add
Remove
Diitnbute
Cancel J
Рис. 28.32. Описание типов сетей при помощи мастера New Load Test Wizard
1102
Часть VI. Система командной работы Visual Studio Team System
Выбор компьютеров для наблюдения
Следующий экран мастера используется для указания, за какими серверами должен
наблюдать нагрузочный тест. Если ваше приложение распределено на несколько серверов, то вы
должны указать здесь эти компьютеры. Вам также необходимо будет указать и компьютер-
контроллер. Это компьютер, на котором работают тесты. Конечно же, для более точных
результатов компьютер-контроллер и компьютер сервера должны быть разными
физическими компьютерами.
Кроме того, для каждого наблюдаемого компьютера вы можете указать набор счетчиков —
стандартный набор индикаторов производительности, которые вы хотите отслеживать.
Существуют наборы счетчиков для IIS, SQL и т. д. Пример экрана Counter Sets показан на
рис. 28.33.
New Load F«t Wizard
„■■ ~ Specify computer* to monitor with counter sets during load led fuw
Welcome Sdected computers md counter 1«& will b« tdded to the default run
j Sctnino Compute» «nd counter sets to monitor
j LoedPettem ^ т!ЖШМ |
1 Test Mix Madel i fyj ADO.Nel
Test Ma l-£J Apportion
Network Mm j < QS
Run Setting* '
[ Add Cprnputcr»< 1 ( Remove, j
letting: |
Prcvtrtvsetectioru. |
j 4 % MjServer [
1 J ASF .Net
J 31 С ontrofler Computer
V% LoadTest
к y\ Controller
-. f| Agent Computer*
j v^ Agent
1 | <Previous J[ Next» [ Ftneh | [ Cancei j j
Рис. 28.33. Описание счетчиков при помощи мастера New Load Test Wizard
Указываем время выполнения и настройки запуска
Последний экран мастера используется для указания настроек нагрузочного теста. Эти
настройки включают: время, количество перехватываемых ошибок, а также уровень проверки.
Вспомните уровень проверки в Web-тестах; это уровень проверок, выполняемых при
имитации нагрузки. Если, например, вы указываете некоторое количество проверок для вашего
Web-теста, то эти проверки снижают производительность и совершенно не имитируют
реальных пользователей. Поэтому здесь можно указать такой уровень, который исключит эти
проверки.
Кроме того, вы можете использовать этот экран для указания "времени разогрева" для
ваших тестов (в течение этого времени тесты будут выполняться, но данные собираться не
будут). Вы можете также указать общее время теста или количество итераций, которое
необходимо выполнить. И наконец, вы можете указать частоту выборки, которая означает
частоту записи данных. На рис. 28.34 показан пример этого последнего экрана мастера.
Глава 28. Редакция Test Edition
1103
I *4.
I ( T.i RevJewiandeA
i Welcome
Scenario
Load Pattern
1 Teii Mi« Model
Test Ми
•a Browser Mit
Network Мм
il Counter Sets
пя> tettmgs for a hod test
Specify the length of the load test by
9 Load test duration
Warm-up duration (hh mm is) 0\ 0 J 0 *
Runduration ihhmm«j 0-% 5 Г 0*
Teat Hera bom
;• и * UC :
Details
1 Sampling rate 5>C second»
Descnptton.
Maximum error details 100V
Validation levek | Lpw . «vqk« validator) pile» riwkwt «ow
1 < Previous
_
[ Firrhh J [
w
i 1? Ss '"
*'
Cartel ]
Рис. 28.34. Настройка запуска в мастере New Load Test Wizard
Просмотр и редактирование нагрузочного теста
Когда мастер заканчивает свою работу, он создает loadtest-файл. Этот файл можно открыть
и отредактировать внутри Visual Studio.
</> 92714 ■ Microsoft Visual Studio
File Edit View Project Butld Debug Data Tools Test Analyze Window Help
У 4>s У кГ аХЗВХ]:^; : С * 9
'Й
iC
т
? 1
•» 1
is
5
>
i
i j
i
UadTestlJcMdeestl - Ж
| *>-*«'? J J Л
- i_J Scenarios *
! r) -^ Find and Edtt Customers
| e -^ Test Мк
^ [80%] FmdCusiomers
4i] [20%] EditCirstomers
G ^jt) Browser Mm
д| [65%] Internet Explorer 7 Q
:*][20%]Frrefox2.O
3 [7%] Internet Explorer 6j0
3 [8<*l Internet Explore; 55 5.
R '3 Network Mix
~J [40%] LAN
~| [25%] СаЫе/DSL 768k
Jf [30%] CableyDSl 1 JMbp*
^[5%] Dial up 56k
jj Step Load Pattern
- -Л Counter Sets
& -T^ LoadTest '"~
ffl ^ ConUoller
h ^ Agent
,- uJ Run Settings
U И Run Settmgsl [Active]
1 ,~*~~,Я..С~^»*...£-АЛ.1.~~~т~. „_ I.
^ Ettcf List ^3Teit *«иЫ
Build succeeded
|.^j {°3 limQiiJ'
Solution foptortr С ~ * H x'
t&*• £Щ ,
^ Solution '92714- C projects)
t ^ Solution Items
U
Д-
?■ 1
>• 3 C;\ \92714\ ' ' 1
3} tjl C:\_\CustomerMana9ei
'-' ££3 CustomerMgrTests
Ы J5al Properties
■CD Microsoft VisualS1
О Microsoft.VisualS!
»>J System
^J EdrtCustomers webte
»jjjj Findcustomer.crw
^ FindCustcmere.vwebt
^ LoadTesti losdtest
< i «It | > !
Рис. 28.35. Просмотр нагрузочного теста
1104
Часть VI. Система командной работы Visual Studio Team System
На рис. 28.35 показан пример файла, открытого в интегрированной среде Visual Studio.
Обратите внимание, что в нем присутствуют все разделы, которые были описаны в мастере.
Если вам необходимо отредактировать элемент, то вы можете выбрать его и
модифицировать его настройки в окне свойств Properties. Вы можете также щелкнуть по разделу правой
кнопкой мыши и открыть редактор. Например, если вы хотите изменить раздел Network, то
можете щелкнуть по нему правой кнопкой мыши и выбрать пункт Edit Network Mix для
того, чтобы открыть диалоговое окно, которое выглядит точно так же, как страница мастера
для этой настройки.
Обратите также внимание на самую правую кнопку в панели инструментов редактора
нагрузочного теста. Она позволяет вам использовать нагрузочный тест для запуска сеанса
профилирования производительности (как это обсуждалось в главе 26).
Выполнение нагрузочных тестов
и просмотр результатов
Наконец, вы готовы запустить нагрузочный тест. Когда вы нажмете кнопку Run на странице
нагрузочного теста, Visual Studio откроет окно монитора нагрузочного теста. Это окно
показано на рис. 28.36. Здесь система еще выполняет набор тестов.
File Edit View Project Build Dtbug Oati Tool» Test Analyze Window Help
U *> "c >£ м» .3 13 3 3 ^ м' - ;
tf lewfTcstl (fcSJ PM] иЩнШмЙшЛ
Г
f
s
J ** Us»e??;d3™ta Uk&d •*'**> ~ • ->
ij T«at In H'»tf—■- 470 *nnn
Counter»
i _JOv«rjll
>.A Find irtd Edit Cult с men
.♦. .~.l LdrtCustomers ;
j 2i finitCiaXomtn j
_j Tests Running i
i'J Uteri cud
slj Computers I
i i Errcrs
1
lJ Configui«tian
KayfodtcateK "| jP«3*BaporntTtme
wa
шГЁР
■»5 С • jJT№" *
i5C ^?ьЛй\\^Ш*
vffiMMaziL
o:oc 00 45 auo ал5 озос C3 4s од 30
100 ,
75 0
son -
25 0.
..^Д.^.Лм. j-
0*00 C0*c. J1J0
Sy*»«m uede. Tel "r] ConitplUc and Agent»
100 . iao
Controller Local run '
5.molingRite 0005 50°
-1 Requests :
5?0
Tot.l Request! 1^939 ^ 00 ooy} w 4fl 01 ш 01 20 3140 C2 ^ c0 fl0 00 20 p3 J0
RcqueslvSec 462 j
"' Ccunter Instinec Category Computer Color Range Mm
Cached Requests 10 443 _
-i Test Саам i " 3J **9**9S№L~.
TciVSec ЗЛ5 ' * Rtquerti'Sec _Tot#l LoadTtrtPej LAFTOMOM ■ 100 J.<0
Failed Test» ПО S* Avg Нмрите Т _Tot«l loaaTwtReqLAPTOPOOJ» ■ 1 ОЛ97
j у EnorvSec Total loadTtstErte LAPTOPKW» • Ю 0
у Threshold Veltb .Total loadTntEnc 1АРТОР00Л * 0 0
j V Avg PegeT>me CuatomefCda LoadTertPag LAPTOP00» ■ 10 ii 0.0045
Jj bivi led Tj7«»t pjaull*
Buridtutctrded
Rerriaifung- 0016
Ж-
0:15 03 00 03 4Ь Э4 2
CI 00
Met
914
011
4.60
0
079
Dl/0
«„
*62
0 0*7
0
0.096
0140
Lut
914
0Л51
300
0
0.15
ШШ
~x Ltl
-
„,
ого:
^i
..
!i
*
лА
*
a
1
Рис. 28.36. Отслеживание загрузочного теста
Если вы когда-либо пользовались программой Performance Monitor в Windows, то найдете
сходство с этим экраном. В центре монитора находится набор графиков, которые
отслеживают важные счетчики (вы можете изменить компоновку сетки и количество отображаемых
Глава 28. Редакция Test Edition
1105
графиков). По умолчанию выводятся графики Key Indicators, Page Response Time, System
Under Test, а также Controller and Agents.
Отслеживаемые каждым графиком счетчики перечислены внизу экрана (вместе с общей
статистикой по ним). Если выбрать один из счетчиков, то его линия на графике будет
выделена. Например, на рисунке выбран индикатор User Load. Вы видите, что эта нагрузка
ступенчато возрастает по времени.
Здесь есть еще несколько других окон. Окно Counters (слева) позволяет вам перемещаться
по счетчикам и добавлять их в монитор. Окно Overview показывает сводку по тестам. Вы
можете увидеть в этом окне некоторую ключевую статистику, такую как общее количество
запросов, количество запросов в секунду, а также использование кэша.
Когда тест останавливается, данные сохраняются. Вы можете работать с этими данными и
подробно анализировать их. Кроме того, вы можете искать тенденции и точки отказа. Вы
можете также проанализировать произошедшие во время выполнения ошибки. Пример
отчета показан на рис. 28.37. Вы можете также просматривать эти данные в виде графиков и
таблиц (при помощи панели инструментов наверху). И конечно, при необходимости вы
можете экспортировать эти данные.
fit
Edit View Project Budd Debug D«U Took Tttt AnilyTt Window Help
у *>_*>_*&** г^зпа'з, * ■< *
tff iMtfTtftl |6 53 РМ| &$»1ййШямОД)
I
1,
''
i
IjfcKWWtt ЧВЩ* Л Т«Ыч J_ .£ > - . , |v j $
-^ T— rni,ilil.d Ж aitm,
Ccunte» Controlw Local run
*id^«« Number of agents 1
^ find *nd id* Curti Run settles used Run Semngsl
i^J Computers
«J E"°" Overall Results
Max User Load 100
Requests/Sec 49 3
Requests Fated 261
Requests Cached Percentage 44.9
Avg Response Tn» (sec) 0 027
Avg Content Length (bytes) 1,583
Tests/Sec 4 14
Tests Fated 127
Avg Test Tme (sec) 9 0S
Avg Transaction Tme (sec) 0
Avg. Page Tme {sec) 0 099
▼ Test Results
Name Scenario Total Tests
FvidCj vi rr pi? Fnd and Edk Customers 560
UfeL&iaiP£f5 Fnd and Edk Customers 662
▼ Page Results
4 ! ' _.***> t ' *>
j*. Itrot Un. r^Tttt «*»i#i
Build «Ktt«ri«d
■r X
Key Statistic Top S Slowest Tests
Name Avg Test Tme (sec)
r'Tw4ti<;>' mi"? 16 2
E-..t<_'j-t'j rers 3 21
Fated Tests (% of total) Avg Test Tme (sec)
127 B2 7) 16.2
0 @) 3.21
Avg
4
I
*J
Рис. 28.37. Отчет по тесту
Ручные тесты
Даже при наличии всех возможностей автоматического тестирования в Team Test
пользователю все равно будет необходимо выполнять некоторые тесты вручную. Хорошая новость
состоит в том, что эти тесты можно описать и отслеживать точно так же, как и другие тесты.
1106
Часть VI. Система командной работы Visual Studio Team System
Создание ручного теста
Ручной тест создается при помощи добавления ручного теста в тестовый проект. Ручной
тест может быть описан как текстовый файл или документ Word. Ручные тесты имеют
расширение mht и хранятся внутри тестового проекта.
Предположим, что вы хотите, чтобы тестировщик просмотрел страницу вашего приложения
с целью проверки ее компоновки в различных браузерах. Вы можете описать для этого
ручной тест (рис. 28.38). Вы задаете название для теста и указываете шаги, которые
необходимо проделать для выполнения теста.
& w
Change fdfting
Styles -
find Customer Layout Test
Test Details
You should launch the Find Customer page inside «Л target browsers and visually review it You are looking for problems with layout, such as
things being too small or too big, on top of one another, tables not breaking correctly. Images not shewing up correctly, colors, fonts, etc. Use
the UI baseline site as a comparison
Test Target
Visual Review
$&)
y^ttiAd-»
MsnkMfTestl^mht - Microsoft Word
Home ln»ert
*i % Tahoma
PAfce layout Keterfcniri M*ii>r*gi
View
В / U - dm К, **
H\ %m i
fe AoBbCci АаВЫ AaBbC
Т"л| *'i'hl\Cc" Ejpprtails Heading t Heading2
^wftgrepfr ** St?is>
Test Steps
I step No.
l
2
3
4
I 5
Step Description
Navigate to RndCustomers aspx using IE 7
Verify colors and fonts
Verify layout and spacing
Verify images
Repeat steps for BreEo* IE 6, and IE 5.5
Expected Result
Page displayed correctly in browser.
Colors and fonts should match UI
guideline
Layout should match screen shot from
prototype
Images should show up relative to the
style guide
Results should be similar to IE7
-DtoMiclQDL.JbJlcinrv,,,,
Warn;ml ф \
"^B:^Jr^^ii^^^mm^L
Рис. 28.38. Ручной тест в редакторе Word
Выполнение ручного теста
Ручной тест выполняется точно так же, как и все другие тесты. Если вы выполняете ручной
тест как часть группы тестов (при помощи редактора Test List Editor), то этот ручной тест
будет представлен тестировщику для его завершения. Кроме того, подробности выполнения
ручного теста будут сохранены как часть результатов тестирования. Таким образом, все
результаты тестирования попадут в команду разработки.
На рис. 28.39 показан пример ручного теста внутри Visual Studio. Обратите внимание, что
тестировщик должен указать результат теста (пройден удачно/неудачно). Тестировщик
может также добавить здесь свои комментарии. Кроме того, сам тест показан в нижней части
окна.
Глава 28. Редакция Test Edition
1107
if> 92714 - Microsoft Visual Studio
File Edit View Project Build Debug Data Tools Test Analyze Window Help
%J *!> S H ^ 1» 13 3 Л =5 -С '♦ ;
HbnualTestllRunninsl i.JdMijl
Яс АРР*У
Select Result
Pass
a Fail
Comments'
Inside IE 5 5 the labels are touching the text boxes on the form
Use the UI baseine srte as a comparison
Test Target
Visual Review
Test Steps
ч
Step No.
1
2
3
4
Step Description
Nnviqate to RndCustamers.aspx using Ш 7
Verrfy colors and fonts
Verify layout and spacing
Verify images
Expected Result
Paqe displayed correctly fn browser
Colors and fonts should match UI
guideline
Layout should match screen shot from
prototype
Images should show up relative to the
j J$ Ere> List 3 Tesl R«ul&
Build succeeded
Рис. 28.39. Выполнение ручного теста
Обычные тесты
Обычные тесты используются для того, чтобы создать оболочку для существующего
тестового кода и выполнить этот код как часть системы тестов. Выполнение обычного
теста обеспечивает публикацию его результатов вместе с другими результатами тестов
приложения.
Обычный тест создается посредством добавления его в тестовый проект. На рис. 28.40
показаны некоторые поля, используемые для описания обычных тестов.
Обычные тесты выходят за границы типичного тестового сценария большинства
приложений. Однако необходимо знать об их существовании (на тот случай, когда они вам
понадобятся). Дополнительную информацию (в том числе и подробный анализ обычных тестов)
ищите в теме "Generic Tests" документации MSDN.
Упорядоченные тесты
Последний тест, который нам необходимо рассмотреть— это упорядоченный тест. Это
просто тест, который вы создаете для группирования и упорядочивания других тестов. Этот
тип теста полезен тогда, когда вы хотите, например, описать общий модульный тест.
Упорядоченный тест обрабатывается как единый тест (даже несмотря на то, что он группирует
много тестов). Это справедливо также и в отношении результатов упорядоченного теста.
Упорядоченный тест либо проходит, либо заканчивается неудачно.
1108
Часть VI. Система командной работы Visual Studio Team System
чГ< 92714 - Microsoft Vuim» Stuo»
ТЖ1Ж
Fife Edit View Project Build Debug Data Teak Test Analyze Window Help
ля GeneHcTestJLGenerkTest*
A generic test is an existing program wrapped to function as a test in Visual Studio, Far information about creating and executing a » ^
Specify an existing program (a test, test harness, or test adapter] to virrap is a generic test
ilk ! MyTestHarness
2. '
\i,, Example. MyTeslHarness exe
^' Run settings
jr Command line arguments tc pass to the generic test*
Vifw Examples
Additional files to deploy with this generic test
«Й
View Examples
Environment variables,
Variable
Name
I
_r^ crroi и st J est Results]
Build succeeded
Рис. 28.40. Обычный тест
v^> Customer Management - Microsoft Visual Studio
File Edit View Project Build Debug Data Tools
kj v^'^y *; зи.э-3 с * ,
1
*
>i>
К;
jo
и
I c"
Test
>
Analyze Window
Help
Debug ▼ Mixed Platforms
Order^estLorderiritesl^^a^^^
| iJ 10 tesvfs) added
Select test list tc view.
/All Leaded Tests
Available tests.
Test Name Project ID
^J AddresslTest CustomerManageiCustomed* *
tJ Addres^Test CustomerManageiCustumerS ,
^_j CancelTest CurtomerManagei Customers' ~
О City Test CustomerMarvagei Customers
i yj CorrtactViaEmailT CustomerManagei Customers*
i^J ContactViaPhone* CustomerManagei Customers
^J DescriptionTest CustomerManagei Customers
<tj EniaflTest CustomerManagei Customers
j [ Continue after failure
j ~0 Enor List |,£] Test Results'
' Ready
>
<
Selected tests.
Test Name
<d Address! Test
^Address2Test
^jCanceJTest
tJCrtyTest
(tJContactViaEmai
%J ContactVtaPho
^j DescriptionTest
<tj EmaiTTest
fc^SlanuaFTestl
vj WebTesll
-1
Project
CustomerMan .
CustomerMan .
CustomerMan .
CustomerMan
CustomerMan...
CustomerMan
CustomerMen
CustomerMan,..
CustomerMan
CustomerMan .
m
. . _
^\™щШ]
•l»
~ X
JD + <
CustomerMar
CustomerMar , * i
CustomerMar
CustomerMar
CustomerMar
CustomerMar
CustomerMar
CustomerMar j
c.\user$\msne
c:\u5ers\msne
i
-
•
Щ
1
[3
~ i
1!
1- ^:
|Mwi
та j
3 |
^
J_4
i
ij
jj
|
Рис. 28.41. Упорядоченный тест
Глава 28. Редакция Test Edition
1109
Создание упорядоченного теста
Упорядоченный тест вы добавляете в тестовый проект точно так же, как и любой другой
тест. Затем вы можете использовать окно описания упорядоченного теста для добавления в
него теста любого типа (за исключением нагрузочного теста). Нагрузочные тесты выходят
за рамки упорядоченного теста.
На рис. 28.41 показан пример упорядоченного теста. Вы можете выбрать тесты слева и
добавить их в упорядоченный тест справа. Затем вы можете выбрать тот порядок, в котором
эти элементы будут выполняться. И наконец, вы можете указать, должен ли упорядоченный
тест продолжаться после первого сбоя.
Резюме
Вы увидели, как разработчики могут создавать модульные тесты для повышения качества
своего кода, а также и того кода, который они передают в производственные условия. Вы
увидели также способности Visual Studio Team Test no созданию Web-тестов, нагрузочных
тестов, ручных тестов, обычных тестов и упорядоченных тестов. Вот некоторые ключевые
положения этой главы:
□ для группирования тестов вы можете описать тестовый проект;
□ редактор Test List Editor позволяет вам просматривать и группировать тесты внутри
интегрированной среды разработки;
□ настройки тестирования вы производите при помощи testrunconfig-файла;
□ вы можете записать маршруты перемещения по Web-приложению и сохранить эти
запросы в качестве Web-теста;
□ параметры Web-теста можно заполнять из источника данных;
□ для описания нагрузочного теста вы можете использовать ваши Web-тесты и модульные
тесты;
□ нагрузочные тесты можно настроить таким образом, чтобы они имитировали реальных
пользователей, зашедших на ваш сайт;
О вы можете описать ручной тест, который должен быть выполнен тестировщиком.
Результаты этого теста могут обрабатываться вместе с результатами других тестов;
□ вы можете создать упорядоченный тест для того, чтобы обрабатывать группу тестов как
единый (атомарный) тест.
Примечание
Есть один элемент, который выходит за рамки данной книги — это новый продукт Visual
Studio 2008 Test Load Agent. Этот продукт не входит в Team Suite. Вы можете
использовать его для имитации такой нагрузки от пользователей в вашей тестовой среде,
которая будет соответствовать ожидаемым нагрузкам в производственной среде. Test Load
Agent может использовать для выполнения тестов несколько клиентских компьютеров;
эти клиенты передают данные на центральный компьютер-контроллер. Более
подробную информацию см. по адресу: http://msdn2.microsoft.com/en-us/vsts2008/products
Глава 29
Редакция Database Edition
Редакция Visual Studio Team System Database Edition — самая новая версия из серии
VSTS. Первоначально она была выпущена после первых редакций Visual Studio 2005
Team System для того, чтобы закрыть брешь в современных инструментальных средствах:
она была предназначена для администраторов (database administrators, DBA) и
разработчиков баз данных.
Вообще говоря, VSTS сместила центр тяжести с производительности труда отдельных
разработчиков и попыталась оптимизироваться под производительность работы команды
разработчиков. Это важное отличие. При рассмотрении команд разработчиков мы видим, что
роль "профессионала по работе с базами данных" была упущена из виду системой Visual
Studio Team System. VSTS Database Edition исправляет этот недостаток.
В мире разработки баз данных существует несколько фундаментальных проблем, с
которыми VSTS Database Edition надеется справиться.
□ Изменения схемы базы данных могут стать проблемой; обычно изменения схемы
реализуются DBA на работающих производственных базах данных (либо при помощи
скриптов, которые выполняются на работающих производственных базах данных). При этом
высока вероятность ошибки (и последующих проблем в системе).
П Воспроизводимость тестирования и разработки. Тестеры и разработчики должны
работать с копиями производственной базы данных, но разобраться в отличиях разных
версий одной и той же базы данных сложно, а сам этот процесс никогда не
обеспечивался инструментами внутри Visual Studio.
□ Тестирование изменений базы данных. Совершенно справедливо (как и в случае с
ошибками на уровне приложения системы), что стоимость поиска и исправления
ошибок на поздних стадиях проекта возрастает геометрически по сравнению с
отыскиванием их на ранних стадиях жизненного цикла проекта.
В этой главе представлены инструменты, которые поставляются с редакцией Visual Studio
Team System Database Edition. Эти инструменты должны ввести DBA и разработчика баз
данных в тот же самый жизненный цикл разработки программного обеспечения, в котором
участвуют разработчики приложений, тестеры и архитекторы. Они обеспечивают этих
профессионалов разработки баз данных средствами, которые специфичны для проблем данной
Глава 29. Редакция Database Edition
1111
области. Редакция VSTS Database Edition выполняет все эти задачи и при этом понимает все
потребности и рабочие процессы, которые специфичны для мира баз данных.
Поскольку этот инструмент (и, следовательно, вся глава) обслуживает роль разработчика
баз данных, то мы предполагаем наличие базового уровня понимания таких
фундаментальных концепций баз данных, как таблицы, представления, хранимые процедуры, триггеры и
ограничения (а также проблем, которые связаны с сопровождением этих элементов).
Система Database Project System
Центр тяжести редакции VSTS Database Edition — это проект базы данных. Проект базы
данных — это по существу автономная версия базы данных. Он отображает базу данных
при помощи набора SQL-файлов, которые содержат схему и определения объектов для
таких вещей, как таблицы, индексы, а также хранимые процедуры. Проект базы данных
является ядром жизненного цикла разработки базы данных (DDLC), как показано на рис. 29.1.
Сборка и
размещение
Выполнить
изменения
Анализ и
тестирование
Рис. 29.1. Жизненный цикл разработки базы данных
Типичный рабочий процесс при помощи VSTS Database Edition будет выглядеть следующим
образом.
□ Администратор базы данных (который обычно является единственным сотрудником
команды проекта, имеющим доступ к производственной базе данных) использует VSTS
Database Edition для создания первоначального проекта базы данных и для
реинжиниринга производственной базы данных в этот проект.
□ Администратор базы данных обычно отвечает за генерирование тестовых наборов
данных (для использования в непроизводственных базах данных).
1112
Часть VI. Система командной работы Visual Studio Team System
П На этой стадии привлекается разработчик баз данных. Разработчик баз данных работает
в рамках проекта базы данных и пишет код базы данных, изменяет при необходимости
элементы схемы (для реализации требующейся функциональности) и пишет модульные
тесты (которые проверяют эти изменения).
П По завершении всего набора изменений разработчик баз данных возвращает изменения
схемы в систему управления исходными кодами Team Foundation Server.
□ Затем к процессу опять подключается администратор базы данных. Он анализирует
изменения, сравнивает изменения со схемой и используемыми в производстве данными,
создает пакет развертывания с этими изменениями, а затем контролирует развертывание
этих изменений в производство.
С помощью VSTS Database Edition весь этот процесс можно выполнить внутри Visual
Studio.
Поскольку проект базы данных является всего лишь представлением реальной базы данных,
то изменения в проекте можно делать без боязни повредить реальную базу данных. И
поскольку эти изменения производятся с определенным набором файлов (которые могут
находиться в той же системе управления исходными кодами, что и остальные файлы VSTS), то
разработчик базы данных может участвовать в том же самом процессе отслеживания
элементарных работ, что и остальные члены проектной команды.
Поскольку понимание самого проекта базы данных очень важно для выполнения задач в
VSTS Database Edition, то мы начнем наше исследование с процесса создания проекта базы
данных.
Создание проекта базы данных
В проектах баз данных используется все та же система шаблонов проектов и создания
нового проекта, что и в других типах проектов Visual Studio. Это означает, что мы запускаем
процесс создания посредством меню File | New, а затем выбираем один из шаблонов,
находящихся в узле Database Projects диалогового окна New Project. VSTS 2008 поставляется с
поддержкой SQL Server 2000 и SQL Server 2005, а поскольку для этого требуется поддержка
различных инструментов, то для них имеются разные шаблоны. Фактически у нас есть два
шаблона для выбора (как для SQL Server 2000, так и для SQL Server 2005): в одном шаблоне
используется мастер, который проведет нас по созданию проекта; в другом шаблоне будет
создан пустой проект, который затем потребуется настроить вручную (рис. 29.2).
Давайте выберем шаблон мастера SQL Server 2005 Wizard и пройдем по всем экранам
мастера.
Примечание
Для того чтобы выполнять анализ и проверку объектов в проекте базы данных, Visual
Studio необходимо взаимодействовать с локальным экземпляром SQL Server: это
может быть SQL Server 2005 Express Edition, SQL Server 2005 Developer Edition или SQL
Server 2005 Enterprise Edition. Если у вас нет работающего локального экземпляра
SQL Server, то вы увидите в начале нового проекта диалоговое окно с запросом пути к
локальному экземпляру SQL Server. Обратите внимание на то, что все продукты
линейки VSTS поставляются с версией SQL Server Express Edition.
Глава 29. Редакция Database Edition
1113
New Project
£roject types
Visual C«
Database Projects
Microsoft SQL Stiver
Other Languages
Distributed Systems
Other Project Types
Test Projects
Templates
Visual Stud11? installed template,
^SQLServer 2000
£3 SQLServer 2005
My Templates
-J]Search Online Templates.
| NET Framework 35 »|СД
JlSQL Server 2000 Wizard
J3SQL Server 2005 Wizard
I
A project that represents a Microsoft SQL Server 2005 database schema
№me AdventuieWorlcsDB)
location. C\U?ers\1powers\Documents\Vtsual Studio 2Q0fl\P rejects WS Unleashed
Solution Nam« AdventureV/orksOB [/ Create directory for solution
Add tc Source Conhol
flrowse.
Рис. 29.2. Шаблоны проектов баз данных
Свойства проекта
После того как мы миновали начальный экран приветствия, мы получаем запрос —
необходимо указать, как мы хотим организовать проект и какую схему использовать (рис. 29.3).
Для организации проекта есть два варианта: по типу объектов и по схеме. При выборе
варианта Organize my project by object type интегрированная среда Visual Studio создаст
каталог объектов схемы с подкаталогами для таких объектов вашей базы данных, как таблицы и
хранимые процедуры. Вариант Organize my project by schema сгруппирует ваши объекты
проекта по тому типу схемы, к которому они принадлежат. Для большинства реализаций баз
данных первый вариант — самый полезный.
Эта страница мастера служит также для выяснения, хотим ли мы применять полнотекстовый
поиск или задействовать поддержку CLR в SQL (которая позволяет использовать в базе
данных типы и функции CLR), а также должны ли сгенерированные в Visual Studio файлы
содержать название схемы базы данных (в виде префикса имени файла). Обратите
внимание, что поддержка полнотекстового поиска отсутствует в том случае, если вы используете
версию SQL Server Express.
Опции базы данных
Следующая страница мастера указывает используемый тип сопоставления (а также
различные настройки сопоставления и хранения, рис. 29.4). Можно оставить эти настройки по
умолчанию. Фактически на следующей странице мастера у вас будет опция импорта этих
настроек из рабочей базы данных (в дополнение к ее схеме).
1114
Часть VI. Система командной работы Visual Studio Team System
New Datacaje Project Whard
I i -~ттт
| Project Properties
Welcome
Set Database Options
Import Database Schema
Configure Build/Deploy
ifl узы]
The files in xour project cart be organried by schema or b>' object type How would you like
to organce the files in /our project7 (You cannot change this option after the project has '
been created)
0 Organise my project by object type
Organize my project by schema
Specrfy the default schema to use for objects that you create in your database project
dbo
,£, JncJude Schema name \n the file name
"~ £n«ble full text search
._ Enable SfllCLK
[ «OrevKJUs [ J^cxt> l [ Finish Cancel |
Рис. 29.3. Варианты организации проекта
New DataBase Project Wizard
| , -штт
УШМ
'"' Set Database Options
—i 5
Welcome
Project Properties
Import Database Schema
Configure Butld'Deploy
Select the check bom to configure yeur database project. As an alternative, you can click
Next and then import the database schema and its configuration
1 ;■/ ANSI paddings
yf. ANSI nulls
;V ANSI warnings
■J Arithmetic abort
Numenc round abort
!*£. Concat nulls yields nulls
2, Quoted idenhfier
Database collation.
| SQt,lBhnl,GcoewLCPl.CS>S
Vou can set addthonai properties by opening the Project menu and clicking Properties.
[ < previous [ &ext> ] | finish | Cancel j
_
Рис. 29.4. Настройки базы данных
Импорт схемы базы данных
Именно на этой странице мастера VSTS Database Edition начинает использовать DDLC:
несмотря на то, что мы можем создать "пустой" проект базы данных, большинство разработ-
Глава 29 Редакция Database Edition
1115
чиков баз данных строит первоначальный проект по существующем базе данных Так
реализуется концепция о том, что производственная база данных "является единственной версией
правды" Таким образом, мы признаем тот факт, что мы хотим, чтобы наши тестовая база
данных и база данных для разработки отражали структур) производственной базы данных.
При помощи реинжиниринга базы данных в составляющие ее объекты Visual Studio
позволяет нам создавать копии базы данных, что в свою очередь позволяет разработчикам
работать в своей собственной "песочнице" и не беспокоиться о повреждении производственного
хранилища данных. На рис 29.5 показана страница импорта схемы.
Примечание
Установка флажка Override database configuration with imported schema settings
приведет к тому, что Visual Studio проигнорирует указанные на предыдущей странице
настройки базы данных и вместо них использует настройки той базы данных, из
которой вы собираетесь импортировать
Чг <• "dlaDair Project Wi
I "ЭЯШ
aid
Import Database Schema
.'.fl zjme
I PiLjrrt Piopeitiri
Sei Djlabare Options
Ccnf gurr Build Deploy
■f |nporte* ring schemj
Sou'ce datable connection
i tfsrtm03~Adventjreiitarki dbo
'1 1
fcdit Ccnrtrtic-i 1 flev, Lnnntct зп
Impart option:
J Script the cd! jmn 'dilation in , if it is different
1-jnore e4endtd properties
c^ernJe djtabdse lunfiguiatin with importta
A tql hie ts Lie^lH for ej-h ddtdDase object 11 -t •, с j
* £rrviou5 ftext *
-
um thtdatjDise irllation
i.hemj ,ЕП_лд,
unpcrt mljthep г t
{ W
l d. Lei
-—'
Рис. 29.5. Импорт схемы базы данных
Укажите подключение к той базе данных, реинжиниринг которой вы хотите произвести, а
затем переходите к следующей (и последней) странице мастера.
Настройка построения и развертывания
Последняя страница мастера проекта (рис. 29.6) определяет, как Visual Studio б\дет
собирать и развертывать проект базы данных. Особый интерес здесь представляют настройки
целевой базы данных. Существуют два основных сценария развертывания: вы можете
указать новую базу данных, либо указать в качестве цели существующую базу данных. Это
позволяет разработчикам баз данных либо создать новый экземпляр базы данных на основе
^3jk 17 U)
1116
Часть Vt. Система командной работы Visual Studio Team System
описанной в проекте схемы, либо обновить существующую базу данных для того, чтобы
использовалась описанная в проекте схема.
New Database Project Wizard
Configure Buid and Deploy
Welcome
Project Properties
Set Database Options
Import Datibase Schema
Configure how your database project if butit and deployed. You can change these
settings later by opening the Project menu and clicking Properties.
BuW output path;
\sql\
Browse»» J
Target Database Settings
I*rget connection
Data Sourc«=192.168J0fjPersist Security lnfo=True;Use/ID= AWDBOjf Г y*_ ]
Target database name
AdventureWorksT est
Def aujt location for target database files.
C:\Program FUes\Microsoft SQL Server\MSSQLi\MSSQL\DATA\ [ Цфф 1
Default deployment collatrca
I
! Ahvays re- create database
•Vs BJocfc incremental deployment if data loss might occur
<£revrous
fjmish
Рис. 29.6. Настройка процесса сборки и развертывания
Мы задаем целевую базу данных посредством указания подключения, имени базы данных, а
также местоположения файлов базы данных на сервере. Последнее поле принимается по
умолчанию равным типу сопоставления исходной базы данных (которое Visual Studio
определила по указанной на предыдущем экране информации).
В табл. 29.1 описаны опции экрана Configure Build and Deploy.
Таблица 29.1. Опции построения и развертывания
Настройка
Build output path
Target connection
Target database
name
Default location
for target
database files
Описание
Путь к тому месту, куда Visual Studio поместит скрипт построения; вы
можете указать здесь относительный путь (относительно пути к проекту базы
данных)
Информация подключения для базы данных, в которую вы хотите
произвести развертывание. Если вы оставите эту настройку пустой, то Visual
Studio будет использовать локальный экземпляр SQL Server, который
служит для проверки проекта (см. предшествующее примечание относительно
требований к локальному экземпляру SQL Server)
Имя базы данных, в которую будет производиться развертывание; если
база данных не существует, то она будет создана
Путь к SQL Server (где хранятся файлы локальной базы данных)
Глава 29. Редакция Database Edition
1117
Таблица 29.1 (окончание)
Настройка
Default
deployment collation
Always re-create
database
Block incremental
deployment if
data loss might
occur
Back up database
before
deployment
Описание
Сопоставление, которое необходимо использовать при развертывании. Вы
можете тне указывать сопоставление, использовать указанное в проекте
сопоставление или сопоставление, описанное в целевой базе данных
Если выставлен этот флажок, то база данных будет удалена, а затем
вновь создана в процессе развертывания Сброс этого флажка говорит о
том, что процесс развертывания должен обновить существующую базу
данных
Если этот флажок выставлен и вы развертываете в существующую базу
данных, то такие изменения схемы (например, сужение числового поля),
которые могут способствовать потере данных, приведут к остановке
процесса развертывания с выдачей ошибки
Указывает, должен ли скрипт развертывания выполнить резервное
копирование базы данных перед обновлением ее схемы
Это последняя страница мастера; на этой стадии Visual Studio уже имеет всю информацию
для создания исходного проекта. Нажатие кнопки Finish запустит генерирование проекта в
Visual Studio. На рис. 29.7 показан снимок экрана импорта схемы, а на рис. 29.8 —
конечный результат: заполненный проект базы данных внутри Visual Studio.
New Database Project Wizard
I е<яааац
"' Ai Summary
vVekivr »e
Project Properties
Set Diiiban Gpkicni
lrnpcrt Dafabaw SfhrmA
CorHgu'e Dui'd/Dep'oy
ijjiay
Statin: A/5) Reading abject text '
1
| ,3/6/20064.22^4 PM Creating Database Project,.,^
3/6/2008 4-2251 PM Done
Э/6/200В 4-2251 PM Import Database Schema started.
3/6/2006 4-22J5PM Generating Scripts j
i '
i
i |
1 i
i, . _ , „ i
Рис. 29.7. Импорт схемы AdventureWorks
Обратите внимание, что объекты схемы базы данных находятся в корневом каталоге Schema
Objects, внутри которого они организованы по своим типам. Каждый объект базы данных —
1118
Часть VI. Система командной работы Visual Studio Team System
будь это таблица, хранимая процедура, индекс, ключ или ограничение — представлен одним
sql-файлом. Кроме файлов схемы, у нас есть каталоги для хранения планов создания данных
(подробнее о них далее в этой главе), а также для скриптов пред- и постразвертывания.
Скрипты, которые размещены в каталогах пред- и постразвертывания, будут выполнены
непосредственно перед развертыванием и сразу после него.
Совет
Скрипты пред- и постразвертывания полезны в том случае, когда вы размещаете в
тестовой среде. Вы можете использовать скрипты предразвертывания для
инициализации среды, а скрипты постразвертывания для очистки после завершения
развертывания.
t") ffliOo J
■ил AdventureWcrksDB - Microsoft Visual Studio
file Edit View Project Build Team getrug
Data Took Tejt
Default
Analyze Window
» Any CPU
y?X
~£j Solution 'AdventureWorksDB' A project!
... ^маю^^м
y^ References
„J Data Generation Plans
С sJ^ Schema Objects
£j Assemblies
л* ZJ Database Triggers
X llj Functionj
~Ц Securtty
^J Service Broker
.J Storage
CI3 Stored Procedures
C12 Synonyms
„Jr Tables
il C3 Constraints
'♦ - LJ Indekes
£ U Keys
[^ Statistics
V lJ3 Triggers
S|J dbo-AWBuildVersicn table.saj
&) dbo.Databaselog.tabie sql
- &j dbo.En-crLogtabtejql
;{> i
fтагй SvplcrtTb^ Solution bplorer i^&ht^A&ew"
Ready
Рис. 29.8. Заполненный проект базы данных
Представление схемы
Кроме уже знакомого представления Solution Explorer проекты баз данных имеют также и
окно Schema View (рис. 29.9).
Это окно похоже на компоновку Solution Explorer (особенно если вы выбрали организацию
проекта по типу объектов, а не по схеме), но оно делает еще один шаг вперед для того,
чтобы разработчики SQL Server чувствовали себя в Visual Studio как дома: данное окно точно
имитирует внешний вид инструмента SQL Management Studio (вплоть до используемых для
элементов проекта значков). На рис. 29.10 приведено сравнение окон SQL Management
Studio Object Explorer и Visual Studio Schema Explorer.
Главц 29. Редакция Database Edition
1119
Schema View .^^ .,
|&;*i2ij*5
~£ .3 AdventureWarlcsDB
Ш С2 Tables
|V} {J} Views
W ~J Stored Procedures
J Ы -J Functions
J vli Synonyms
Ш JJ Types
| El uU Database Triggers
1 tU Assemblies
1 W J3 Security
4 и «-J Storage
Ы JJ Service Broker
J Ei JJ Оф haned Objects
I
ЩЩ'
i
!
1
•
Рис. 29.9. Окно Schema View проекта базы данных
StHe«w View
i^^U «1
[ С С* AdvmtuievVcrksDB
t iJ ТьЫе»
1 ♦, CJ Views
[ ~ sJ? Stored Procedures
;[ ЬЗ 73 dbo.ujpGrtBitlOtMrtenafc
I hu Paramrtr*
if $p «StartProductfD
i |p SKheckDale
f tl ИЗ ^bo uipSrtfmpleyrfManagpri
If 4 ^3 dbo.tHpGetr>'jn*g*r£mplt»yees
it S ZU ^Ьо uspGetWhereUtedProdJctlD
if ffl iTl dbo.u5piti§£rmr
if t*J \H dbcirtpPnntfrrcr
11 >1 Zl Humar>Re$oufCM.usp'Jpd««EmplD
| [ Я Ц] HumarResoucies usp JpdsteEmpIc
if S ^J Hjnwr>Rr40L.icesuvpl/pdalcEmpIo
il t <\J Functions
if i-J Synonyms;
il £W T/P«
if t .J Outabtttlf qqt'i
i ^J A&semb'K
I! т *.te!Z*.Z. - -
Ш
r!
Ц
m
j
1
J
i
fr
I
— p
Schema View
cannot- $( * Г T]
E Id TF5*rM3a{5QL ^'^ 9 ° %54 ^SlTWSVrtaSM'j'j)
£ „vJ System Databases
,.«• _J DeUtw«t S-iapthols
- ^j AdvertreWarfes
5) *U Database 0 «grams
'й 1* "abtes
— -i Pragran»nabftty
R Hi Stw-dProtertyreu
♦% ilJ System Stared Procedures
£ 2! dta.ujspGeffiaOfta»Vrtos
4 .«J Parameters
££ «SarrP'oocctE (»t. Input, ho defadt}
ЩИ £Chec*Daii! {daleere, Irixit. No tie/auil;
CJ Recjn^s htecer
*] !!j db©.ucfjGet&»pfc>yeeM«->Agm
+. ^ cbo.uspGetManaoerilmpovees
ju !2 daa.ijspc^jvvrtrettted^oo^ctc
f "ZZ dBe.cspLo^rfor
£ *£ dbo.uspPrrt£rry
t, t£ Humar«eMotxce5,«pL^ateOr$ayeet.o$*n
h3 ^funcbons
{£ ;j| Database Trippers
^
SQL Management Studio
Рис. 29.10. Сравнение Schema View
с представлением из SQL Server Management Studio
Поскольку окно Schema View сосредоточено исключительно на объектах баз данных, то вы
не найдете здесь таких объектов, как планы создания данных или скрипты пред- и
постразвертывания. Окно Schema View имеет также замечательную функцию визуальной
индикации наличия синтаксических ошибок в объектах баз данных. Например, если мы дважды
1120
Часть VI. Система командной работы Visual Studio Team System
щелкнем по объекту dbo.uspGetBillOfMaterials, а затем изменим его SQL на что-то
неправильное, то получим визуальное уведомление о проблеме прямо в представлении
Schema View (рис. 29.11).
Теперь, когда мы уже знаем систему проектов баз данных, мы можем исследовать
специфические для баз данных инструменты версии VSTS Database Edition.
Примечание
Несмотря на то, что окно Schema View является мощным инструментом для
управления объектами баз данных, оно имеет одну досадную проблему: в нем нет
горизонтальной полосы прокрутки (такой как в Solution Explorer). Это означает, что если у
вас имеются объекты с длинными именами, то вам придется расширять окно для того,
чтобы увидеть полное название. Надеемся, что это будет учтено в следующем пакете
исправлений.
Schema View * '" ^^"Д^,,,,^ jjj|
lauiiii.^,,.. , „ I
| F31&3 AdventureWorbDB * || j
К Cl Tables
| Й СИ Vtevw
E &? Stored Procedures
1 i ffi Щ dbo.uspGetBiHOfMaterials
| ; Ei Ш dbo^uspGetErnployeeManagers
§ i йО dbo.ospGetManagerEmployees
1 j fctl Q dbo.itspGetWhereUsedProductID
1 '■ 1±] OH dbo.uspLogError
1 ' Ы-О dbo^spPrintError
1 { Ф О HurrwnResourcewispUpdateEmpfoyeeHi
1 | SO HumanResources.uspUpdateEmployeeLc
III * El£Z3 HumartResources.uspUpdateEjmpfoyeeP<
I) IS О Functions
j i СЛ Synonyms
| Ш Dl Types
1] E (U Database Triggers
(U Assemblies
К Ci Security
I P £j Storage
7
1
• У
1
III
Щ
i II
1
ii
m!
ill
~Ji|
11 EF) Cli Service Broker III
ILk^^.a^:^^^ & и* j
Рис. 29.11. Индикация ошибок в окне Schema View
Сравнение схем
Инструмент Schema Comparison используется для сравнения структур двух баз данных. Он
может также сравнить схему проекта базы данных и рабочую базу данных. Это очень
важная функция для жизненного цикла разработки баз данных: разработчикам БД (и
администраторам БД) необходимо понимать различия между схемами (для того чтобы понимать
изменения, которые необходимо перенести из среды разработки в тестовую среду или из
тестовой среды в производственную).
Глава 29. Редакция Database Edition
1121
Примечание
Инструмент Schema Comparison используется "за кулисами" во время процесса
импорта схемы. Для нового проекта базы данных это означает сравнение схемы проекта
(которая пуста — объектов нет) с базой данных и генерирование скрипта для учета
различий. Конечным результатом является копирование схемы базы данных в проект
базы данных.
Помимо простого сравнения двух различных схем (для поиска отличий) вы можете также
при помощи этого инструмента напрямую синхронизировать одну схему с другой.
Инструмент Schema Comparison запускается из меню Data | Select Schema Compare | New
Schema Comparison. Диалоговое окно New Schema Comparison (рис. 29.12) используется
для указания двух сравниваемых объектов. У вас есть вариант выбора в качестве источника
и цели как базы данных, так и проекта базы данных (обратите внимание, что вы не можете
сравнить два проекта: данный инструмент может сравнить только базу данных с базой
данных, проект с базой данных или базу данных с проектом).
В этом примере мы сравниваем схему базы данных Adventure Works для оперативной
обработки транзакций (OLTP) со схемой хранилища данных Adventure Works. После выбора
источника и цели мы запускаем сравнение (посредством нажатия кнопки ОК). Кнопка со
стрелкой в центральной части диалогового окна используется для обмена местами
информации о цели и источнике.
Совет
Инструмент сравнения схем Schema Comparison может использоваться даже для
сравнения баз данных SQL Server различных версий. Это очень удобно для
организаций разработчиков, которые разрабатывают на сервере SQL Server 2005, но в
производственных условиях имеют SQL Server 2000 — или для тех групп, которые хотят
перенести базы данных из SQL Server 2000 в SQL Server 2005 (с одновременным
улучшением схемы).
New Schema Comparison
LI
Source Schema
<*• £alabese:
Target Schema
r Project
1 «srtmOa^dvtrrtweWcrksuibo
S
tfrtmQe Ativ<nWreW<wi*D*V dbp
id* Connection-. I НедСеппеспоп.*
nncxnon<<< I
ВД Connection..* Ne» Connection*,
Comperes the target schema to the source schema, lets the comparison results, and shows the Knot necessary to update the target to match the
source. From the results list, you can specify whkh changes to apply to the target.
j [^ Сдпсс!
Рис. 29.12. Настройка сравнения данных
После того как сравнение закончится, мы увидим результаты в Visual Studio (рис. 29.13).
Верхняя панель окна сравнения показывает иерархические представление всех объектов
базы данных (в обеих базах данных). Каждый объект отображен под своей базой данных,
1122
Часть VI. Система командной работы Visual Studio Team System
показано также и действие обновления. Действие обновления — это то действие, которое
требуется выполнить для того, чтобы целевая база данных стала выглядеть как база данных
источника (в смысле схемы).
<•> AdventureWortraCB - Microsoft Vbyal Studio
file fcdtt View Project £uild Team Eebug D*ta look Test Anaryze Window Help
>J3 - < ' \J 4 0 I h 2 £, x1 * ^ ' -fP * -** ' ► DdauH * AnyCPU
Г " ** I ""JWrrte^pdates 43 Export To Editor •{ Д «* j 20 e
SchemaCompareJ
166 objects were compared»
[ca I [5) ЦЕ<^
tfsrtm08AdventureWorlcs.dbo (Sourc... Update Action
tfsrtmOS AdventureWortaDW.dbo (Target.
ULJlTables
:-
Missing
New
Different
Missing
Missing
Missing
□ [dbo] [AWBuildVersion]
Э |dbo] [DatabaieLog]
л Drop
4* Create
V Update
X Drop
Л Drop
A Drop
^3 rdboMAdvenlureWorksDWBuildVemcn
^3 [dbobfDatabaseLog]
33 [dbo].[DimAccount]
*1\ Idbo] [DimCurrency]
33 [dbo].[DimCustomer]
Object Definitions
Source Object: Target Object:
С New Text fj Different Text □ Missing Text
Sdiei-rt* UpJaU Script- HbrUiT08.Advfcirts«eWorbOV^db(»J ^ ~ ~ ~~~
7г.1.д script vea cr«»t:ec fcy V2.3-&I Jcudio on J/U/20JL «л: *:ЪЛ PK,
?'«,*> f* xa av ifc%r c*. tfjx „wj?.AdvejiCv-.x.eWjrk.3DW««.4.bc ^_ finite it t:.-± Jer'ti *j vlarUi
Pie-ese b&cic <;p ve.ir carqet. caz^fcas- betore rurniricj thia scri.p*_.
GO
SKT NUMERIC ROUHBABORT OFF
Ready
Рис. 29.13. Результаты сравнения данных
В показанном на рис. 29.13 примере сравнения у нас есть таблица dbo. DatabaseLog,
которая существует в обеих базах данных (и поэтому ее действие обновления — Update). В
случае с dbo. AWBuildVersion, которая существует в источнике, но отсутствует в целевой базе
данных, в качестве действия обновления установлено Create: нам необходимо взять схему
этой таблицы и использовать ее для создания новой (идентичной) таблицы в целевой базе
данных.
Просмотр описаний объектов
Если мы щелкнем по строке в таблице сравнения, то увидим в панели Object Definitions
параллельное сравнение схемы выбранных объектов. Эта панель на рис. 29.13 видна не
полностью; на рис. 29.14 мы открыли панель чуть больше для того, чтобы показать имеющуюся
там информацию.
Для каждого объекта баз данных источника и цели появляется схема (на SQL). Текст SQL
будет иметь цвет фона в соответствии с легендой, показанной в Visual Studio: New Text —
это тот текст, который существует в источнике, но не в целевой базе; Different Text — это
тот текст, который существует как в источнике, так и в целевой базе данных, но отличается;
Missing Text — это тот текст, который имеется в целевой базе данных, но отсутствует в ис-
Глава 29. Редакция Database Edition
1123
точнике. Просмотр описаний объектов — отличный способ определить разницу между
двумя объектами (на уровне SQL). В показанном на рис. 29.14 примере мы видим блок текста,
который помечен как New Text.
^ AdventureWoricsDB - Microsoft Visual Stuoio
File |drt View £roj*ct guild Теагд. £ebug Djta Tools Test Analyze
$ ' * i3 d Ш > £ -A \ *? * ^ * £! ^ ^ I ► JW«* \*
T ' &* ; * i Write iipdrte* | -^Export To Edttof * J Д j * T| -
X" ЗДмяпаСатралгЗ
*
P-
| Rea
168 objects were compared
Status tf5rtmQS.AdvenUjreW0rks.dbo (Sourc... Update Action
H .J Tables
Missing Л Drop
New 23 [dbo] [AWBuildVersion] «* Create
Different .3 tdbQ],[Ditab«eLog] <* Update
Missing X Drop
Miwinn. X Dron. .
Object Definitions
Source Object Target Object
[TS-QLJ Jnvarchar] (sax) COLLATE SQL_Lacir.: * ' [TSCL] [nv
[XmlEvenc] [иь1] НОТ NULL {XnilEvenc)
) ON ZPRIMARY} TEXTIHAGE_CH fPRIHARY] J !} ttH [PRIH
GO GO
|
— "csistraints ar;d indexes
ALT2R *a3LE [dboj. tBetabaaeLoo;] ADD CGMSTt
□ New Text □ Different Text ПМ«»пдТеЛ
4S:hemi Upd*te5c«pt
dy Lnl5
иПЕЫйЫ"
Window Help
" * i*l
tfsrtm08.AdventureWcrksDW dbo (Target ] '.%'
О |dboj[AdventureWori*DWBuildVersion ^J
^3 tdbo].|D4tabaseLog) j |
13 [dbo] [DimAccount] I V
Til IdhnUnicnCurrfflrvl """ о
<&
archar] (rcax) COLLATE S2L_Latin: * '?•"
[xjrI] HOT NULL "o
ftRY] T£XTIMA3E_0N {PRIMARY] £
; *=--
I
СЫ1 Chl INS
Рис. 29.14. Сравнение описаний объектов
Скрипт обновления схемы
Нижняя панель окна Schema Comparison показывает нам скрипт, который был
сгенерирован на основе сравнения. Этот скрипт (который в данном окне редактировать невозможно)
содержит команды SQL, которые нам пришлось бы выполнить для того, чтобы сделать
целевую базу данных идентичной (с точки зрения схемы) базе данных источника. Вы можете
редактировать этот скрипт по каждому объекту отдельно (при помощи нажатия Update
Action в таблице результатов сравнения). При этом появится выпадающий элемент, который
позволит вам выбрать либо действие по умолчанию (из сравнения), либо выставить
действие Skip. При помощи такого пропуска объекта мы удаляем те строки из скрипта
обновления, которые воздействуют на этот объект (независимо от того, находится ли он в источнике
или целевой базе данных).
На рис. 29.15 показан скрипт обновления, сгенерированный по нашему сравнению баз данных.
Совет
Возможно, вы захотите использовать действие Skip для таких вещей, как
пользователи, регистрационные имена, а также для групп файлов. Обычно эти вещи дублировать
не следует, особенно если вы делаете сравнение данных с намерением перенести
изменения из тестовой базы данных в производственную базу.
1124
Часть VI. Система командной работы Visual Studio Team System
<&> AdventtireWoHnOB - Microsoft Visuai Studio
Ble £dit ^«w £rpject fiuild T«m fiebug D|t* Iool* Tejl Ajjelyie Window НФ
.<й* л-.й «i.*U fc.JkilL- "' :...*.:..:*.!..►...D*™h '.^cpu
I T- eJ«|4lWnieA|pdit«$|*mib<p<HtToEditoi'I4| ЧД*
|^ SchemaCompare3
S j j 166 objects were compared.
ТЬ^г» ociip'-, v,aa сгсяхей by Visual 5r.urt.io on ^/#/-?OfS at: 7:44 PM.
R .r this1 .«:ipf, or t f3rc»9B.Auv>~aT;iu^Kork3l!W.dbQ to глкч» it сг-<» sxzr ач
Р5';ая<» fcac* t*p уочг t.*i?er, <1а-4Ьля<? bffcie rv:rniaa chJ.4 serine.
•7
GO
SST NtMERIC RODHDABORT OFF
GO
SET ANSI_PADDING ON
GO
351 ANSI WARNINGS OK
GO
5£T CONCATJHULljriELDS HULL ON
GO
ЗЕТ ARITHABORT ON
GO
SET SOOTED IDENTIFIER ON
GO
5П ANSI NULLS ON
GO
IF EXISTS (SLLECT * FROM t-eaprlh. .ayaobjecta WHERE id-OBJECTIDrtsapdb.
| Ready Inl Cotl Chi
U>l»B
•'»
-r X
г^^^ч&щ
*
H
3 1
i
<!
vf^r^OS.^ve* !^S*|
» i
j
I
i j
9
gl
:3 J
i
ItttpErrcra'>) ▼
INS
'
Рис. 29.15. Просмотр скрипта обновления схемы
Выполнение скрипта обновления схемы
Теперь, когда скрипт обновления готов, вы можете выполнить этот скрипт на целевой базе
данных. Конечной целью этого выполнения является приведение схемы целевой базы
данных в соответствие схеме базы данных источника. Вы можете выполнить этот скрипт
непосредственно из инструмента Schema Comparison, экспортировать этот скрипт в файл
(который может быть затем выполнен в различных инструментах, понимающих T-SQL), либо
открыть этот скрипт в редакторе T-SQL и выполнить его там.
Все эти варианты легко воплотить из панели инструментов окна Schema Comparison, либо
посредством использования меню Data | Schema Compare. Действие Write Updates
выполняет скрипт обновления немедленно; действия Export to Editor и Export to File открывают
скрипт в редакторе или записывают его в файл.
Опции сравнения
Вы можете управлять тем, как инструмент Schema Comparison выполняет свое сравнение
(при помощи диалога Options). Выберите Tools | Options, а затем перейдите на страницу
Schema Compare в разделе Database Tools. Этот экран (рис. 29.16) позволяет вам настроить
работу процесса сравнения (а также используемые в сравнении объекты). Например, вы
можете выставить флажок Ignore filegroups для того, чтобы инструмент сравнения исключал
из сравнения группы файлов SQL Server. Большинство имеющихся здесь опций пояснений
не требует, но в системе помощи VSTS есть тема "Options (Database Tools/Schema
Compare)", где имеются подробные объяснения всех настроек.
Глава 29. Редакция Database Edition
1125
*Т*;- X |
Environment
Performance Tools
г Project* end Solutions
i> Source Control
t> Ted Editor
л Database Toofc
General
Data Compere
Data Connections
v Data Gen enter
Design-time Validation Database
0/R Designer
Query and View Designers
Schema Compare
>■ Table and Database Designers
> T-5QL Editor
E> Debugging
i- Device Tools
■r HTMLPtaigftcr
Vi Include dependencies
У) E«rce table column order to be identtcat
' I I'ta* items as case-sensrhve
?j flock schema updates if data lots might occur
lf\ Include SQL plumbing for transactional synchronization scripts
Advanced schema compare options:
i Г J Ignore Till factor and index padding
(^j Ignore permissions
fZ Ignore whitespace
: [^Ignore bindings
' Clgnore SET QUOTED.IDENTIFIFR and SET ANSI.NULLS statements
; f Ignore extended properties
! f "Ignore full text induing
! P Ignore collation order
I y« Defaults
Рис. 29.16. Настройка опций сравнения
Сравнение данных
Помимо способности сравнивать схемы баз данных и проекты баз данных редакция VSTS
Database Edition имеет также и инструмент сравнения данных. Процесс такого сравнения
почти идентичен процессу сравнения схем.
Т*
New Data Comparison
if8
Choose Source and Target Databases
Source Database
Jarget Database
srvLA«VentttreWofk(<dbo
£d<t Connection...
Ne# Connection».
^J®
$svlAdvcntUreWoits2>dbo
* i
Egrt Connection...
New Connections
Data Compare Options
Records to compare;
ffi different Records
|j£ Only in Seurce
У] Only w Tjrget
R1 Identical fiecords
Compare target database to source database with the option to synchronize the target database to the source
database.
«P^w; ЦеэЛ > i. £mHh Cancel
Рис. 29.17. Выбор исходной и целевой баз данных
1126
Часть VI. Система командной работы Visual Studio Team System
Сначала мы запускаем сравнение через меню Data | Data Compare | New Data Comparison.
Простой мастер, состоящий из двух страниц, соберет всю необходимую информацию. Во-
первых, точно так же, как и при сравнении схем, нам нужно указать базы данных: источника
и целевую (рис. 29.17). Обратите внимание, что у нас нет варианта сравнения проектов баз
данных (поскольку в них нет никаких данных — только схема).
У нас есть на данной стадии также опция выбора тех записей, которые мы хотим сравнивать
в этих двух базах:
□ все те записи, которые отличаются; ,
□ записи, которые существуют только в исходной базе данных;
□ записи, которые существуют только в целевой базе данных;
□ все записи, которые идентичны.
Посредством выбора всех этих опций мы указываем, что хотим сравнить все записи этих
двух баз данных.
Затем нам необходимо указать, какие таблицы и представления мы хотим включить в
сравнение. Для этого нужно просто поставить отметку рядом с каждым объектом, который должен
участвовать в сравнении (рис. 29.18).
Ne.v Data Companion
Ш & Select which tables, fields, and views to compere
Name
3 NO [dbo] [AWBuildVersion]
<•* HZD [dbo] [AWBuiIdVeritonJombstoM]
$ klU [dbo] [DatabaseLog]
♦'03 [dbo].[Errortog]
**' k!Z3 fdbo] [Errort.og_Tomb5toneJ
<•+' 0 Z2 ldbo] [sysdiagrami]
^ [V| П IHumanResources] [Department]
'♦1 [£]Щ THumanResources] [Employee]
& РЩ [HumanResGUrcesMEmployteAddress]
il kllU IHumanResources] [EmployeeDepartmentHhtoryJ
71 kO [HumanResourc«],[EmployeePayHirtor>]
il [S\11 [HumanResources].[JobCandidate]
-t" МЭ [HumanResourcesMShift]
i k'O IPerson] [Address]
f [7Q [Person] [AddresVFype]
^ M3I [Person] LContact]
*> П71 1 1 Person] fContactTvoel
1 < greyiouj
_
p ЫМ]
Comparison Key
PK_AWBuildVerjkmJ»yrtemlriformationID j 1
PKT)EL>WBuildVerston_Tombstone_Systen =
PK_Databa:eLog_DatabaseLogID j J
PK_ErrorLog_ErTorLoglD - '
PKDEL_ErrorLog_Tombstone_ErrcrLogro
PK_sy*diagrarm_703EA55A
PK_Department_DepartmentID
PK_Emp{oyee_EmployeeID
PK_EmptoyeeAddress_EmployeeID_Addres£
PK_EmployeeDepartmenlHwtOfy_Emplcyee
PK_EmpIoye«PayHkstory_EmployeeTD_Rate(
PK JobCandidste JobCandidatelD
PK_Shrft_ShiftJD
PK.Address.AddressID
PK_AddressType_Addres5TypeID
PK_Contact_ContactID
PK ContsctTvue ContactTvnelD
' j EtrvUh J Cencd |
Рис. 29.18. Выбор таблиц и представлений для сравнения
Теперь инструмент Data Comparison имеет всю необходимую информацию для начала
работы. После завершения сравнения будет показано окно Data Comparison. Оно имеет очень
похожую на окно Schema Comparison компоновку. В верхней панели представлен подсчет
(по таблицам или представлениям) количеств записей (одинаковых, различных,
существующих только в источнике, существующих только в целевой базе данных). В отдельном
Глава 29. Редакция Database Edition
1127
разделе окна показаны подробности различий в данных, а в нижней части имеется панель,
которая используется для просмотра скрипта обновления данных (рис. 29.19).
*/> AdvcntureWorksOB - Microsoft Visual Studio
®
file £drt View Rroject Build Team Qebug Djta look Test Analyze Window Help
J) ' -J ' Л dl tf ; ^ :^ £* «^ ^ 7 *J ' :t; ► Default * АпУCPU
T' fi& ~JWrrteJJpdatesj 45 Export To Edjtoi -! >44 Ц* . *< Ю -
DataCompwe2;
!L»
J 73 tables and/cr views were compared.
fc Source srvl.AdventureWofks.dbo
:4 Target srvlAdventureWorks2.dbo
Object (check to include in update) Different Records
lL Ю Table*
' <l3 tdbo],[AWBuildVer$ion] 0
□ [dboj [AWBuilrfVersionJombstcne] &
M)l3 Ldbo].[DitabaseLogJ 0
ГЗ [dbo] [ErrorLogl 0
Only in Source
0
0
32 (Add 32)
0
Only in Target
0
0
0
0
Ide
1
0
357
0
Different Records Only in Source j QnJym Target | Identical Record» |
f Dart* Update Script
This window displays the SQL script that Data Compare generates to update the target database. You must cliclr 'Refresh Update Script' to
update and display the script
Ready
Рис. 29.19. Результаты сравнения данных
Просмотр подробностей на уровне записей
Щелчок по одной из строк покажет те физические строки, которые для выбранного объекта
различны. Они появятся в одной из вкладок, которые организуют их по типу различий. На
рис. 29.20 мы видим, что таблица HumanResources. Employee имеет в исходной базе
данных 13 таких строк, которые отсутствуют в целевой базе данных. Щелчок по этому
элементу таблицы покажет все эти записи на вкладке Only in Source.
Таблица подробностей позволяет нам вручную отменить выделение тех строк, которые мы
не хотим обновлять. Удалив пометку в столбце Update, мы можем указать те строки,
которые мы не хотим обновлять или вставлять в целевую базу данных.
Просмотр и выполнение скрипта обновления
Скрипт Data Update Script — это логический эквивалент скрипта Schema Update Script,
присутствующего в окне Schema Comparison: он показывает операторы SQL, которые
необходимо выполнить для обновления целевой базы данных до такого состояния, чтобы она по
своим данным стала копией исходной базы данных.
1128
Часть VI. Система командной работы Visual Studio Team System
| <J>> AdvenrureWorksOB - Microsoft Visual Studio
ftie £dtt tfiew £roject fiuild Team fiebug Data locls Tejt Analyze W>dow Help
Y - #* ** Write Updates j Чё Export То Edrtot -
if Data£ompare2| _ __ ___
| j 73 tables and/or views were compa red,
3 | $► Source: srvlAdventuf eWcxks dbo
-I»
4^! - *Я,
^IB
Ц
Object (check to include in update)
IH [doc] [jysdugrams]
, Z! [HumanResources].[Department]
[7, ^3 |[HumanResourctt] [Employee)
_V. 121 [HumanResources] [EmployeeAddreO
V ~3 [HumanResources] (EmployeeDepartO
* Target srvl JVcrventureWorks2 dbo
Different Records Only in Source Only in Target Identical Records
0 0 0 0
0 0 0 16
199 (Add 199)
203 (Add 203)
91
DrffertTTtRecoftii(p), Onry in Source A3) JTjnly in >ffi*JQ]flderrtical ЯмовЬ B77) |
13 records exist en source but not on target database; 13 records will be added to target fsrvl.AdvenhjreWcrks2.dbc)
Update EmployreiD
|* 162
(/ 165
,V 167
168
170
175
NattonaRDNumber
788456780
152085091
227319668
578953538
470689086
754372876
СогЛасШ
1208
1192
1133
1159
1235
1203
LpgmlD ManagedD
advrntirrr-wforlrs\ju.. 16
adventure worksVi... 74
adventure-works\.~ 173
adventure worksNr.. 87
adventure-works\ 44
adventure-wrcrks^s . 16
^Pa<aUpM»xti)Mi
Ready
1Ы!
Pro
Pre
Scr
Pro-
Рис. 29.20. Выбор таблиц и представлений для сравнения
[*=*№
<jt> AdventureWoricsOB - Microsoft Visual Sludlo
pfe Edit y'wwr project guild Team fiebug D*ta Tools Test Analyze Window tfcelp
Л- l'C3 А Ф j Л 4» %Л*> " ** lJ£'WJ * k* °?*U* ' Any CPU
T* ^ j^J Wnte Updates!«« Export Те Edrtot 'J Д >< j л \ Q.
4; DvtaUiaiparf*!
о 173 tables and/or views were compared.
ХШ
wp*
..^s script was crea.eti by Visual itutfic oi* 'i/U/^vttfc at <?:<3 fM.
k^r* mis scrips, си srvl.Adve-r.curetecrk-sZ.dfco ro nsake it tJ-.e serre as srvl.Advent^reWorka.ntK
.яз.? script, periorr-s its actions xr. ta« rollewmg arder:
I Diaasxe r'crsiiya-ketf ccnaxrramti.
*. Psrisrr DZl£ZZ соязглг.гз*
_. Perfcrrs LFCATE ccmrcafcds
*. fcerism INSERT cacreanda.
^. ke-«r.afcle rareiyn-Jrev constraints.
s-lease teac* *op your гегзес йасаЬаяв befsre z-orning cftzs scrips.
-/
5ET NUMERICJIOUNDABORI OFF
GO
S£T XACTJUJORT, AN3I_PADDI1?G, AKSIJIARHIJIGS , СОЖЛТ_1ГОЫ,_Т1ЖЬСЗ_!ГОЫ,г ARTTHABORT, QUCTED_:
GO
'"Fainter ussd for text / :jta$e upraacea Тпал right not be ntaded, xs.it ir declared, here -u
DECLARE gpv binaryA6)
ВЕ5ГЫ TRAUSACTION
ALTER TAHIE {Sale*}.lCastoeer] DROP COHSTRAIKT (FK_Custcaer_Sale3Tcrritory_TerritoryID]
ALTER TABLE [Sales] . (SaaesPexannQjotarUacory) DROP COHSTRATNT CiTK_SaleaPeracTi3uot.aHi9tory_
ALTER TABLE [Salea] . (СсгслсгуЯеоДстСиггелеу) DROP COaSTRATNT [Fir_CouncryRegiorCurrency_Couj ,
< { м vwyua. ^ 4vJfr
Ready
Lnl
Coll
Chi
Рис. 29.21. Скрипт обновления
Первоначально это окно пустое. Для генерирования скрипта необходимо в меню Data
выбрать Data Compare | Refresh Update Script. На рис. 29.21 показан скрипт обновления для
Глава 29. Редакция Database Edition
1129
нашего сравнения баз AdventureWorks. Комментарии в верхней части скрипта весьма
интересны, поскольку они демонстрируют надежность скрипта: он достаточно интеллектуален
для того, чтобы удалить внешние ключи таблиц перед выполнением вставок или обновлений
данных. Затем они создаются вновь (после внесения данных в выбранные таблицы или
представления).
Наши варианты выполнения скрипта обновления остаются все теми же: мы можем
выполнить скрипт непосредственно, либо экспортировать его в файл или редактор T-SQL.
Примечание
Вы можете выполнить тонкую настройку сравнения данных при помощи диалогового
окна Options (меню Tools | Options), в котором необходимо выбрать страницу Data
Compare (в категории Database Tools).
Рефакторинг переименованием
Редакция VSTS Database Edition сделала первые шаги по представлению концепций рефак-
торинга для сообщества разработчиков баз данных. В этой книге мы посвятили целую главу
(см. главу 9) рассказу о встроенной в Visual Studio Professional поддержке рефакторинга для
кода на языках Visual C# и Visual Basic. В редакции VSTS Database Edition добавлена
поддержка рефакторинга Rename для объектов базы данных.
Когда вы изменяете имя объекта (точно так же, как и при изменении названия в VB или С#),
то получаете список всех элементов схемы базы данных, которые будет необходимо
изменить для выполнения перемены названия. Для этого движок рефакторинга переименованием
просматривает всю цепь зависимостей данного объекта (для того чтобы обновить также и
все ссылки на данный объект).
Предположим, что мы хотим изменить имя таблицы HumanResources. Employee в базе
данных AdventureWorks. В окне Schema View щелкните правой кнопкой мыши по таблице,
а затем выберите Refactor | Rename. После этого будет показано диалоговое окно Rename
(рис. 29.22).
Rename - HumnRe50u*c*s.Employe*
New name
Worker
Locations
Humanftesources
[/} Preview changes
W\ Assume defaufe project schema dbo for unqualified script and unit test reference»
Г/J Update reference* in schema objects containing warnings or errors.
[7) Generate ref adoring log
л The default script that is generated at deployment time results
and adding a new table (column) with the new name. T his can
maintained, please perform data migration manually.
ULHBMT
i
.
i
n dropping the existing table (column]
result in dab loss, К data must be ;
I OK
[ Car*** j i
Рис. 29.22. Диалоговое окно Rename
1130
Часть VI. Система командной работы Visual Studio Team System
Опции Rename
В диалоговом окне Rename мы выбираем новое название объекта, а также указываем
несколько опций для работы рефакторинга:
□ мы можем предварительно просмотреть необходимые для файлов схемы изменения;
□ для любых объектов базы данных, которые до сих пор не имеют префикса в виде
названия схемы, мы можем присоединить впереди по умолчанию название схемы "dbo";
□ если у нас есть какие-либо файлы схемы, которые находятся в неработоспособном
состоянии (например, схема описания таблицы, которая находится в работе и имеет в
данный момент неверный синтаксис), то мы можем указать необходимость выполнения
процесса переименования даже для таких файлов;
□ мы можем сгенерировать журнал произведенных изменений.
Нажатие кнопки ОК покажет нам окно, в котором мы сможем просмотреть все изменения,
которые необходимы для выполнения команды переименования.
Предварительный просмотр изменений схемы
Окно Preview Changes (рис. 29.23) состоит из двух областей: верхний список показывает
все объекты, затрагиваемые командой переименования; в нижней области (на языке SQL)
показаны реальные изменения, которые будут выполнены.
Preview Changes - Renarre
Rename 'Employee' to 'Worker''
-" dj Sates.vSalesPtrscn.view sql
^ INNER JOIN [HumanRejourcesl.fEmployee] e
-! Qfi HumanReiources.^EmployeeDepartmerrLview.sql
.1,ИИЛЦ..1Ш1иШЛЩЦ1ЯИ
-j t«j Sates.vSalesPereanSate5ByRscalYears.v1ew sql
«Г „ »l Г S ~ .
Preview changes:
SELECT
e.{FmriloyeelDJ
,c. {Tide]
I ,c. [FirscNaite]
,c.£HiddleSauae]
, c.[LaatHaraeJ
,c.fSuffixJ
,e.Circle] AS {JobTitle]
,d. {Kane] A3 {Department}
,d.[GroupHanej
i ,edh.{StaxtDateJ
FROM [НшдапЯсзоигсса} .(Ког)г«| е
INNER JOIN fPexsonl.[Contact] с
OH c.[ContaccIDj « e.[ContactIDJ
, THMFR ЛОТН ГЯпт*п&*чп«1Гг^*1 . ГГигп1пур^Г»т»
тпгрпгШчгогИ ^-1b
Your project or one of hs dependencies contain syntax or build errors. References may not be updated.
&>Р»У
Рис. 29.23. Диалоговое окно Preview Changes
Глава 29. Редакция Database Edition
1131
Щелкнув по объекту в верхнем списке, мы увидим те обновления, которые движок рефакто-
ринга будет применять к схеме этого объекта. Важно помнить, что мы меняем только файлы
схемы нашего проекта базы данных, а не схему рабочей базы данных. В этом и заключается
сила проекта базы данных: мы можем выполнить изменения в безопасной среде, потом
протестировать их, а затем перенести эти изменения в физическую базу данных.
Примечание
Очень хорошо то, что рефакторинг переименованием способен анализировать не
только зависимости объектов схемы, но и любые другие зависимые объекты,
хранящиеся в проекте (такие как план создания данных или модульные тесты, подробнее
об этом см. далее).
Модульные тесты
Мы подробно описываем инфраструктуру тестирования Visual Studio (и VSTS) в главах 26 и
28. Редакция VSTS Database Edition использует уже существующую в Visual Studio
инфраструктуру модульного тестирования для того, чтобы обеспечить специфические для баз
данных возможности модульного тестирования. Модульные тесты в проекте базы данных
сосредоточены на проверке правильности схемы. То есть они должны обеспечить, что
производимые в базе данных изменения не нарушат работоспособность существующего кода и
не нарушат неявного "контракта" между уровнем приложения и уровнем базы данных.
Поэтому в смысле ожидаемых результатов они не отличаются от модульных тестов,
написанных для уровня приложений. Ключевая разница для разработчиков баз данных состоит в
том, что визуальный конструктор тестов в VSTS Database Edition специализирован под SQL.
Модульные тесты можно писать на T-SQL (а также и на Visual Basic или С#).
Создание модульных тестов
Существуют два способа создания модульных тестов для базы данных. Мы можем
использовать стандартное меню Test и выбрать New Test для открытия диалогового окна Add New
Test. Для наших модульных тестов данных нам нужен шаблон Database Unit Test
(рис. 29.24).
После нажатия кнопки ОК в диалоговом окне Add New Test новый тестовый проект будет
создан и добавлен в текущее решение. Визуальный конструктор тестов уже будет открыт и
готов к работе. Но в VSTS Database Edition есть оолее легкий способ создания модульных
тестов внутри окна Schema View. Щелкните правой кнопкой мыши по тому объекту,
который вы хотите тестировать, а затем выберите пункт Create Unit Tests.
Следующее диалоговое окно (рис. 29.25) позволяет нам выбрать любой элемент схемы
нашего проекта базы данных и вставить новый класс модульных тестов для этого элемента.
Мы можем либо добавить класс модульных тестов в существующий тестовый проект, либо
создать новый тестовый проект (на VB или С#) в текущем решении.
1132
Часть VI. Система командной работы Visual Studio Team System
Md New Test
Iemplates:
Ц
ebsbbs
44
Manual Test
(Word for-
«ti
Web Test
Test fclame:
3
Generic Test
43
Ordered Test
й
Load Test
<L.S
Unit Test
DatabaseUnitTestl
Add to Test Project Create
*J
Manual Test
(text format)
Q
Unit Test
Wuard
cs
s new Visual C* test project.
1Т7ЦШ||
Ha
Description "
Use a database unit test to exercise
database objects.
You can Hie a database unit test to test
stored procedures, functions, triggers, and
an/ other type of database object
~
w v
L..9*L^.J I c*nw' J \
Рис. 29.24. Создание модульного теста для базы данных
Create Unit Tests 19 ЦЦ^аШ :
Current selection: | j
В 4;ЦЭ AdventureWorksOB
[~ Г У.У Stored Procedures
J T03 dbo.uspPrintError
* i_d obo.uspGetWhereUsedProductID
<УЩ dbo.uspGetManagerEmployees
Щ dbo.u*pGetEmployeeManagers
rj dbo.uspLogError
J_m3 HumanP.esources uspUpdateEmployeePenorMlIrrfo
s 3 HumanResources,uspUpdate£mployeeHireInfo
.' ^2 HumanResources-uspUpdateEmpioyeeLogin
i" Г tA Functions
>♦- ПИ Triggers
Output project
Project |-TcstPfOJ«ttl <-[
Mew project name.
Output class
} Insert unit test 4fJc-»t sdec»e<
* Create new class: DatabaseUrutTest2.es
( OK j ( Cancel
Рис. 29.25. Выбор объектов для тестирования
Примечание
Ранее мы упоминали, что модульные тесты в VSTS Database Edition могут быть
написаны на T-SQL (а также и на VB или на С#). Почему же в диалоговом окне Add New
Test у нас есть только варианты С# и Visual Basic? Причина такова: несмотря на то,
что мы можем писать модульные тесты на T-SQL, они транслируются в тесты на
управляемых языках (VB или С#). Ни администратору БД, ни разработчикам БД не
Глава 29. Редакция Database Edition
1133
приходится беспокоиться о генерируемом коде на языках VB или С# (если только они
этого не пожелают сами!).
Преимущество создания тестов в окне Schema View по сравнению с меню Test состоит в
том, что VSTS Database Edition автоматически создает заглушку на языке T-SQL, которую
можно будет использовать как стартовую точку для теста. Она не завершена, но улучшает
производительность вашего труда, сокращая объем набора текста, необходимого для
написания теста. Заглушки могут создаваться для следующих элементов:
□ хранимые процедуры;
□ функции;
□ триггеры;
□ произвольный SQL (т. е. любой "компилируемый" блок кода SQL).
Создание тестового проекта
Если в текущем решении нет тестовых проектов, то Visual Studio создаст для вас такой
проект (в соответствии с вашим выбором в выпадающем списке рис. 29.25). После создания
проекта вы получите запрос о подключении к базе данных, которое необходимо
использовать для тестового проекта.
Project TestProjectt' Configuration
"TS
I
| Specify the database configuration settings for the current test project. These settings
! are stored in the «pp,config file m the test project You mutt rebuild the test project
[ before these setttngt are applied.
Database connections
Execute unit tests using the following data connection:
wl.AdY*T*ur»Wprfcvdfco
£d« Connection- Nk»Connect«n-
' ] Use a secondary data connection to validate unit teste
Croce»1 -teuton*
Deployment ———
™ Automatically deploy the database project before unit tests aie run
Database project
Deployment configuration:
tNort $ft«ted>
Database state
I -
Generate test data before unit tests an run.
jNore sskvted)
Рис. 29.26. Выбор основного и второстепенного подключений к базе данных
На рис. 29.26 показано окно, в котором вы введете эту информацию. Это окно показывает
также еще одну важную функциональную возможность модульных тестов для баз данных: вы
1134
Часть VI. Система командной работы Visual Studio Team System
можете указать второе подключение, используемое для проверки тестовых результатов. Это
позволяет вам указать обычное подключение с правами пользователя для выполнения тестов
(это основное подключение), а также подключение с более высокими правами владельца базы
данных (или администратора) для проверки тестов (это второстепенное подключение).
Визуальный конструктор модульных тестов
для баз данных
Показанный на рис. 29.27 визуальный конструктор модульных тестов для баз данных
отображает тестовую заглушку для хранимой процедуры dbo. uspGetManagerEmployees.
«J* AdventureWorfcsCB - Microsoft V>$ual Stuao
File Edit Vkw Project guild Team Debug Djta
f OiUtocUnitTcst2xs[Dcsi9nr[
1п>ЫВЗЫ
Tool* Test Analyze Window
>► Default » Any CPU
<* L J J . ~ -v «* i.
-r X
HeJp
' dbo_u*pG«tMeM9erEniptoy*«T ▼ ]|Twt ▼]f#| Wj\ Вегятвж |
-- aacafcase Jri.. test tcr dfce. ^2pC-->!aregerJircic < _>si
| JEC-ARE 3RC INT,
! gManagexID 1MT
j 3£L£CT SRC - 0,
i 9HAHugerID - 0
j SXZC 8RC - Jdbo| . {uapGetManagerEiEFloyeea} SHa.iagerTD
t 5ZLECT RC-8RC
T est Conditions:
Infojnckgrye^ J •*, j ifr 11 X [
Type
1$
>r 4 X
Feady
SthenwViev»
В ^3 AdventureWorksDB
[£ L/ Tables
IV 1Ла Views
ST L/ Stored Procedures
■jti dbo.u5pGelB1llOfMaler.eli
V 23 ^bo uspGetEmployeeMansge,
♦'. 'ИЗ dbo uspGetMsnagerEmployei
<B 72 dbo.uspGetWhereUiedProdu<<
i* <1П dbo uspLogError
jii ^] dbo uspPrintError
ir ^1] HumanReicurces uspUpdatel -
Ъ ^ZZ\ HumanReicurces uspUpdatei,
Ц <~\ HumanRKOurcei-UipUpdatet
[£ \ZA Functions
r.'.l Synonyms
ft' U Types
E LU Database Tnggeri
L3 Assemblies
Л LJ Security
E CJ Storage
if ijj Service Broker
j|! Sch ema fj^ Teerri Exp . %i\^ Sckrtior
оИЭ СК16 IMS
Рис. 29.27. Визуальный конструктор модульных тестов
В данном случае предположим, что мы хотим протестировать правильность хранимой
процедуры. Поскольку мы знаем загруженные в базу тестовые данные, то мы также знаем, что
при передаче в эту хранимую процедуру идентификатора менеджера 16 она должна вернуть
нам ровно 20 строк. Для создания на основе этого предположения блочного теста нам
необходимо сначала установить значение входного параметра равным 16. Это легко сделать
посредством редактирования кода T-SQL блочного теста следующим образом:
SELECT @RC = 0, @ManagerID =16
Теперь нам необходимо тестовое условие, которое будет искать ожидаемое количество
строк. В нижней панели визуального конструктора выберите в раскрывающемся списке Test
Conditions значение Row Count и щелкните значок плюса. После этого условие будет
добавлено в список условий. После добавления условия нам необходимо задать фактическое
значение для условия. Дважды щелкните по условию для того, чтобы увидеть окно его
Глава 29. Редакция Database Edition
1135
свойств. В этом окне вы можете установить свойство Row Count в значение 20. На
рис. 29.28 показано настроенное условие для нашего теста.
</> AdventureWorwCB - Microsoft Visual Stud'o
4«|S
File £dit V/tew Project guild Team Bebug Data look Tejt Analyze Window Help
J3 ' -J ' С* У Ф * 44 A >* * w • ;: - ." J ► Default ^ » Any CPU
у -> *,! к£з ^ ^ ^ з л ^ " : - * ' \ : 1 j ^ - *i r::';
>{ DitabaseUnitTest2.cs |Desgn]'j
-( j, - -r
ii dtao^uspGetMerwgetEmptoyeesT ▼ [Test
IN" I * B"
uT'C*'^.^
Sihema View
H ^1 AdverturettcrlcsDB
=5FLFCT ЗЯС - C,
QMa^agerlD - 16
FXF~ 9BC - JdbnJ . [uspGe-cManagerEirplnyeea] BMaiaQerlD
5ELECT RC-gaC
' Test Conditions;
:* x
Name
rcwCountCondruonl
Type
Row Count
I 0 rows must be
♦, Li« Tables
(£ lJ Views
'-- Ц/ Stored Procedures
,♦1 23 dbo.uspGetBNIOfMatemls
iJ 'ИЗ dbo.uspGetEmployecManage
'♦J 2D dbo uspGetMenagerEmployo
4! J3 dbouspGetWhereUsedProdut
_ T* Г" rthr» u<;nl «nFrrrtr
',3 Schema ! ^ ? f a»r* Kj> J% Ъь\и\ or
roMrCountCondftlonl
True
rowCountCondiHonl Microsoft VisuelStudi
(Name)
Enabled
ResuttSet 1
Mow Count
The expected number of rows
Ready
Рис. 29.28. Добавление в тест условия
\S> AdventurrWortuCB - Microsoft Visual Studio
)(a jtw>$ra
Re £dil V>w Project guild Team fiebug DfU Tools Test Analyze Window jjelp
JD ' -J' u2 У & *; t 5 ^ * ** ' ^ v ~> ► Default - AnyCPU
" a
DatabaseUnttTestZcj (Designf __
obo„uspGelMBr«gerEmpk/ee$Tts ▼ II Test
l\ J*l (** ; В««<™~
Vi >,}(*:six* .i.,j t-i
DECLARE 2RC 1ЭТГ,
Test Conditions.
Row Count
Test View » Д
*> » j [AllCofumr ■»
<у Itemts) selected. 1
Test Name Project
Lj dbo_tripCetManagerf TertProjectl
^SjS
i"\*»- ^} tfj IpowersSLPOWERSl 2008-03-06. • ) *>йцп - >jj) Debug * ;i
О Test гит *siled Results, 0'1 passed, Item(s1 checked 1
TT¥
Pesult
Build succeeded
Test Name Project
dbo_uspGetManagerl TestPrcjectl
Error Message
RowCountCondilion Condih
&*•*«■• W**- ^Sotuv"" 2;Test
Рис. 29.29. Просмотр результатов теста
1136
Часть VI. Система командной работы Visual Studio Team System
Выполнение блочного теста для базы данных
Теперь мы готовы выполнить тест и увидеть его результаты. Откройте окно Test Window
(при помощи выбора в меню Test пункта Windows, а затем Test View). Выберите в списке
тот тест, который мы только что создали, а затем нажмите кнопку Run Selection в верхней
части окна Test View. Visual Studio незамедлительно запустит тестовый скрипт и покажет
результаты в окне Test Results. На рис. 29.29 мы видим, что тест был выполнен, но наша
хранимая процедура тест не прошла.
Для получения подробностей о неудачном выполнении теста дважды щелкните по строке
результата в окне Test Results. Мы ясно видим, что хранимая процедура вернула из целевой
таблицы только 12 строк (вместо ожидавшихся 20 строк — рис. 29.30).
<*Л AdveritureVVorfcsDB - Microsoft Visual Studio
File £rfrt yiew Project fiuild Теад» fiebug Data lools
yb^-Lia» / \- Л *•?*-,*!'-* ►
а|-> ^'милавязгз* : с т .;-<
Г>Е] ' oT»_uipGrtM*n»g«_esTeft[Results][.]0й^фч?и^1иЙ*11?
[о В CommonResults
Щ TertRuru IpowerjlBLPOWERSl 2008-03-06 2339:49
Test Name- dbo^uspGelManagerEmplcyeesTest
Result О Filled
Duration- 00-0001.2664645
Computer Name. LPOWERS1
Start Timr 3/6/20081ДО55 PM
End Time Э/6/2ИИ11:3938 PM
Test
Default
\k >
fcsaali
AD*Iy
-
Л У
ze
l^jajiBij
Window ЙЫр
Any CPU » j ^1 %
" ^
r -J Л l ЕЙ 4 ^ Ж Sfc Л 1 "J v
~ X
*
f
Is
test We* ^ * К |
«> • [AHColumr- У
vi) ltem{s) selected 1
Test Name Project
i ^) crbojJspGe^anagefiTestProjectl
(-i Error Menage Copy
RowCourrtConditton Condrtion (rowCountCandrtionl) Failed. ResuHSetl: The
12 rovw(s) did not match the 20 expected rovw(s)
1-] Error Stack Trace Copy
Micrmoft.Vi5UBlStiJdio.TeemSyrtem.Data.UriitTest»ng.Condrbons.Te«tCondruo
n.FormatAndThrovy(Exception innerException, String specificMessageFcrmat
; OhjertlJarg)
Microsoft.VisualStudioJe»mSystem.Data.UrofTerting.Condrtions.Ro*vCountC
DndrtkrbDoAKiexttDBbe.TabJe.itsultSEfi w
JTtttKewKs
IB**- ^ ^ & lpowers©LPOWERSl 2008-03-06. - ) *> Run
О Test run railed Results. 0/1 passed; Item(s) checked: 1
"TTxl
►£ Debug »
Result
V<JO Failed
Test Name Project
dbo.uspGetMarugerl TestProjectl
Error Message < [,,,„_. Av ~^J}l,^^-,,,-,,^,Z2 *
RottComtCondrtionCondrti I jjSSStrV '^tea..." ^S*lu... I ^ Test...
Build succeeded
Рис. 29.30. Просмотр результатов теста
Создание данных
Еще одним ключевым действием жизненного цикла разработки баз данных является
создание тестовых данных. Само собой разумеется, что невозможно протестировать и уровень
приложения, и уровень базы данных (приложения для работы с базой данных) при
отсутствии данных в базе. Это общая для проектов баз данных проблема. В идеальном случае надо
было бы тестировать на производственных данных, но с использованием таких наборов
данных связано множество проблем. Производственные данные часто содержат
конфиденциальную информацию (или информацию личного характера), которая не может находиться
в открытом доступе. Объем работы, требующейся для подготовки "стерилизованной" вер-
Глава 29. Редакция Database Edition
1137
сии данных производственной базы, часто просто огромен. Все это осложняется
вероятностью утратить уникальные связи данных, существующие в производственной базе.
Именно здесь на сцену выходит генератор данных VSTS Database Edition. Он работает как
дополнение к инструменту импорта схемы: если мы обследуем производственную базу
данных и выполним реинжиниринг ее схемы, то сможем сделать то же самое и с данными.
Генератор данных использует профиль данных производственной базы для создания своего
собственного алгоритма генерирования случайных (но релевантных) данных в целевой базе
данных.
Создание плана создания данных
План создания данных — это объект, который мы можем добавить в наш проект базы
данных для создания тестовых наборов данных. Эти планы будут видны в окне Solution
Explorer в каталоге Data Generation Plans. Для добавления плана в ваш проект щелкните
правой кнопкой мыши по названию проекта, выберите пункт Add New Item, а затем выберите
шаблон Data Generation Plan в категории Data Generation Plans (рис. 29.31).
Add New Item • AdventureWofksDB
£ategones:
Database Project
Date Generation Pints
Prognmmabilrty
Security
Service Broker
Storage
Tables end Views
User Scripts
Vkim! Studio Templates
И
Data Generation Plan
№me 'аДШ1»И'МЛДД1йЯ
Templates
Visual Studio installed templates
t$£) Data Generation Plan
My Templates
V%J Search Online Templates
cz
— _ _
| У Ifflnfijjftnl 1
зШ
ДО | | Cancel |
'.
Рис. 29.31. Добавление плана создания данных
После того как план будет добавлен в ваш проект, он обследует объекты схемы проекта, а
затем загрузит их в окно визуального конструктора Data Generation Plan Designer
(рис. 29.32). В окне визуального конструктора мы управляем всеми аспектами плана
создания данных. Верхняя панель конструктора показывает нам все таблицы нашего проекта. Мы
можем включить (или не включать) любой объект в план создания данных (выставляя
флажок рядом с названием объекта).
Кроме названий таблиц мы видим также и число, представляющее количество строк,
которые будут вставлены в таблицу. По умолчанию план вставит 50 строк в каждую таблицу.
Мы можем изменить это значение на любое число строк (его необходимо ввести в ячейку
1138
Часть VI. Система командной работы Visual Studio Team System
таблицы). Имеются также столбцы Related Table и Ratio to Related Table. Эти настройки
важно понимать, поэтому давайте обсудим концепцию соотношений подробнее.
Ъ?> AdventureWonuCB - Microsoft Visual Stud о
<o j tat
File £drt. V>w Project fiuild Тыщ fiebug Djta Tools Tejt Analyze ffimdow Help
3 ' ~ * Li У 0 i J* ! Л ' Л ' -»'* v \ ' Def»4«t - AnyCPU
й * ЗД*.й1 Ч>*> Wti*i^S3 3'n^ I'll * e
>{ DstaGeneratJonPtanl.dgeit _ _
- 2»
p
$
Finished loading schema
Tabre (select to include in data generation)
fcj -3 dbfrAWBwldVerjtOrt
j] Ц] rtbc.DatabaseLog
V| Z] dbo ErrorLog
•/] ^3 HumanResources.Department
V[ *J3 KurrMrvResources Employee
У] 1"!! HumanResources.EmployeeAddress
V| Z3 HumanRebources EmployeeDepirtmentHistory
« j
Rovw to Insert
50
50
50
50
50
SO
50
Related Table
None
None
None
i
PatotoRe *
i
*
- x il!
Data General'anPrevi*
Systemlrrf ormahc nID
I Identity
WftPtHy
Identity
Mcrtfrty
Identity
Identity
Ready
vt - AWeU^dVersion
i) Database Version
1 еЬб*вР«ЮМ
nHHzQaK4«H60U .
lV2kL
6iUEEc^»aEUbvz^
EaSOEUnK.iZjKPE...
UNFJryKaiqdjOlAO
VenionDate
7Л6Ч5431-40.29 .„
8/7/4098 3.56.47 AM
8/27/392111 2132.
6/:3'6910 8-25 35.,
3/4/557511:2225.
4/19'-940910 33Л1
ModifiedDate
7/16/4543 14Q-2?
8/7/4098 3i56-47 AM
8/27/392111*21-32
6/23/o910S25J5 .
3/4/557511-22125 .
4/19/940910 33 01
Рис. 29.32. Визуальный конструктор Data Generation Plan Designer
Соотношения таблиц
В базе данных, имеющей между таблицами связь типа "один-ко-многим", обычно
существует некое стандартное соотношение количества строк такой связи. Пример — таблица
заказов, которая имеет связь "один-ко-многим" с таблицей элементов заказа. Если заказы в
компании имеют среднее количество позиций, равное трем, то мы можем сказать, что
существует среднее соотношение 1:3 для количества строк заказов и количества строк
элементов заказов. Генератор данных способен учитывать такие типы связей.
В списке таблиц мы можем указать связанную таблицу (посредством щелчка в столбце
Related Table). Список имеющихся таблиц будет заполнен в соответствии с внешними
ключами и связями, описанными в схеме базы данных. После выбора связанной таблицы мы
можем указать соотношение, и это число автоматически настроит количество строк, которые
будут вставлены в таблицу на стороне "многие".
Например, в базе данных AdventureWorks имеются таблицы
Purchasing.PurchaseOrderHeader и Purchasing.PurchaseOrderDetail. Эти таблицы
связаны (каждый заголовок имеет одно пояснение или более), поэтому они имеют
приблизительное соотношение 2:1. То есть для каждой строки заголовка существуют примерно две
строки с пояснениями. На рис. 29.33 показан учет этого соотношения в визуальном
конструкторе. Обратите внимание, что он автоматически вычислил для нас 100 строк (применив
это соотношение к 50 строкам по умолчанию).
Глава 29. Редакция Database Edition
1139
и/> AdventureWoftaDB - Microsoft Visual Studio
f_ile £dit View Project fiuild Теад} Qebug Data J_oofs lejt Адаг/ze Window
Lj3- -.JhlflP' , Л '* -."'
ki J|335i'J fc> *> 1Ы fcrf I H
г
о
о
DsUGenentfonPUnLdgefl*!
Finished leading schema
Table (select to include in data generation)
>/ '^2 Production WorkOrder
"У; ИЗ PraductmrvWarkOrderRouting
jf Ц] Purchasing.ProductVendor
J3 РигсгиЫг*дД»иг<1аде0г(М>е**й
2 Ш Purchasing PurchaseOrderHeader
У !ГЗ Purchasing ShipMethod
7" Z3 Purchasing Vender
Data Senmfcan Preview * PurchaseOrde-rDetatf
PurchaseQrderlD .U PurchaseOrderDetaiOD
Foreign key j Identity
Foreign key Identity
Foreign key btentrty
Foreign key Identity
f««gr» key Identity
J Re*
Foiejqn key _ Identity
dy
- j» » ~ » S' Default - Any CPU
333-rj^. .; -; , s
=_
Rows to Insert Related Table
50 None
50 None
Ы*1р
- 3
. _
[ ц Ш w&ymd}
-j
" x> Mi
Patio to Related Table *
50 None
100 j Purchaswg^wkhaseOidflrHe .< j IX
50 None
50
50
w
jj DueDate OrderQty
7Л6/45431:40:29 „ 11088
8-7/4098 3:56.47 AM 9320
8/27/392111.Л.32.. 8617
6/23/69108:2535 20492
3/4/5575 1122-25. 15187
4Л9/-940? 10:33 01 . 30420
ProductlD Л)
Foreign key
Foreign key
Foreign bey
Foreign lay
Foreign key
Fpre«wkev
I
r
* л. x
Ш
'i
■M\
till
rv
ч
—
sv
UnrtPrice * H
ЗШ1890972 -* i\
26231270072
24257468456
57632963718
42750329390
85629785990 "
Рис. 29.33. Добавление плана создания данных
Предварительный просмотр сгенерированных данных
Нижняя панель визуального конструктора создания данных дает нам предварительный
просмотр данных для любой выбранной в верхней панели таблицы. Например, после выбора
таблицы Person.Contact мы сможем увидеть строки, которые автоматически
сгенерированы для вставки в эту таблицу генератором данных (рис. 29.34).
Для того чтобы понять, как были получены эти значения и как этот процесс можно
настроить, нам необходимо ввести концепцию генераторов данных.
Настройка генераторов данных
Генераторы данных— это компоненты, которые создают данные определенного типа;
VSTS Database Edition имеет генераторы для всех основных типов данных:
□
□
а
□
а
□
строки (в кодах ASCII и Unicode);
числа (tinyint, smallint, int, bigint, real, float, decimal, numeric, money);
двоичные данные (varbinary, image);
дата и время;
уникальный идентификатор (GUID);
битовые данные.
1140
Часть VI. Система командной работы Visual Studio Team System
<*> AdventureWorfcsDB Microsoft Vsuei Studio
I file idit View
и л 'гад*
с?
г
£roject fiuild Теаш
•j...4 ..„». Il" :
!5j;">*> «»»
DrtaGcnentloanMil^gcn*
Fmuhed loading schema.
Table (select to ir
*| £3 Phiot С
dude in drt» generation)
ortfatt
ontactType
Djta Genen^onWavkw * Contact
CantactlD fA)
| | Identify
toertfrty
kten%
WewWy
Identity
Mentrtjr
Identity
identity
identity
Identity
*№***»
4 \
J Rudy
NamcStyle
JTrue
False
False
Fake
True
True
True
False
False
False
_ _FM«-
«1
£ebug Data
* - ^--<
looh
fr
SI3 3 23^}
—-_-
Rowfto
SO
«
Title
eb6
ePuO
a
HHi
*K
ixHGOUo
lo
D
gMpiSlV
IdaoJUE
_ c&ifr
~_
Insert
""
Test Analyze Window Help
Default ' Any С
* t * i
— - -=r-~
Related Table
w — —
FirstNjrtie
еЬбдаРйбМапНН.
uH60UoYleLDflg„
mCA'GulEaSOBU...
£4,01
0[ME04RvivBJW...
U*K6LMneA£fRU..
U6HE1GUU
AUMQTzEaaDlAE
jf6FvFjiWBoN0AfU..
akZJeildfebfcttiJ...
P7YCUmMM?U>
PU
- =—=- - -__
l»i@i
'$
-r X
Ratio to Related Table *
11
*
MrddteName
etxWuUManHK-
azHGOUoYletDdg..
mOMSulEaSflBU
<J6j01
OU4E04RvavBiW...
UwK6LMntAEfR6
UfiHErGuO
AU64QTzEaiOiAL.
jfdrvEnWBdNDAlU.»
akZ*tildfcbfc3e<L.
Р7*ЯАтЦПА«И*
LertName
eWWuQManHH.. _
KH60lidYleLD6gn ....
mCzIVGu.EaS0BU
CojOl
0LMCO4Rv3vBJW„
UwKoLMneAEfRO.
U6HErGuO
AUC4QTzEaaOiAE...
/6n/EnWB6N0Aill...
akZieildtubiz3eu..
P7*CV»mMV4l7P4.b '
>
цу
4
Щ
< <
f i
Ji|l
i-S i:
■> I1
ftii
jtlr
'Sj
if!
i* <
i
Рис. 29.34. Предварительный просмотр данных
Кроме того, имеются генераторы и для более сложных типов, таких как:
□ внешние ключи;
□ регулярные выражения;
□ данные на основе запросов ("привязанные к данным" генераторы).
Каждый генератор выдает данные на базе случайного начального значения и соответствует
целевой схеме. В нашем примере с таблицей Contact мы видим, что для столбца
ContactiD не было сгенерировано значений, поскольку в схеме базы данных этот столбец
описан как идентифицирующий; значения для этого столбца будут предоставлены самой
базой данных. В данных примера вы увидите числа там, где должны быть числа; строки там,
где должны быть строки; и временные метки там, где должны быть данные даты/времени.
Но данные не безукоризненные. Например, мы видим, что столбцы имен содержат данные,
которые имеют вид строк, но не похожи на настоящие имена. А в столбце Modif iedDate
есть весьма странные даты вроде "8/1/6169 5:13:59 РМ". Итак, хотя значения по умолчанию
дали нам нечто похожее на реальность, все же это не совсем то, что нам нужно. Для того
чтобы данные стали более реалистичными, нам необходимо настроить некоторые свойства
отдельных генераторов.
Изменение свойств генератора
Для изменения генератора сначала необходимо в визуальном конструкторе Data Generation
Plan Designer открыть окно Column Details. Вы можете либо щелкнуть правой кнопкой
мыши в окне предварительного просмотра данных и выбрать Column Details, либо нажать
кнопку Column Details в панели инструментов визуального конструктора.
Глава 29. Редакция Database Edition
1141
В окне Column Details перечислены все столбцы таблицы. Когда мы щелкаем по столбцу, то
получаем окно свойств с различными настройками генератора, прикрепленного к этому
столбцу. Например, если мы хотим изменить даты, генерируемые для столбца Modif iedDate, то мы
можем щелкнуть по этому столбцу в списке столбцов, а затем указать значения Мах и Min для
генерирования более реалистичных значений даты/времени (рис. 29.35).
Совет
Каждый тип генератора имеет собственные уникальные свойства, которые можно
настраивать. Для числовых генераторов мы можем указать минимальное и
максимальное значения. Помимо управления такими параметрами, как минимальное и
максимальное значения (или начальное значение), мы можем также указать распределение
для строковых генераторов (при помощи настройки минимальной и максимальной
длины генерируемых строк).
Одним из особенно полезных свойств генераторов чисел и даты/времени является
свойство Distribution. Оно используется для настройки кривой статистического
распределения генерируемых данных. Например, если мы хотим генерировать данные
для столбца возраста в таблице Person, то мы можем указать нормальное
распределение этих значений. Для этого нужно указать в свойстве Distribution значение
Normal (вместо Uniform).
</> AdventureWorwOB - Microsoft Visual Studio
i@b&fowT
Fife Edit yiew Project guild Team Eebug
Tools Test Analyze JIVtndow
J ■> Default <r Any CPU
tWp
• m
Ц< '' DitaGcnefatioitPiMLtfgen*
t\<
РУГ*
Finished loading, schema
Tabie (select to include in data generation)
S3 ^PwsenTontact ~ "~ *
"Щ 33 Person-ContactTyoe
j<J* m ' I
Rows to Insert *i
> -i
50 -I
i
j | ModrfkdOate Column
\ j A o,v Nulls
\*'l Сс;.ьцд n»
' В Distribution
1 elv
I3etd*i«' ,
Uniform
*
Column ОДаЗГЗдопУ^гйас*
Column (select to include in data generation)
P J2 Suffix
' Щ 13 EmailAddress
Щ ffl EmailPromohon
(/] S3 Phone
\j\ ffl PasswordHash
(V] Щ PasswordSalt
P |U AddrtionalContacttnfo
{if} C rowguid
Key
Data Type
nvarchar
nvarchar
int
Phone
Varchar
varchar
AdditionalCo
uniqueidentil
datetime
Vntp q« Kv.
Mm
Percentage Null
Pr «Vfrt
Seed
Step
Unique
3/1/200811:5959 PMJ
1/1/200012.-00:00 AM
0
False
5
00Л1Ю0
Fats*
. ^ Column Details ^ Date ©enemticn Preview
Ready
m
The mMimum value that is generated for the column.
Рис. 29.35. Изменение настроек генератора даты/времени
Использование сложного генератора
Как уже упоминалось, у нас есть возможность реализовать более сложные генераторы.
Давайте в качестве примера рассмотрим столбец Title нашей таблицы Contact. В идеальном
случае мы бы хотели, чтобы генератор этого столбца выдавал Mr, Mrs, Ms или Dr. Посколь-
1142
Часть VI. Система командной работы Visual Studio Team System
ку базовый генератор этого делать не умеет, то мы можем вместо него использовать
генератор регулярных выражений.
изыаы
*«** AdventureWorfcsCB - Microsoft Visual Studio
Fit* Edit #e* £roject guild Team gebug Qgta Jock Test Aflame Window Це1р
Л • , ' u2 kl Ш i & "~* & ' • ^ ' ^ • ~ i » Default - AnyCPU
и '3 3 s:o •>**> ы^азэзиз 2c~* ;
? DataGefterationPlanLdgen*
Finished loading scheme.
Rows to Insert
50
50
50
50
50 j Maximum Length
Percentage Null
* 3
(Table (select to include in date generation)
(Vf ^3 Person.Contact
J] [3 Ре«ол ContactType
«/] ^] Person CountryRegion
,>] Z3 Person.StattProvince
?| ZD Production BillOfMatenaks
f TH»e Column
«леек -с \5tt;i
Column Detail - Person Contact
Data Type
nvarchar
Name
Name
Ma me
nvarchar
nvarchar
Generator
Regular Expression
String
String
Stnng
Stnng
String
'A
я&
Mr|Mn|Ms|Dr
™4 Column Details ЩгЗаЧз GisnmtJcn Preview
Peady
Expression
The date generated by the Regular Expression
generate is guaranteed to match the regular express^*
Рис. 29.36. Изменение присвоенного генератора
«* AdventureWoricsDB - Microsoft Visual Studio
file jjdrt View project Build Team
yi- DataGenentionPianLidfefi
fiehug Data
lock Test Analyze Vtfndow Help
^„^_
11_ An error occurred while generating data and the operation
I* Table (select to include in data generation)
j 2 13 Perscn.AddressType
| \ Ш "d[ Р^тол.Сопиа
I " *~1 Prr<r\fi rj\pl»rtTsrpm .
t5ata Sene/atran Prwievtf Contact
ContactID <j} NameStyle
I Identity j True
Identity False
Identity False
ttenthy False
fefeftiijy True
Identity True
Identity True
Identity False
" ~ • №
—
Title
Mrs
Mrs
Mrs
Ms
Mrs
Dr
Mr
Dr
Identity False Ms
3 Output Q Column DefsHr !2JDlte Generation Preview
J Ready
Default - AnyCPU
2 C' * t
.
^ШЬвЗЫ'
i»
- X
has been terminated. See the Error List window for information»
Rows to Insert
50
+|so
v\
- — —
FirstName
ebtWuUManHH...
KttiOUdYlpLDog
mUVGuiEaSBBU
CoJOI
OLUIHMRvavBSW
iWfilMAeAEfRO
UfiHErGuO
Allu4QTz£aU)(AE..
jforVEnWBoNOAlAL.
Related Table Ratio to Related Table
• — •
-
MiddleName
еЬбхлРиФМапНН...
a2H60U6Yl«LD6g
mCiIVGuiEaSGBU
CoJOI
OU4IZ04RvivB«W
6wKeIMrttAEfR6
UfiHErGuO
AUu4QTiEaaDtAL
jfiTvEnWBoNDAlU...
»
* a x
LastName
еЬОхвРибМапНН
azH60U6>loLD6g„.
mCdVGOiEeSOBU».
CojOi
0lMI264RvavBiW..
UwlCoLMfleAEfRO.
UoHErGuU
AUuAQTiEaSOIAE..
jfdivEnWB6NOAJU -
*
&J:
si
£ \
'1 i
Ы'
2?.
n
3
^
14'
ц
я
. _.
Рис. 29.37. Генератор регулярных выражений в действии
Глава 29. Редакция Database Edition
1143
Для изменения присвоенного столбцу генератора необходимо прокрутить окно Column
Details до столбца Generator. Щелчок по столбцу покажет раскрывающийся список со всеми
поддерживаемыми типами генераторов. В нашем случае необходимо выбрать Regular
Expression. После замены генератора мы можем использовать окно свойств для ввода нашего
выражения, которое будет генерировать правдоподобные обращения (рис. 29.36).
Если мы теперь вернемся обратно на вкладку Data Generation Preview, то увидим, что
данные уже обновлены в соответствии с настройками генератора (рис. 29.37).
Создание данных
После того как мы настроили план создания данных так, как того хотели, последним шагом
необходимо выполнить этот план. Самый простой способ для этого— это щелкнуть по
кнопке Generate Data в панели инструментов Data Generator. Сначала вам будет
необходимо указать то подключение к базе данных, которое будет использоваться (которое, в свою
очередь, уже определяет и целевую базу данных). Здесь вы получите запрос, хотите ли вы
удалять уже существующие в таблице строки перед тем, как создавать новые данные. После
получения ответов на эти вопросы начнется создание данных.
Эта операция многопоточная; обычно одновременно обновляется сразу несколько таблиц.
В течение всего этого процесса окно визуального конструктора будет обновляться и
показывать продвижение процесса для каждой таблицы: галочкой помечается успешное
создание данных, а треугольником обозначается либо выполняющееся создание, либо
запланированное (рис. 29.38).
Wft AdvenrureWorfcsDB - W crosoft Visual Studio
File Edrt View Project fluild Теащ fiebug D^ta Tools Tejt Analyie Window Help
ii" ' Л fk Ш Ь ~ л " ?' ' -iv~i > Default - Any CPU
«» a~ i"L u ->*> k&i&zi^n*^ Г: т 9
\}У\ D4taGeneratiofiPf«nl.dgen
u | Generating data for selected tables of database AdventureWorlesTest
L*L ; Table (select to include in data generation) Rows to Insert Related Table Ratio to Related Table
!
1
i
'
[ 13 dbo AWBuildVeruan 50
Q ZJ dbo Databaselcg 50
(_ Щ dboErrorLog 50
R. Z3 HumanResources Department 50
!/ Ц] HumanResourcesXmployee 50 None
LI 1Л HumanResources EmployeeAdrfresx 50 None
R. Z3 HumanResources EmployeeDepar 50 Ncne
'»/ ^ HumanResources.EmployeePeyHi . 50 None
']vj id Hum«nilewur<«J«bC*r>d«tete 50 Hot*
2 HI HumanResources.Shjft 50
\" !I3 PerscnAddress 50 None
У 13 Person AddressType 50
2 IjI Person.Contact 50
i ЦЗ Person ContactType 50
( ] Z3 Person CountryRegron 50
3 QttputjJ^ Column DtUtSs !Д Uat* beneuiop Pr«v«w
J Ready
• iB
Status
чЬ!
>f
J
t
и
•J
и
\*s
V
1 сэ I ihI тш£Зш&
-
-x tit
Zi
- 2
1
58 k
i £ '
• 3
15
' >* i
n
3
n
1 T£
1'
Рис. 29.38. Генератор регулярных выражений в действии
1144
Часть VI. Система командной работы Visual Studio Team System
Построение и развертывание
Последняя тема, которую мы еще не рассмотрели, — это обновление схемы базы данных
схемой из проекта базы данных. Здесь используется все та же парадигма построения и
развертывания, которая применяется и в других типах проектов Visual Studio. В контексте
проекта базы данных процесс построения делает синтаксический анализ всех файлов SQL и
выявляет те файлы, где есть синтаксические ошибки SQL. Если построение прошло
успешно, то развертывание обновит схему целевой базы данных (или создаст новую базу данных,
если целевая база данных не существует).
Мы указали целевую базу по умолчанию тогда, когда выполняли программу мастера
первоначального создания проекта. Эту информацию можно изменить в любое время при помощи
щелчка правой кнопкой мыши по проекту в окне Solution Explorer и последующего выбора
пункта Properties (для того чтобы открыть окно свойств). На вкладке Build содержатся
настройки, которые определяют процесс построения и место развертывания (рис. 29.39).
Примечание
Для реального развертывания схемы вам не обязательно использовать Visual Studio.
Выполняя построение проекта базы данных, мы генерируем файл скрипта SQL (со
всеми необходимыми командами SQL). Мы можем выполнить этот файл скрипта из
любого инструмента, который понимает T-SQL (и в том числе из SQL Enterprise
Manager). Это полезно в таких ситуациях, когда реальное изменение схемы производится
администратором БД (у которого может и не быть инсталлированной версии VSTS Da-
' tabase Edition, либо у него есть специальный инструмент, который он должен
использовать для изменения схемы).
W» AdventureWorfcsDB - Microsoft V»la\ Studio
ftte fcdrt yitw Project guild Теащ. fiebug Djta look Tejt Anilyzt Vtfndow Help
4'^J'Ji У 3P, & -* Ai'ZsJ'4 " P~; t■■ * Dff,ult * Anycpu
У{" AdventweWorfaDB
.a
Configuration I Active (DeUuty
Platform. [ArtrVBJAoyCPUj
Target DaUbast Settings
Itrget connection*
Data Source=192168 О 5D;Persht Security Info=True;User ПЬ AWDBCfcPot|
Target database name
AdventureWorksTest
Default location for target database file*
СЛРгодгат FilesVMtcrosoft SQL SefveAMSSQL J\MSSQL\DATA\
Deployment collation default
^3 Solution 'Adventui *
>fl U Solution hems
-, £3 AdventureWo;
■■ai References:
-1 L> Data Generj
4t) DataGei:
if D| Schema Ofcj
'-! %J/ Scripts
; Ы i£>Post-D<j*
< 4] Data
«£) Perr
: a£] Rolt!
; > iURuw
j itibgr
Q \& Pre-Deft
i itiCus
4} Link
*Jlog
_ •»! o,.. w
Ready
Рис. 29.39. Вкладка Build
Глава 29. Редакция Database Edition
1145
Резюме
В этой главе вы увидели, как разработчики и администраторы баз данных могут
использовать инструменты редакции VSTS Database Edition для того, чтобы справиться со многими
обычными проблемами, с которыми они сталкиваются во время жизненного цикла
разработки баз данных.
Точнее говоря, мы рассмотрели, как редакцию Database Edition можно использовать для
того, чтобы:
□ выполнять реинжиниринг базы данных в проект базы данных;
□ производить изменения файлов схемы в проекте баз данных, и даже сохранять эти
файлы в системе управления исходными кодами;
□ сравнивать схемы и данные двух баз данных (а также схемы базы данных и проекта
базы данных);
□ создавать модульные тесты и проверять эти тесты на объектах проекта базы данных;
□ формировать сложные планы создания данных;
□ собирать и размещать схему проекта базы данных в рабочую базу данных.
Глава 30
Team Foundation Build
Последний инструмент системы Visual Studio Team System, который мы опишем в данной
книге— это Team Foundation Build (TFB). Он распространяется как часть сервера Team
Foundation Server и (подобно другим обсуждавшимся инструментам) является составной
частью Visual Studio Team System (VSTS).
При продвижении проекта по своему жизненному циклу вы достигаете точки, в которой
приходит время свести воедино все компоненты, откомпилировать их, раздать и
протестировать. Этот процесс называется построением. Как вы увидите, процесс построения
программного обеспечения — это нечто большее, чем простая компиляция исходного кода в
исполняемые двоичные файлы. На самом деле построения могут быть исключительно
сложными и требовать огромного количества ручной работы членов команды проекта.
В этом процессе возникают некоторые уникальные проблемы:
□ отсутствие всеобъемлющего универсального набора инструментов построения
(интегрированного в проектную среду) приводит к непредсказуемому и невоспроизводимому
процессу построения;
□ сложно отследить процесс построения и понять его состояние;
□ обычно нет никаких механизмов поиска неполадок, которые происходят при построении.
Team Foundation Build предназначена для автоматизации многих аспектов процесса
построения и решает перечисленные здесь проблемы (предоставляя команде проекта цельный
набор инструментов для создания и анализа построений).
В этой главе рассматриваются возможности инструмента Team Foundation Build, дается
обзор основ систем построения, обсуждается типичный процесс построения в Visual Studio
Team System, а также подробности способов взаимодействия с инструментами построения
из Visual Studio.
Обзор Team Foundation Build
Многие организации разработчиков используют лабораторию построений для создания
открытых и закрытых построений своих версий программного обеспечения. В своей основе
лаборатория построений является набором аппаратного и программного обеспечения, кото-
Глава 30. Team Foundation Build
1147
рый берет все файлы исходного кода командного проекта, централизует их на сервере
построения, а затем компилирует систему с учетом всех самых последних изменений. После
этого (в идеальном случае) такое построение упаковывается и копируется в некий
общедоступный ресурс, который доступен всем членам команды. Отдел проверки качества (QA)
после этого может выполнить свои тесты и определить, какие изменения должна внести
команда разработчиков.
Цель инструмента Team Foundation Build— предоставить готовую лабораторию
построений. По существу он стремится устранить из процесса построения большую часть ручной
работы, предоставляя в то же время членам команды возможность получать информацию о
состоянии построения. Платформа Team Foundation Build предоставляет команде проекта
следующие возможности:
□ позволяет быстро и легко создавать и запускать процесс построения из Visual Studio;
□ обеспечивает повторяющийся, непрерывный процесс построения программного
обеспечения по определенным событиям (таким как возвраты или временные интервалы);
□ обеспечивает команду проекта необходимыми для определения общего состояния
построения инструментами;
□ позволяет сравнивать построения (для оценки истории развития проекта).
Архитектура Team Foundation Build
Сервисы Team Foundation Build обеспечиваются в Visual Studio Team System четырьмя
подсистемами: клиентские инструменты, сервисы построения, Web-сервисы построения, а т!ак-
же хранилище построений. Каждая из них играет в процессе построения свою
специфическую роль. На рис. 30.1 показана совместная работа этих компонентов.
Каждый из этих четырех компонентов играет ключевую роль для обеспечения надежности
построения. В следующем списке описаны компоненты рис. 30.1.
□ Build Client Tools (Visual Studio) (клиентские инструменты построения Visual Studio) —
с их помощью построение (которое может иметь версию и храниться в системе
управления исходными кодами Team Foundation Source Control system) описывается и
запускается.
□ Build Web Services (Web-сервисы построения) — этот компонент существует на уровне
приложения сервера Team Foundation Server. Его задача — прослушивание приходящих
от клиентских инструментов запросов на построение. Затем он передает запрос на
построение сервисам Build Services (на сервере построения).
□ Build Agents (агенты построения)— представляют собой реальные серверы построения
вашего приложения. Сервисы построения работают на этих агентах. Это "рабочие
лошадки", которые выполняют фактическое построение. Для этого они сначала изучают
определение построения. Затем они собирают все необходимые файлы (из системы
управления исходными кодами), компилируют исходные файлы, выполняют тесты и
публикуют результаты в хранилище построений. Затем членам команды могут быть
разосланы уведомления о завершении построения. Кроме того, агенты построения
выложат построение в указанное место.
38 3ак 3716
1148
Часть VI. Система командной работы Visual Studio Team System
Build Repository (хранилище построений) — уровень данных сервера Team Foundation
Server служит хранилищем данных. Здесь хранятся подробности процесса построения и
журналы событий. Это позволяет клиентам просматривать и анализировать построение.
*/
8/
I 1%
Клиентские
инструменты сборки
т
Visual Studio 2008
f Web-сервисы сборки ]
Уровень
приложения
Team
Foundation
Server
•€
Разделяемые
файловые
ресурсы /
Сервер
Файловая
система
Старт / Стоп
Хранилище сборок
Уровень
| данных Team
Foundation
Server
Агенты сборки
Сервер
^сборки Team
Foundation
Server
J*
&
Рис. 30.1. Система Team Foundation Build
Примечание
Представленная на рис. 30.1 диаграмма является логической архитектурой. Система
Team Foundation может быть структурирована различными способами. Например,
несмотря на то, что для больших проектов имеет смысл держать выделенный сервер
построения, вы можете разместить сервер построения на том же самом компьютере,
на котором находится уровень приложения Team Foundation Server (либо уровень
данных). Для очень больших проектов, возможно, имеет смысл содержать целую
ферму компьютеров для построения (на которых работают компоненты сервера
построения).
Клиент Team Build Client
Team Explorer внутри Visual Studio работает как основной клиент системы Team Foundation
Build. Внутри Team Explorer можно управлять построениями и настраивать их (в узле
Builds). В узле Builds видно каждое описанное в данном командном проекте построение.
Каждый из этих объектов имеет различные настройки, в том числе: какие файлы должны
быть включены в построение, какие тесты должны выполняться как часть построения, где
должно быть опубликовано построение и т. д. На рис. 30.2 показан список описаний
построений в окне Team Explorer.
Примечание
Для того чтобы управлять построениями проекта, вы должны быть членом группы
Build Services сервера TFS для данного проекта.
Глава 30. Team Foundation Build
1149
Team Explorer
l^J/J® ~
Щ 2K3R2-TFS2008
Г^1 My Favorites
1 e 51 Utware HR
I '£ ta Work Kerns
I x 12 Documents
[ 14 Reports
i s ^ущ
[ ££ All Build Definition*
f ♦ j Full Build -
[ .^ Source Contro
daily
1
ш
J
Рис. 30.2. Построения в окне Team Explorer
Уровень приложения
Уровень приложения Team Foundation Server реализует Team Foundation Build как набор
четырех Web-сервисов (все Web-сервисы, реализуемые компьютером уровня приложения
сервера TFS, описаны в главе 23):
□ Web-сервис Build Controller предоставляет API для управления построениями.
Например, он способен выдавать команды запуска и останова агентам построения;
□ Web-сервис Build Store предоставляет методы сохранения и получения информации о
построениях для уровня данных TFS;
□ Web-сервис Build Integration позволяет серверу построения и прочим клиентам
взаимодействовать с другими объектами командного проекта;
□ Web-сервис Publish Test Results является API для распространения результатов тестов
построения среди членов команды проекта.
На уровне приложения имеется доступ к системе управления исходными кодами, а также и к
информации по анализу кода и по тестированию. Все это очень важно для процесса
построения.
Агенты построения
Агент построения — это сервер (или серверы), который может выполнить построение и
поместить результаты в разделяемый каталог. Агент построения (называемый также сервером
построения) — это основной "мотор", который реализует процесс построения.
Процесс построения начинается с вызова со стороны клиента построения (или из
запланированного процесса), который делается к уровню приложения. На уровне приложения
имеется сервис Team Build Service. Его задача — выдавать команды агенту построения на
выполнение фактического построения. Конечно, эти команды основаны на информации из
базы данных построений.
Затем агент построения выполняет скрипты построения и размещает построение на
указанном разделяемом ресурсе. Он регистрирует его продвижение и сообщает уровню приложе-
1150
Часть VI. Система командной работы Visual Studio Team System
ния о его завершении. Он также работает совместно с уровнем приложения для того, чтобы
записать результаты построения в хранилище данных TFS (для отслеживания).
Примечание
Мы обсуждаем все эти элементы как отдельные компоненты Однако важно помнить,
что все они могут работать на одном компьютере.
Хранилище построений Build Repository
Хранилище построений реализовано на уровне данных сервера Team Foundation Server в его
собственной базе данных SQL Server под названием TfsBuild. Эта база данных содержит
таблицы, которые хранят информацию, связанную с описаниями построений и результатами
тестов, а также соответствующие элементарные работы.
В качестве примера хранимой здесь информации на рис. 30.3 показана модель данных для
некоторых основных таблиц, используемых для описания построений. Это таблица
описания построений (в которой хранятся ваши описания построений), таблица агентов
построения (в которой хранится информация о компьютере построения), а также таблица для
хранения реальных экземпляров данного построения.
Теперь, когда у вас есть все необходимое, пришло время посмотреть, как можно управлять
процессом построения в системе Visual Studio Team System.
tblj^iildDefinitfon
1
Defninonld
Groupld
DefirttlonName
DefaultBuldAoent
DropLocatlon
CorfqurrtionFolderUrl
MexTlmeout
ConbnuousIntegraUxiType ■
ContnuousIntegrattonQulet
LastButtJn
LartGoodBiJdUrl
LastGoodBufldLabel
Enabled
Description
LastSystemQueueld
LastSystemBuldStartTine
tbLBulldAgent
J
u
p
Agentld 1
Gfoopld
AgentName
MachlneName
Port
RequreSecureChamel
MaxProcestes
BuMDrectory
Status
StatusMessage
Description
QueUeCount
InitlaizlngStatus
InWa»ring5tatusM«j«ge
tbIJMIdQueue
5
Li
p
Г
Quaueld
Agentld
Oefinittonld
QueueTime
III
CustofnGatVertan
DropLocation
RequastedFor
RequwtedBy
CommendLine
Bddld
tbtJBuHdCjuaHty
5
,?
Quaityld I
TeamProject
QuaUty
Deleted
Veiftad
j—a j
tbLBulld
Щ Boldld
j"j Defnltlonld
HBuldNumber
5tartTlme
I FintthTirne
' Aoentld
ConflgurationFoldefOrl
ySourceGetVersion
Droptocatton
LogLocation
1 j Qualityld
I | BuldStatus
ГП CompilationStatus
' TastStatus
ReqimtedFor
[j | RequeitedBy
Pj LastChangedOn
} LastChangedBy
| J LabelName
I | CommandLme
| J KeepForever
Lj BljlldLJri
0
В
Рис. 30.3. Часть модели данных для базы данных Build
Создание нового построения
В системе Team Foundation Build используется концепция определения построения.
Определение построения — это просто контейнер для всей конфигурационной информации,
относящейся к построению. По существу оно определяет все части данного построения.
Глава 30. Team Foundation Build
1151
Новое определение построения создается в окне Team Explorer. Щелкните правой кнопкой
мыши по узлу Builds, а затем выберите пункт New Build Definition. При этом запустится
мастер определения построения, который проведет вас по процессу определения рабочей
области, выбора файлов для построения, настройки тестов и анализа, описания агента
построения и планирования построения. После завершения мастера он запишет конфигурацию
построения в файл специального формата (который используется движком построения).
Следующие разделы проведут вас по мастеру определения построений.
Название построения
Первый шаг — дать построению имя. Оно будет отображаться в узле Team Explorer Builds
и в отчетах по построению. На рис. 30.4 показана первая страница мастера определения
построений.
Обратите внимание, что мы будем продвигаться при помощи ссылок на левой стороне
(общие, рабочая область и т. д.). Этот пользовательский интерфейс — не совсем настоящий
мастер.
Build Definition - HR Application Automated Nightly Build I *? Ы&Ш
Workspace
I l Project File
Retention Policy
Л Build Defaults
Trigger
* Thtf icon indicates th
Build definition name
HR Application Automated Nightly Build
Description (optional);
This build runs nightly against the HR application A full set of test and code * .
analysis is executed agains the build. The build is then dropped tc a central '
location for installation by the test team.
ii
i.
Disable this build definition (no new builds will be queued).
at the tab «quires input, [ OK ] [ C*nce| ]
Рис. 30.4. Указание имени определения построения
Выбор файлов для построения
Второй экран в окне Build Definition — это экран рабочей области Workspace. Здесь вы
можете настроить построение на базе одного или нескольких каталогов системы управления
исходными кодами. В разных каталогах у вас могут храниться разные версии одного и того
же кода. Либо вам может понадобиться взять исходный код из нескольких проектов (в
системе управления исходными кодами) для выполнения вашего построения.
Каждому каталогу системы управления исходными кодами может быть поставлен в
соответствие каталог на компьютере построения (называемый локальным каталогом). На
1152
Часть VI. Система командной работы Visual Studio Team System
рис. 30.5 показан пример настройки рабочих каталогов построения. Здесь показан один
каталог системы управления исходными кодами, которому соответствует один локальный
каталог на сервере построения.
Buttd DefTnrtKm - HR Application Automated Nightly Build
; General ;
l X Project File
Retention Poficy
i Si Build Defaults
Trigger ;
i
I ]
i
j 'I
Working folders
Statu* Source Control Folder
Active S/licware HR
■■■•ШШШШШшШ
X This icon indicates that the Ub requires input
1®*ШШ11
Local Folder
SCSourceDir)
Г ~sr~\ Ltm* j |
Рис. 30.5. Указываем рабочую область системы управления исходными кодами
для сервера построения
Определение файла проекта построения
Теперь вам необходимо выбрать место для хранения проекта построения. Вспомните, что
этот проект построения будет иметь версии. Поэтому вам нужно выбрать каталог в системе
управления исходными кодами (в котором вы будете хранить проект). Вы можете сделать
это при помощи кнопки Browse рядом с полем Version control folder (рис. 30.6).
После выбора местоположения вам следует нажать кнопку Create (в этом же окне) для
генерирования файла TFSBuild.proj. Нажатие этой кнопки запустит мастера MSBuild Project
File Creation Wizard.
Настройка порядка построения
Мастер MSBuild Project File Creation Wizard позволяет вам настроить: порядок элементов,
которые вы хотите построить, их конфигурацию, а также и другие опции. Первый экран
позволяет вам настроить порядок собираемых вами решений (рис. 30.7). Обратите внимание
на кнопки-стрелки справа. Они позволяют вам перемещать элементы вверх и вниз по списку
(если между ними есть зависимости и порядок их построения важен).
Описание конфигураций построения
Далее необходимо настроить конфигурацию построения. В ней указываются параметры
построения (является ли построение отладочной или выпускаемой версией), а также целевой
Глава 30. Team Foundation Build
1153
процессор. На этом экране вы можете указать несколько конфигураций. Пример показан на
рис. 30.8.
Build Definition - HR Application Automated Nightly Quiid
I J» Я
Team Foundation Build uses en MSBuild project and response ftfe to perform your
build. Specify the location in version control to store these files.
General
Workspace
|Щ!|ЩЩЩЩ| Version control folder
Retention Policy S/Utware HR/TeamBuddTypes
Xl Build Defaults
' Trigger
This icon indkaui
Browse for folder
Team foundation Server
2OR2-TFS20QB
Foldm.
Б Щ 2K3R2-TFS200B
h Щ Litware HR
tf C3 Ub»a.rtH8.VSMM
,T,CJ Full Build-dairy
{♦ Q MSF-TEST
{£ CjJ Or°*er Management Project
К Щ Unleashed Custom Template
Folder path;
S/litware HR/TeamBuiklTypej
L" <* if." «*** 1
Рис. 30.6. Выбор местоположения в системе управления исходными кодами
для проекта построения
1 зш&зШ
MSBuild Project File Creation Wizard
.J
Select and order sotutions to buBd
Configurations
Options
Solutions are listed based on the specified workspace. Selected solutions will be built
sequentially m the order specified below.
Select лпЛ order solutions to build:
!:/{ (Select AU)
I?] S/LitwareHR/LitwafeHllVS2aO8/LitwBreHR.VS20O8.sln
Рис. 30.7. Описание порядка построения зависимых элементов
1154
Часть VI. Система командной работы Visual Studio Team System
MSBuild Project FjtetJMtJen Wfcard
Sdect configurations to buSd
Solutions will be built in the listed configurations
Whkh configurations would you 8kc to bufld?
Configuration
Platform
■r] Any CPU
Рис. 30.8. Описание конфигурации построения
Выбор тестов и анализа построения
В качестве составляющей части процесса построения может производиться тестирование.
На следующей странице мастера (рис. 30.9) собирается информация о тех тестах, которые
должны выполняться как часть процесса построения.
MSBuild Project file Creafoon Wizard
[ttyssd
Select build options
Selections
Configurations
The build process will include the following build options,
Which buSd options would you ike to Include to the bufld process?
Г Rimtest{e.g.nrnBVTs rti)
\J\ Automatically detect and run tests in the following assemblies
Semicolon delimited list of file specifications:
S(OutDtr)\Test*.dll
Rl Perform code analysis according to project settings
Рис. 30.9. Опции тестирования построения
Глава 30. Team Foundation Build
1155
Вы можете выбрать файл с метаданными тестов в Team Project. Либо система построения
может сама обнаружить тестовые сборки и соответствующим образом их выполнить.
При помощи нижнего флажка вы можете выполнить статический анализ кода для
включенных в построение файлов исходного кода.
Описание политики сохранения построений
Политика сохранения построений разрешает вам указать, сколько построений будет
храниться на сервере (рис. 30.10). Эта политика позволяет системе построения удалять старые
построения и таким образом освобождать место на вашем сервере построения. Политика
сохранения может быть настроена в зависимости от результата построения: неудачное,
остановлено, частично успешное, успешное. Для каждого из них вы можете указать, сколько
построений необходимо хранить.
Build Definition - HR Application Automated Nightly Build ШнШ
j General
Workspace
( Project File
| U Build Defaults
Trigger
|
j
l> This icon indicates Xh
Specify how builds should be retained:
Build Outcome Retention Policy
О Failed Keep Latest Only
■«'' Stopped Keep Latest Only
% Partially Succeeded Keep 2 Latest
^М^ШЩ^тш, щщ^щ^ ! ■ :
Keep None |\
Keep Latest Only ^*
Keep 2 Latest
Keep 5 Latest
Keep 7 Latest
Keep 10 Latest
< Specify Count to Keep...>
Note; Completed bwfds may be exempted from their associated retention policy In
the view of builds by selecting Retain Indefinitely from their context menu.
at the tab require* input i OK j [ Caned
Рис. 30.10. Настройка политики сохранения построений
Описание конфигурации агента построения
Следующий шаг— указать системе Team Foundation Build, какой сервер необходимо
использовать в качестве Build agent (рис. 30.11). Помните, что вы должны подготовить этот
сервер для работы в качестве сервера построения (для этого необходимо выполнить
инсталляцию с дистрибутива сервера Team Foundation Server; при этом на сервере будет развернут
сервис построения, который, разумеется, должен быть запущен до того, как вы стартуете
процесс построения).
Агенты построения добавляются в TFS и могут использоваться для последующих
построений. Вы можете также воспользоваться кнопкой New для описания нового агента
построения. При этом запускается диалоговое окно Build Agent Properties (рис. 30.12). Здесь вы
можете указать название компьютера агента построения, порт для связи, рабочий каталог и
1156
Часть VI. Система командной работы Visual Studio Team System
многое другое. Обратите также внимание, что вы можете запускать построения по
защищенному каналу.
Теперь движок построения должен узнать, куда он должен поместить файлы построения
(локально на сервере построения) и куда он должен выложить построение для того, чтобы
оно было доступно всем членам команды. Этот параметр указывается на странице Build
Defaults (как показано на рис. 30.11). Обратите внимание, что вы можете указать здесь
разделяемый ресурс для выкладывания построения (чтобы все остальные могли получить к
нему доступ).
Build Definition - Hft Application Automated Nightly Build
I
1 ' General
1 !
! Workspace
| 1 Project File :
j Rctentran Policy
1 И28ШДИИ1
j j Trigger
j
!
i
i
i
i
i
I^JBi]
Specify the build agent and staging location forthis build definition. These selections j
mey be modified by the person queuing the build i
Build agent
ItFS Build Agent ^ ^ T; ,
Description;
Builds wwft be staged to the following shire {for example, WwvMihare):
W2k3r2-th2008M.twjrebu.ldsj
L.2LJL
||
Neww |
*
H
Cfncel J i:
Рис. 30.11. Настройка умолчаний для построения
Build Agent Properties
Display name
TFS Cental Build Agent
Description:
A build igent on the TFS box itself]
Computer name
2tfr2-tfs2008 ~ ~~ ~~"
Li Require secure channel (HTTPS)
Working directory:
S(Temp)\S(BuildDeTinitiDnPBth)
Agent status;
|ь»ьи
- -
- -
„I
J
Note; For mere information about installing Team Foundat
computer, see httpi//go.nvcrosoftconVMintyHinlddrfl£3
L JMs*. J
L
At" ■« ■iw
ИЖШ'
Communications port
0 builds in
ion Build or
OK ]
queue
the build
L j*™*
* i
I
n
r
In
1
Jj
Рис. 30.12. Описание нового агента построения
Глава 30. Team Foundation Build
1157
Планирование построения
или настройка триггеров построения
Последний экран в окне Build Definition, — это экран Trigger. Здесь вы можете указать
время автоматического запуска построения.
Build Definition - KR Application Automated №ghtiy Build
General
Workspace
Project Pile
Retention Policy
Build Defaults
Team Foundation Build supports continuous integration by letting you trigger a
burid after a check-in.
О Check-Ins do not trigger a new build
£) Build each check-in (more builds]
i) Accumulate check-ins until the prior build finishes (fewer builds)
( , Sijifci w-rofreftsttJVievtty \ minutes.
# Build every week on the following days:
B3 Monday 2 Tuesday gj Wednesday gj Thursday
Щ Friday Щ Saturday П Sunday
Queue the build on the default build agent at:
ЗЛО AM 7 Eastern Standard Time (GMT -05O0)
OK
Cancel
Рис. 30.13. Запуск построения каждую ночь
'-i^irM
К» LJtwereHR.VS2M» - Microsoft Visual Studio
File f-drt View Project Bu3d Team Debug Data Tools Test Analyze Window Help
~XR
Source location: CJ $/Litw*reHrVTeerr»BuildTypes
FoWen
Loci I Path: CAUsers\msneftDocuments\source codeUitwareVTeamBuildTypes
Щ
:; Щ 2K3R2-TFS20OB
> ft) Dl LitwareHR.VS2008
J fc) &? TeamBuildTypes
Ш ul FuUBirrid-daily
у СЙ Order МападгмегЧ P'c,rrt
3, g§ чК****>ес1 Ci/itccr "tmp'jte
Name *
£a Full Build -dairy
• |||ШШШИЙ|
,_]TFSBuild.rsp
Pending Change User
Latest
Yes
! 1ж*№№й№»1кШт
< Changeset 12 successfully checked m.
Рис. 30.14. Файлы описания построения в окне Source Control Explorer
1158
Часть VI. Система командной работы Visual Studio Team System
Вы можете делать построение при каждом возврате исходного кода на сервер (это
называется непрерывной интеграцией). Вы можете также указать, что построения должны
производиться последовательно одно за другим. В этом случае, если построение уже выполняется
и в это время происходит один (или несколько) возвратов, то новое построение не
начинается до завершения старого.
Вы можете также запланировать в этом интерфейсе выполнение построения. Здесь вы
можете указать дни недели и время выполнения построения. Пример показан на рис. 30.13.
По завершении описания построения происходят два события: различные настройки
построения записываются в XML-файл TFSBuild.proj, и этот файл добавляется в систему управления
исходными кодами (в то место, которое было указано при описании построения).
Например, на рис. 30.14 показан проект построения (TFSBuild.proj) в корне каталога
TeamBuildTypes. В этом каталоге есть также и еще один проект построения — Full Build - daily.
Редактирование определения построения
Вы можете отредактировать файл определения построения в Team Explorer. Просто
щелкните правой кнопкой мыши по названию построения и выберите пункт Edit Build Definition
(рис. 30.15). При этом появятся те же экраны, которые используются для определения
построения.
I Ё1 кУьЗийГ
ч/> UtwareHK.VS200B - Microsoft Visual Studio
File Edit View Project Build Teem Debug Data Toots Test Analyze Window Help
Jb Ji ' U d&\% •& Z ' "V ri ' ^ ' 4< ► .Debug • AnyCPU
^1 v ^Ы^$ЦЖШ^7Ш$АШ Тс*го *«P«erer
\\3
\j} l\%
l£j 2IGR2-TFS2QQ8
1 My Fa4'orfte$
Ы Гй Utw»re HR
3 U Wcrk Items
ч! ^J Documents
>-4 Reports
3 £> Builds
n) All Build Definitions
«j Full Build • daily
„д Source Control
Ai
View Builds ]
Queue New Build... j
Edrt Build Definition...
X
l3
—
rjF»t Result» [
Delete Цг
Add to My Favorites 1
Properties j
Щ
Ready
Рис. 30.15. Запуск редактора построений
Глава 30 Team Foundation Build
1159
Файл проекта TFSBuild.proj
Хорошая новость состоит в том, что вы можете редактировать все стандартные элементы
построения при помощи редактора определения построений. Однако непосредственным
редактированием кода XML можно добиться большего. Код XML в файлах проектов
построения исключительно хорошо прокомментирован, а сами файлы довольно короткие.
Для того чтобы открыть файл проекта построения в Visual Studio, необходимо перейти в
Source Control Explorer к нужному файлу TFSBuild.proj и дважды щелкнуть по его
названию. При чтении этого XML-файла вы заметите, что в нем записана информация по всем
основным категориям параметров построения: есть общая информация, информация по
решению, конфигурации, местоположению и тестам.
Совет
Можно очень просто расширить любой тип построения нестандартными задачами,
которые будут выполнены в процессе построения. Поскольку такая задача — это всего
лишь фрагмент кода, который выполняется во время построения, то создание новой
задачи — это написание кода реализации вашего нестандартного действия.
Дополнительную информацию по расширению построения при помощи нестандартных задач
см. в теме "Walkthrough: Customizing Team Foundation Build" документации MSDN.
Роль MSBuild
Как уже упоминалось ранее, ядром сервера построения TFS является технология MSBuild.
Этот движок построения реализован в виде одного исполняемого файла msbuild.exe.
Несмотря на то, что MSBuild поставляется вместе с Visual Studio, он не зависит от этой
интегрированной среды разработки, а это означает, что вы можете запускать его на тех
компьютерах, где нет инсталлированной Visual Studio.
Для своей работы MSBuild берет XML-файл, который описывает последовательность
событий для построения. Затем он обрабатывает эти события в указанном порядке. MSBuild
является надежным движком, который может работать с условными построениями,
инкрементальными построениями, а также и с зависимостями между целями и построениями.
Поскольку файл TFSBuild.proj соответствует спецификациям MSBuild для входных файлов,
то Team Foundation Build может просто передать этот файл на выполнение при запуске
построения. Коротко говоря, Team Foundation Build просто является пользовательским
интерфейсом для движка MSBuild, а также содержит некоторые функции для интеграции
построения в структуру командного проекта (что позволяет выполнять уведомления, выбор
наборов изменений и т. д.).
Запуск построения
При наличии нескольких определений построений члены команды могут в любое время
запустить любое из них (при помощи ручного старта из Team Explorer). Конечно, они могут
также просто подождать их запуска по расписанию (как это уже обсуждалось).
1160
Часть VI. Система командной работы Visual Studio Team System
Queue Build "Utware HR"
I C\ ^jS£^^'
Ф
Select a build definition to build and specify an «gent that witf
perform the build.
Build definition:
[ HR A|yplg*t«n Automated NjghrHy Butld
This build runs nightly against the HR application A full set of test
and code analysis is executed agains the build. The build rs then
dropped to a central location for installation by the test team.
Build agent
[ТВ Burid Agent
Drop folder for this build;
\\2k3r2-tfs2008Mitwarebuilds
Priority in queue
Normal
Position:
1
MSBuild command-fine arguments (optional):
Queue
Cancel
Рис. 30.16. Постановка построения в очередь выполнения
Рис. 30.17. Общий процесс построения
Глава 30. Team Foundation Build
1161
Для запуска построения из Visual Studio Team Explorer щелкните правой кнопкой мыши по
определению построения и выберите пункт Queue New Build. При этом будет отправлено
сообщение в очередь построения слоя приложения, в котором будет указано, что
построение должно быть выполнено на конкретном агенте построения.
Как видно из рис. 30.16, диалоговое окно Queue Build дает возможность выбрать
определение построения и изменить некоторые настройки внутри этого определения, такие как:
компьютер для выполнения построения; каталог, в который можно поместить построение на
этом компьютере; а также приоритет построения по отношению к другим построениям в
очереди.
После запуска построение пройдет все свои шаги и завершится либо успешно, либо
неудачно. На рис. 30.17 показан общий процесс, которому будет следовать любое построение.
По мере продвижения построения по шагам своего процесса движок построения постоянно
записывает информацию по этому продвижению в хранилище построений, что позволяет
заинтересованным членам команды отслеживать продвижение построения из Visual Studio.
Отслеживание и анализ построений
Информация по построениям предоставляется в Visual Studio при помощи Team Build
Explorer. Окно этого браузера отображает список завершенных или находящихся в процессе
выполнения построений и служит основным средством просмотра продвижения процесса
построения и отчетов по завершенным построениям.
Team Build Explorer
Показанный на рис. 30.18 Team Build Explorer дает моментальный снимок построений, где
указаны: состояние (успешно завершено, закончилось неудачей, выполняется); название
построения; качество построения; дата завершения построения.
Совет
Если вы (или другие члены команды проекта) хотите получать уведомления о
завершении построения, то вам необходимо использовать функцию уведомления проекта
Team Foundation Server. TFS описывает два события, на которые вы можете
подписаться: Build Completed и Build Quality Changed.
Браузер позволяет вам получить доступ к отчету по конкретному построению и указать
состояние качества построения.
Указание качества построения
Система Team Foundation Build имеет свой набор состояний качества, которые группа
тестирования качества может выбирать для указания качества построения:
□ Initial Test Passed (Начальный тест пройден);
□ Lab Test Passed (Лабораторный тест пройден);
1162
Часть VI. Система командной работы Visual Studio Team System
П Ready for Deployment (Готова к развертыванию);
□ Rejected (Отвергнута);
□ Released (Выпущена);
□ UAT Passed (Пройдено приемочное тестирование);
□ Under Investigation (Изучается).
ч/> CustomerManege* - Microsoft Visual Studio [ел Ш, ifQll
' Pile Edit View Website Build Teem Debug Data Queiy Designer Took Test Analyze Window HeJp
I Л ' J " J Я 0 * : > '' ~ "' ' <;•! " * ► Debug * NFT * £ %
23 Set Priority- -» * ! 2f Ъ X V* Ь &
Build definition
Quality filter,
Date filter
IНЯ Application Automated Nightly Build
▼ J < Any flutld Quality*
.Today
Л
fl ф Maine Build Definition Build Quality
О HR Application Automat. HR Application Automated Nightly Build
1 & HR Application Automat. HR Application Automated Nightly Build
Щ|
н
/ Queued jl ^ Completed
"^TestResufcs
Reedy
Date Completed •*■ Requested By
3A0/20OB12J9AM 2K3R2-TFS2O08\r
3/107200812:35 AM 2K3R2-TFS2008\r<
мтжхж ш ^ш1гМ
Рис. 30.18. Браузер Team Build Explorer
Группа качества должна зайти в браузер Team Build и указать состояние качества
построения (для того чтобы показать всем остальным членам команды результаты своих тестов).
Это можно сделать очень легко: при помощи щелчка по столбцу и выбора одного из
состояний (как показано на рис. 30.19).
Кроме имеющихся состояний качества вы можете также добавить и собственные. Для этого
нажмите кнопку Manage Build Qualities в панели инструментов Build Explorer. Используя
диалоговое окно Edit Build Qualities (рис. 30.20), вы можете добавить новые состояния или
удалить одно из существующих состояний.
Отчет по построению
Для просмотра отчетов по завершенным и выполняющимся построениям необходимо
дважды щелкнуть по построению внутри Team Build Browser.
Глава 30. Team Foundation Build
1163
sf> CustomerManaget - Microsoft Viyja! Studio (<~j is, ^ШттШ
File Edit View Website Build Teem Debug Data Query Designer Tools Test Апа^уге Window Help
1 J-J-Jiidf I * * - - * > , 4-U ', J, Debug • NET * J$ *|
vf Build txptocer - Litware HR Тмййб^сг | ~ X Ц,
I :J] i SetPrwity
' Build ciefmition
l- 3 h X Чз S* !j?
Quality filter.
| [HR Application Automated N*ghtiy Build
▼ ' < Any Build Quality*
Today
i ф Name Build Definition Build Quality
О HR Application Automat HR Application Automated Nightly Build
<jj> HR Application Automat HR Application Automated Nightly Build
Jf HR Application Automat. HR Application Automated Nightly Build [ ^
Date Completed •*• Requested By
3/10/200812J9 AM 2K3R2-TFS2008\r
3-10/200812-35 AM 2K3R2-TFS20Q8\r :
ЗЛ0/2Ш1230 AM 2K3R2-TFSZ608Vr f
Initial Test Passed
Lab Test Passed
Ready fcr Deployre
Ready fcr Initial Та
Rejected
Released
UAT Passed
%
J) Queued jj^ Completed
3 Test Resets
Reedy
Рис. 30.19. Установка состояния качества построения
Ы\\ Build QuaSitie-, i § шШшШ
i
i
i
i
i
i
Quality Name:
Ready for public test
ШЫШШ^ШШк^^Ш^^^^^^^ш^^^^^Ш-
Lab Test Passed
Ready for Deployment
Ready for Initial Test
Rejected
Released
UAT Pantd
Under Investigation
f Add ] |
Remove |
i
[ <Ж ] [ Cancel J ,
Рис. 30.20. Добавление нового состояния качества построения
Каждый отчет находится в окне документа, открывающемся в Visual Studio, и имеет
следующие разделы:
□ Summary (Сводка) — резюмирует подробности построения и содержит такие элементы
данных, как: название построения; затребовавший выполнение построения человек;
компьютер, на котором выполнялось построение; текущее состояние качества
построения; ссылка на журнал построения;
1164
Часть VI. Система командной работы Visual Studio Team System
П Build steps (Этапы построения)— содержит список (во время выполнения процесса
построения он является динамически обновляемым), в котором указаны дата и время
каждого этапа построения;
Я Result details (Подробности результата) — содержит: ошибки и предупреждения,
сгенерированные построением; результаты тестов, выполненных вместе со построением;
результаты проверки покрытия кода;
□ Associated changesets (Связанные наборы изменений) — содержит гиперссылку на
список наборов изменений, которые были частью построения;
□ Associated work items (Связанные рабочие элементы) — предоставляет гиперссылку на
список всех эдементарных работ, которые связаны со построением.
На рис. 30.21 показан открытый в Visual Studio отчет по построению.
Элементарные работы представляют собой механизм корреляции для связывания
построений и прочих объектов командного проекта. Например, рассмотрим следующую цепочку
информации:
1. Разработчик исправляет ошибку и возвращает эти изменения в систему управления
исходными кодами.
2. Из этого возврата создается элементарная работа "ошибка" (с набором изменений).
3. Поскольку набор изменений связан с элементарной работой, а построения работают с
4 наборами изменений из хранилища исходных кодов, то вы можете легко определить,
какие ошибки в каком построении были устранены.
~г^ш^Ш
<Л Customer Manager - Microsoft Vbuaf Studio
File Edit View Project BuBd Team Debug
ы]
<i) Lest refreshed on ЗЛОУ200812J0U5 AM.
Data Tools Test Analyze Window
I • «4 ► Debug » .NET
Help
Hii*.
Burld name,
Requested by:
Teem project
Definition name
Agent name:
Command-line arguments:
Started ore
Completed orr.
Last changed by:
Last changed ore
Quality
Work items opened:
Source control version:
Log:
I BoUsteps
Build Step
■& Initializing build
Ф Getting sources
■& Labeling sources
ф Succeeded ^
" HR Application Automated Ntyhuy BuildI 20ОВ03Ю /
2GR2-TFS2D08\msnell
Lrtware HR
HR Application Automated Nightly Build
TFS Build Agent
ЗЛ0/2О08123032 AM
ЗДО/20081230:46 AM
NT AUTHORJTV\LOCAL SERVICE
ЗЛО/20081230.46 AM
Not available
C14
\\2k3r24fSaMB\lrr>«rebuila4\HrlAopl.cation Automated Mghtfr Build 2QQB0m7\Bu.ldl
& 8 succeeded, 0 failed
Completed On
ЗЛО/200812:30:38 AM
ЗЛ0/2ОО81230 44 AM
ЗЛО/20081230:45 AM
rM
Щ S
l3*«*B<»4fel
Ready
Рис. 30.21. Отчет по построению
Глава 30. Team Foundation Build
1165
Резюме
В этой главе мы описали использование Team Foundation Build для автоматизации и
управления как простыми, так и сложными процессами построения командных проектов. Team
Foundation Build позволяет вам обращаться с построениями как с неотъемлемой частью
командного проекта.
На сервере Team Foundation Build предоставляет базу данных, движок построения, а также
интерфейсы Web-сервисов для определения, выполнения и анализа построений
программного обеспечения. Данная глава представила логическую и физическую архитектуру
компонентов системы Team Foundation Build и показала, как они сосуществуют внутри более
обширной технической инфраструктуры Visual Studio Team System. Используя слабо
связанные уровни, Team Foundation Build позволяет вам масштабировать среду построения
(посредством присваивания роли сервера построения либо совместно используемому
серверу, либо выделенному серверу, либо даже ферме в виде нескольких серверов).
На стороне клиента несколько интегрированных в Visual Studio окон позволяют всем ролям
команды с легкостью участвовать в процессе построения. В этой главе мы описали, как Team
Explorer используется для описания новых типов построений и выполнения этих построений
из интегрированной среды разработки Visual Studio. И наконец, эта глава показала вам
возможности Team Build Browser по отслеживанию результатов построений и их анализу.
Предметный указатель
н
Add-in Manager 459
AJAX21,655
Apply Styles 540
ASP.NET 500
ASP.NET Development Server 503
Authenticode 247
jClass Designer 18,996
Class View 142
Code Analysis 1033
Code Definition Window 183
Code metrics 1040
Code Snippets Manager 278
Common Language Runtime (CLR) 86
CSS 187
CSS Properties 541
D
Data Comparison 1125
Data Generation Plan Designer 1137
Database Diagram Designer 701
Database Project System 1111
Datacenter Designer 1065
DataSet Designer 730
Deployment Designer 1068
Document Outline 156
E
Exception Assistant 321
Expression Blend 33
HTML Source Editor 203
HTTP 752
Images Collection Editor 605
Import IIS Settings Wizard 1068
IntelliSense 264
LINQ 740
Logical Datacenter Designer 1060
M
Macro Explorer 420
Macro, интегрированная среда 421, 422
Manage Styles 538
Microsoft Expression Blend 634
Microsoft Office 914
Microsoft Project 977
Microsoft Report Viewer 501
Microsoft Sync Framework 103
MSBuild Project File Creation Wizard 1152
MSF Agile 880
N
New Load Test Wizard 1096
New Team Project Wizard 901
New Test Data Source Wizard 1086
Предметный указатель
1167
О
0/R Designer 741
O/R mapping 740
Object Browser 153
Performance Explorer 1016
Project Designer 129
Project Explorer 423
Properties 78, 623
Task List 281, 384
Team Architect 1045
Team Build Explorer 1161
Team Explorer 912, 957, 965, 1148
Team Foundation Build (TFB) 1146
Team Foundation Server (TFS) 890, 894, 911,
922, 964
Team Foundation Source Control (TFSC) 921
Test List Editor 1010, 1079
TODO 282
Toolbox 190, 386, 520
TreeNode Editor 604
U
Query Designer 705
R
Remote Debugging Monitor 355
Report Designer 918
RSS215
UDD1 752
URI 752
User Control Designer 611
Schema Comparison 1120
Schema View 1118
Server Explorer 147
Service Configuration Editor 789
SharePoint913
Silverlight 22, 34,681
SOAP 752
Solution Explorer 77, 135, 924
Source Control Explorer 924
SQL 705
SQL Editor 710
Sync Services 103
System Designer 1056
Table Designer 698
Tag Navigator 261
Visual Source Safe (VSS) 921
Visual Studio 2008 Test Load Agent 1109
Visual Studio Content Installer 230, 239
Visual Studio Team System (VSTS) 879, 920
Architecture Edition 885
Database Edition 889, 1110
Development Edition 885
Test Edition 888
Visual Studio Tools for Office (VSTO) 35, 851
W
Web 2.0 654
Web Forms 200
Web Test Recorder 1083
Web-приложение 500
Web-страница 518
Windows Communication Foundation (WCF)
750, 780
Windows Forms 188,263
Windows Forms Designer 586
Windows Mobile 38
1168
Windows Presentation Foundation (WPF)
197,614
Windows Workflow 41
Workflow Designer 803
WS-* 752
WSDL751
WSE 752
A
Агент сборки 1149
Активный кадр стека 359
Анализ кода 1033
Б
База данных 1112
безопасность навигации по сайту 676
В
Визуализатор 353
Визуальное дерево 634
Визуальный конструктор WPF 620
Г
Генератор данных 1139
Гиперссылка 257
д
Диаграмма:
архитектурная 1049
классов 996
логического центра данных 1060
приложения 1048, 1050
размещения 1069
системная 1056
Диспетчер фрагментов кода 278
Документ 398—400
Предметный указатель
х
XAML618
ХВАР 669
XML751
XSD 752
XSLT186
3
Задача:
комментариев 281
пользовательская 283
ярлыков 283
Закладка 168
Закрепление 590
Замена в файлах 176
К
Каскадные таблицы стилей 187
Каталог решения 115
Класс, стилевой 534
Код:
совместное использование 18
фрагмент 269
элемента управления 194
Команда 412
Командное окно 389
Комментарий 281
Компонент 190,207, 586
Конструктор:
визуальный 72
классов 290
Контейнер 591
TabControl611
ToolStripContainer 601
Л
Лента 854
Лоток компонентов 190, 586
Лямбда-выражение 93
Предметный указатель
1169
м
Макрос 418
запись 419
запуск 435
отладка 429
Мастер:
Add-in Wizard 441
New Project Wizard 486
создание 486
Меню:
Debug 326
создание 598
Метод, частичный 95
Мобильные устройства 38
Модуль:
дополнительный 441, 443
разделяемый дополнительный 443
Н
Наблюдение за переменными 348
Навигатор тегов 261
Надстройка 441
Настройки:
импорт 59
импорт/экспорт 213
сохранение 16
О
Обработка событий 430
Объединенные окна 392
Объект:
Command 412
Debugger 415
Document 398
EditPoint 405
OutputWindowPane 391
Project 372
Solution 370
TaskList 384
TextDocument 399
Window 377
Объектная модель автоматизации 365
Объектно-реляционная проекция 739
Окно 377
About 443
вывода 390
Откладывание кода 940
Отладка 179,315
макросов 429
много поточного приложения 356
настройка 331
ошибки 320
сервисов WCF 356
удаленная 354
Отладчик 415
Отношение:
многие-ко-многим 704
один-к-одному 704
один-ко-многим 702
рефлексивное 704
Ошибка, отладка 320
П
* Панель:
Toolbox 71
инструментов:
Debug 331
Style Sheet 536
создание 600
команд 394
Парность скобок 278
Печать кода 182
Подключения к данным 148
Подписывание 247
Поиск в документах 170
Показатели кода 1040
Правило стиля 534
Представление 709
Привязка 589
данных 636
Приложение:
многопоточное 356
разработка интерфейса 578
Проект 62, 119,142
Профилирование производительности 1016
Процесс, рабочий 800, 810
Публикация приложения 248
1170
Предметный указатель
Редактор:
XML184
кода 257, 263
С#74
Visual Basic 75
текстовый 160
Ресурс 133,635
Рефакторинг285, ИЗО
Решение 107, 141
Сборка 1146
Сервер сборки 1149
Сервис 43, 748
Web 751
Система управления исходными кодами 920
Скин 547
С март-задача 262
, Смарт-тег 262, 288, 855, 872
Событие, перенаправление 638
Список задач 281
Стилевое правило 537
Стили уровня страниц 534
Стиль 536, 540
встроенный 533
Страница:
контента 543
шаблон 542
Строка состояния 602
Схема XML 185
Таблица стилей 535
Текстовый редактор 257
Тема 545
Тест 1076,1131
Тестирование 1075
Web-интерфейса 1082
блочное 1131
загрузочное 1096
общее 1107
поблочное 1004
ручное 1105
упорядоченное 1107
Тип, анонимный 92
Точка:
останова 179,323,338
отслеживания 338, 347
прерывания, функции 338
Триггер 713
Ф
Файл:
vsmacros 424
расширение 122, 510, 1046
addin 460
asmx 753
asx 576
cd996, 1047
ess 535
dbg 332
dd 1047, 1069
ldd 1046, 1060
loadtest 1103
mhtll06
pdb 332
sd 1046
sitemap 573
skin 546
snippet 273
sync 48
testrunconfig 1014, 1082
vsdir 489
vsi 230, 239
vssettings 16
vstemplate 237
vsz 486, 488
wtm805
xoml 806
Форма 578
Web 518
стартовая 582
Функция, пользовательская 714
X
Хранимая процедура 709
Предметный указатель
1171
ш
Шаблон:
проекта 232
элемента 239
Э
Элемент управления 190, 586
AccessDataSource 739
Accordian 665
AutoCompleteExtender 665
Button 566
Calendar 566
CalendarExtender 665
Canvas 626
CatalogZone 553
ChangePassword 570
CheckBox 566
CollapsiblePanelExtender 665
Compare Validator 569
ConfirmButtonExtender 666
ContentPlaceHolder 543
CreateUserWizard 570
Custom Validator 569
Data Source Controls 575
DataGridView 607, 731
DataPager 23, 575
DetailsView 575
DropDownList 566
EditorZone 554
FilteredTextBoxExtender 665
FlowLayoutPanel 592
Grid 628
GridView 575
HoverMenuExtender 665
HyperLink 566
Image 566
IrfiageList 605
ImageMap 566
Label 565
LinqDataSourceControl 24
ListSearchExtender 665
ListView 22, 575
Login 570
LoginName 570
LoginStatus 570
LoginView 570
MaskedEditExtender 665
ModalPopupExtender 666
MultiView 567
ObjectDataSource 739
PasswordRecovery 570
PasswordStrength 666
RadioButton 566
Range Validator 568
RegularExpressionValidator 568
ReorderList 666
Repeater 575
RequiredFieldValidator 568
ScriptManager 656
ScriptManagerProxy 656
SiteMapDataSource 739
SiteMapPath 573
SliderExtender 666
SplitContainer 593
SqlDataSource 739
StackPanel631
StatusStrip 602
TabContainer 666
Table 566
TableLayoutPanel 592
TextBox 566
Timer 657
ToolStrip 595, 597
ToolStripContainer 593
TreeView 604
UpdatePanel 656
UpdateProgress 657
ValidationSummary 569
WebPartManager 551, 553
WebPartZone 552, 554
Wizard 567
WrapPanel 632
XmlDataSource 739
визуальный стиль 596
всплывающая подсказка 596
код 194
нестандартный 207, 612
пользовательский 207, 576, 608
порядок табуляции 596