Visual Studio 2010. Księga eksperta 9788324630295, 0672330814 [PDF]

Poznaj środowisko Visual Studio 2010 Professional i naucz się tworzyć mistrzowskie aplikacje Jak wykorzystać technologię

196 39 74MB

Polish Pages [1266] Year 2011

Report DMCA / Copyright

DOWNLOAD PDF FILE

Table of contents :
O autorach (21)
Wprowadzenie (23)
Dla kogo przeznaczona jest ta książka? (23)
Koncentracja na wersji Visual Studio Professional (24)
Materiały do pobrania (25)
Jak zorganizowana jest książka? (25)
Część I: Wprowadzenie do Visual Studio 2010 (25)
Część II: Szczegółowe omówienie środowiska IDE (25)
Część III: Tworzenie kodu i zarządzanie nim (25)
Część IV: Wzbogacanie środowiska Visual Studio (26)
Część V: Tworzenie aplikacji dla przedsiębiorstw (26)
Konwencje używane w książce (26)
Część I: Wprowadzenie do Visual Studio 2010 (27)
Rozdział 1. Krótki przegląd środowiska Visual Studio 2010 (29)
Produkty z rodziny Visual Studio (31)
Wersje Express (32)
Wersja Professional (33)
Wersja Premium (34)
Wersja Ultimate (34)
MSDN (35)
Powiązane narzędzia (36)
Języki, platformy i szablony aplikacji (40)
Wybieranie języków programowania (40)
Platformy .NET (42)
Wiele aspektów aplikacji dla platformy .NET (43)
Tworzenie bogat(sz)ych interfejsów sieciowych (46)
Formularze Windows (46)
Platforma WPF (47)
Rozwiązania oparte na pakiecie Office (50)
Tworzenie klientów sieciowych (53)
Budowanie witryn za pomocą technologii ASP.NET (54)
Wzbogacanie aplikacji za pomocą AJAX-a (58)
Programowanie za pomocą technologii Silverlight (59)
Programowanie pod kątem chmury (63)
Tworzenie aplikacji działających w chmurze (64)
Uruchamianie aplikacji w chmurze (64)
Publikowanie aplikacji w chmurze (66)
Praca z danymi (67)
Projektowanie danych (67)
Oddzielanie projektu danych od modelu źródła danych (68)
Tworzenie aplikacji okresowo nawiązujących połączenie (71)
Tworzenie powiązanych rozwiązań opartych na usługach (71)
Tworzenie aplikacji i procesów biznesowych (72)
Tworzenie i konsumowanie usług (74)
Podsumowanie (76)
Rozdział 2. Środowisko IDE Visual Studio (77)
Instalowanie środowiska Visual Studio (78)
Wybór języka (78)
Konfigurowanie środowiska programistycznego (79)
Strona startowa (83)
Opcje uruchomieniowe (84)
Pierwszy projekt (85)
Wybieranie docelowego środowiska (86)
Poruszanie się po środowisku IDE (88)
Menu (89)
Liczne paski narzędzi (94)
Dostosowywanie pasków narzędzi (95)
Solution Explorer (97)
Edytory tekstu (98)
Graficzne okna projektowe (102)
Okno narzędzi (103)
Okno Properties (104)
Zarządzanie wieloma oknami środowiska IDE (105)
Przyczepianie (105)
Dokowanie (106)
Poruszanie się między oknami środowiska (108)
Dostosowywanie czcionki (110)
Podsumowanie (111)
Rozdział 3. Języki platformy .NET (113)
Wprowadzenie do języków (114)
Programowanie obiektów (115)
Typy, zmienne i stałe (129)
Operatory (133)
Podejmowanie decyzji i rozgałęzianie kodu (135)
Pętle (138)
Praca z grupami elementów (141)
Programowanie z wykorzystaniem atrybutów (145)
Tworzenie i zgłaszanie zdarzeń (147)
Mechanizmy języka (150)
Wykrywanie typu zmiennej na podstawie przypisania (151)
Tworzenie obiektów i ustawianie ich właściwości w jednym wierszu kodu (153)
Definiowanie kolekcji i inicjowanie ich wartości (nowość) (155)
Tworzenie egzemplarzy nieistniejących klas (156)
Dodawanie metod do istniejących klas (157)
Dodawanie logiki biznesowej do wygenerowanego kodu (158)
Dostęp do danych i pobieranie ich za pomocą języków .NET (160)
Pisanie prostych funkcji anonimowych w kodzie (162)
Dzielenie podzespołów na wiele plików (164)
Bezpośrednie korzystanie z elementów XML (tylko w języku Visual Basic) (164)
Usuwanie nieużywanych argumentów z metod obsługi zdarzeń (tylko w Visual Basic) (166)
Automatyczne generowanie kodu do obsługi właściwości (nowość w Visual Basic) (166)
Rezygnacja z podkreślenia przy kontynuowaniu wiersza w języku Visual Basic (nowość) (167)
Korzystanie z dynamicznych obiektów i języków (nowość) (167)
Kowariancja i kontrawariancja (nowość) (173)
Platforma .NET (175)
Podsumowanie (177)
Część II: Szczegółowe omówienie środowiska IDE (179)
Rozdział 4. Rozwiązania i projekty (181)
Wprowadzenie do rozwiązań (182)
Tworzenie rozwiązania (183)
Korzystanie z rozwiązań (188)
Zapoznawanie się z projektami (194)
Tworzenie projektu (194)
Używanie plików definicji projektu (198)
Praca z projektami (203)
Podsumowanie (209)
Rozdział 5. Przeglądarki i eksploratory (211)
Okno Solution Explorer (212)
Ikony i wskazówki graficzne (213)
Zarządzanie rozwiązaniami (217)
Zarządzanie projektami (218)
Okno Class View (219)
Pasek narzędzi (220)
Pasek wyszukiwania (220)
Panel obiektów (221)
Panel składowych (222)
Okno Server Explorer (223)
Połączenia z danymi (224)
Komponenty serwera (225)
Okno Object Browser (229)
Zmiana zasięgu (229)
Przeglądanie obiektów (230)
Okno Document Outline (232)
Modyfikowanie elementów (233)
Podsumowanie (234)
Rozdział 6. Wprowadzenie do edytorów i okien projektowych (235)
Podstawy (236)
Edytor tekstu (237)
Okna projektowe środowiska Visual Studio (240)
Pisanie kodu w edytorze (240)
Otwieranie edytora (241)
Pisanie kodu (241)
Budowa okna edytora kodu (243)
Narzędzia do nawigowania po kodzie (246)
Przeszukiwanie dokumentów (249)
Diagnozowanie w edytorze kodu (258)
Drukowanie kodu (262)
Używanie okna Code Definition (262)
Tworzenie i modyfikowanie dokumentów oraz szablonów XML (264)
Generowanie szablonów (265)
Projektowanie szablonów XML (265)
Edycja arkuszy stylów XSLT (269)
Używanie kaskadowych arkuszy stylów (270)
Dodawanie zasad stylów (271)
Definiowanie atrybutów arkuszy stylów (271)
Tworzenie aplikacji klienckich dla systemu Windows (271)
Tworzenie projektów aplikacji dla systemu Windows (272)
Tworzenie projektów WPF (280)
Tworzenie formularzy sieciowych (282)
Projektowanie aplikacji opartych na formularzach sieciowych (283)
Tworzenie komponentów i kontrolek (289)
Tworzenie nowego komponentu lub kontrolki (290)
Uwagi na temat pisania kodu komponentów (291)
Tworzenie klas za pomocą okna Class Designer (293)
Tworzenie diagramu klasy (293)
Dodawanie elementów do diagramu (294)
Definiowanie relacji między klasami (296)
Definiowanie metod, właściwości, pól i zdarzeń (298)
Podsumowanie (299)
Rozdział 7. Społeczność .NET - interakcje w internecie (301)
Możliwości Visual Studio związane ze społecznością (302)
Strona startowa Visual Studio (303)
Dostęp do systemu pomocy (312)
Zarządzanie ustawieniami systemu pomocy (312)
Zgłaszanie błędów i przesyłanie innych informacji zwrotnych (323)
Przykłady (326)
Wykrywanie i wykorzystanie współużytkowanych zasobów (328)
Rodzaje współużytkowanych zasobów (328)
Wyszukiwanie odpowiednich zasobów (328)
Instalowanie i przechowywanie udostępnianych zasobów (330)
Własny wkład w społeczność (332)
Pakiety startowe a szablony (333)
Tworzenie szablonów projektów (333)
Tworzenie szablonów elementów (340)
Tworzenie pakietów w celu ich rozpowszechniania (341)
Podsumowanie (356)
Część III: Tworzenie kodu i zarządzanie nim (359)
Rozdział 8. Korzystanie z narzędzi zwiększających produktywność (361)
Podstawowe narzędzia pomocnicze edytorów tekstu (364)
Śledzenie zmian (364)
Wskazówki dotyczące problemów (364)
Aktywne odnośniki (365)
Kolorowanie składni (365)
Schematy i nawigacja (367)
Schematy kodu (367)
Nawigowanie po znacznikach (370)
Inteligentne znaczniki i operacje (372)
Okno projektowe HTML-a (372)
Okno projektowe formularzy Windows (373)
Edytor kodu (373)
Mechanizm IntelliSense (375)
Uzupełnianie słów (Complete Word) (375)
Okno z informacjami podręcznymi (Quick Info) (377)
Okno z listą składowych (List Members) (378)
Okno z informacjami o parametrach (Parameter Info) (379)
Porządkowanie instrukcji Using (380)
Fragmenty kodu i kod szablonowy (380)
Dopasowywanie nawiasów (391)
Dostosowywanie mechanizmu IntelliSense do własnych potrzeb (392)
Okno Task List (393)
Zadania związane z komentarzami (394)
Zadania związane ze skrótami (395)
Zadania użytkownika (396)
Podsumowanie (396)
Rozdział 9. Testowanie kodu (397)
Podstawy testów jednostek (399)
Tworzenie projektu testów (399)
Generowanie testów na podstawie istniejącego kodu (402)
Pisanie testów jednostek (405)
Uruchamianie testów jednostek (407)
Konfigurowanie opcji i ustawień testów (409)
Platforma testów jednostek (413)
Klasa TestContext (413)
Klasy atrybutów testów (415)
Operacje wykonywane przed testami jednostek i po nich (418)
Klasy asercji (420)
Testowanie wyjątków (422)
Tworzenie testów jednostek zależnych od danych (423)
Pisanie testów jednostek działających w ASP.NET (428)
Definiowanie atrybutów środowiska ASP.NET (428)
Generowanie testów jednostek ASP.NET (429)
Konfigurowanie hosta projektu testów (430)
Konfigurowanie atrybutów testów jednostek (431)
Definiowanie połączenia za pomocą okna dialogowego Properties (431)
Tworzenie testów uporządkowanych (433)
Organizowanie testów (434)
Okno Test View (434)
Okno Test List Editor (435)
Podsumowanie (438)
Rozdział 10. Refaktoryzacja kodu (439)
Podstawy refaktoryzacji w Visual Studio (441)
Uruchamianie narzędzi do refaktoryzacji (441)
Podgląd zmian (445)
Zmienianie nazw (446)
Uruchamianie operacji Rename (447)
Używanie okna dialogowego Rename (449)
Wyodrębnianie metod (450)
Uruchamianie refaktoryzacji Extract Method (451)
Wyodrębnianie metod (451)
Generowanie szkieletu metody (457)
Wyodrębnianie interfejsów (459)
Uruchamianie refaktoryzacji Extract Interface (459)
Wyodrębnianie interfejsów (459)
Refaktoryzacja parametrów (462)
Usuwanie parametrów (462)
Zmiana kolejności parametrów (463)
Hermetyzacja pól (465)
Uruchamianie refaktoryzacji Encapsulate Field (465)
Okno dialogowe Encapsulate Field (465)
Podsumowanie (466)
Rozdział 11. Diagnozowanie kodu (467)
Podstawy diagnozowania (468)
Scenariusz (469)
Wiele etapów diagnozowania (469)
Diagnozowanie aplikacji (samodzielne sprawdzanie) (470)
Podsumowanie podstaw diagnozowania (481)
Debuger środowiska Visual Studio (481)
Menu i pasek narzędzi Debug (482)
Opcje diagnozowania (487)
Wkraczanie w kod, wychodzenie z niego i przeskakiwanie (488)
Określanie warunków wstrzymania wykonywania kodu (494)
Korzystanie z punktów śledzenia (opcja When Hit) (503)
Podglądanie danych w debugerze (505)
Korzystanie z funkcji "zmień i kontynuuj" (511)
Diagnozowanie zaawansowane (513)
Zdalne diagnozowanie (513)
Diagnozowanie usług WCF (514)
Diagnozowanie aplikacji wielowątkowych (515)
Diagnozowanie aplikacji równoległych (520)
Diagnozowanie skryptów działających po stronie klienta (526)
Diagnozowanie informacji o awarii (plików zrzutów) (527)
Podsumowanie (530)
Rozdział 12. Wdrażanie kodu (533)
Przegląd sposobów wdrażania rozwiązań po stronie klienta (534)
Wprowadzenie do wdrażania metodą ClickOnce (534)
Wprowadzenie do wdrażania za pomocą instalatora systemu Windows (535)
Publikowanie projektów za pomocą technologii ClickOnce (536)
Publikowanie projektów za pomocą instalatora systemu Windows (539)
Edytor File System (542)
Edytor Registry (543)
Edytor File Types (544)
Edytor User Interface (545)
Edytor Custom Actions (546)
Edytor Launch Conditions (546)
Publikowanie witryn i aplikacji ASP.NET (549)
Korzystanie z narzędzia Web Deployment Tool (550)
Korzystanie z narzędzia Copy Web Site Tool (554)
Podsumowanie (556)
Część IV: Wzbogacanie środowiska Visual Studio (557)
Rozdział 13. Wprowadzenie do obiektowego modelu automatyzacji (559)
Przegląd obiektowego modelu automatyzacji (561)
Wersje modelu obiektowego (561)
Kategorie automatyzacji (563)
Obiekt główny DTE (DTE2) (564)
Obiekty Solution i Project (565)
Kontrolowanie projektów wchodzących w skład rozwiązania (568)
Dostęp do kodu projektu (569)
Okna (572)
Dostęp do okien (572)
Interakcja z oknami (573)
Okna tekstowe i panele (576)
Rodzaje okien narzędzi (578)
Okna połączone (586)
Paski poleceń (588)
Dokumenty (592)
Dokumenty tekstowe (593)
Obiekty polecenia (604)
Wykonywanie poleceń (606)
Dodawanie klawiszy skrótu (607)
Obiekty debugera (608)
Zdarzenia automatyzacji (608)
Podsumowanie (609)
Rozdział 14. Tworzenie makr (611)
Rejestrowanie makr (613)
Korzystanie z okna Macro Explorer (614)
Pisanie makr za pomocą środowiska IDE Macros (616)
Projekty makr (617)
Pisanie makr (620)
Diagnozowanie (623)
Obsługa zdarzeń (623)
Wywoływanie makr (629)
Podsumowanie (633)
Rozdział 15. Tworzenie dodatków i kreatorów (635)
Tworzenie pierwszego projektu dodatku (637)
Ustawianie parametrów dodatku (637)
Struktura dodatków (645)
Cykl życia dodatków (645)
Reagowanie na polecenia (651)
Zarządzanie dodatkami (653)
Przykładowy dodatek - paleta do wybierania kolorów (654)
Początkowe operacje (655)
Tworzenie klasy kontrolki użytkownika (655)
Dopracowywanie klasy Connect (659)
Udostępnianie ustawień dodatku (662)
Tworzenie kreatorów dla środowiska Visual Studio (677)
Analiza struktury kreatorów (677)
Tworzenie kreatorów typu Add New Item (680)
Podsumowanie (686)
Rozdział 16. Rozbudowywanie edytora kodu przy użyciu platformy MEF (687)
Problem z rozszerzaniem (688)
Tworzenie dynamicznych aplikacji (688)
Architektura platformy MEF (689)
Reguły działania platformy MEF (689)
Korzystanie z platformy MEF (690)
Edytor środowiska Visual Studio i platforma MEF (691)
Punkty dołączania rozszerzeń do edytora (692)
Korzystanie z pakietu Visual Studio SDK (693)
Korzystanie z menedżera rozszerzeń (699)
Tworzenie rozszerzenia edytora za pomocą platformy MEF (701)
Podsumowanie (709)
Część V: Tworzenie aplikacji dla przedsiębiorstw (711)
Rozdział 17. Tworzenie aplikacji ASP.NET (713)
Podstawy tworzenia witryn w ASP.NET (715)
Tworzenie nowego projektu witryny lub aplikacji sieciowej (715)
Kontrolowanie właściwości i opcji projektu (728)
Tworzenie stron internetowych (736)
Projektowanie interfejsu użytkownika (745)
Określanie układu strony i położenia kontrolek (746)
Tworzenie jednolitego wyglądu i zachowania (753)
Tworzenie UI konfigurowanego przez użytkownika (775)
Praca z kontrolkami ASP.NET (787)
Przegląd kontrolek ASP.NET (787)
Standardowe kontrolki ASP.NET (790)
Kontrolki do sprawdzania poprawności (792)
Kontrolki logowania (794)
Kontrolki nawigacyjne witryny (797)
Kontrolki danych (798)
Kontrolki użytkownika (800)
Tworzenie aplikacji ASP.NET MVC (804)
Wprowadzenie do aplikacji ASP.NET MVC (804)
Tworzenie projektów MVC (808)
Dodawanie mechanizmów za pomocą ASP.NET MVC (811)
Podsumowanie (820)
Rozdział 18. Tworzenie aplikacji opartych na formularzach Windows (821)
Podstawy projektowania formularzy (822)
Uwzględnianie użytkownika końcowego (823)
Rola standardów UI (824)
Planowanie interfejsu użytkownika (825)
Tworzenie formularza (826)
Typ projektu Windows Application (826)
Właściwości i zdarzenia formularza (827)
Dodawanie kontrolek i komponentów (830)
Układ i pozycjonowanie kontrolek (831)
Używanie kontenerów (836)
Wygląd i zachowanie kontrolek (840)
Praca z kontrolkami ToolStrip (841)
Wyświetlanie danych (849)
Tworzenie własnych kontrolek (853)
Dziedziczenie po istniejącej kontrolce (853)
Projektowanie kontrolki użytkownika (854)
Tworzenie kontrolki niestandardowej (857)
Podsumowanie (857)
Rozdział 19. Tworzenie bogatszych i bardziej inteligentnych interfejsów użytkownika (859)
Platforma Windows Presentation Foundation (860)
Model programowania (863)
Wprowadzenie do okna projektowego WPF (865)
XAML i panele projektowe (866)
Programowanie z wykorzystaniem WPF (871)
Układ (871)
Style i szablony (878)
Wiązanie danych (881)
Zdarzenia przekazywane (883)
Tworzenie prostej przeglądarki obrazów (884)
Rozpoczynanie tworzenia układu (885)
Zapisywanie obrazów (891)
Wiązanie rysunków (893)
Metody do obsługi zdarzeń związanych z przyciskami i efekty do modyfikowania obrazu (894)
Wybór katalogu przy użyciu standardowego okna dialogowego (895)
Podsumowanie (901)
Rozdział 20. Tworzenie bogatych aplikacji internetowych (903)
Technologia ASP.NET Ajax i bogate interfejsy działające w różnych przeglądarkach (904)
Ajaksowe kontrolki w ASP.NET (905)
Tworzenie stron obsługujących częściową aktualizację (907)
ASP.NET Ajax Library i Ajax Control Toolkit (915)
Tworzenie wyjątkowych, bogatych interakcji opartych na przeglądarkach w systemie Windows (921)
Niezależne aplikacje WPF a programy XBAP WPF (922)
Tworzenie aplikacji WPF uruchamianych w przeglądarce (922)
Zagadnienia związane z zabezpieczeniami (926)
Instalowanie aplikacji XBAP (929)
Udostępnianie interaktywnych aplikacji w różnych systemach (933)
Wprowadzenie do Silverlight (933)
Tworzenie aplikacji Silverlight (934)
Silverlight 4.0 (939)
Podsumowanie (940)
Rozdział 21. Praca z bazami danych (941)
Tworzenie tabel i związków (942)
Tworzenie nowej bazy danych SQL Server (943)
Definiowanie tabel (945)
Korzystanie z Database Diagram Designer (947)
Praca z poleceniami w SQL-u (951)
Pisanie zapytań (951)
Tworzenie widoków (955)
Tworzenie procedur składowanych (956)
Tworzenie wyzwalaczy (960)
Tworzenie funkcji definiowanych przez użytkownika (961)
Używanie projektów baz danych (961)
Tworzenie projektu bazy danych (962)
Okno Schema View (967)
Kompilowanie i wdrażanie (968)
Uwagi na temat mechanizmu DAC (969)
Tworzenie obiektów bazy danych w kodzie zarządzanym (970)
Rozpoczynanie projektu SQL Server CLR (970)
Tworzenie procedury składowanej w C# (971)
Wiązanie kontrolek z danymi (974)
Wprowadzenie do wiązania danych (974)
Automatyczne generowanie związanych kontrolek Windows Forms (976)
Modyfikowanie zbiorów danych o określonym typie (981)
Ręczne wiązanie kontrolek formularzy Windows (982)
Wiązanie danych w aplikacjach WPF (986)
Wiązanie danych z kontrolkami sieciowymi (989)
Odwzorowania obiektowo-relacyjne (993)
Przegląd technologii LINQ (994)
Odwzorowywanie przy użyciu narzędzia O/R Designer (996)
Kod LINQ (998)
Korzystanie z platformy Entity (1001)
Kierowanie zapytań do modelu EDM (1006)
Podsumowanie (1008)
Rozdział 22. Aplikacje oparte na usługach (1011)
Wprowadzenie do usług (1012)
Dlaczego usługi sieciowe ASP.NET i WCF? (1014)
Aplikacje oparte na usługach sieciowych ASP.NET (1015)
Szablon projektu ASP.NET Web Service (1017)
Tworzenie usługi sieciowej ASP.NET (1020)
Konsumowanie usługi sieciowej ASP.NET (1033)
Wyjątki w usługach sieciowych ASP.NET (1039)
Aplikacje oparte na usługach WCF (1041)
Szablon projektu WCF (1043)
Tworzenie usług WCF (1045)
Konfigurowanie usług WCF (1050)
Konsumowanie usługi WCF (1055)
Hosting i instalowanie usług WCF (1058)
Podsumowanie (1060)
Rozdział 23. Dodawanie procesów do aplikacji (1061)
Podstawy technologii Windows Workflow (1063)
Składniki procesu (1063)
Szablony projektów typu Workflow (1065)
Okno projektowe procesów (1067)
Szablony elementów procesów (1068)
Podstawy tworzenia procesów (1069)
Korzystanie z wbudowanych czynności procesów (1082)
Sterowanie przepływem (1083)
Czynności Runtime i Primitives (1084)
Czynności Error Handling (1086)
Czynności Collection (1086)
Obsługa transakcji (1087)
Zarządzanie komunikatami (1089)
Tworzenie procesów typu Flowchart (1094)
Tworzenie aplikacji do zarządzania procesem (1096)
Scenariusz - zgłoszenia dotyczące podróży (1096)
Szablony projektów aplikacji (1097)
Tworzenie bazy danych i biblioteki dostępu do danych (1099)
Tworzenie usługi do obsługi rezerwacji w biurze podróży (1104)
Tworzenie niestandardowej biblioteki czynności (1105)
Projektowanie procesu zgłaszania podróży (1107)
Tworzenie aplikacji klienckiej (formularze do zgłaszania i zatwierdzania podróży) (1119)
Uruchamianie aplikacji do obsługi procesu zgłaszania podróży (1124)
Podsumowanie (1127)
Rozdział 24. Tworzenie aplikacji biznesowych opartych na pakiecie Office (1129)
Przegląd rozszerzalnych funkcji pakietu Office (1131)
Funkcje pakietu Office (1131)
Typy projektów Office w Visual Studio (1135)
Tworzenie dodatków dla pakietu Office (1136)
Modyfikowanie wstążki (1137)
Modyfikowanie panelu zadań (1141)
Tworzenie regionów formularzy aplikacji Outlook (1144)
Tworzenie rozszerzeń dokumentów Office (1147)
Kontrolki kontenerowe (1147)
Tworzenie paneli operacji (1149)
Przechowywanie danych w pamięci podręcznej (1150)
Implementowanie własnych tagów inteligentnych (1153)
Podsumowanie (1156)
Rozdział 25. Aplikacje działające w chmurze i technologia Windows Azure (1157)
Podstawy platformy Azure (1158)
Korzyści, jakie daje platforma Azure (1158)
Konfigurowanie środowiska programistycznego (1160)
Role w platformie Azure (1164)
Szablony projektów na platformę Azure (1165)
Sposoby przechowywania danych w platformie Azure (1167)
Aplikacja Hello Cloud (1170)
Rozwijanie i wdrażanie aplikacji na platformę Azure (1174)
Scenariusz (1174)
Rozwijanie aplikacji (1175)
Subskrypcja usług platformy Azure (zakładanie konta) (1188)
Tworzenie konta do przechowywania danych (1190)
Tworzenie konta usług hosted service (1194)
Przygotowywanie aplikacji do publikacji (1196)
Publikowanie i wdrażanie aplikacji w chmurze (1199)
Przenoszenie do środowiska produkcyjnego (1204)
Następne kroki (1205)
Podsumowanie (1207)
Skorowidz (1209)
Papiere empfehlen

Visual Studio 2010. Księga eksperta
 9788324630295, 0672330814 [PDF]

  • 0 0 0
  • Gefällt Ihnen dieses papier und der download? Sie können Ihre eigene PDF-Datei in wenigen Minuten kostenlos online veröffentlichen! Anmelden
Datei wird geladen, bitte warten...
Zitiervorschau

Microsoft®

Visual Studio® 2010 Mike Snell, Lars Powers

Poznaj środowisko Visual Studio 2010 Professional ■ u *••.**• • ••

_

i naucz się tworzyć mistrzowskie aplikacje

..........................

• • *Jak wykorzystać technologię ASP.NET do tworzenia pr profesjonalnych witryn internetowych? ; .............. .................................. ■ Jak tworzyć aplikacje bi biznesowe oparte na pakiecie Office? •

.........................

.................. Jak kompleksowo testować swój kod, zaprzęgając do pracy Visual Studio? ‘I -' 1> ~ \‘ \• -• • ..• • • • • • • » * * » # * . , , ' * ‘ ' ......... - * - —X - \V_-_ .. ' „ ^ ^ ^^ ' '

Microsoft®

Visual Studio® 2010

KSIĘGA EKSPERTA H elion

Mike Snell, Lars Powers L _____________________________

Microsoft®

Visual Studio® 2010

KSIĘGA EKSPERTA

Microsoft®

Visual Studio® 2010 r

Mike Snell, Lars Powers L ____________________________

Poznaj środowisko Visual Studio 2010 Professional i naucz się tworzyć mistrzowskie aplikacje Jak wykorzystać technologię ASP.NETdo tworzenia profesjonalnych witryn internetowych? Jak tworzyć aplikacje biznesowe oparte na pakiecie Office? Jak kompleksowo testować swój kod, zaprzęgając do pracy Visual Studio?

Microsoft®

Visual Studio® 2010

KSIĘGA EKSPERTA H elion

Tytuł oryginału: Microsoft" Visual Studio* 2010 Unleashed Tłumaczenie: Tom asz Walczak Projekt okładki: Studio Gravite / Olsztyn Obarek, Pokoński, Pazdrijowski, Zaprucki ISBN: 978-83-246-3029-5 Authorized translation from the Knglish language edition, entitled: Microsoft* Visual Studio* 2010 Unleashed, ISBN 0672330814, by Mike Snell and Iars Powers, published by Pearson Education, Inc, publishing as Sams Publishing, Copyright CyCPU

3 5, dtrttun





• J X I ThisOocument.es' _______________ T latnmgQuoteTemplate dota'

4 Word Controls

1

x |

_ j>i]

^

Pointer

j i - o ti •

Aa

R*chTe*tContentContfcH

M irttiKia qK vVstewttn* dkUd strony Orłwo*ar>ia (oreiponder Recen^a WtfM Deweloper Dodatki V

Aa

PteinTextContentControl

£3|

PttureContentControl

J|

ComooBo«C ontervtC©ntrol

i' B

DropOowniistContentCont..

«5‘

DatePickeiContcntControi

j'S

BuikfcngBkxkGeSefyConte...

^

Bookmark

a a j -.W

^ Solution Tfj»mnqQuo1eTemplate' a TraioingQooteTemplate .

->' Son treiO -

J?

Spistresd

ab1



Cancel

Wskazówka Bardzo wygodną właściwością związaną z importowaniem i eks­ portowaniem ustawień jest możliwość przenoszenia ulubionych odnośników do pomocnych informacji. Te ulubione pozycje są pobierane z ustawień domyślnej przeglądarki internetowej. Ponadto m ożna je przenosić między maszynami, dlatego nie trzeba spędzać następnej godziny, szukając w pliku pomocy informacji na szcze­ gólnie ważny temat.

D om yślnie ustawienia są eksportowane do folderu Dokumenty. W system ie W indows 7 ścież­ ka do ustawień to zwykle C:\Users\[użytkownik]\Documents\Visual Studio 10\Settings. M ożna tu znaleźć XML-owe pliki .vssettings z wieloma ustaw ieniam i danego egzem plarza środowiska Visual Studio. Są to m iędzy innymi plik CurrentSettings.vssettings i wyeksportowane pliki ustaw ień. Użytkownicy m ogą wymieniać się plikam i .vssettings. Pliki tego typu można też wykorzystać do przenoszenia ustawień między kom puteram i i w ersjam i środowiska IDE. U m ożliw ia to kreator Import and Export Settings.

0

Rozdział 2. Środowisko IDE Visual Studio

Strona startowa Przy pierwszym uruchomieniu Visual Studio 2010 widoczna jest strona startowa tego środowiska. W wersji 2010 stronę startową zmodyfikowano. Teraz jest bardziej przydatna i udostępnia nowe możliwości środowiska oparte na platform ie WPF. Rysunek 2.6 przedstawia przykładową stronę startową. Sta rt ?a o e • M < ro vo rt V is u a l S tu d io

: File

Edit

View

0eb u 9

Team

Data

ttta* ..— k— ^ Tools

Test

Wmdow

H elp requestor

Start Paęe

U O Visual Studio*2010Professional Get Started

Guidance and Resources

Latest News

1 Connect To Team Foundation Server p

Tj

Welcome

New P ro je ct.

Windows

f T j Open P ro je c t.

Web

Cloud

Office

SharePoint

Data

w hat's New in visu al Studio 2010 Learn about the new fe atu res included m th n release Visual Studio 2010 O verview

Recent Projects

W hat i New in X T Fram ew ork 4 W orkhow ConsoleA pplication!

What i New m V n ual C *

11 ii

Custom ize th e vttu a l Studio Start Paqe

T raim ngQ ooteT em ptate J g Contoso

Creating Appfeatiom with Visual Studio

C odeM etnc vAdom m «ntVS2010U nleai. VSlXProiectC odeM etnc Adornm ent >, V iew portA dom m entl

Extending Visual Studio

i TeitA d o rn m e n tl EdrtorM arginl EdrtorC laisdierl

C om m unity and Learning Resources ✓ Close page m er project load ✓ Show page on startu p

Test Results ■ Error List B Output

m

Test Runs

Rysunek 2.6. Strona startowa w Visual Studio 2010

Strona startowa zawiera liczne przydatne odnośniki umożliwiające szybkie rozpoczęcie pracy. Zacznijmy od lewego górnego rogu. Z najdują się tu trzy główne opcje: łączenia się z serw erem TFS, tworzenia nowego projektu i otw ierania projektu. O pcje z lewej strony ekranu um ożli­ wiają też uruchom ienie niedawno używanych projektów. W górnej części znajdują się zakładki dotyczące rozpoczynania pracy, porad, zasobów i najnowszych informacji. Zakładki prowadzą do materiałów w internecie. Więcej informacji o korzystaniu ze strony startowej zawiera rozdział 7., „Społeczność .NET — interakcje w internecie”.

©

C zę ść I Wprowadzenie do Visual Studio 2010

Wskazówka Nowa strona startowa zapewnia większą kontrolę nad listą niedawno używanych projektów. Można zaznaczyć projekt na liście i przy­ czepić go, aby zagwarantować, że na niej pozostanie. Można też łatwo usuwać projekty z listy.

Opcje uruchomieniowe Jeśli programiście nie podoba się strona startow a lub chce, aby środowisko bezpośrednio otw ierało projekt, n a d którym będzie pracow ał przez najbliższych kilka miesięcy, może d o ­ stosować sposób urucham iania IDE. W oknie dialogowym Options (Tools/Options lub o d n o ­ śnik Settings na stronie startowej) należy znaleźć węzeł Environment, a następnie Startup. Rysunek 2.7 przedstawia niektóre z dostępnych opcji uruchomieniowych. Rysunek 2.7. Opcje uruchomieniowe

O ptions 4

Environm ent General A d d - in/ M acros Security AutoRecover Docum ents Extension Manager Find and Replace Fonts and Colors Im port and Export Settings

Keyboard Startup Task List W eb Browser r Projects and Solutions t Source Control P Text Editor : D eb u ggin g Database Tools

*

At startup: Show SUrt P»g*

-

Start Page news channel http'y/go.microsoft.com/fwlinlc/?1inlcid=84795Btclcid=409 Download content every: 60 ; j m inutti ;Defauit Start Page) W arning: Using a custom Start Page from a source that is unknown or not trusted can expose to your computer to security threats because the page and any referenced assem blies vwlt run under the privileges of the current user.

-

r

.9 L - J L ^



Z tego poziomu m ożna skonfigurować, skąd system będzie pobierał inform acje wyświetlane na stronie startowej (opcja Start Page news channel). Można także nakazać w-czytanie ostatniego rozwiązania, wyświetlenie okien dialogowych New Project lub Open Project, otwarcie strony głównej przeglądarki lub niepodejmowanie żadnych działań (wyświetlenie pustego środowiska). Można także skonfigurować częstotliwość autom atycznego odświeżania zawartości na p o d sta ­ wie danych z serwera. Ponadto można zastosować niestandardową stronę startową. Aby uzyskać informacje na tem at takich stron, należy kliknąć odnośnik Customize the Start Page na e k ra ­ nie powitalnym strony startowej.

Rozdział 2. Środowisko IDE Visual Studio

Pierwszy projekt N astępnym naturalnym krokiem jest utw orzenie pierwszego projektu. Program ista może chcieć otw orzyć istniejący projekt lub rozpocząć pracę od podstaw . W obu scenariuszach utworzenie lub otw arcie projektu pozw ala szybko uzyskać dostęp do podstawowych funkcji zarządzania projektam i i plikami w środow isku. Aby rozpocząć, m ożna kliknąć m enu File lub odnośnik Projects na stronie startowej. Po włą­ czeniu m enu File w menu podrzędnym New pojawią się opcje umożliwiające utw orzenie n o ­ wego projektu lub witryny. Projekty to szablony grupujące pliki aplikacji sieciowych, dla sys­ tem u W indow s, pakietu Office lub innych. Witryny obejmują zbiór plików sieciowych, które są obsługiwane jak pliki, a nie skompilowany kod. W ram ach jednej aplikacji można połączyć kilka projektów. W tedy wszystkie projekty mogą znajdować się w pojedynczym rozwiązaniu. Na rysunku 2.8 pokazano okno dialogowe New Project. W arto zauważyć, że tworzona jest aplikacja sieciowa ASP.NET oparta na języku Visual C#, a projekt znajdzie się w nowym rozwiązaniu. Więcej inform acji na ten temat zawiera ro z­ dział 4., „Rozwiązania i projekty”. -------------

New Project Recent Templates Installed Templates a

Visual C* Windows Web Office Cloud Extensibility Reporting Sitverlight Sitverlight fo r Windows Phone Test WCF Workflow XNA Game Studio 4.0 Other Languages Other Project Types Database Test Projects

Online Templates

Name Location: Solution name:

.NET Framework 4

* Sort by. Default

—* 1

*— * »

4

ASP.NET Web Application

Visual C*

$ $ &

ASP.NET MVC 2 Web Application

Visual C*

ASP.NET Empty Web Application

Visual C*

ASP NET MVC 2 Empty Web Application

Visual C*

ASP.NET Dynanuc Data Entities Web Application

Visual C*

ASP.NET Dynamic Data Lmq to SQL Web Application

Visual C»

ASP.NET AJAX Server Control

Visual C*

ASP.NET AJAX Server Control Extender

Visual C*

p p & &

< £ ? 3 ASP.NET Server Control

W ebApplicationl < c\code\ W ebApplicationl

S e a l e d Templates

P

Type: Visual C* A project for creating an application with a Web user interface

Visual C«

* ■J

Browse... Create directory for solution Add to source control

0*1 Rysunek 2.8. Tworzenie nowego projektu

H

C zę ść I Wprowadzenie do Visual Studio 2010

Wybieranie docelowego środowiska W iele osób pracuje w środow iskach, w których działają aplikacje zbudow ane dla różnych w er­ sji platform y .NET. M ożliwe, że nowe aplikacje będą powstawać dla wersji .NET 4.0, jednak nadal trzeba zapew nić obsługę jednej lub kilku aplikacji dla platform y .NET 2.0. Oczywiście, staje się to jeszcze bardziej odczuwalne wraz z pojawianiem się nowych wersji. Programista nie chce jednak przechowywać na komputerze wielu wersji środowiska Visual Studio. Zamiast tego m oże wybrać dla aplikacji docelową wersję platformy. W ten sposób m ożna korzystać z jednego środow iska i w ykorzystać najnowsze uspraw nienia. Visual Studio 2010 um ożliw ia wskazanie docelowej wersji platform y .NET dla aplikacji. O zna­ cza to, że można w ykorzystać pojedyncze narzędzie do pracy nad aplikacjami zbudowanymi dla różnych odm ian platform y .NET. W ybór wersji platformy .NET powoduje odpow iednie ustawienie okna narzędzi, typów projektów, dostępnych referencji, a nawet mechanizmu IntelliSense w środow isku. Elem enty te są dopasow yw ane do wybranej wersji platformy .NET. N a rysunku 2.9 ponow nie przedstaw iono okno dialogowe New Project. Tym razem w yróżnio­ no miejsce wyboru wersji platform y .NET (w środkowej górnej części ekranu). New Project R ecen t 7 em plates

■NET Fiamework 4

In s ta lle d Te m p lates

MM

DU DC Cloud i

I

m &&

Mpori M

| RMM

Sikerlioht for Windows Phone Test

1F M mmmm

XNA Game Studio 4 0 Other Languages Other Protect Types Database Test Projects

Type: Visual C* A project for creating an application with a Web user interface

Visual C* Application

Visual C *

ASP.NET Empty Web Application

Visual C#

ASP.NET MVC 2 Empty Web Application

V isual C *

ASP.NET Dynamic Data Entities Web Application

nsual C«

ASP.NET Dy namic Data Lmq to SQL Web Application

Visual C*

ASP NET AJAX Server Control

Visual C*

A>P NET AJA> Sen.er Control Extender

M m

ASP.NET Server Control

vrsual vs

......

Ml

Search Installed Templates

MHN

NET Framework 3.0 .NET Framework 3.5 .NET Framework 4

MMM G i

Em m

* S< ft by: Default



v

O n lin e Tem p lates

Ilame

.'•ebApplicationl

Locaticn:

cxcodeN

Solution nam e

.’.ebAp plication!

Bic.vse... U

Create directory for solution Add to source control

Cancel

Rysunek 2.9. Tworzenie aplikacji dla określonej wersji platformy .NET

Po wybraniu wersji platformy środowisko automatycznie dostosowuje dostępne typy projektów, m echanizm IntelliSense, biblioteki, do których m ożna dodać referencje, i inne podobne ele­ menty. Jeśli program ista zechce na przykład dodać referencję, w oknie dialogowym Add Refe­ rence dostępne będą tylko biblioteki z docelowej wersji platformy.

Rozdział 2. Środowisko IDE Visual Studio

C zę ść I Wprowadzenie do Visual Studio 2010

W wielu firmach pracują program iści używający różnych wersji środowiska Visual Studio. Trzeba zachować ostro żn o ść przy otw ieraniu starszych aplikacji w nowszych wersjach Visual Studio. Choć kod nie zostanie zmodyfikowany, środowisko przekształci plik rozwiązania na wersję 2010 (dlatego nie będzie m ożna go użyć w starszych edycjach). Osobom pracującym w takich firmach zalecam y tw orzenie wielu wersji pliku rozwiązania — po jednej dla każdej wersji środowiska Visual Studio stosowanej w zespole.

Poruszanie się po środowisku IDE Po utworzeniu pierwszego projektu należy zacząć dodawać funkcje d o aplikacji. Wymaga to podstawowej wiedzy na tem at wielu kom ponentów środowiska IDE. N a rysunku 2.12 przed­ stawiono przykładową w itrynę w środowisku IDE. W arto zauważyć, że układ środowiska jest standardowy. Po lewej znajduje się okno narzędzi, po prawej — okno Solution Explorer, a w środku — kod. Przy tw orzeniu innych aplikacji pojawi się podobny interfejs (o ile programista nie zmodyfikuje ustawień). PropciTracket • MK»otob

Studio Ffirmat

T|U e

looh

TeH jftm dra

tk*P

PuMnte Crtele PubM< Sftbnp * (B ra t O t jK b t i I w t ł

Sobt « t O - 'T e i t S o a i " i

J Account J ł App.Dete O [ J Scripts

ctd c la s s > " sty le i * >Klle n t:

FAeOpioed

Hłddenf *eld

-d Styk*

< a* p :O ro p O o * m ii* t :c-*~OropOi < / * » p : DropOouni. i ł t >

Mypcrtmk



knaąe lm#9«S^ton Ima^eMap

Liektn:

tab el Imfcfiutton

ListBoi

S Y S T fW

Ś t f 0 7 E N IA P R A

Literal locafczc MuBMC* Panel Placeholder

SfardD ToolTip

a*p:0’opC.pr>r^.*taDro|iC«aieŁąt: Uitound »

VefcdetronGroup V«v*StetcMod* Vwble

RacfroBi/tton

Inhere True

Redrc6i*tontist Substitution

K l i t t a t ■ Output IHe the arrow key* to reset by laręe rnrem enti

____________________

Rysunek 2.12. Prosta aplikacja sieciowa w środowisku IDE

0

Li»4J

Col33

Ch»

MS

J

Rozdział 2. Środowisko IDE Visual Studio Poznanie środow iska IDE to pierwszy krok do wydajnej pracy. W dalszych punktach o m a ­ wiamy liczne elem enty pokazane na rysunku 2.12. W czasie czytania opisu poszczególnych narzędzi warto w racać do tego rysunku.

Menu Jeśli używałeś już starszych wersji tego środowiska, odkryjesz, że pasek m enu w Visual Studio 2010 jest dość standardow y. Jest bardzo intuicyjny, opcje znajdują się tam, gdzie można ich oczekiwać, a nowe m enu pojawiają się w zależności od części środow iska IDE, zainstalow a­ nych narzędzi i dom yślnego języka. Na przykład m enu Refactor jest dostępne w edytorze kodu C#, m enu Project — jeśli otwarty jest jakiś projekt, a konfiguracja m enu File jest różna dla poszczególnych języków. Tabela 2.1 zawiera listę niektórych z częściej używanych m enu (uporządkow anych od lewej do prawej) wraz z ich opisem. Tabela 2.1. Menu środowiska Visual Studio 2010

Menu

Rysunek

File

** •

Opis * 1*3 . * 4 fteo $**. * J ŁMArof»d

yi

Menu File służy do tworzenia nowych projektów i witryn. Można też dodawać nowe elementy, zapisać efekty pracy, pracować nad projektami z uwzględnieniem kontroli kodu źródłowego czy wydrukować kod.

_

>.*

Cłrt*>«h*N Cłrł-K l> tt^ CoSf.

c**.$

&4*»nc«d Sr* 0 »*M &

J J

Cw .SM l.S

***

ą»v*. Prce* £ rvo.et'» > - •' OK.*: lc«

Edit

£d4

CtK»P * »

. ;' ■ _____ __ ____

jjódb 0 * •^ > *0 •0

-

U |**.LntQ c**;Art*te

r­ A

Cuj

Ctrt*X

'i

£opy

Ctrt*C

Delete

Od

Select

CtH-A

E»'Xl »r,d neplecf fio T o ,N»v»geteTo,.

* CH -G Ctrl*

insert F»łe As TejL. 5 -tf-.**.

»

J

»

.V>1 format Selection

Format Document

»

I*brfy Selected jnet

*

Untąfedy Selected Lines Make Uppercase

3

8 8

Ctrt*E. 0 Ctrl*! f

Ctn-SM t» J

Make fcCnvercase

Ctrt*U

Delete Ljoruonut WMr Space

Ctrl-E. \

View

Ctrl-E. S

Soace

Word Wrap

Ctrl •E W

Incremental Search

Ctrl*!

Comment Selection bncommfnt Se«ct»n

CtrUE C Ctf'*E. u

Menu Edit służy do zarządzania elementami schowka i wycofywania oraz ponownego wprowadzania zm ian za pomocą poleceń Undo i Redo. Ponadto menu to daje dostęp do ważnych narzędzi, takich jak Find, Replace i mechanizm IntelliSense. Menu podrzędne widoczne na rysunku przedstawia zaawansowane opcje menu Edit, takie jak Format Document, która umożliwia zastosowanie formatowania do kodu, nad którym programista właśnie pracuje.

h crease l '•e Ind-n* Decrease tine indent

©

C zę ść I Wprowadzenie do Visual Studio 2010 T ab ela 2.1. Menu środowiska Visual Studio 2010 — ciąg dalszy

| R ysunek View

View l£ j Code *?) ^5 Se»*e' Explore'’ -U? So^uton bglorer ^ 3 C * ‘ Hierarchy Cigs* View " ł Code Qef "bort W '.-ow Object Browser _4^ Error t^st 2 Output 73* Proper!** j^ndow i2ł L«St . J Ć Tool boa B S u d P«ge Fipd Results Cttifr Windows Toolbars t J Fyfc Screen a*^ Navigate Backward -V| t_ _ u

B

Refactor

Refactor fienam e.. Extract M ethod..

> jy

E n ca o sj ate fie ld .. Extract Interface.. R em ote P a ra m e te r. a b Reorder Param ete':

W ebsite ■‘■A A dd New Item .. i i J Add Existing Item .. 5j V

Copy Web Site... Nest Related Fi-es Add Reference Add W eb Reference.. Add Service Reference Set as Startup Project

♦y |#

Menu View daje dostęp do licznych okien środowiska Visual Studio. Jeśli programista utraci orientację (lub okno), menu View to najlepsze miejsce, aby przywrócić poprzedni stan. Tu można otworzyć okna Server

F7 Shift-n Ctr1*W l Ctr1*W,S Ctr1*At*K Ctrt*W c Ctr1*W D CtruW J Ctrt*W E Ctri-W 0 Ctruw P Ctrf+W. r Ctrt-W X

Explorer, Solution Explorer, Task List

a • » O Shift* AM* Erie* C trl-

>*»«

< /

Website

Opis

Start Options-. ASP.N ET Configuration

Command Wndo* Document Outline ^3 Property Wanag« ^1 Resource View 2 M Interacts 4? tdavo Explorer 3 Weo fro m rr WMWMMMMMM

F2 C trt-R M C t ii- R E C tr l-R I C trf-R V CW -RO

Ctrt^ Shift* A Shift* Alt ♦ A

CW*W B Ctrl* W A CW*W U

i inne kluczowe okna środowiska IDE. Menu podrzędne przedstawia opcję Other Windows, dającą dostęp do wielu okien środowiska Visual Studio 2010.

CtH*W R Ctrt»Al*F Ait*f8 Ctri*W W

Menu Refactor (tylko w języku C#) daje dostęp do opcji umożliwiających zm ianę nazw elementów w kodzie, przenoszenie kodu między metodami i używanie zmiennych jako parametrów. Więcej informacji o refaktoryzacji znajduje się w rozdziale 10., „Refaktoryzacja kodu". Menu Website jest dostępne tylko w czasie pracy nad witryną (nie można go używać przy pracy nad aplikacjami sieciowymi lub projektami innych typów). Umożliwia dodawanie nowych elementów, referencji, kopiowanie witryn do miejsca, skąd mają być udostępniane, i obsługę zależności projektu. Można także ustawić stronę startową aplikacji i uzyskać dostęp do opcji konfiguracyjnych ASP.NET danej witryny.

Rozdział 2. Środowisko IDE Visual Studio Tabela 2.1. Menu środowiska Visual Studio 2010 — ciąg dalszy

Menu Project

Rysunek

O pis

Project i A d d Class... A d d N«w kem ... ■'-ł A d d Existing k e m ....

Menu Project przypomina menu Website, jednak jest widoczne dla projektach przeznaczonych i nieprzeznaczonych dla sieci. Z tego menu programiści mogą dodawać nowe elementy i referencje do projektów, określić projekt startowy, zm ienić kolejność kompilacji, a także uzyskać dostęp do okna dialogowego Properties z właściwościami danego projektu. W tym miejscu można określić między innymi docelową wersję platformy .NET, domyślną przestrzeń nazw i wiele innych elementów.

Sbift»Alt*C Ctrl* Shift* A Shift* A h * A »

A d d ASP.N ET Folder

2) Build Deploym ent Package ■ li Package/Pubksb Settings Exclude From Project j! l Show AH Files A d d ReferenceA dd Service Reference... Set as Startup Project

Build

^

W ebApphcationl Properties...

f#

Set As Start Page ASP.NET Configuration

guild ] 2 3 guild Solution Rebuild Solution Ciean Solution

F6

i**j

Sh.ft*?6

By id ProjectTracker RgOvi'd ProjectTracker Clean ProjectTracker Pubfoh ProjectTracxer

Menu Build umożliwia uruchomienie kompilatora dla danego rozwiązania. Z tego menu można uruchomić kompilację (lub rekompilację) całego rozwiązania lub pojedynczych projektów w jego obrębie. Z menu Build można także uzyskać dostęp do okna Configuration Manager. To okno dialogowe umożliwia określenie sposobu kompilacji (diagnostyczna lub produkcyjna), rodzaj procesora i tak dalej.

8a;cn Budd... Configuration M anage' .

Debug

Debug ' ft.ndcws ► Start Debugging P Stad W-tHout Debugging Attach to grocess.. Exceptions.. S i Step |nto Ql Step Qrti Togge Breaxpo^c? New greak point Aj < S'eakpo r?;

* F5 Ctif*F3 Ctrt*D E F ll

f: o F9



fireaxpo -ts Z3 Qutput £ 3 jirm eoate 3

Ctri*D B Ctrl*D. I

Menu Debug zapewnia program istom dostęp do poleceń diagnostycznych środowiska Visual Studio. Te polecenia obejmują opcje pozwalające uruchomić projekt w sesji diagnostycznej i dołączenie nowej sesji diagnostycznej do istniejącego, działającego procesu. Ponadto z tego menu można zarządzać punktami przerwań. Menu podrzędne przedstawia kilka innych okien diagnostycznych dostępnych z menu Debug. Więcej inform acji na temat tego menu znajduje się w rozdziale 11., „Diagnozowanie kodu".

i

C zę ść I Wprowadzenie do Visual Studio 2010 Tabela 2.1. M enu środowiska Visual Studio 2010 — ciąg dalszy

Menu

| Rysunek

Data

Menu Data umożliwia zarządzanie źródłami danych aplikacji. Opcje tego menu umożliwiają dodawanie nowych elementów do bazy danych. Bardziej szczegółowe omówienie korzystania z danych zawiera rozdział 21., „Praca z bazami danych".

Oats Add

Diagram

New Query

Table

Detacr. Database Modify Connection...

Stored Procedure

£ ‘ose Connection

Inline Function Tfioie-valued Function Scajar* valued Function

Format

Menu Format umożliwia manipulowanie kontrolkami formularzy Windows lub sieciowych. Na przykład można wybrać szereg kontrolek formularza i zarządzać odstępami między nimi.

. Format New Style .. Attach Style Sheet Forggrourtd Color... Background Color.

A

Set Position

*

£ont

¥

Justify

¥

Font..

=?

Paragraph.

i”

gullets a~d Numoenrg.. Borders and $£ad.ng„. Position...

C five-1 r.

mV

Insert Bookmark. i

Align

¥ Same Size

»

Order

»

Remove Formatting ■ T lf.lL'j. , 'TH11' 1'

Tools

■To o k? Attach to p ro ce s.. %

C tn-A it.P

Co^ act to QatahMe C o ^ cct to ł t w . Code Snippet* M tnagr

c u k c

* .*

,

CnooM Toe b o i heosv. Add • -

.

2£*c'0>

y

Urm iOM Marsegej

-■J

£un Tentpct*n/Macro

Ctri»SW t*P

^

Re^orO T firp y jr^ l/e c o

C 0l*Sh.ft**l

C reek £U!D

Saye Tempo* aryMac'c

O o tjuKitoi Comnsur»;y f d t v ftC F Sef

■jf

(ittrn k fo o ls. iTPonaod b p ort S itte rs .

kjec'O (ip io w

A H *f|

U a cro tP E

A lfF U

Loed Macro ProjectM fft Macro Project-

Table

T a b le

j In s e r t T a b le In s e r t

a

f ie ie t e



S e le c t

a

M o d ify



Menu Tools daje dostęp do wielu narzędzi udostępnianych wraz z Visual Studio. Obejmuje to zarządzanie dodatkami i makrami Visual Studio, które rozszerzają środowisko (zobacz menu podrzędne). Można także uzyskać dostęp do narzędzi łączących się z innymi serwerami i aplikacjam i czy zarządzających ustawieniami środowiska IDE. Elementy tego menu są szczegółowo opisane w dalszych rozdziałach książki. Menu Table (dostępne, kiedy widoczne jest okno projektowe z formularzem sieciowym) służy wyłącznie do manipulowania tabelami formularza sieciowego. Z tego menu można utworzyć nową tabelę, wstawić wiersze do istniejącej tabeli i zm ieniać rozmiar elementów tabeli.

Rozdział 2. Środowisko IDE Visual Studio Tabela 2.1. M enu środowiska Visual Studio 2010 — ciąg dalszy

j Rysunek

I Menu

Test

Test

y

Opis

]

Menu Test umożliwia zarządzanie testami w Visual Studio. Opcji tego menu można użyć na przykład do utworzenia nowego testu jednostek, zarządzania istniejącymi testami i pomiaru efektywności testów. Z tego menu można także uruchamiać testy.

New l e s t . Load Metadata File., ^ e ate New Test List.

-l>iU.VVr.'tt

3

Run



Qebug

i

Select Active Test Settings Edit Test gettings



Windows

*

j

13 “~1 ^ Window

le st View Test L»st Editor Testfiesuits Tfist Runs

Menu Window umożliwia zarządzanie otwartymi oknami środowiska IDE. Można je ukryć, zamknąć wszystkie otwarte okna lub zmienić stan istniejącego okna, na przykład Solution Explorer, z zadokowanego na dokument otwierany za pomocą zakładki.

W indow *3

3

New W indow Stf't Float

Ayto Hide All j

C lose All D o cum ents Reset W indow Layout



1 N ewProject asp>. c s ' W in d o w s.

Hpln ---r it-

yisual Studia Documentation

•J

MSDN Fotums

Ctrf*Fl. C

Report a 8ug Samples

^

Customer Feedback Options.. Reg ster Product C hecfc for Updates y>

Technical Support Qnline Privacy Statement...

»'j

Menu Help daje bezpośredni dostęp do wszystkich opcji pomocy dostępnych w Visual Studio. Menu Help pozwala też przejść do forów MSDN, zgłosić błąd, przejrzeć przykłady i wykonać inne podobne zadania. Można także sprawdzić dostępność aktualizacji i, oczywiście, uzyskać dostęp do biblioteki pomocy.

About Microsoft Visual Studio

Uwaga Zrzuty w tabeli 2.1 przedstawiające menu zostały zrobione przy użyciu domyślnych ustawień menu dla języ ka C # . W języku Visual Basic odpowiadają im bardzo podobne, choć nieco zmienione menu. Ponadto skróty klawiaturowe dla opcji także są specyficzne dla języka C # . Programiści używający Visual Basic zauważą, że wiele z tych skrótów jest takich samych. Wszystkie opcje można dostosować do indywidualnych preferencji użytkownika.

I

C zę ść I Wprowadzenie do Visual Studio 2010

Liczne paski narzędzi Visual Studio 2010 w samej wersji Professional obejmuje blisko 30 pasków narzędzi. Jeśli ist­ nieje zestaw często używanych poleceń, praw dopodobnie są one umieszczone na jakim ś pasku narzędzi. Duża część pasków narzędzi jest wysoce wyspecjalizowana. Na przykład używając okna Class Designer, program ista będzie oczywiście korzystał z paska narzędzi Class Designer do zarządzania grupam i klas lub zm iany przybliżenia. Jeśli program ista tworzy zapytanie SQL, będzie używał paska narzędzi Query Designer. Dlatego nie będziemy tu opisywać wszystkich pasków. W zam ian dostosujemy się do charakteru tego krótkiego przeglądu i przedstawimy jedynie główne elem enty.

Standardowy pasek narzędzi Standardowy pasek narzędzi (Standard) jest widoczny przez cały czas korzystania z IDE (oczy­ wiście o ile program ista go nie wyłączy). Ten pasek zapewnia szybki dostęp do wszystkich często używanych poleceń. Standardow e polecenia znajdują się w lewym górnym rogu: Create New Project, Add New Item, Open, Save i Save All. Po nich znajdują się Cut, Copy, Paste i Undo. Rysunek 2.13 przedstaw ia standardow y pasek narzędzi w środow isku IDE. 3 ~

^

* -i

'

i•

"

_ ~

? ’gguWo.

__ 73*

~* ' ' S ) !*. j * H

Rysunek 2.13. Standardowy pasek narzędzi w Visual Studio 2010

Wskazówka Radzimy nauczyć się skrótów klawiaturowych dla standardowych poleceń takich jak C u t, C o p y , P a s te czy U n d o . Większości ele­ mentów standardowego paska narzędzi odpowiadają skróty, które warto zapamiętać. Następnie można usunąć odpowiadające im ikony z paska narzędzi w celu zaoszczędzenia cennego miejsca na polecenia, które i tak wymagają użycia myszy (i mają skróty trud­ niejsze do zapamiętania).

Następne elementy warte uwagi to dwa polecenia związane z nawigacją — ikony przypominające dokument (lub plik z kodem) ze strzałką wskazującą w lewą stronę na jednym rysunku i w prawą na drugim. Te przyciski umożliwiają poruszanie się do przodu i do tyłu po kodzie oraz rozw ią­ zaniu. Śledzą specjalne wiersze w kodzie i otwierane okna oraz um ożliw iają na tej podstaw ie dostęp do szukanych elementów za pom ocą jednego kliknięcia. Umożliwiają w ten sposób na znaczną poprawę wydajności. Przycisk z zieloną strzałką znajdujący się obok poleceń służących d o nawigacji często nazyw a­ ny jest przyciskiem Run lub Play. Służy on do inicjowania kom pilacji projektu i urucham ia program w trybie diagnozowania. Dalej na prawo widać opcje inicjujące wyszukiwanie ele­ mentów w kodzie. Ta właściwość może być przydatna na przykład do szybkiego wyszukiwania miejsca zakończenia pracy. Następnie widać ikony pozwalające szybko wyświetlić jedno z wielu

Rozdział 2. Środowisko IDE Visual Studio okien środow iska Visual Studio. Podobnie jak menu View te ikony zapewniają szybki dostęp do okien Solution Explorer, Properties, Object Browser, Toolbox i tak dalej. Dostępna jest nawet ikona Other Windows (po prawej stronie), które pozwala otworzyć dodatkow e okna.

Dostosowywanie pasków narzędzi Jeśli standardow y pasek narzędzi rozpowszechniany wraz z Visual Studio nie spełnia wymagań program isty, m ożna utw orzyć jego niestandardow ą wersję. W tym celu należy wybrać opcję Customize z menu Tool lub kliknąć prawym przyciskiem myszy pasek środow iska IDE i wybrać tę samą opcję. Spowoduje to wyświetlenie okna dialogowego Customize widocznego na rysunku 2.14. W tym miejscu można wybrać wyświetlane paski narzędzi, określić rozm iar ikon elemen­ tów widocznych na paskach, włączyć lub wyłączyć podpowiedzi i klawisze skrótu, a także wykonać inne operacje. Rysunek 2.14. Okno dialogowe Customize w środowisku Visual Studio 2010

Aby dostosow ać pasek narzędzi, należy zaznaczyć elem ent i wybrać jeden z przycisków po prawej stronie (do przenoszenia opcji w górę lub w dół, usuwania i tak dalej). Jeśli zmiany okażą się niezadowalające, wystarczy użyć przycisku Reset z zakładki Toolbars i przywrócić ustawienia dom yślne. Zakładka Toolbars w oknie dialogowym Customize pozwala określić, które paski narzędzi będą w idoczne. Omawiane okno dialogowe zawiera też przycisk New, który umożliwia utworzenie nowego paska narzędzi, aby pogrupow ać istniejące polecenia. Daje to programiście duże m oż­ liwości w zakresie dostosowywania paska. Po kliknięciu wspomnianego przycisku należy nazwać nowy pasek i użyć zakładki Commands (zobacz rysunek 2.15), aby dodać elem enty do niestan­ dardow ego paska narzędzi.

C zę ść I Wprowadzenie do Visual Studio 2010

Rozdział 2. Środowisko IDE Visual Studio Zachęcam y do sam odzielnej eksploracji różnych pasków narzędzi środow iska Visual Studio (i możliwości związanych z ich dostosowywaniem). Często ich przydatność m ożna w pełni docenić tylko w odpowiednim kontekście. Na przykład w czasie modyfikowania formularzy W indows możliwość zmiany wzajemnego ułożenia kontrolek za pomocą paska narzędzi Layout pozwala zaoszczędzić wiele czasu. Jeśli programista wie, że takie paski narzędzi są dostępne, z więk­ szym praw dopodobieństw em skorzysta z ich zalet.

Solution Explorer O kno Solution Explorer um ożliw ia grupow anie plików składających się na aplikację i m anipu­ lowanie nim i. Rozwiązanie może zawierać kilka projektów (aplikacji). Projekt obejmuje pliki spe­ cyficzne dla jego typu. Aplikacją może być witryna internetowa, aplikacja dla systemu Windows, biblioteka klas czy aplikacja konsolow a. W tych kontenerach znajdują się pliki stron interne­ towych, form ularzy, klas, pliki XML i inne potrzebne elementy. Rysunek 2.17 przedstawia okno Solution Explorer odłączone od środowiska IDE. W arto zwrócić uwagę na to, że otwarte jest tylko jedn o rozwiązanie (takie jest ograniczenie) i zawiera ono kilka aplikacji (nazywanych projektami). Jedna z nich to aplikacja W PF (TimeTrackinglnterface), inna to w itryna internetow a (ProjectTracker), a ostatnia to biblioteka klas (AppFramework). Rysunek 2.17. Okno Solution Explorer środowiska Visual Studio 2010

GX

Solution Explorer

^ W

S M

W

tK k

^ 3 Solution ProjectTracker’ (4 projects) 4

3

A ppfram ew ork

^ Properties > a j References r j j Ckent.es Prpject.cs S I New Project aspx p “ 3 Srte.Master A ] Stylesheet.css t, W eb.confrg 3 Tim eTrackinglnterface t> Properties a ca i References t>

App.vaml

4

M am.xaml

M am jram l.es

Okno Solution Explorer umożliwia dostęp do różnych elementów projektu. Zaznaczenie i dwu­ krotne kliknięcie elementu w oknie Solution Explorer powoduje otwarcie danego okna projekto­ wego lub edytora powiązanego z typem wybranego pliku. N a przykład otwarcie pliku o rozszerze­ niu .cs pow oduje uruchomienie edytora kodu C#. W omawianym oknie zwykle dodaje się też nowe

C zę ść I Wprowadzenie do Visual Studio 2010 elementy do aplikacji (klasy, rysunki, formularze). W tym celu należy kliknąć projekt lub folder prawym przyciskiem myszy i wybrać opcję Add. O kna Solution Explorer można także użyć do kontrolow ania ź ró d ła danych i spraw dzania danych wychodzących z bazy i trafiających do niej. O kno Solution Explorer jest szczegółowo opisane w rozdziale 4., „Rozwiązania i projekty”.

Edytory tekstu Visual Studio 2010 zawiera kilka edytorów tekstu (kodu). Każdy edytor tekstu bazuje na wspólnej podstaw ie, która w każdym edytorze zapewnia określony zestaw funkcji obejmujący między nimi określanie szerokości marginesów, możliwość zwijania zagnieżdżonych elementów czy wybór kolorów . D ostępne są ed y to ry kodu (C#, Visual Basic i tak dalej), edytor XML, edytor H TM L (lub stron .aspx), edytor arkuszy stylów i inne.

Edytory kodu To w edytorze k o d u w ystępuje magia. T o właśnie tu program ista używa swego ulubionego języka do definiow ania obiektów i ich działania. Oczywiście, można pisać kod poza edytorem Visual Studio, ale po co? M ożna także pisać powieść w program ie Notatnik czy ręcznie obliczać podatki. D obry e d y to r kodu po prostu zwiększa produktyw ność, a Visual Studio udostępnia jeden z najlepszych produktów tego typu. Edytor kodu to głów ne narzędzie w czasie tworzenia kodu. D odaje wcięcia i odstępy, aby kod był przejrzysty i czytelny. U dostępnia m echanizm IntelliSense i uzupełnianie instrukcji, dzięki czemu nie trzeba sprawdzać (lub zapamiętywać) wszystkich nazw bibliotek obiektów ani słów kluczowych. Zapewnia skróty umożliwiające szybkie generowanie standardowego kodu, na przykład definicji właściwości. Grupuje kod w bloki, stosuje kolory dla słów kluczowych i komentarzy, wyróż­ nia błędy i nowy kod dodany po ostatniej kompilacji. Podsumowując, edytor kodu w Visual Studio udostępnia wiele funkcji pozwalających zachować koncentrację, uporządkować pracę i zwięk­ szyć produktyw ność.

Edytor kodu języka C# Rysunek 2.18 przedstaw ia edytor kodu języka C#. Poniżej opisanych jest kilka elem entów , na które warto zwrócić uwagę. • Kod jest pogrupowany w logiczne fragmenty reprezentowane przez symbole widoczne po lewej stronie. Można użyć znaku minus do zamknięcia całej klasy, metody, właściwości lub podobnej grupy. Umożliwia to ukrycie kodu, nad którym nie pracujesz w danym m o ­ mencie. M ożna także utworzyć własne regiony służące do tego samego i nazwać je. • W iersze kodu są num erow ane przy lewej krawędzi edytora. W poszczególnych edyto­ rach funkcję tę można włączyć łub wyłączyć. • D odany kod jest wyróżniany kolorow ą linią. Żółty oznacza nowy kod, który jeszcze nie został zapisany. W yróżniająca linia zm ienia k o lo r na zielony po zapisaniu kodu i znika po zamknięciu oraz ponow nym otwarciu pliku. Ta właściwość um ożliw ia p ro ­ gram iście (i edytorowi) śledzenie miejsc, w których w trakcie bieżącej sesji zostały w prow adzone zmiany.

5

Rozdział 2. Środowisko IDE Visual Studio

• N azw a otwartego pliku z kodem jest widoczna na zakładce okna. Gwiazdka oznacza, że kod zm ienił się od czasu, kiedy został ostatnio zapisany. • W czasie wpisywania kodu działa mechanizm IntelliSense. M ożna użyć strzałek do szybkiego wyszukania elem entu na liście. Umieszczenie kursora nad elem entem p o ­ w oduje wyświetlenie dotyczących go szczegółów (tekst podpow iedzi w ramce po praw ej). M ożna wcisnąć klawisz Tab, aby uzupełnić elem ent wyborem z IntelliSense. •

Kod jest wyróżniany różnymi kolorami. Domyślnie słowa kluczowe są niebieskie, komen­ tarze zielone, tekst czarny, typy użytkownika jasnoniebieskie, łańcuchy znaków' czer­ w one i tak dalej.

• Dwie listy rozwijane u góry edytora kodu umożliwiają: nawigację między klasami w pliku (lewa lista) oraz metodami, polami i właściwościami w obrębie danej klasy (prawa lista).

Edytor kodu języka Visual Basic Edytor kodu języka Visual Basic działa bardzo podobnie jak edytor dla Ot. Rysunek 2.19 przed­ stawia ten sam kod, co na rysunku 2.18, napisany w edytorze kodu języka Visual Basic. Poniżej opisane są niektóre z różnic m iędzy tym i edytorami. • D o rozdzielania metod i właściwości służą poziom e linie. • Lista rozwijana m echanizm u IntelliSense jest przefiltrow ana i zawiera często używany podzbiór opcji obok wszystkich możliwych wartości.

C zę ść I Wprowadzenie do Visual Studio 2010

»

Solution Explorer - Solution ’ProjectTrac..

w

S trn g

Properties

Reeay

lr> 3

Col 26

CH26

INS

Rozdział 2. Środowisko IDE Visual Studio Rysunek 2.20. Ustawienia czcionek i kolorów w oknie dialogowym Options

Jeśli programista poszuka nieco w oknie dialogowym Options, znajdzie węzeł Text Editor. W tym m iejscu m ożna ustaw ić jeszcze więcej właściwości edytora tekstu. M ożna na przykład usunąć poziome linie rozdzielające procedury w edytorze Visual Basic lub wyłączyć automatyczną zmianę form atow ania kodu. Jedna z często w prow adzanych zmian dotyczy autom atycznego form atow anie kodu przez edytor języka C#. M ożna odnieść wrażenie, że precyzyjna kontrola naw iasów klamrowych ma duże znaczenie dla osób pracujących z kodem przez cały dzień. Jeśli program ista chce, aby wszyst­ kie nawiasy klamrowe znajdowały się w nowym wierszu lub rozpoczynały w iersz otwierający blok kodu, może to ustawić w tym oknie. Inne rozwiązanie to zachowanie w yboru w zależności od rodzaju bloku kodu. Na szczęście wszystkie ustawienia m ożna kontrolow ać w oknie dialo­ gowym Options. Rysunek 2.21 przedstawia niektóre z opcji związanych z formatowaniem kodu C# w edytorze. W arto zauważyć, że w oknie widoczny jest też przykład ilustrujący, jak kod zostanie sform atowany w edytorze. Rysunek 2.21. Kontrolowanie formatowania kodu w oknie dialogowym Options

C zę ść I Wprowadzenie do Visual Studio 2010 |---------------------------------------------

Graficzne okna projektowe Graficzne okno projektowe to obszar, na którym m ożna używać myszy do tworzenia elementów takich jak form ularze poprzez przeciąganie, upuszczanie, przenoszenie, zm ianę rozmiaru i tak dalej. Visual Studio 2010 udostępnia wiele takich okien. W spólnie umożliwiają one tworzenie elementów składających się na aplikację. Te elementy to między innym i formularze Windows, form ularze sieciowe, diagram y klas czy schematy XML. W szystkie okna projektow e działają mniej więcej tak samo. Po pierwsze, zajmują centralną pozycję w IDE jako okno z zakładkam i otoczone różnym i menu, paskam i narzędzi i panela­ mi. Po drugie, program ista m oże używać okna narzędzi (opisanego dalej) jako palety, z której wybiera elementy (na przykład kontrolki) um ieszczane w oknie projektowym. Następnie można skonfigurować wiele właściwości każdego z tych elem entów, używając okna Properties. Rysunek 2.22 przedstawia okno projektowe dla formularzy WPF (środkowa, wyróżniona zakład­ ka). W arto zwrócić uwagę na okno narzędzi znajdujące się po lewej stro n ie i okno Properties widoczne po prawej stronie na dole. Ponadto na poniższym rysunku widać, że w czasie obsługi form ularzy widoczny jest pasek Layout. Umożliwia on łatwe rozmieszczanie kontrolek wzglę­ dem siebie. W następnych rozdziałach szczegółowo omówimy większość graficznych okien projektow ych. Ich szerszy przegląd znajduje się w rozdziale 6., „W prow adzenie do edytorów i okien projektow ych”. o o ProjectTracker - Microsoft Visual Studio £4e

:

£dit

J

'

.

J£«v»

£roject

J ’J A J

guiłd

&eoug

1 - i

Team

■O •



D fta

fg im a t



’ ►

lo o ts

Te*t

& in d o *

Debug

*

belp

Mixed Platforms

Create Pobfisti Settinjgs MamWmdowj^ml* X

Toolbox

i □

Pointer

®

Button

e s

MaieWirtdowJcaml.es

NewPron

Border

Calendar

a

Canvas

0

Checkflox

.

j

3 Solution Project Trać ker (2 projects) a ProjectTracking

P r o f il

1 ....

t> cM Properties > .ad References *■ Appraml

Imię i nazwisko

4

ComboBox E3

ContentControl

u-J W

DaUGnd

B

DockPanel

J O

Document Viewer

MamWmdowjuml

*

^

MainWmdowjtaml.es

4 1 Tracker Adres

DatePicker

Q Solution Explorer



1

l

- 3 X |

Properties Text Box textBox2

Ellipse Expander

Properties

Data urodzenia

fi

Frame

a

Grid

m

GndSpktter

o M A >9 »t§ll

GroupBox

P n IW Ś f C l

Image

» 2t r ;« n » r» 1 I ) 4Q ( 7



Media Element

\ «

Label

W

■t

B a c k J tc c tM if c iU s y ...

''

...............

_________

Ltt& ch t o P r o c e s s . . . D e f a u lt.a s p x

S i l a z i a o E x p l r z t r - S c ia t i c a

C oaaact t o D a t a b a s e . ..

Standard ^ P o in te r *3 A dBotator

l

|E B ulietedL ist

® Button "T

Calendar

0 CheckBox J ; CheckBoxList DropDown!1 s t

Ą,

DycanieHyperLink F ileC pload

K' B iddenField Ą HyperLiak _ ji Image

(j)

InageB uttoo

jjj IaaijeMap A Label

y, określa, czy jest ono prawdziwe, czy nie (wartość t r u e lub f a l s e ) . O peratory porów nyw ania to: operator mniejszości (=), operator rów ności (= w języku Visual Basic i == w C#) oraz o p erato r nierów­ ności ( w języku Visual Basic i ! = w C#). W poniższym fragmencie pokazano, jak przypisać do zm iennej logicznej wynik porów nania.

C# bool check = accruedVacation > vacationTakenToDate;

Visual Basic Dim check As Boolean = accruedVacation > vacationTakenToDate

M ożna też przeprowadzić porów nanie z uwzględnieniem typu, aby sprawdzić, czy dwa obiekty mają tę sam ą referencję. W języku C# do porów nań tego rodzaju służą standardow e operatory rów ności (=) i nierówności (!= ). W języku Visual Basic są to słowa kluczowe Is i IsNot, na przykład check = Employeel Is Employee2.

Łączenie O peratory łączenia umożliwiają scalanie łańcuchów znaków. W języku Visual Basic operato­ rem łączenia jest znak am persand (&) użyty dla dwóch zm iennych lub wartości łańcuchowych. W języku C# służy do tego znak plus (+). Pokazano to w poniższym kodzie:

C# string fullName = firstName + " “ + lastName;

Visual Basic Dim fullName as String = firstName & " " & lastName

Operatory logiczne i warunkowe O peratory logiczne i warunkowe umożliwiają łączenie porównań na wiele sposobów, co pomaga dokonyw ać wyborów w kodzie (bardziej szczegółowe inform acje zawiera następny punkt). M ożna na przykład połączyć dw a porównania, aby sprawdzić, czy obydwa są prawdziwe. Cza­ sem trzeba ustalić, czy praw dziwe jest przynajm niej jedno z dwóch porów nań. O peratory logiczne pozwalają wykonać te i inne operacje. W tabeli 3.3 opisano liczne operatory logiczne (przykładow y kod zawiera następny punkt).

Podejmowanie decyzji i rozgałęzianie kodu O pisanych wcześniej operatorów m ożna użyć do spraw dzania określonych w arunków w k o ­ dzie. T esty są przeprowadzane, aby wybrać urucham iany kod lub ustalić, w którym miejscu przejść do innej ścieżki wykonywania w aplikacji. W platform ie .NF.T istnieją trzy główne struktury do podejmowania decyzji: If...Then...Else, Select...Case i Try...Catch...Finally.

C zę ść I Wprowadzenie do Visual Studio 2010 Tabela 3.3. Operatory logiczne i warunkowe

Cel

C#

tączy dwa wyrażenia logiczne i zwraca wynik.

&

I Visual Basic And

Jest to t rue, jeśli oba wyrażenia są prawdziwe. Odwraca wartość logiczną lub wyrażenie

j

Not

1

Or

z dwóch wyrażeń ma taką wartość. A

Xor

odmienną wartość (jedno t rue, a drugie

VB: check = (x> Y )

Or (x>0)

C#: check = (x > Y )

| (x>0)

VB: check = T ru e X o r F a ls e C#: check = t r u e

— f a ls e ) . Jest to skrócona wersja operatora And.

VB: check = N o t someVal C#: check = ! som eVal

wartości.

Zwraca t rue, jeśli dwa wyrażenia mają

VB: check = (x> Y ) And (x>0) C#: check = (x> Y ) && (x>0)

logiczne. Wynik to odwrotność obliczonej

Zwraca t rue, jeśli przynajmniej jedno

Przykład w pseudo kodzie

&&

A n d A ls o

Jeśli pierwszy warunek nie przejdzie testu,

~ f a ls e

VB: check = (x>Y) AndAlso (x>0) C#: check = (x > Y ) && (x>0)

drugi warunek nie będzie sprawdzany. Jest to skrócona wersja operatora 0 r. Jeśli pierwszy warunek przejdzie test,

II

O rE ls e

VB: check = (x> Y ) O rE ls e (x>0) C#: check = (x > Y )

|| (x>0)

drugi warunek nie będzie sprawdzany

If...Then...Else Składni I f m ożna użyć w kodzie do sprawdzenia jednego lub kilku warunków. Na podstawie wyniku testu można wybrać wykonywany blok kodu (inny, jeśli wynik to t r u e , a inny, jeżeli jest to f a ls e ) . Można też realizować bardziej skomplikowane scenariusze, zagnieżdżając instrukcje I f i używając operatorów logicznych opisanych we wcześniejszym podpunkcie. W języku Visual Basic należy bezpośrednio używać instrukcji If...Then zagnieżdżonych w bloku kończącym się instrukcją End If. W języku C# w aru n k i If um ieszczane są w nawiasach, a instrukcje — w nawiasach klamrowych. Poniższy kod określa, czy m ożna zatwierdzić podanie o urlop otrzym ane od pracownika. W kodzie znajduje się zagnieżdżona instrukcja If i przykład łączenia dwóch warunków za pom ocą operatora And. C# public bool CanApproveVacationRequest(int daysRequested, int daysTaken, int daysAllowed, int daysAccruedToDate)

{ / / Reguła pracownik może wziąć urlop, jeśli go zgromadził, ale jeszcze nie wykorzysta!.

if ((daysRequested < daysAllowed) & (daysTaken < daysAllowed))

{ if ((daysTaken + daysRequested) < daysAccruedToDate)

{ return true; } else { return false;

Rozdział 3. Języki platformy .NET > } else { return false;

} >

Visual Basic Public Function CanApproveVacationRequest(ByVal daysRequested As Integer, ByVal daysTaken As Integer, ByVal daysAllowed As Integer, ByVal daysAccruedToDate As Integer) As Boolean 1 Reguła: pracownik może wziąć urlop, jeśli go zgromadzi!, ale jeszcze nie wykorzystał.

If daysRequested < daysAllowed And daysTaken < daysAllowed Then If (daysTaken + daysRequested) < daysAccruedToDate Then Return True Else Return False End If Else Return False End If End Function

W arto zauważyć, że jeśli w języku Visual Basic występuje jeden wiersz wykonywany na pod­ stawie w arunku i f , wtedy m ożna zapisać instrukcję w jednym wierszu kodu, na przykład I f x > 500 Then z robCos. W języku O , jeżeli wykonywany jest jeden wiersz kodu, można zrezy­ gnow ać z nawiasów klamrowych, a instrukcja po w arunku I f zostanie uruchom iona na pod­ stawie w artości warunku.

Select...Case (switch) K onstrukcja Select...Case (switch w języku C#) umożliwia sprawdzenie wartości jednego w yrażenia. Na podstawie w arunku i wartości można następnie wykonywać różne bloki kodu. W języku C# można zdefiniować warunek w nawiasach po słowie kluczowym sw itch . Następnie m ożna zdefiniować poszczególne bloki kodu przy użyciu słowa kluczowego case, sprawdzanej w artości i dwukropka. Na końcu bloku należy dodać instrukcję break. M ożna też zastosować słowo kluczowe default do określenia kodu wykonywanego wtedy, jeśli żaden warunek nie jest spełniony. Elementy te przedstaw iono w poniższym kodzie:

C# private void CalculateAdditionalCompensation()

{ switch (this.Status)

{ case EmploymentStatus.Contract: / / Kod dla pracowników kontraktowych.

break; case EmploymentStatus.Hourly: / / Kod dla pracowników zatrudnionych na godziny.

break;

C zę ść I Wprowadzenie do Visual Studio 2010 |----------------------------------------------case EmploymentStatus.Salaried: / / Kod dla pracowników pobierających zwykłą pensję.

break; case EmploymentStatus.SalariedCommissioned: / / Kod dla pracowników z wynagrodzeniem prowizyjnym.

break; case EmploymentStatus.Other: / / Kod dla innych pracowników.

break; default: / / Kod uruchamiany przy błędnym statusie.

break;

} > W języku Visual Basic do pisania instrukcji Select...Case służy słowo kluczowe Select, po którym następuje słowo kluczowe Case i warunek. Każdy kolejny warunek jest poprzedzony słowem kluczow ym Case. Aby urucham iać kod w sytuacji, kiedy nie jest spełniony żaden w arunek, m ożna użyć instrukcji Case Else. Poniżej znajduje się przykładowy kod: Visual Basic Private Sub CalculateAdditionalCompensation() Select Case Me.Status Case EmploymentStatus.Contract ' Kod dla pracowników kontraktowych.

Case EmploymentStatus.Hourly 1 Kod dla pracowników zatrudnionych na godziny.

Case EmploymentStatus.Salaried ' Kod dla pracowników pobierających zwykłą pensję.

Case EmploymentStatus.SalariedCommissioned Kod dla pracowników z wynagrodzeniem prowizyjnym.

Case EmploymentStatus.Other 1 Kod dla innych pracowników.

Case Else ' Kod uruchamiany przy błędnym statusie.

End Select End Sub

Pętle Często trzeba uruchomić zestaw instrukcji więcej niż jednokrotnie. Należy wtedy utworzyć pętlę. Najczęstsze scenariusze to wykonywanie kodu w pętli określoną liczbę razy, dopóki warunek nie przyjmie wartości true lub false, lub jeden raz dla każdego elem entu z kolekcji obiektów (zobacz omówienie pracy z grupami elem entów w dalszej części rozdziału).

1138|

Rozdział 3. Języki platformy .NET

For...Next K onstrukcja For...Next umożliwia wykonywanie bloku instrukcji określoną liczbę razy. Służy do tego licznik zwiększany o określoną wartość przy każdym uruchom ieniu pętli. Po osiągnię­ ciu przez licznik maksymalnej w artości pętla kończy działanie. W języku C# instrukcja f o r zapisyw ana jest w nawiasach i składa się z trzech części: deklaracji licznika, w arunku dla licznika i w artości kroku licznika. Poszczególne części rozdzielone są średnikiem . Poniższy kod urucham ia blok jeden raz dla każdego raportu od pracownika: C# for (int i = 0; i < numDirectReports; i++)

{ / / Aktualizowanie danych pracownika na podstawie raportów.

} W języku Visual Basic instrukcja For jest nieco czytelniejsza. Należy określić licznik, począt­ kową w artość i wartość docelową (To). Opcjonalnie m ożna dodać słowo kluczowe Step, aby określić, o ile należy zmienić w artość licznika przy każdym wykonaniu pętli. Poniżej znajduje się przykładow y kod:

Visual Basic For i As Integer = 1 To numDirectReports 1 Aktualizowanie danych pracownika na podstawie raportów.

Next

For...Each (iteratory) S truktura For...Each, podobnie jak For...Next, umożliwia wykonywanie grup instrukcji. Jednak instrukcje ze struktury For...Each są wykonywane jeden raz dla każdego elem entu z grupy (lub kolekcji). Jeśli programista doda do klasy Employee blok kodu, który trzeba uruchom ić raz dla każdego raportu, może zastosować pokazaną wcześniej strukturę For...Next i urucham iać ją na podstaw ie liczby raportów. Zastosowanie struktury For...Each umożliwia przejście po każdym obiekcie kolekcji. W tym procesie pobierana jest referencja do danego obiektu i można ją w ykorzystać w kodzie. Dzięki tem u nieco łatwiej jest napisać i zrozum ieć kod. S tru k tu rę For...Each w obu językach (C# i Visual Basic) stosuje się podobnie jak konstrukcję For...Next. W poniższym przykładzie kod wykonywany jest raz dla każdego egzemplarza klasy Employee z kolekcji DirectReports: C# foreach (Employee emp in DirectReports)

{ / / Wykonywanie kodu na podstawie każdego raftortu. / / Elementów można używać jako emp. Nazwa.

}

C zę ść I Wprowadzenie do Visual Studio 2010 |----------------------------------------------Visual Basic For Each emp As Employee In DirectReports ‘ Wykonywanie kodu na podstawie każdego raportu. ' Elementów można używać jako emp. Nazwa.

Next

Do...While/Until Czasem trzeba powtarzać blok kodu odpow iednią liczbę razy, dopóki w arunek nie przyjmie w artości true lub false. M ożna oczekiwać na k o nkretną wartość lub używać licznika zwięk­ szanego na podstawie logiki (zamiast standardowych kroków). W tedy w arto zastosować pętlę Do...While lub While. Pętla Do...While wykonywana jest raz przed sprawdzeniem warunku, aby określić, czy należy uruchomić kod po raz drugi. Pętla While najpierw sprawdza warunek, a na­ stępnie w ykonuje kod tylko wtedy, jeśli w arunek jest spełniony. W języku C# do tworzenia pętli Do...While służy słowo kluczowe do, po którym następuje blok kodu w nawiasach klamrowych. Instrukcja while zapisyw ana jest na końcu bloku kodu, co oznacza, że instrukcje są wykonywane raz przed spraw dzeniem warunku (aby sprawdzać wa­ runek przed uruchom ieniem pętli, należy użyć pętli while). Pokazano to w poniższym kodzie: C# do

{ / / Pobieranie następnego projektu i obliczanie prowizji.

projectCommission = GetNextProjectCommision(empId); calculatedCommission += projectCommission; if (projectCommission == 0) break; } while (calculatedCommission < MaxMonthlyCommission);

W arto zauważyć, że w kodzie zastosowano słowo kluczowe break . Oznacza ono, że kod powi­ nien wyjść z pętli Do...While. M ożna też użyć słowa kluczowego continue, aby pom inąć pozo­ stały kod bloku i przejść bezpośrednio do instrukcji while w celu w ym uszenia sprawdzenia w arunku (i zwykle przejścia do następnego pow tórzenia pętli). W języku Visual Basic instrukcję while (lub until) należy umieścić na początku lub na końcu pętli. Jeśli znajduje się ona na początku, warunek będzie sprawdzany przed uruchom ieniem pętli. Jeżeli instrukcja znajduje się na końcu, kod pętli wykonywany jest przynajm niej raz przed sprawdzeniem warunku. Słowo kluczowe While oznacza, że pętla ma działać, dopóki warunek jest spełniony (dopóty nie stanie się fałszywy). Słowo kluczowe U ntil umożliwia wykonywanie pętli dopóty, dopóki warunek nie stanie się prawdziwy (dopóki jest fałszywy). Poniżej pokazano przykładowy kod:

Visual Basic Do 1 Pobieranie następnego projektu i obliczanie prowizji.

projectCommission = GetNextProjectCommision(empId)

Rozdział 3. Języki platformy .NET calculatedCommission += projectCommission If projectCommission = 0 Then Exit Do Loop While calculatedCommission < MaxMonthlyCommission

Istnieje też podstawowa pętla W hile (bez do). O dm iana ta przechodzi przez blok kodu, dopóki warunek jest spełniony. Pętle Do...While, podobnie jak wszystkie pętle, można zagnieżdżać w celu obsługi bardziej skomplikowanych scenariuszy.

Praca z grupami elementów W czasie program owania często trzeba zarządzać grupami podobnych elementów. Programista może pracować nad zbiorem wartości, na przykład kodami pocztowymi powiązanymi z przedsta­ wicielem handlow ym . Można też używać grupy obiektów, na przykład czeków z wypłatami otrzym anych przez pracownika w danym roku. Kiedy trzeba pracować nad grupą elementów, m ożna wykorzystać do tego klasy tablic lub kolekcji. Tablice doskonale nadają się do pracy nad stałymi i sekwencyjnymi listami elem entów tego samego typu. Kolekcje są lepiej dostosow ane do zarządzania grupam i zawierającymi zmienną liczbę obiektów.

Tablice Tablica to grupa elementów jednego typu (prostego lub wskaźnikowego). M ożna utworzyć na przykład tablicę z samymi liczbami całkowitymi lub łańcucham i znaków. Ponadto w czasie inicjowania tablicy trzeba określić liczbę przechowywanych w niej elementów. Istnieją metody zwiększania lub zmniejszania rozm iaru tablic, jednak zwykle polegają one na kopiowaniu za­ wartości do innej tablicy. Jeśli potrzebna jest elastyczność w zakresie dodaw ania lub usuw ania elem entów , lepiej użyć kolekcji zam iast tablicy. W czasie określania rozmiaru tablicy w arto pamiętać, że indeksow anie tablic rozpoczyna się od zera. O znacza to, że pierwszy elem ent tablicy ma num er zero. Dlatego jeśli określim y rozm iar tablicy na m y A rray (6 ), będzie ona zawierać siedem elem entów (od zerowego do szóstego). Tablice są ciągłe i sekwencyjne. Umożliwia to szybkie ustaw ianie i pobieranie wartości ele­ m entów za pom ocą indeksu. Typowe tablice są jednowymiarowe, co oznacza, że zawierają jedną grupę indeksowanych elementów. Tablicę tego rodzaju można zadeklarować przez określenie liczby elementów w tablicy w czasie deklarow ania zmiennej lub przed pierwszym zastosow aniem tablicy. Istnieje kilka popraw nych sposobów definiowania tablicy. W języku C# standardow a technika to stosowanie słowa kluczowego new i określanie rozm iaru tablicy. W języku Visual Basic m ożna ustawić wielkość tablicy bez korzystania ze słowa kluczowego new. Pokazano to w poniższym kodzie: C# short!] salesRegionCodes = new short[numRegions];

V isual Basic Dim salesRegionCodes(numRegions) As Short

C zę ść I Wprowadzenie do Visual Studio 2010 |----------------------------------------------Dostęp do elem entów tablicy odbyw a się poprzez indeks. Klasy tablic dziedziczą po klasie S y stem .A rray. Zapewnia to liczne właściwości i metody, służące między innymi do pobierania typu w artości elem entów tablicy (G etType), p obierania łącznej liczby elem entów z wszyst­ kich w ym iarów tablicy (L en g th ) i pobierania największego indeksu w danym wymiarze (Get '-••UpperBound). Poniżej pokazano, jak wykorzystać ostatnią z tych metod i uzyskać dostęp do elem entów tablicy za pom ocą indeksów: C# for (int i = 0; i < salesRegionCodes.GetUpperBound(O); i++)

{ short code = salesRegionCodesli]; / / Dodatkowe przetwarzanie.

}

Visual Basic For i = 0 To salesRegionCodes.GetUpperBound(O) Dim code As Short = salesRegionCodes(i) 1 Dodatkowe przetwarzanie.

Next

W deklaracji m ożna też zainicjować wartości elementów' tablicy. W tedy liczba zdefiniowanych elem entów określa rozmiar tablicy. Poniżej znajduje się przykładowy kod: C# doublet] salesFigures = new doublet] {12345.98, 236789.86, 67854.12};

Visual Basic Dim salesFiguresO As Double = {12345.98, 236789.86, 67854.12}

M ożna definiować tablice o większej liczbie wymiarów (do 32). Często stosow ane są tablice dwuwymiarowe, w których jeden w ym iar traktowany jest jak wiersze, a drugi — jak kolumny. Do spraw dzania liczby w ym iarów tablicy służy właściwość Rank. Przykładowa wielowymiarowa tablica zawiera poziom sprzedaży każdego przedstawiciela handlo­ wego (wiersze) w każdym regionie (kolum ny). M ożna ją zdefiniować w następujący sposób: C# doublet,] salesByRegion = new double[6, 5];

Visual Basic Dim salesByRegion(6, 5) As Double

W arto zauważyć, że tablica może też zawierać inne tablice. Są to tak zwane tablice tablic. Cza­ sem nazywa się je tablicami postrzępionym i, ponieważ poszczególne elem enty m ogą być tabli­ cami o różnych rozmiarach i wym iarach. Dlatego tablica nie jest wtedy jednolita.

Rozdział 3. Języki platformy .NET

Klasy kolekcji i typy ogólne Klasa kolekcji zapew nia większą elastyczność w czasie korzystania z obiektów. W jednej kolek­ cji można na przykład przechowywać obiekty różnych typów. Kolekcje mogą też mieć różną długość — dodaw anie i usuwanie elem entów jest w nich łatwe. Standardowe klasy kolekcji są zdefiniowane w przestrzeni nazw System.Collections. Klasy z tej przestrzeni to m iędzy innym i klasa bazowa do tw orzenia w łasnych niestandardow ych kolekcji (CollectionBase), a także bardziej specyficzne kolekcje, na przykład ArrayList, Stack, SortedList, Queue i Hashtable. Można na przykład utworzyć prostą, dynamiczną kolekcję ArrayList na wartości reprezentujące poziom sprzedaży. W poniższym kodzie pokazano, jak utw orzyć now ą kolekcję ArrayList, dodać do niej elem enty i przejść po nich w pętli. C# ArrayList salesFigures = new ArrayListO; salesFigures.Add(12345.67); salesFigures.Add(3424.97); salesFigures.Add("None"); for (int i = 0; i < salesFigures.Count; i++)

{ object figure = salesFiguresli]; / / Przetwarzanie danych.

}

Visual Basic Dim salesFigures As New ArrayList() salesFigures.Add(12345.67) salesFigures.Add(3424.97) salesFigures.Add("None") For i As Integer = 0 To salesFigures.Count - 1 Dim figure As Object = salesFigures(i) 1 Przetwarzanie danych.

Next

Oczywiście, klasa A rra y L is t i inne klasy kolekcji udostępniają także wiele innych właściwości i metod. Należy zapoznać się z tymi, któ re są potrzebne w danej sytuacji. W arto zauważyć, że klasa kolekcji we wcześniejszym kodzie zawiera obiekty dw óch typów: double i string. Może to prowadzić do problem ów , jeśli przyjęto założenie, że wszystkie obiekty kolekcji mają ten sam typ. Program ista może oczekiwać, że poziom sprzedaży zawsze będzie w yrażony za pomocą typu double, albo że kolekcja będzie zawierać same obiekty Employee. W tedy potrzebna jest klasa kolekcji o ściśle określonym typie. Można ją utw orzyć

C zę ść I Wprowadzenie do Visual Studio 2010 |----------------------------------------------przez napisanie własnej, niestandardow ej klasy kolekcji (dziedziczącej po klasie C o lle c tio n B a s e i implementującej interfejsy specyficzn e dla potrzeb). Platforma .NET udostępnia ponadto zestaw klas ogólnych, które u m o żliw iają stosowanie grup obiektów o ściśle określonym typie. Kolekcje ogólne znajdują się w przestrzeni nazw System.Collections.Generic. Klasy kolekcji ogólnych umożliwiają w czasie inicjowania klasy zdefiniowanie typu przechowywanych w niej elem entów. Powoduje to ograniczenie typu elem entów zapisywanych w tej klasie. Tę inform ację można wykorzystać w kodzie. Aby zdefiniow ać ogólną listę w języku C #, należy użyć nawiasów ostrych () i podać wewnątrz nich typ. W języku V isu al Basic służą do tego zwykłe nawiasy i słowo kluczowe Of. W przykładowym kodzie zdefiniow ano prostą, ogólną listę elementów, która może zawierać jedynie wartości typu double:

C# List salesFigures = new List();

Visual Basic Dim salesFigures As New List (Of Double)

D ostępnych jest wiele ogólnych klas kolekcji, w tym Dictionary, HashSet, LinkedList, List, Queue, SortedList, Stack i tak dalej. Można też pisać własne ogólne klasy kolekcji.

Krotki (nowość) Klasa System.Tupie umożliwia utworzenie uporządkowanej listy elementów i korzystanie z nich. Po u tw orzeniu listy nie m ożna jej zm odyfikow ać. Jest to łatwa technika przechow yw ania sekwencyjnych list elementów (i uzyskiwania dostępu do nich). Jeśli programista chce na przykład utworzyć krotkę do przechowywania nazw miesięcy z pierwszego kwartału, może użyć statycznej składowej Tuple.Create. Aby dodać elem enty do listy, należy podać je w nawiasach i rozdzielić przecinkami. Następnie można uzyskać dostęp do elementów krotki za pom ocą składni Iteml, Item2, Item3. W arto zauważyć, że krotki udostępniają właściwość Item tylko dla określonej liczby elementów. Korzystanie z krotki pokazano w poniższym kodzie: C# var qlMonths = Tuple.Create("Sty", "Lut", "Mar"); string monthl = qlMonths.Iteml;

Visual Basic Dim qlMonths = Tuple.Create("Sty", "Lut", "Mar") Dim monthl As String = qlMonths.Iteml

Rozdział 3. Języki platformy .NET Klasa Tupie oparta jest na typach ogólnych. M ożna zdefiniować typ każdego elem entu listy. M etoda Create automatycznie określa ten typ. Można jednak podać go bezpośrednio. Wtedy do zadeklarow ania typów należy użyć konstruktora:

C# Tuple qlMonthNumAndName = Tuple.Create(l, "Sty", 2, "Lut", 3, "Mar");

Visual Basic Dim qlMonthNumAndName As Tuple(0f Integer, String, Integer, String, Integer, String) = Tuple.Created, "Sty", 2, "Lut", 3, "Mar")

Programowanie z wykorzystaniem atrybutów Czasem trzeba udostępnić m etadane na temat możliwości kodu. M etadane mają informować inny kod sprawdzający (za pom ocą m echanizm u rełleksji) dany fragm ent pod kątem jego specyficznych funkcji. M ożna na przykład poinform ować środowisko uruchom ieniow e plat­ formy .NET o pożądanym sposobie kompilowania kodu. Platforma .NET udostępnia wiele atrybutów . M ożna też tworzyć w łasne niestandardowe atrybuty. W tedy należy napisać kod sprawdzający m etadane na tem at własnej aplikacji. A trybuty deklaratyw ne m ożna stosow ać do klas, właściwości, m etod, param etrów i innych elem entów kodu. Do aplikacji m ożna dodać jeden atrybut lub większą ich liczbę. Niektóre atrybuty przyjm ują param etry określające dodatkowe inform acje o kodzie. W arto zauważyć, że zwyczajowo nazwy wszystkich atrybutów kończą się słowem Attribute (na przykład SerializableAttribute). Przeważnie jednak m ożna pominąć to słowo w d e­ klaracjach, ponieważ nie jest wymagane. W języku C# atrybuty są um ieszczane w kodzie w nawiasach kwadratowych ([ ]). Można na przykład zastosować atrybut ConditionalAttribute, aby poinform ow ać kom pilator, które fragm enty kodu należy skom pilować w zależności od zm iennych środowiskowych lub opcji podanych w wierszu poleceń. A trybut stosowany jest do kodu w następujący sposób:

C# [System.Diagnostics.Conditional(“DEBUG")) public void EmployeeCalculationsTestMethodt)

{ / / Kod kompilowany’ w wersji diagnostycznej podzespołu.

> W języku Visual Basic atrybut w celu dodania do kodu należy umieścić w nawiasach ostrych () przed danym fragmentem kodu:

C zę ść I Wprowadzenie do Visual Studio 2010 |----------------------------------------------Visual Basic Conditional( "DEBUG" )> Public Sub EmployeeCalculationsTestMethod() 1 Kod kompilowany *v wersji diagnostycznej podzespołu.

End Sub

Obsługa wyjątków W czasie program ow ania dużo czasu zajmuje usuwanie wyjątków z kodu. Jednak nie zawsze m ożna wyeliminować w szystkie scenariusze prow adzące do wystąpienia wyjątku. Wtedy po­ trzebny jest sposób na przew idzenie wyjątku i — jeśli to możliwe — obsłużenie go w kodzie. Służy do tego struktura T ry ...C a tc h ...F in a lly . Instrukcję Try należy um ieścić wokół bloku kodu, w którym może pojawić się wyjątek. Zwykle robi się to w celu obsłużenia błędu. Jeśli program ista nie zamierza obsługiwać problemów, m oże pozwolić na przejście błędu do kodu wywołującego. Oczywiście, w zewnętrznym kodzie trzeba dodać obsługę błędów (menedżer błędów), aby zapobiec nieeleganckiemu przejściu wyjątków do użytkowników. Kiedy w bloku Try wystąpi wyjątek, sterowanie jest natychmiast przekazywane do bloku Catch. M oże to być ogólny blok do przechwytywania wszystkich błędów lub blok przeznaczony dla w yjątków specyficznego typu. Kod w bloku C a tc h ma obsłużyć błąd. O bsługa błędu może polegać na rejestrow aniu błędu, wysyłaniu go do systemu kom unikatów lub próbie wykonania innych operacji (na przykład wywołania instrukcji skoku) w wyniku w ystąpienia problemu. Poniżej pokazano prosty przykład. W bloku T ry przeprowadzane jest dzielenie. Blok może zgłosić wyjątek, jeśli w ystąpi dzielenie przez zero. W arunek ten pow oduje zgłoszenie specy­ ficznego wyjątku — D iv id e B y Z e ro E x c e p tio n . Istnieje też blok C atch do obsługi wyjątków tego (i tylko tego) rodzaju. Do bloku C atch m ożna dodać albo kod „pochłaniający” wyjątek bez wykonywania żadnych operacji, albo kod przetwarzający go. P onadto program ista może ponow nie zgłosić wyjątek po jego obsłużeniu.

C# try

{ averageSales = salesToDate / avgRate;

> catch (System.DivideByZeroException e)

{ / / Obsługa wyjątku / / Do ponownego zgłaszania służy instrukcja throw e:.

>

Visual Basic Try averageSales = salesToDate / avgRate

Rozdział 3. Języki platformy .NET Catch ex As System.DivideByZeroException 1 Obsługa wyjątku. ' Do ponownego zgłaszania służy instrukcja Throw ex.

End Try

M ożna dodać wiele specyficznych i ogólnych bloków Catch. W arto zauważyć, że jeśli blok Catch nie jest powiązany z typem zgłoszonego wyjątku, dany wyjątek nie zostanie obsłużony, ale przejdzie do kodu wywołującego (lub do środowiska uruchomieniowego). W bloku Catch m ożna też ponow nie zgłosić błąd. Służy do tego słowo kluczowe Throw. Jeśli program ista nie zgłosi ponownie wyjątku, środowisko uruchom ieniow e przyjmie, że błąd obsłużono, i przejdzie dalej. Instrukcję Throw można ponadto zastosować w dow olnym miej­ scu aplikacji, w którym program ista chce zgłosić wyjątek. Jest też blok F in a lly . Ten fragment kodu należy umieścić po blokach C atch. Jest urucham iany niezależnie od tego, czy wyjątek zgłoszono, czy nie. Blok F i n a l l y przydaje się do porządko­ wania zasobów, które zaalokowano w bloku T ry.

Tworzenie i zgłaszanie zdarzeń Języki platform y .NET udostępniają niewiele funkcji, które m ożna zastosować bez korzystania ze zdarzeń. Zdarzenia umożliwiają poinform ow anie w jednym fragmencie kodu innego bloku o w ystąpieniu pewnej sytuacji. M ówimy, że kod zgłaszający zdarzenie publikuje je, a blok otrzymujący powiadomienia subskrybuje zdarzenie. Prostym przykładem jest tworzenie interfejsu użytkow nika w aplikacji sieciowej lub dla systemu W indows. Programista dodaje wtedy kod subskrybujący publikowane przez interfejs użytkownika zdarzenia, takie jak kliknięcie przyci­ sku przez użytkow nika. Oczywiście, zdarzenie może mieć więcej niż jednego odbiorcę, a o d ­ biorcy mogą subskrybować wiele zdarzeń.

Tworzenie zdarzeń W czasie tw orzenia zdarzenia trzeba określić, czy konieczne jest przekazywanie niestandardo­ wych danych do subskrybentów. Te niestandardowe dane to argum enty zdarzenia. Jeśli nie są potrzebne, wystarczy zadeklarować zdarzenie za pom ocą słowa kluczowego event i delegata EventHandler. Jeśli program ista chce zdefiniować proste zdarzenie zgłaszane w momencie zaktualizowania klasy Employee, m oże to zrobić w następujący sposób: C# public event EventHandler RaiseEmployeeUpdatedEvent;

V isual Basic Public Event RaiseEmployeeUpdatedEvent As EventHandler

C zę ść I Wprowadzenie do Visual Studio 2010 |----------------------------------------------Zadeklarow anie zdarzenia jest równoznaczne z jego opublikowaniem. Subskrybenci mający referencje do danej klasy m ogą następnie zasubskrybować zdarzenie. Trzeba jeszcze zgłosić zdarzenie w klasie, w której je opublikowano. Pozwala to powiadomić subskrybentów o wystą­ pieniu zdarzenia. N ieco trudniejsze jest definiow anie zdarzeń, które wymagają przekazania niestandardowych danych. W tedy najpierw trzeba utworzyć niestandardow ą klasę na dane zdarzenia. Klasa musi dziedziczyć po klasie bazowej E ventA rgs. M ożna na przykład utworzyć niestandardową klasę z argum entam i zdarzenia i zapisać w niej identyfikator pracownika związanego ze zdarzeniem aktualizacji. W tym scenariuszu w niestandardowej klasie należy umieścić właściwość do prze­ chowywania wartości identyfikatora i konstruktor do przekazywania jej. Pokazano to w poniż­ szym kodzie: C# public class EmployeeUpdatedEventArgs : EventArgs

{ public EmployeeUpdatedEventArgststring id)

{ id = id;

} private string id; public string Employeeld { get { return id; }

> }

Visual Basic Public Class EmployeeUpdatedEventArgs Inherits EventArgs Public Sub New(ByVal id As String) id = id End Sub Private id As String Public Readonly Property EmployeeldO As String Get Return id End Get End Property End Class

Przy stosowaniu niestandardow ych argum entów zdarzeń trzeba określić, że zdarzenie ma używać niestandardowej klasy z argum entam i. M ożna wykorzystać do tego wersję klasy Event ^♦H andler zdefiniowaną jako typ ogólny. Klasę zawierającą argum ent należy podać w ogólnej

Rozdział 3. Języki platformy .NET definicji klasy EventH and ler. Ta ostatnia klasa autom atycznie obejm uje argum ent sender (zwykle jest to kopia obiektu publikującego zdarzenie). Poniżej pokazano, jak zdefiniować niestandardow ą wersję klasy EventHandler: C# public event EventHandler RaiseEmployeeUpdatedCustomEvent;

Visual Basic Public Event RaiseEmployeellpdatedCustomEvent As EventHandler (Of EmployeellpdatedEventArgs)

Zgłaszanie zdarzeń Z darzenie należy zgłosić w klasie, w której je zdefiniowano. Zdarzenie zgłaszane jest w wyniku pew nych operacji. W om aw ianym przykładzie jest to aktualizacja klasy Employee. Aby zgłosić zdarzenie, wystarczy wywołać je w odpowiednim miejscu i przekazać właściwe parametry. Dla niestandardow ego zdarzenia aktualizowania klasy Employee należy przekazać tę klasę jako param etr sender, a następnie identyfikator pracow nika w egzem plarzu klasy EmployeeUpdated

'-►EventArgs: C# public void UpdateEmployee()

{ / / Aktualizowanie obiektu klasy Employee. / / Zgłaszanie zdarzenia w celu powiadomienia subskrybentów o aktualizacji.

RaiseEmployeeUpdatedCustomEvent(this, new EmployeellpdatedEventArgs (this.Id));

}

Visual Basic Public Sub UpdateEmployee() 1 Aktualizowanie obiektu klasy Employee. ' Zgłaszanie zdarzenia w’ celu powiadomienia subskrybentów o aktualizacji.

RaiseEvent RaiseEmployeeUpdatedCustomEvent(Me, New EmployeellpdatedEventArgs (Me. Id)) End Sub

Subskrybowanie i obsługiwanie zdarzeń O sta tn i krok polega na włączeniu oczekiwania na zdarzenie (zasubskrybow aniu go). Wymaga to w ykonania dwóch operacji. Po pierwsze, trzeba napisać m etodę odzwierciedlającą sygnaturę zdarzenia. Zawartość metody musi określić programista. Metoda wywoływana jest po zgłoszeniu zd arzen ia. Poniżej pokazano przykładową m etodę (w klasie subskrybującej zdarzenie z klasy Em ployee) wywoływaną po zgłoszeniu zdarzenia. W arto zauważyć, że w metodzie zastosowano niestandardow y typ zdarzenia, dlatego trzeba użyć odpowiedniej sygnatury.

C zę ść I Wprowadzenie do Visual Studio 2010 |----------------------------------------------

c# private void OnEmployeeUpdate(object sender, EmployeellpdatedEventArgs e)

{ //

Wykonywanie operacji w odpowiedzi na aktualizację obiektu kliny Employee.

string empld = e .Employeeld;

} V isual Basic Private Sub OnEmployeeUpdate(ByVal sender As Object, _ ByVal e As EmployeellpdatedEventArgs) Dim empld As String = e.Employeeld Console.WriteLine("Zgłoszono zdarzenie: id=" & empld) End Sub

Po drugie, trzeba zarejestrować metodę obsługi dla danego zdarzenia. W tym celu należy d o ­ dać wskaźnik do zdarzenia za pomocą instrukcji += (w języku C#) lub AddHandler (w języku Visual Basic). Zwykle m etody obsługi zdarzeń dodawane są w konstruktorze subskrybującej klasy lub w kodzie służącym do inicjalizowania jej egzemplarzy. W poniższym fragmencie pokazano kod wiążący metodę OnEmployeeUpdate ze zdarzeniem RaiseEmployeeUpdatedCustomEvent: C# Employee _emp = new Employee!); emp.RaiseEmployeeUpdatedCustomEvent += this .OnEmployeeUpdate;

V isual Basic AddHandler

emp.RaiseEmployeeUpdatedCustomEvent, AddressOf OnEmployeeUpdate

Kiedy taki kod jest urucham iany, zawsze wynika to z użycia klasy zgłaszającej zdarzenie (tu jest to zdarzenie Employee. UpdateEmployee). Po dojściu do metody zgłaszającej zdarzenie wy­ woływany jest kod klasy subskrybującej zdarzenie.

Mechanizmy języka Do tej pory omawialiśmy podstawy’ program ow ania w językach platform y .NET — budowanie obiektów i rozwiązywanie standardowych problem ów związanych z pętlam i, obsługą wyjątków oraz tworzeniem i przetw arzaniem zdarzeń. W tym podrozdziale spróbujem y opisać dodatko­ we elementy, które sprawiają, że języki platform y .NET są wyjątkowe. W ielu z tych elementów programiści nie używają na co dzień. Techniki te zapewniają jednak dodatkow e możliwości w cza­ sie pisania kodu i pozwalają lepiej go zrozumieć. O to funkcje języków platform y .NET om ó­ wione w tym miejscu: • niejawne określanie typów, • składnia inicjowania obiektów,

Rozdział 3. Języki platformy .NET • składnia inicjowania kolekcji (nowość), •

m etody dodatkowe,

• typy anonim owe, • wyrażenia lambda, •

m etody częściowe,



zapytania zintegrow ane z językiem (ang. Language Integrated Query — LINQ),

• podzespoły zaprzyjaźnione, • obsługa języka XML (tylko w Visual Basic), •

nieużywane argum enty zdarzeń (tylko w Visual Basic),

• autom atycznie im plem entow ane właściwości (nowość w Visual Basic), •

niejawne kontynuow anie wiersza w Visual Basic (nowość),



korzystanie z dynam icznych obiektów i języka (nowość),



kowariancja i kontrw ariancja (nowość),

• obsługa równoważności typów (nowość).

Wykrywanie typu zmiennej na podstawie przypisania W now szych wersjach języków Visual Basic i C# (od wersji 2008) m ożna definiować zm ienne bez jaw nego określania ich typów. Nie przeszkadza to jednak w odnoszeniu korzyści charaktery­ stycznych dla zmiennych o ściśle określonym typie (sprawdzanie ich popraw ności przez kom ­ pilator, przydział pamięci i tak dalej). Ulepszone kompilatory potrafią wykryć typ danych na podstawie kodu. Proces ten to niejawne określanie typu (ang. local type inference lub implicit typing). W arto przyjrzeć się poniższym wierszom kodu. Programista tworzy zmienne typu S t rin g i przypi­ suje do nich wartość. C# string companyName = "Contoso";

V isual Basic Dim companyName As String = "Contoso";

Te sam e wiersze można zapisać z wykorzystaniem niejawnego określania typu. Pozwala to pom inąć w deklaracji typ s t r i n g . Kompilator potrafi wykryć, że program ista chce użyć tego typu, i tworzy zmienną o ściśle określonym typie. W języku C# um ożliw ia to słowo kluczowe v a r. Nie należy mylić go z instrukcją v a r używaną na przykład w języku JavaScript. Zm ienne definiow ane przy użyciu tego słowa kluczowego mają ściśle określony typ. W języku Visual Basic wystarczy użyć instrukcji Dim i pominąć deklarację typu.

C zę ść I Wprowadzenie do Visual Studio 2010 C# var

com panyNam e =

"C o n to so ";

Visual Basic D im c o m p a n y N a m e =

"C o n to so ";

Te dwa wiersze działają identycznie jak kod przedstawiony wcześniej. Choć w drugim przykładzie programista nie zadeklarował typu, określił go kompilator. Nie jest to powrót do ogólnych typów danych, takich jak V a r i a n t lub O b je c t. Podejście to nie polega też na późnym wiązaniu zmiennych. Po prostu bardziej sprawny kom pilator potrafi ściśle określić typ zmiennej w wyniku analizy kodu. Dzięki tem u program ista może korzystać z wszystkich zalet wczesnego wiązania, a przy tym nieco skrócić kod. Rysunek 3.2 przedstawia działanie kompilatora języka C# (kompilator języka Visual Basic funk­ cjonuje w taki sam sposób). W idać tu, że naw'et na etapie program ow ania kom pilator potrafi wykryć, iż typ zm iennej to S y ste m . S tr in g . Rysunek 3.2.

Określanie typu

o o C o n so łe A p p s - M icrosoft Visual Studio fcile

fcdit

tyew

Refactor

Project

guild

gebug

Tearc

Data ,

! . vi,

A* ' i

Em ployee.es*

X

~



■,

...

*

i

Io o ls Debug

t

..

Tejt

JMndow

Help

.

Proqram .es

ConsoleApps. Employee



V Lo o ku p C o m p an > N am e (strin g em pld)

c l a s s Employee

p u b lic s t a t i c s t r in g LockupCompanyfJame( s t r in g empld)

v a f name ■ " b r a k " ; c la s s S y s t e m .S t r in g

Represents text as a series of Unicode characters.

/ / O p e r a c je do w y s z u k iw a n ia n a zw y . re tu rn name;

f t Task List ■

O utput

Ready

Przy niejawnym określaniu typu trzeba pamiętać o kilku zagadnieniach. Po pierwsze, aby kom ­ pilator mógł określić typ zm iennej lokalnej, trzeba przypisać do niej w artość. Nie powinno to stanow ić problem u, poniew aż zm ienna bez o k reślonej wartości nie jest używana. Drugie zagadnienie związane jest z tym, że przy niejawnym określaniu typu można używać tylko zmiennych lokalnych. Nie można stosować tu zmiennych z poziomu klasy (czyli pól) ani zm ien ­ nych statycznych. Próba ich użycia w języku C# spow oduje zgłoszenie błędu przez kompilator.

Rozdział 3. Języki platformy .NET W języku Visual Basic także pojawi się ten błąd, pod warunkiem jednak, że program ista włączy opcję Option Strict. Jeśli tego nie zrobi, zmienna nie będzie miała ściśle określonego typu, ale typ ogólny — Object. Niejawne określanie typu zm iennych lokalnych może być przydatne także w deklaracjach innego rodzaju, na przykład przy definiowaniu tablic, tworzeniu zmiennych w pętli, definiowaniu zmiennych w instrukcji Using i zmiennych zawierających wyniki wywołania funkcji. W każdym z tych scenariuszy kom pilator potrafi wykryć typ danych na podstawie kontekstu. Poniższy kod przedstawia instrukcję Using i wykrywanie typu zmiennej cnn (jest to obiekt typu SqlConnection). W arto zauważyć, że instrukcja Using określa blok kodu, w którym używany jest dany zasób. Zastosowanie bloku Using gwarantuje, że środow isko uruchom ie­ niowe po zakończeniu pracy usunie obiekt (tu jest nim połączenie z bazą danych). C# using (var cnn = new System.Data.SqlClient.SqlConnection()) { //

Kod korzystający z połączenia.

}

Visual Basic Using cnn = New System.Data.SqlClient.SqlConnection '

Kod korzystający z połączenia.

End Using

W języku Visual Basic można włączyć i wyłączyć wykrywanie typu zmiennych lokalnych w danym pliku. Domyślnie w nowych plikach z kodem Visual Basic mechanizm ten jest włączony. P ro­ gram ista może to zmienić za pom ocą instrukcji O p tio n I n f e r O ff, którą należy umieścić na początku pliku.

Tworzenie obiektów i ustawianie ich właściwości w jednym wierszu kodu O becnie dostępna jest skrócona technika, która umożliwia zadeklarow anie egzemplarza klasy i przypisanie początkowych wartości wszystkim (lub niektórym) jej składow ym . Przy użyciu jednego wiersza kodu można utworzyć obiekt i ustawić jego właściwości. W czasie wykonywania program u środowisko najpierw' utworzy obiekt, a następnie przypisze wartości jego składowym w kolejności ich pojawiania się na liście inicjacyjnej, fen nowy' mechanizm to inicjator obiektów (ang. object initializer). Poniżej przedstawiono przykład zastosowania tej techniki. Program ista utw orzył klasę Employee o licznych właściwościach, między innymi FirstName, LastName, FullName i T itle . Przy uży­ ciu inicjatora obiektów można jednocześnie utworzyć egzemplarz tej klasy i ustawić początkowe wartości wybranych (lub wszystkich) jej właściwości. W tym celu należy najpierw utworzyć obiekt. W języku Visual Basic służy do tego słowo kluczowe With (język C# nie wymaga w tym

C zę ść I Wprowadzenie do Visual Studio 2010 miejscu żadnej instrukcji). Następnie trzeba umieścić w nawiasach klamrowych kod inicjujący odpowiednie właściwości: C# Employee emp = new Employee { FirstName = "Jan”, LastName = "Kowalski", Title = "Starszy programista" };

Visual Basic Dim emp As New Employee() With { .FirstName = "Jan", .LastName = "Kowalski", .Title = "Starszy programista" }

Pojedyncze wiersze kodu widoczne powyżej odpowiadają instrukcji tworzącej egzemplarz klasy Employee i odrębnym w ierszom kodu zw iązanym z każdą właściwością. W arto zauważyć, że w języku Visual Basic trzeba poprzedzić inicjator słowem kluczowym W ith, a każdą właści­ wość — kropką. W języku C# nie jest to potrzebne. Oczywiście można też użyć inicjatorów obiektów przy korzystaniu z konstruktorów z param e­ tram i. Należy wtedy przekazać param etry do konstruktora w standardow y sposób, a następnie dodać inicjator obiektów. Jeśli klasa Employee m a konstruktor przyjm ujący imię i nazwisko pracownika, można utworzyć obiekt przy użyciu odpowiednich param etrów i użyć inicjatora do określenia wartości składowej T itle: C# Employee emp = new Employee!"Jan", "Kowalski") { Title = "Starszy programista" };

Visual Basic Dim emp As New Employee!"Jan", "Kowalski") With { .Title = "Starszy programista" }

W inicjatorach obiektów m ożna też umieszczać kod. Ponadto w języku Visual Basic można użyć właściwości inicjowanego obiektu do inicjowania innych właściwości. W języku C# technika ta jest niedostępna. K om pilator tego języka nie daje dostępu do zm iennej do m om entu zakoń­ czenia przypisywania. Poniższy kod inicjuje obiekt Employee i ustaw ia wartość właściwości Employee. FullName przez połączenie imienia i nazwiska. Warto zwrócić uwagę na to, że w wersji w języku Visual Basic użyto inicjowanego obiektu: C# Employee emp = new Employee { FirstName = "Jan", LastName = "Kowalski", FullName = "Jan" + "Kowalski" };

Visual Basic Dim emp As New Employee!) With { .FirstName = "Jan", .LastName = "Kowalski", .FullName = .FirstName & " " & .LastName }

Rozdział 3. Języki platformy .NET Inicjatory obiektów można zagnieżdżać. Jeśli właściwość także jest obiektem, m ożna go utw o­ rzyć w inicjatorze. Programista może też umieścić inicjator jednego obiektu w inicjatorze innego obiektu. Ilustruje to prosty przykład. Użyta tu klasa Employee ma właściwość Location, która odpowiada typowi Location o właściwościach City i State. Obiekt Employee i zagnieżdżony obiekt Location można utworzyć w następujący sposób: C# Employee emp = new Employee { FirstName = "Jan", LastName = "Kowalski", Location = new Location { City = "Katowice", State = "SL" } };

Visual Basic Dim emp As New Employee!) With { .FirstName = "Jan", .LastName = "Kowalski", _ .Location = New Locatin With {.City = "Katowice", .State = "SL" } }

Definiowanie kolekcji i inicjowanie ich wartości (nowość) O becnie m ożna zdefiniować klasę kolekcji lub tablicy i jednocześnie określić początkowe wartości danego obiektu. Pozwala to przekształcić wiele wierszy z prostymi wywołaniami m e­ tody add w instrukcję jednowierszową. Jest to szczególnie przydatne, jeśli w aplikacji wystę­ puje lista elem entów, którą trzeba zadeklarować i zainicjować za pomocą wartości. Program ista może zdefiniować na przykład tablicę z lokalizacjami biur sprzedaży. Można ją zdefiniow ać i zainicjować w następujący sposób: C# string!] salesGeos = {"Wybrzeże", "Polska Centralna", "Polska Południowa"};

Visual Basic Dim salesGeos!) As String = {"Wybrzeże", "Polska Centralna", "Polska Południowa"}

Podobnej składni można użyć do definiowania i inicjowania klas kolekcji, w tym klas opartych na typach ogólnych. Na przykład poniższy kod definiuje listę obiektów Employee i dodaje do listy dwa now e obiekty tego typu. W arto zauważyć, że w kodzie w języku Visual Basic trzeba użyć słowa kluczowego F rom. C# List empList = new List {new Employee("1234"), new Employee!"3456")};

Visual Basic Dim empList As New List(Of Employee) From _ {New Employee!"1234"), New Employee!"3456")}

C zę ść I Wprowadzenie do Visual Studio 2010 |----------------------------------------------

Tworzenie egzemplarzy nieistniejących klas Obecnie platform a .NET umożliwia utw orzenie obiektu, który nie ma odpowiadającej mu klasy na etapie projektowania. W technice tej kompilator tworzy nienazwaną (anonimową) klasę, fen m echanizm to typ anonim ow y. Jednostki te są niezbędne do obsługi zapytań LINQ. Przy użyciu takich typów kolumny danych zwracane przez zapytanie można zapisać jako obiekty (zagadnienie to jest szczegółowo opisane w dalszej części rozdziału). Typy anonimowe są kom ­ pilowane jako obiekty o właściwościach przeznaczonych tylko do odczytu. Poniżej znajduje się fragm ent kodu ilustrujący tworzenie typu anonimowego. Programista chce utworzyć obiekt o właściwościach Name i PhoneNumber, jednak w kodzie nie ma definicji takiej klasy. Można w tedy użyć deklaracji typu anonimowego:

Visual Basic Dim emp = New With {.Name = "Jan Kowalski", .PhoneNumber = "123-123-1234"}

C# var emp = new { Name = "Jan Kowalski", PhoneNumber = "123-123-1234" };

W arto zauważyć, że w deklaracjach typu anonimowego do zdefiniowania obiektu użyto ini­ cjatorów (zobacz omówienie we wcześniejszej części rozdziału). Istotna różnica między tą techniką a inicjatorami polega na tym, że po deklaracji zmiennej i słowie kluczowym New nie ma tu ściśle określonego typu. Kompilator utworzy typ anonimowy z właściwościami Name i PhoneNumber. W języku Visual Basic dostępne jest słowo kluczowe Key. W skazuje ono, że kom pilator pow i­ nien korzystać z danej właściwości przy zarządzaniu typem. Właściwości zdefiniowane przy użyciu tego słowa kluczowego służą do porównywania różnych egzemplarzy typu anonimowego. Język C# nie obsługuje tego słowa kluczowego. W tym języku wszystkie właściwości są traktow a­ ne tak, jakby były oznaczone za pomocą modyfikatora Key z języka Visual Basic. Aby w języku Visual Basic oznaczyć właściwość słowem kluczowym Key, należy użyć poniższej składni: Dim emp = New With {Key .Name = "Jan Kowalski", .PhoneNumber = "123-123-1234"}

Programista m oże też tworzyć typy anonim ow e przy użyciu zm iennych zamiast składni przypi­ sania wartości do właściwości. Przy stosow aniu tego rozwiązania kom pilator używa nazwy zmiennej jako nazwy właściwości, a wartości zmiennej — jako wartości właściwości typu an o ­ nimowego. W poniższym kodzie zm ienna Name pełni funkcję właściwości typu anonim ow ego:

Visual Basic Dim name As String = "Jan Kowalski" Dim emp = New With {name, .PhoneNumber = "123-123-1234"}

Rozdział 3. Języki platformy .NET

string name = "Jan Kowalski"; var emp = new {name, PhoneNumber = "123-123-1234" };

Dodawanie metod do istniejących klas Programiści m ogą teraz dodawać do istniejących typów niestandardow e elem enty w taki spo­ sób, jakby jednostki te były dostępne we wzbogacanej klasie od zawsze. O znacza to, że nie trzeba ponow nie kompilować danego typu ani tworzyć klasy pochodnej, aby dodać do niej nowe funkcje. W zam ian programista może dodać metodę do istniejącego obiektu za pom ocą nowego m echanizm u kom pilatora — metod dodatkowych (ang. extension method). Stosowanie tej techniki przebiega nieco inaczej w językach Visual Basic i C#. W Visual Basic naj­ pierw trzeba zaim portować w pliku przestrzeń nazw System.Runtime.CompilerServices. N astępnie trzeba oznaczyć dany podprogram Sub lub Function dyrektyw ą Extension >-*-Attribute. O statni etap polega na napisaniu nowego podprogram u, w którym pierwszym param etrem jest wzbogacany typ. Poniższy fragment ilustruje tę technikę. Tu w zbogacono typ Integer o now ą m etodę — DoublelnSize:

Visual Basic Imports System.Runtime.CompilerServices Public Module IntegerExtensions

Public Function DoubleInSize(ByVal i As Integer) As Integer Return i + i End Function End Module

Kompilator języka C# nie wymaga im portow ania przestrzeni nazw ani dodaw ania atrybutu do metody. W zam ian trzeba najpierw utw orzyć klasę statyczną. N astępnie należy dodać do niej metodę statyczną, którą program ista chce dołączyć do wybranej klasy. Pierwszym param etrem tej m etody pow inien być w zbogacany typ. Przed nazwą tego typu należy um ieścić m odyfi­ kator this. Poniższy kod wzbogaca typ danych int o nową m etodę — DoublelnSize.

C zę ść I Wprowadzenie do Visual Studio 2010 |----------------------------------------------Aby użyć m etody dodatkow ej, trzeba najpierw zaim portow ać ją do projektu (w języku C# należy użyć deklaracji u sin g ). N astępnie m ożna wywoływać nową metodę w taki sam sposób jak pozostałe podprogram y danego typu. Poniższe fragmenty ilustrują tę operację w językach Visual Basic i C#. K od wywołuje tu dodaną wcześniej funkcję D o u b le ln S iz e klasy I n t e g e r ( in t) . Visual Basic Imports IntegerExtension

c#

Module Modulel Sub Main() Dim i As Integer = 10 Console.WriteLine(i.DoublelnSize.ToString()) End Sub End Module

using IntegerExtensions; namespace CsEnhancements { class Program { static void Main(string[] args)

{ int i = 10; Console.WriteLine(i.DoublelnSize!).ToStringt));

} } >

Dodawanie logiki biznesowej do wygenerowanego kodu Metody częściowe (podobnie jak klasy częściowe) zawierają napisany przez programistę kod doda­ wany do danej klasy w trakcie kompilacji. Umożliwia to autorow i klasy częściowej zdefiniow a­ nie namiastki m etody i wywoływanie jej w innych miejscach kodu. Po dodaniu kodu nam iastki (metody częściowej) będzie on wywoływany zamiast niej. Na zapleczu kompilator scali nowy kod z klasą częściową w kom pletną jednostkę. Jeśli program ista nie udostępni definicji m etody częściowej, kom pilator pójdzie o krok dalej i usunie z klasy m etodę częściową wraz z wszystkimi jej wywołaniami. Metody (i klasy) częściowe mają pomagać w generowaniu kodu, a program iści zwykle pow inni ich unikać, jeśli nie tworzą generatorów' kodu lub ich nie używają, ponieważ jednostki częściowe utrudniają zrozum ienie kodu. Oczywiście, środow isko Visual Studio m a coraz więcej w budow anych m echanizm ów g enero­ wania kodu, dlatego większość programistów' wcześniej czy później natrafi na metody częściowe. W wielu sytuacjach generator kodu lub m echanizm jego projektow ania (na przykład LINQ to

1158|

Rozdział 3. Języki platformy .NET SQL) generuje klasę częściową i często jed n ą metodę częściową lub większą ich liczbę. M odyfi­ kator P a rtial służy do definiowania zarów no klas, jak i m etod częściowych. Jeśli program ista korzysta z wygenerowanego kodu, często otrzymuje klasę częściową, którą może uzupełnić o kod scalany w czasie kompilacji z wygenerowaną wersją. W ten sposób można dodać niestandardową logikę biznesową do dowolnej metody częściowej zdefiniowanej i wywoływanej w wygenerowa­ nym kodzie. Poniższy fragm ent to egzemplarz klasy częściowej Employee. Zaw iera ona jedną właściwość, Salary, a także m etodę o nazwie SalaryChanged opatrzoną modyfikatorem Partial. M etoda ta jest wywoływana przy modyfikowaniu wartości właściwości Salary.

Visual Basic Partial Class Employee Private

salary As Double

Property SalaryO As Double Get Return salary End Get Set(ByVal value As Double) salary = value SalaryChanged() End Set End Property Partial Private Sub SalaryChangedf) End Sub End Class

C# partial class Employee { double

salary;

public double Salary { get { return salary;

} set { salary = value; SalaryChangedf);

} } partial void SalaryChangedf);

>

C zę ść I Wprowadzenie do Visual Studio 2010 |----------------------------------------------Powyższy frag m e n t przedstaw ia ko d utw orzony przez generator. Następne zadanie związane z im plem entacją m etody częściow ej polega na dodaniu następnej częściowej klasy Employee i określeniu działania m etody SalaryChanged. Służy do tego poniższy kod:

Visual Basic Partial Class Employee Private Sub SalaryChanged() Dim newSalary As Double = Me.Salary 1 Używanie informacji o wynagrodzeniu.

End Sub End Class

C# partial class Employee

{ partial void SalaryChanged()

{ double newSalary = this.Salary; //

Używanie informacji o wynagrodzeniu.

} } Kompilator zastąpi m etodę SalaryChanged nową wersją tej częściowej metody. W ten sposób w wyjściowej klasie częściowej (praw dopodobnie z w ygenerow anym kodem ) m ożna używać metody bez żadnych informacji o niej. Jeśli programista zdecyduje się ją napisać, program wywoła ją w odpow iednim momencie, jednak metoda ta jest opcjonalna. Jeśli w kodzie zabraknie imple­ mentacji m etody częściowej SalaryChanged, kompilator usunie ją oraz jej wywołania, przez co całkowicie w yelim inuje ją z klasy.

Dostęp do danych i pobieranie ich za pomocą języków .NET W Visual Studio 2008 w prow adzono nowy zbiór m echanizm ów — zapytania LINQ (ang. Language Integrated Query). LINQ to m odel program ow ania, w którym w ykorzystano wiele z om ów ionych wcześniej funkcji. Wzbogaca on języki o nowy sposób dostępu do danych i korzy­ stania z nich. Stosując model LINQ, m ożna korzystać z danych przy użyciu składni obiektowej i kierować zapytania do zbiorów obiektów w kodzie Visual Basic i C#. LINQ umożliwia odwzorowywanie tabel z danymi na obiekty i vice versa (zobacz rozdział 21., „Praca z bazam i danych”). Dzięki tem u programiści mogą łatwiej i bardziej wydajnie korzystać z danych. D ostępna jest też pełna obsługa mechanizmu IntelliSense przy wpisywaniu nazw tabel i kolumn. LINQ wspomaga też zarządzanie wstawianiem, aktualizowaniem, usuw aniem i wczy­ tywaniem danych. Ostatnia z wymienionych operacji — wczytywanie danych — to ważny element m odelu LINQ, ponieważ technologia ta ma wbudowaną obsługę pobierania kolekcji danych. Przy użyciu funkcji tego modelu m ożna pobierać nie tylko własne dane, ale też dow olne kolekcje .NET. Służą do

Rozdział 3. Języki platformy .NET tego oczywiście nowe słowa kluczowe i specyficzna składnia. Na przykład w języku Visual Basic operatory używane w zapytaniach to Select, From, Where, Join, O rder By, Group By, Skip, Take, Aggregate, Let i Distinct. Język C# obejmuje podobny zbiór słów kluczowych. Jeśli te mechanizmy nie zaspokajają potrzeb programisty, można rozwinąć wbudowane operatory zapy­ tań, zastąpić je lub napisać własne jednostki tego rodzaju. O peratorów zapytań można używać do pobierania dowolnych danych .NET obsługujących interfejsy IEnumerable i IQueryable. Są to między innym i obiekty DataTable, o d w zo ro ­ wane obiekty serwera SQL Server oraz kolekcje .NET, w tym typy ogólne (generyczne), obiekty DataSet i dane XML. A oto przykładow y kod. Programista utworzył kolekcję employees obiektów Employee i chce pobrać listę wszystkich pracowników pracujących w określonej lokalizacji. W tym celu może napisać następującą funkcję:

C# public static List FilterEmployeesByLocation (List employees, string location)

{ / / Zapytanie UNQ zwracające kolekcję pracowników przęfiltrowaną z uwagi na lokalizację.

var emps = from Employee in employees where Employee.Location.City == location select Employee; return emps.ToListO;

}

Visual Basic Public Function FilterEmployeesByLocation( ByVal employees As List(0f Employee), _ ByVal location As String) As List(Of Employee) ' Zapytanie UNQ zwracające kolekcję pracowników przęfiltrowaną z uwagi na lokalizację.

Dim emps = From Employee In employees _ Where Employee.Location.City = location Return emps.ToListO End Function

W arto przyjrzeć się powyższemu kodowi. Funkcja przyjmuje listę obiektów Employee, filtruje ją na podstawie podanej lokalizacji, a następnie zwraca listę wyjściową. Do filtrowania listy służy przetw arzane w pamięci zapytanie LINQ o nazwie emps. To zapytanie można odczytać w nastę­ pujący sposób: pobierz wszystkie obiekty Employee do kolekcji employees i znajdź te, w któ­ rych miejscowość odpowiada lokalizacji przekazanej do funkcji. Na zakończenie wywołanie m etody emps .T o L ist( ) w instrukcji r e t u r n przekształca wyniki zapytania zapisane w pamięci na nową kolekcję.

C zę ść I Wprowadzenie do Visual Studio 2010 |---------------------------------------------W tym miejscu znalazło się tylko krótkie omówienie m odelu LINQ. Związany jest on z wielo­ m a m echanizm am i, między innym i sprawdzaniem popraw ności na etapie kompilacji i wali­ dacją schematów, a także now ą składnią zapytań U N Q . Niewątpliwie w arto poświęcić więcej czasu na poznanie tej technologii.

Pisanie prostych funkcji anonimowych w kodzie W najnowszych wersjach języków .NET (edycja 2008 i nowsze) można pisać proste funkcje nazwane lub anonimowe, które działają wewnątrzwierszowo i zwracają jedną wartość. Te funk­ cje istnieją wewnątrz metod, a nie jako odrębne niezależne jednostki. Są to tak zwane wyrażenia lambda. W arto zrozum ieć ich działanie, ponieważ służą do obsługi zapytań LINQ, choć ich zastosowania nie ograniczają się do tego obszaru. Załóżmy, że program ista chce utworzyć prostą funkcję, która przekształca liczbę stopni ze skali Fahrenheita na skalę Celsjusza. M ożna użyć do tego kodu Visual Basic poprzedzonego słowem kluczowym F u n c tio n . Następnie należy określić parametr)' funkcji (tu jest to liczba stopni Fah­ renheita). O statni etap to nap isan ie wzoru do obliczenia wartości zw racanej przez wyraże­ nie lambda. Służy do tego następująca składnia:

Visual Basic Dim fahToCel = Function(fahValue As Integer) ((fahValue - 32) / 1.8)

Składnia tej techniki w języku C# jest nieco inna. Programista musi jawnie zadeklarować delegata używanego przez kom pilator przy przekształcaniu wyrażenia lambda. Oczywiście, delegata należy zadeklarować w zasięgu klasy. Po jego utworzeniu m ożna napisać kod wyrażenia. W tym celu należy użyć operatora =>. Oznacza on „jest zapisywany w”. Po lewej stronie operatora należy podać typ delegata, nazwę wyrażenia i znak =, po którym powinny znaleźć się potrzebne parametry. Po prawej stronie trzeba umieścić sam o wyrażenie. Poniższy fragment ilustruje tworzenie dele­ gata i wyrażenia:

C# / / Deklaracja delegata z poziomu klasy.

delegate float del(float f); //

Wyrażenie lambda ir ciele melody.

del fahToCel = (float fahValue) => (float)((fahValue - 32) / 1.8);

W arto zauważyć, że w obu przykładach przypisano wyrażenie do zmiennej fahToCel. Powo­ duje to utworzenie delegata, a w języku C# — bezpośrednią konwersję. Następnie m ożna wywo­ łać zm ienną jak delegata w następujący sposób:

Visual Basic Dim celcius As Single = fahToCel(70);

Rozdział 3. Języki platformy .NET C# float celcius = fahToCel(-10);

W języku Visual Basic m ożna też napisać funkcję wewnątrzwierszową i pom inąć przypisywa­ nie wyrażenia do zmiennej:

Visual Basic Console.WriteLine((Function(fahValue As Integer) ((fahValue - 32) / 1.8))(70))

W arto zauważyć, że funkcja jest tu zadeklarowana, a następnie natychm iast wywołana przez przekazanie na jej końcu wartości 70. Także w języku C# istnieją pew ne specyficzne rozwiązania. Program ista m oże tu napisać wiele instrukcji w wyrażeniu lam bda. W tym celu należy umieścić je w nawiasach klamrowych i zakoń­ czyć każdą z nich średnikiem. W poniższym fragmencie wyrażenie lambda zawiera dwie instrukcje. Pierwsza tworzy nową w artość, a druga — wyświetla ją w oknie konsoli. W arto zauważyć, że delegat m usi mieć tu typ v o id , a aby uruchom ić wyrażenie lambda, trzeba je wywołać. C# //

Deklaracja delegata z poziomu klasy.

delegate void del(float f); del fahToCel = (float fahValue) => { float f = (float)((fahValue - 32) / 1.8); Console.WriteLine(f.ToString()); }; fahToCel(70);

W yrażenia lambda są używane w zapytaniach I.INQ do obsługi klauzul Where, Select i Order by. Przy użyciu takich zapytań m ożna na przykład napisać następującą instrukcję:

Visual Basic Dim emps = From emp In db.employees Where(emp.Location = "Katowice") Select emp

C# var emps = from emp in db.employees where emp.Location == "Katowice" select emp;

Powyższe zapytania LINQ są przekształcane na wyrażenia lam bda podobne poniższym:

Visual Basic Dim emps = From emp In db.employees.Where(Function(emp) emp.Location = _ "Katowice").Select(Function(emp) emp)

C zę ść I Wprowadzenie do Visual Studio 2010 |----------------------------------------------c# var emps = from emp in db.employees where (emp => emp.Location == "Katowice") select (emp => emp);

Dzielenie podzespołów na wiele plików W wersji języka C# z 2005 roku wprowadzono podzespoły zaprzyjaźnione. O d wersji 2008 technika ta jest obsługiwana także w języku Visual Basic. Mechanizm ten um ożliw ia dostęp podzespołów do elem entów wewnętrznych innych podzespołów. Oznacza to, że można zdefi­ niować składow e wewnętrzne i korzystać z nich w podzespołach zewnętrznych. Ten mechanizm jest przydatny, jeśli program ista planuje podzielić podzespół na kilka plików fizycznych, jednak chce zachow ać w każdym z nich dostęp do wszystkich elementów wewnętrznych.

Uwaga Podzespoły zaprzyjaźnione n ie mają dostępu do składowych pry­ watnych.

Aby udostępnić wewnętrzne składow e podzespołu innem u, zaprzyjaźnionemu podzespołowi, należy użyć atrybutu klasy InternalsVisibleToAttribute. Ten atrybut należy zastosować na poziom ie podzespołu. Program ista musi podać przy tym atrybucie nazwę i publiczny znacz­ nik klucza podzespołu zewnętrznego. Kompilator połączy wtedy oba podzespoły jako jednostki zaprzyjaźnione. Podzespół zawierający atrybut InternalsVisibleToAtt ribute udostępnia wewnętrzne mechanizmy zaprzyjaźnionej jednostce, ale już nie na odwrót. Ten sam efekt można uzyskać za pom ocą opcji kom pilatora używanych z poziom u wiersza poleceń. Stosowanie podzespołów zaprzyjaźnionych, podobnie jak większości zbliżonych technik, jest związane z pewnymi kosztam i. Jeśli program ista zdefiniuje podzespół jako zaprzyjaźniony z innym , oba podzespoły staną się powiązane i będą przydatne tylko wspólnie. Oznacza to, że nie będą już niezależnymi jednostkam i funkcjonalnymi. M oże to prowadzić do pom yłek i utrud­ nia zarządzanie podzespołami. Często lepiej zrezygnować z tego mechanizmu, jeśli nie ma bardzo konkretnego powodu do jego użycia.

Bezpośrednie korzystanie z elementów XML (tylko w języku Visual Basic) Obecnie m ożna umieszczać elem enty XML bezpośrednio w kodzie Visual Basic. Powoduje to, że tw orzenie kom unikatów i pobieranie danych w tym form acie to proste zadania. Podstawą tego mechanizmu jest możliwość bezpośredniego pisania kodu XML za pom ocą typów danych

Rozdział 3. Języki platformy .NET System.Xml. Linq.XElement i System. Xml. Linq. XDocument. Ten pierwszy pozwala tworzyć zmienne i przypisywać do nich elementy w formacie XML, a drugi (XDocument) służy do przypi­ sywania zmiennych do kompletnych dokum entów XML.

Uwaga W tym miejscu omówiono pisanie kodu XML w języku Visual Basic. Dwa wymienione typy (XElement i XDocument) są wartościowymi dodatkami także dla programistów używających C # , jednak w tym języku trzeba manipulować właściwościami i metodami tych obiek­ tów, ponieważ nie można bezpośrednio pisać i przetwarzać kodu XML za pomocą edytora kodu.

Używanie elem entów XML w kodzie to ustrukturyzowany proces, a nie proste przekazywanie łańcuchów znaków do silnika przetwarzającego kod. K om pilator używa na zapleczu silnika LINQ to XML do obsługi tej techniki. Poniżej znajduje się prosty przykład. Przedstawiony kod tworzy zm ienną emp typu XElement, a następnie przypisuje do niej dane w formacie XML: Dim emp As XElement = Jan Kowalski Starszy programista Contoso Katowice

Podobne dane m ożna zapisać w zm iennej typu XDocument. Wystarczy wtedy dodać w n a ­ główku definicję dokum entu XML (). W obu rozwiązaniach efektem są dane XML. M ożna nimi m anipulow ać, przekazać je jako kom unikat, pobrać i tak dalej. W większości scenariuszy zapisywanie komunikatów XMI. na stałe w kodzie nie jest wskazane. Przy użyciu omawianych typów m ożna zdefiniować stru k tu rę danych XML, a je sam e pobrać z innych źródeł (zmiennych, baz danych i tak dalej). Na szczęście Visual Basic obsługuje także tw orzenie danych XML za pom ocą w yrażeń. Służy do tego składnia w stylu języka ASP: . Ta technika informuje kompilator o tym, że programista chce przetworzyć wyrażenie i przypisać wynik do obiektu XML. Do tw orzenia w tym formacie k o m u n ik ató w z pow tarzającym i się danymi m ożna użyć pętli. Poniższy kod ilustruje tw orzenie znanych już danych XML przy użyciu składni w stylu języka ASP. O biekt e reprezentuje pracow nika, a przypisanie danych do obiektu typu XElement może wyglądać następująco: Dim e As Employee = New Employee!) Dim emp As XElement =



docation state=

V

Contoso.Fx.Analysis Contoso.Fn.Common Contoso.FxJntegrotion nś] User Manage men* Consoles

a

Forms

a

5*! Contoso.UI.WindowsFoims.EmployeeSt#tus My Project ^

Com m onFuncs.vb

ContosoUP.VindovvsfcrmsEmployeeStatus.sdm 41) CustomControtl.vb Ń5] Forml.vb 'JJ Modulel.vb 2 UserControll.vb a

Contoso.UlWmdowsForms.OrderEntry ..

Properties

t>

References ContosoUlWindowsFormsOrderEntry.sdm

I. o P

^5] Fom nl.cs Logtn.cs & J MyCom ponent.cs i i P roductC atalog.nml

jtj P ro d u c t C a t a lo g e d c^] Program.es "*1 WizardDialog.es X M LSeh em aljsd

.jjt XSLTFileljcsIt a

.’ J

C onsoles. H ello W orld 1 room ies

r,l,. fnn-.nl.

v Beginlnvcke(Sy stem . A sync Callback object) v Endlnvoke(System .lA sync Result)

v InvokeQ

--------------

Okienko składowych

C zę ść II Szczegółowe omówienie środowiska IDE

Pasek narzędzi Pasek, narzędzi okna Class View zapewnia łatwy dostęp do poleceń służących do dodawania katalogów wirtualnych, przechodzenia do następnych i poprzednich elementów panelu obiektów oraz określania, które obiekty m ają być widoczne. Tabela 5.4 przedstawia różne przyciski paska narzędzi okna Class View. Tabela 5.4. Przyciski paska narzędzi okna Class View

Ikona

1 Opis Tworzy katalog wirtualny służący do porządkowania obiektów w panelu obiektów.

Dl

Class View New Folder.

IS

Back. Powoduje wyświetlenie

s

Forward.

m

Class View Settings. Wyświetla

poprzednio wybranego obiektu.

Powoduje wyświetlenie obiektu widocznego przed kliknięciem przycisku wstecz.

listę rozwijaną umożliwiającą wybór typów obiektów wyświetlanych w panelu obiektów i panelu składowych. Dostępne opcje obejmują:5/łow 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. Ą

View Class Diagram. Tworzy diagram klas i otwiera go w przeglądarce. Do diagramu automatycznie dodawane są wszystkie typy zawarte w projekcie.

Pasek wyszukiwania Pasek wyszukiwania to rozw ijane pole tekstowe umożliwiające szybkie i łatw e przeszukiwanie obiektów widocznych w panelu obiektów. Kiedy użytkow nik wpisze szukane pojęcie (na przy­ kład nazwę typu lub przestrzeni nazw), okno Class View usunie obiekty z panelu obiektów, a na­ stępnie ponownie zapełni go jedynie tymi elem entam i, które spełniają w arunki wyszukiwania. Rysunek 5.4 przedstawia w yniki wyszukiwania dla pojęcia IT r a n s i t i o n . Rysunek 5.4. Filtrowanie w panelu obiektów

CUss V«v> rjJTfan&tion

- n x

Rozdział 5. Przeglądarki i eksploratory Aby przywrócić standardow y widok panelu obiektów i usunąć filtr, należy kliknąć przycisk Clear Search w idoczny na prawo od przycisku Search. Ostatnie warunki wyszukiwania są zapisywane na liście rozwijanej, co umożliwia ich późniejsze pow tórne w ykorzystanie.

Panel obiektów Panel obiektów wyświetla drzewo obiektów zawartych w projekcie. Każdy obiekt jest repre­ zentowany przez ikonę i nazwę. Rozwinięcie węzła projektu w drzewie powoduje odsłonięcie dostępnych w nim typów. Widoczne są także relacje między dalszymi elem entam i nadrzędnym i i podrzędnymi, na przykład przestrzeniami nazw i klasami oraz typami i typam i nadrzędnym i. Tabela 5.5 przedstaw ia ikony widoczne w panelu obiektów. Tabela 5.5. Ikony panelu obiektów

Ikona

Opis Klasa lub struktura.

la

*

Delegat.

0 0 ' O

Wyliczenie.

-0

Interfejs.

Przestrzeń nazw. Moduł.

Na te ikony są nakładane różne rysunki sygnalizacyjne, które stanow ią graficzną reprezentację informacji o zasięgu każdego obiektu i poziomie dostępu do niego. Ikony sygnalizacyjne określa­ jące poziom dostępu przedstawiono w tabeli 5.6. Tabela 5.6. Ikony sygnalizacyjne określające zasięg i poziom dostępu

Ikona

I Opis

Prywatny. i} B mmm □

Wewnętrzny lub zaprzyjaźniony.

brak ikony

Publiczny. Chroniony.

Liczba poziomów widocznych dla każdego obiektu zależy od ustaw ień widoku. Na przykład włączenie opcji Show Base Types powoduje dodanie do drzewa wszystkich typów bazowych.

C zę ść II Szczegółowe omówienie środowiska IDE Podstawowym zadaniem panelu obiektów jest umożliwianie szybkiej i łatwej nawigacji po drzewie obiektów projektu. Oznacza to, że panel ten udostępnia obiektowy widok projektu. Kliknięcie panelu obiektów prawym przyciskiem myszy powoduje wyświetlenie menu podręcz­ nego. To menu jest niem al identyczne z m enu okna Solution Explorer, ale zawiera kilka d o d at­ kowych opcji służących do sortowania i grupow ania zaznaczonych elem entów. Dostępne opcje sortow ania to:

• S o rt A lp h a b e t ic a l ly — projekty, przestrzenie nazw i typy w panelu obiektów zostaną posortow ane w rosnącym porządku alfabetycznym. • S o r t b y O b je c t T y p e — typy w panelu obiektów zostaną alfabetycznie posortowane na podstawie ich ogólnych kategorii (na przykład w kolejności: klasy, wyliczenia, interfejsy, struktury). • S o rt b y O b je c t A c c e ss — typy zostaną posortowane według m odyfikatorów dostępu (p u b lic , p r i v a t e , p r o te c te d i tak dalej). • G r o u p b y O b je c t T y p e — do drzewa zostanie dodany nowy poziom katalogów dla o d ­ rębnych typów obiektów. Na przykład jeśli projekt zawiera klasy i interfejsy, w drzewie panelu obiektów zostaną utw orzone katalogi klas i interfejsów zawierające o d p o ­ wiednie typy.

Panel składowych Panel składowych reaguje na wybory dokonyw ane w panelu obiektów i wyświetla wszystkie składowe — właściwości, zdarzenia, stałe, zm ienne, wyliczenia — zdefiniow ane w zaznaczo­ nych obiektach. Składowe każdego rodzaju mają odm ienne ikony określające zasięg i typ. W tym panelu widoczne są naw et sygnatury składowych (obok ikon opisanych w tabeli 5.7 używane są tu także te same ikony sygnalizacyjne co w panelu obiektów). Tabela 5.7. Ikony panelu składowych

Ikona

Opis

El H

Stała. Metoda lub funkcja. Właściwość. Pole.

Panel składowych doskonale nadaje się do szybkiego wyświetlania dostępnych operacji i atrybu­ tów typów. W ystarczy wybrać klasę (typ) w panelu obiektów i przyjrzeć się składowym wy­ świetlonym w panelu składowych.

Rozdział 5. Przeglądarki i eksploratory

Uwaga Wielu programistów uważa, że większość zadań związanych z pro­ gramowaniem łatwiej jest wykonać za pomocą okna C lass V ie w niż w oknie S o lu tio n E x p lo r e r . Dostępne operacje są niemal identyczne, a okno C la ss V ie w zapewnia obraz projektu w większym stopniu skoncentrowany na kodzie. Programiści mogą eksplorować drzewa dziedziczenia i szybko przeglądać różne składowe wszystkich typów zdefiniowanych w projekcie. Wadą korzystania z okna C la ss V ie w jest brak graficznych informacji o kontroli kodu źródłowego.

Także panel składow ych udostępnia menu kontekstowe z nieocenionym i narzędziami do prze­ glądania i m odyfikow ania kodu. M ożna na przykład bezpośrednio zastosować refaktoryzację polegającą na zm ianie nazwy wybranej składowej. Inne możliwości obejm ują natychm iastowe wyświetlanie kodu definicji składowej, wyszukiwanie wszystkich przypadków jej użycia w kodzie czy urucham ianie okna Object Browser, w którym głównym węzłem będzie wybrana składowa. W tym miejscu m ożna także zmienić ustaw ienia filtra i w yśw ietlania danych. Rysunek 5.5 przedstawia wszystkie dostępne polecenia tego menu. Rysunek 5.5. Menu kontekstowe panelu składowych

fio To Definition

F12

Browse Definition Find All References

C trl**. R

J;j.

View Cell Hierarchy

Ctrl-K. Ctrl-T

jJ i

Copy

Ctrt-C

Rename...

Ctrl* R, R

V

Show Pybltc Members

V

Show Protected Mem|jers

V

Show Private Members

V

Show £ther Member, Show Inherited Members Sort Alphabetically

V

Sort By Member Iy p e Sort By Member A ccjss Group By Member Type

Okno Server Explorer Okno Server Explorer pełni dwie funkcje: udostępnia różne usługi i zasoby systemowe zn ajd u ­ jące się na lokalnych oraz zdalnych kom puterach, a także zapewmia dostęp do obiektów' re p re ­ zentujących połączenie z danymi. Podobnie jak w przypadku innych eksploratorów środowiska Visual Studio systemy, usługi, zasoby i połączenia z danymi są przedstaw iane graficznie w for­ mie drzewa. Systemy są widoczne w węźle głów nym Servers (dom yślnie wyświetlana jest lokal­ na maszyna), a połączenia z danymi — w węźle głównym Data Connections.

C zę ść II Szczegółowe omówienie środowiska IDE

Uwaga Zawartość i konfiguracja okna S e r v e r E x p lo r e r nie są specyficzne dla rozwiązania ani projektu. Te ustawienia są zapisywane wraz z innymi opcjami środowiska IDE i dlatego nie zmieniają się w wyniku otwarcia innego rozwiązania (lub projektu).

Pasek narzędzi w idoczny u góry okna Server Explorer umożliwia dostęp za pomocą jednego kliknięcia do funkcji Add Data Connection i A dd Server (rysunek 5.6). Można także wymusić odświeżenie zawartości okna (dostępny jest również przycisk do anulowania procesu odświeżania, ponieważ obsługa zapytania skierowanego do zdalnej maszyny może być długa). rr Explorer

** O X

( j l Data Connections

a

i,

,•

appserver.sr21.dbo _ j Database Diagram s

0

Tables

!» J

V iew s

>

J

Stored Procedures

U

j

Functions

l>

J

Synonym s

P

U

Types

0

G | Assemblies

Servers a

4 } fileserver t>

Event lo g s

t>

M anagem ent Classes

jf 0 t>

£

M anagem ent Events Message Queues

s S j Performance Counters

p

Services

4 | workstation

Uwaga Wersje Express i Standard środowiska Visual Studio nie wyświetlają serwerów w oknie S e r v e r E x p lo re r. Pokazują w nim tylko połącze­ nia z danymi. W tych wersjach omawiane okno nosi nazwę D a ta E x p lo r e r .

Połączenia z danymi Połączenia z danymi (węzeł Data Connections) reprezentują fizyczne połączenia z lokalną lub zdalną bazą danych. Poprzez nawiązane połączenie można uzyskać dostęp do różnych obiektów bazy danych i m anipulow ać nimi. Każda kategoria obiektów jest w idoczna jako węzeł katalogu w węźle Data Connections. Elementy drzewa w każdym węźle umożliwiają bezpośrednią interakcję

Rozdział 5. Przeglądarki i eksploratory z ich fizycznymi odpowiednikam i w bazie danych poprzez zestaw okien projektowych i edytorów nazywanych wspólnie graficznymi narzędziami do obsługi baz danych. Narzędzia te szczegółowo opisano w rozdziale 21., „Praca z bazami d an y ch ”. W oknie Server Explorer widoczne są następujące obiekty: • schematy danych, • tabele, • widoki, • procedury składowane, • funkcje, • synonimy,

• typy. • podzespoły. M ożna utworzyć now y obiekt bazy danych, zmodyfikować lub usunąć istniejący, a jeśli to możliwe — pobrać z takiego obiektu dane (na przykład tabelę lub widok).

Uwaga Funkcje oraz liczba typów obiektów dostępnych poprzez okno S e rv e r zależą od używanej wersji środowiska Visual Studio oraz rodzaju bazy danych. Oznacza to, że nie wszystkie funkcje są dostęp­ ne w każdej bazie danych. Narzędzia Visual Database Tools naj­ lepiej współpracują z bazą Microsoft SQL Server, choć większość podstawowych operacji jest obsługiwana także w wielu innych re­ lacyjnych bazach danych. E x p lo re r

Komponenty serwera W ęzeł Servers w oknie Server Explorer umożliwia bezpośrednie zarządzanie licznymi zdalnym i i lokalnymi usługam i oraz zasobami, a także używanie ich w projektach Visual Studio. Jest to konsola do zarządzania kom ponentam i bazującymi na serwerze. D om yślnie jako serwer w i­ doczna jest maszyna lokalna. Aby dodać inne serwery, należy kliknąć prawym przyciskiem myszy węzeł Servers i wybrać opcję Add Server lub po prostu kliknąć przycisk Connect to Server w pasku narzędzi okna Server Explorer. W oknie dialogowym, które się pojawi, należy podać nazwę kom putera lub adres IP serwera. To okno dialogowe umożliwia także połączenie się z serwerem za pomocą różnych zestawów danych uwierzytelniających. W węźle Servers jako węzły potom ne widoczne są następujące kategorie komponentów: • Event Logs, • Management Classes, • M anagement Events,

C zę ść II Szczegółowe omówienie środowiska IDE • Message Queues,

• Performance Counters, • Services. M ożna także zarejestrow ać inne kategorie kom ponentów wyświetlane w węźle Servers. Powyż­ sza lista przedstawia jedynie domyślne, w budow ane funkcje środowiska Visual Studio 2010.

Event Logs Za pom ocą węzła Event Logs można zarządzać aplikacją, zabezpieczeniami i dziennikami zda­ rzeń połączonych serwerów. Obejmuje to czyszczenie dzienników zdarzeń lub analizę i spraw ­ dzanie poszczególnych wpisów. W yróżnienie dziennika lub wpisu pow oduje wyświetlenie ich właściwości w oknie właściwości środowiska Visual Studio, co umożliwia przeglądanie i modyfiko­ wanie ich wartości. Po przeciągnięciu dziennika zdarzeń na projekt środow isko autom atycznie utworzy egzemplarz kom ponentu S y ste m .D ia g n o stic s .E v e n tL o g lub S y stem .D ia g n o s tic s . ^♦•EventLogEntry.

Management Classes Elementy w węźle Management Classes reprezentują różne klasy systemu W indows M anagement Instrum entation (W M I). Każda z tych klas odpow iada logicznej lub fizycznej encji powiązanej z serwerem. D ostępne klasy są przedstaw ione w tabeli 5.8. Tabela 5.8. Węzły klas W M I

Tytuł

Klasa WMI

Desktop Settings

Win32_Desktop

Disk Volumes

Win32_LogicalDisk

M y Computer

Win32 ComputerSystem

N etw ork Adapters

Win32 NetworkAdapter

N etw ork Connections

Win32_NetworkConnection

NT E vent Log Files

Win32_NTEventLogFile

Operating System s

Win32 OperatingSystem

Printers

Win32_Printer

Processes

Win32_Process

Processors

Win32_Processor

Services

Win32_Service

Shares

Win32_Share

Softw are Products

Win32_Product

System Accounts

Win32_SystemAccount

Threads

Win32 Thread

Rozdział 5. Przeglądarki i eksploratory Szczegółowa analiza W M I wykracza poza zakres tego rozdziału i książki. Ujmijmy do krótko — każdy z tych w ęzłów udostępnia grupy właściwości różnych klas W M I (takich jak klasy nadrzędne, podrzędne, ustawienia, zależności), a każda z tych grup udostępnia zestaw poleceń umożliwiający bezpośrednie modyfikowanie zasobów znajdujących się po stronie serwera. M ożna to w ykorzystać na przykład do ustaw ienia poziom u d o stęp u dla współdzielonych danych dostępnych na zdalnym serwerze. Po rozwinięciu węzłów w oknie Server Explorer do węzła Shares (poprzez węzeł Disk Volumes) m ożna uzyskać dostęp do informacji o współdzielonym zasobie poprzez m enu podręczne tego zasobu. M ożna na przykład wybrać operację SetSharelnfo, k tó ra otwiera o k n o dialogow e W MI um ożliw iające zmianę różnych atrybutów zasobu, ta ­ kich jak jego opis czy m aksym alna liczba użytkowników.

Management Events W ęzeł Management Events zawiera listę zapytań związanych ze zdarzeniam i. Są to „jednostki nasłuchujące”, które okresow o kierują zapytania do systemu obsługi zdarzeń WMI serwera. Te zapytania można określać za pomocą okna dialogowego (zobacz rysunek 5.7; otwiera się je za pom o­ cą opcji Add Event Query menu podręcznego). Po utworzeniu zdarzenia środowisko tworzy węzeł Management Events, w którym widoczne są egzemplarze zdarzenia. R y su n e k 5.7.

Tworzenie zapytania typu Management Event

C zę ść II Szczegółowe omówienie środowiska IDE

Message Queues Jeśli na docelowym serwerze zainstalow ane jest kolejkowanie kom unikatów , w węźle Message Queues w idoczne są wszystkie dostępne kolejki oraz znajdujące się w nich wiadomości.

Performance Counters W szystkie liczniki wydajności zainstalowane na docelowym kom puterze są widoczne w węźle Performance Counters. Każdy z nich znajduje się w obrębie własnej kategorii. W idoczne są także egzemplarze tych liczników, o ile są dostępne.

Services W węźle Services wymienione są wszystkie zainstalowane usługi.

Programowanie za pomocą okna Server Explorer O prócz um ożliw iania sprawdzania połączeń danych i zasobów serw era oraz m anipulow ania nim i okno Server Explorer ma jeszcze jedno zadanie. Poprzez przeciągnięcie elem entów z okna Server Explorer na powierzchnię projektową środowiska Visual S tudio m ożna szybko utworzyć kom ponenty kodu bezpośrednio związane z w ybranym elem entem. N a przykład przeciągnięcie węzła Application Log (Servers/Event Logs) na istniejący form ularz W indow s spowoduje, że eg­ zemplarz kom ponentu S y s t e m . D i a g n o s t i c s . E v e n t L o g będzie wskazywał na dziennik ap li­ kacji. Następnie można od razu napisać kod służący do interakcji z tymi komponentem. W ten sam sposób można szybko zagnieździć w aplikacji kod dostępu do kolejki komunikatów lub obsługiwać odczyt z licznika wydajności i zapis do niego. Tabela 5.9 przedstaw ia różne dostępne operacje przeciągania w raz z ich skutkami. Tabela 5.9. Przeciąganie w oknie Server Explorer

I W ęzeł nadrzędny

Przeciągany elem ent

I Skutki

Event Logs

Kategoria dziennika zdarzeń (na przykład Application lub System)

Tworzy egzemplarz komponentu S y s t e m . D i a g n o s t i c s . ^ • E v e n tL o g skonfigurowany dla odpowiedniego dziennika zdarzeń.

Management Classes

Egzemplarz klasy zarządzającej

Tworzy egzemplarz komponentu WMI lub CIMv2.

Management Events

Zapytanie zdarzenia zarządzającego

Tworzy egzemplarz komponentu S y s te m .M a n a g e m e n t. '-♦ M a n a g e m e n tE v e n tW a tc h e r.

Message Queues

Egzemplarz kolejki komunikatów

Tworzy egzemplarz komponentu S y s t e m .M e s s a g in g . ^ • M e ssa ge Q u e u e dla wybranej kolejki.

Performance Counters

Licznik wydajności lub egzemplarz licznika

Tworzy egzemplarz komponentu S y s t e m . D i a g n o s t i c s . ^ ♦ P e r fo r m a n c e C o u n t e r skonfigurowany dla odpowiedniego licznika.

Services

Usługa

Tworzy kontroler S y s t e m . S e r v i c e P r o c e s s . ^ ♦ S e r v ic e C o n t r o l l e r przeznaczony dla wybranej usługi.

]

Rozdział 5. Przeglądarki i eksploratory

Uwaga Połączeń z danymi z okna S e rv e r E x p lo re r nie można przeciągać na powierzchnię projektową. Więcej informacji o skutkach przeciągania w rozwiązaniach bazodanowych zawiera rozdział 21.

Okno Object Browser Okno Object Browser przypomina funkcjami, wyglądem i stylem okno Class View. Udostępnia hierarchiczny w idok projektów , podzespołów, przestrzeni nazw, typów , wyliczeń i interfejsów. Jednak w porów naniu z oknem Class View okno Object Browser obsługuje dużo więcej rodzajów obiektów. O prócz aktualnie otwartego projektu można wyświetlać elem enty całej platform y .NET, włączając w to kom ponenty COM i dostępne obiekty zewnętrzne. Jest to doskonałe narzę­ dzie do wyszukiwania i analizowania typów niezależnie od ich fizycznej lokalizacji.

Zmiana zasięgu Można użyć listy rozwijanej Browse paska narzędzi do filtrowania obiektów widocznych w oknie Object Browser lub zm iany zasięgu obejmującego wyświetlane elementy. Tabela 5.10 przedstawia cztery dostępne opcje zasięgu. Tabela 5.10. Opcje zasięgu w oknie Object Browser

Zasięg

• Skutek

All Components

Nadzbiór pozostałych dostępnych zasięgów. Wybór tej opcji powoduje wyświetlenie wszystkich typów i składowych platformy .NET, bieżącego rozwiązania i używanych w nim bibliotek, a także samodzielnie określonych komponentów.

.NET Framework

Wyświetla wszystkie obiekty konkretnej wersji platformy .NET (na przykład 2.0 lub 3.0).

My Solution

Wyświetla wszystkie obiekty bieżącego rozwiązania, włączając w to używane w nim komponenty.

Custom Component Set

Wyświetla wszystkie komponenty samodzielnie dodane do niestandardowego zbioru komponentów.

Modyfikowanie niestandardowego zbioru komponentów N iestandardow y zbiór kom ponentów to lista sam odzielnie określonych elementów. Używanie takiej listy może być przydatne wtedy, kiedy program ista chce przyjrzeć się kom ponentom należącym do różnych kategorii. Zamiast przeglądać inform acje z różnych zasięgów, m oże umieścić wybrane elem enty na tej liście.

C zę ść II Szczegółowe omówienie środowiska IDE Do dodaw ania elem entów do niestandardow ej listy kom ponentów służy opcja Edit Custom Component Set dostępna na liście rozw ijanej Browse lub poprzez kliknięcie trzech kropek wi­ docznych na prawo od tej listy. W ybór tej opcji powoduje otwarcie okna dialogowego, w którym można dodaw ać i usuwać pozycje listy (rysunek 5.8). Rysun ek 5.8.

Modyfikowanie niestandardowego zbioru komponentów

Dodawanie kom ponentów do tego zbioru wymaga jedynie zaznaczenia wybranego elem entu na jednej z autom atycznie zapełnianych list obiektów (dostępnych pod zakładkam i .NET, COM i Projects) lub przejścia bezpośrednio w zakładce Browse do zawierającego dany kom ponent podzespołu. Należy wybrać szukany obiekt, a następnie kliknąć przycisk Add, po czym ele­ menty zbioru pojawią się na dole okna dialogowego. M ożna także wybrać jeden z elem entów zbioru i usunąć go z listy, klikając przycisk Remove.

Przeglądanie obiektów Okno Object Browser składa się z paska narzędzi i trzech różnych paneli: panelu obiektów, panelu składowych i panelu z opisem. Także tu widoczne są podobieństwa do okna Class View. Pasek narzędzi, panel obiektów i panel składowych funkcjonują tu identycznie jak w oknie Class View. Należy wybrać obiekt w drzewie, aby wyświetlić jego składowe. Pasek narzędzi udostępnia przyciski służące do przechodzenia naprzód i wstecz, co pom aga w nawigacji po głębokich drze­ wach. Rysunek 5.9 przedstawia działanie okna Object Browser. Hierarchiczne relacje, ikony oraz operacje dostępne w panelach są takie same w o bu oknach, dlatego nie będziemy ich ponow nie opisywać. Za to panel z opisem to nowy elem ent.

Rozdział 5. Przeglądarki i eksploratory

Panel z opisem Po zaznaczeniu elem entu w panelu obiektów lub składowych o k n a Object Browser w panelu z opisem pojawiają się szczegółowe inform acje dotyczące w ybranej pozycji. U dostępniane dane są dość bogate i obejm ują: • Nazwę w ybranego obiektu. • Nazwę jednostki nadrzędnej tego obiektu. • K om entarze z kodu oraz podstawową pom oc dostępną dla tego obiektu. Tam, gdzie to możliwe, panel z opisem zawiera wśród wyświetlanych danych odnośniki pozw a­ lające szybko przejść do powiązanych elementów. Na przykład dla właściwości typu string mogą zostać wyświetlone następujące informacje: public string SystemContextld { set; get; } Member of Contoso.Fx.Integration.ContextToken

W arto zwrócić uwagę na zastosowanie odnośników — kliknięcie identyfikatora spow oduje wyświetlenie w oknie Object Browser typu danych string. P o d o b n ie kliknięcie o d n o śn ik a Contoso. Fx. Integration. ContextToken spowoduje otwarcie w p rzeglądarce definicji klasy

ContextToken.

C zę ść II Szczegółowe omówienie środowiska IDE

I232|

Rozdział 5. Przeglądarki i eksploratory Document Outline

MainVVtndcw.nr-ni

-Window Resources CommandBmdmgs L Dock Panel Border (HeaderBorder) Border (MenuBordei) Grid (MainGnd) Grid (Du gram Pane) -ColumnDefmitions C c I um n Definition

Column Definition (c d u m n i Clone Borde* (Diag'amBordef,Diagram Viewer (DtagramControO ■ Gnd (DetailsPane)

Cownml rfń nom Details ^DetailsContrcl/ andSf H a

Add a family m em ber

NewUserControl (Ne-.vUserControl) Wekome (WekomeUserControl) Personlnfo (PersonlnfoControl) Family Cata (FamilyDataControl) OldVersionMessage (OldVersicnMes

Message TTks H e w ts created with an earlier version of f e n it ,. Show, a wtfi be saved In a n e w format for use w ith th n version The new We's name vnR end w ith family* and w ił bundle att your fam ily photos, stories and tree

irto this »n0e We'

i

Document Outline 4 P Data Sources

Q

Design

0 XAML

ca G rid (DetaHsPane)

W ndcxv/DooPane; Gn ►

me®

Rysunek 5.11. Formularz WPF

Pasek narzędzi okna Document Outline pozw ala kontrolować wyświetlanie typów w drzewie, a także ułatwia zm ianę uporządkow ania elem entów' w oknie oraz określanie ich pozycji.

Modyfikowanie elementów O kno Document Outline umożliwia błyskawiczne przejście z hierarchicznego widoku elem entu do jego kodu. Elementy aktualnie modyfikowane w' edytorze kodu lub oknie projektowym są wyróżnione w drzewie. Z kolei wybranie elementu w oknie Document Outline pow'oduje wybranie (wyróżnienie) elem entu w edytorze kodu lub oknie projektowym. Każdy typ projektu jest obsługiwany w oknie Document Online w nieco odm ienny sposób. Zwykle w celu przeniesienia elementów w strukturze m ożna przeciągnąć je w widoku drzewa. Dla aplikacji opartych na form u­ larzach W indows udostępniono pasek narzędzi, który' można zastosować w oknie Document

Outline. Opis przycisków' paska zawiera tabela 5.11.

C zę ść II Szczegółowe omówienie środowiska IDE Tabela 5 .1 1. Polecenia paska narzędzi okna D ocum ent Outline dla form ularzy Windows

Ikona

i Opis

u A

Type Name Display Style. Ta lista rozwijana umożliwia kontrolę sposobu wyświetlania nazw typów w drzewie: None — nie są wyświetlane nazwy typów; Short — wyświetlana jest lokalna, niekwalifikowana nazwa typu; Long — wyświetlana jest w pełni kwalifikowana nazwa typu.

E 0 E E E

Expand Ali.

Powoduje rozwinięcie wszystkich węzłów nadrzędnych.

Collapse Ali.

Powoduje zwinięcie wszystkich węzłów nadrzędnych.

Move Down in Container. Przenosi wybrany

element o jedną pozycję w dół w bieżącym kontenerze.

Move Up in Container. Przenosi wybrany element o jedną

pozycję w górę w bieżącym kontenerze.

Move Out o f Current Container. Usuwa wybrany element z bieżącego kontenera i umieszcza go w kontenerze w yższego poziomu (lub w katalogu głównym, jeśli nie ma takiego kontenera). Move into Next Container. Usuwa wybrany element z bieżącego kontenera

E

(lub z katalogu głównego) i umieszcza

na następnym.

Podsumowanie W tym rozdziale pokazaliśmy, że przeglądarki i eksploratory to okna środowiska Visual Studio, które zwykle udostępniają hierarchiczny widok swej zawartości. Okna mają wspólne elementy interfejsu (widok w postaci drzewa, paski narzędzi i elem enty) i stanow ią główne narzędzia do wizualizacji elementów- projektów w środow isku IDE oraz do manipulowania nimi. Przeglądarki i eksploratory udostępniają proste interfejsy typu „wskaż i kliknij” służące do: •

W izualizacji i organizowania rozwiązań oraz projektów na poziomie plików.



W izualizacji i organizowania projektów na poziom ie typów i klas.



K ierow ania zapytań i w chodzenia w interakcje z zasobam i serwera, tak im i jak bazy danych, liczniki wydajności i kolejki komunikatów.



Przeglądania bibliotek typów.

Choć niektóre przeglądarki i eksploratory związane są z dość zaawansowanymi i skom pliko­ wanymi zagadnieniami (na przykład usługami WMI), służą jed n em u celowi: rozszerzają zasięg środowiska IDE jako narzędzia do błyskawicznego programowania aplikacji do zadań wykracza­ jących poza zwykłe edytowanie plików z kodem.

Rozdział 6. Wprowadzenie do edytorów i okien projektowych

C zę ść II Szczegółowe omówienie środowiska IDE W tym rozdziale: •

Podstawy



Pisanie kodu w edytorze

• Tw orzenie i modyfikowanie dokum entów oraz szablonów XML • Używanie kaskadowych arkuszy stylów • Tw orzenie aplikacji klienckich dla systemu W indow s • Tw orzenie formularzy sieciowych • Tw orzenie komponentów' i kontrolek • Tw orzenie klas za pom ocą okna Class Designer Choć Visual Studio udostępnia im ponujący zestaw funkcji obejmujący niemal wszystkie ele­ menty procesu rozwoju oprogram ow ania, sercem środowiska IDE są edytory i okna projektowe. Są to narzędzia używane przez program istów na co dzień — umożliwiają pisanie kodu, m ody­ fikowanie zasobów, projektowanie formularzy i tworzenie szablonów . Oczywiście każde z tych narzędzi m a funkcje pozwalające zwiększyć produktyw ność program isty oraz jakość kodu. W tym rozdziale koncentrujem y się na stosowaniu tych edytorów i okien projektowych do tworzenia rozwiązań w IDE.

Podstawy Mówiąc ogólnie, edytor środowiska Visual Studio to edytor tekstu, który umożliwia wydajne pisanie kodu (w języku Visual Basic, HTML, XAMI. i tak dalej). O kno projektow e to edytor graficzny umożliwiający bezpośrednią obsługę elementów graficznych bez konieczności pisania tekstu. Wiele typów dokum entów m ożna modyfikować zarów no w oknach projektow ych, jak i w edytorach. M ożna na przykład utw orzyć form ularz w ok n ie projektowym dla form ularzy W indow s za pom ocą wygodnego przeciągania lub samodzielnie napisać kod w edytorze kodu. Można też utworzyć plik XML przy użyciu tych samych m echanizm ów . Edytor tekstu środowiska Visual Studio udostępnia podstawowe funkcje dostępne we wszystkich edytorach. Te mechanizmy są dziedziczone i wzbogacane w specyficznych edytorach obsługu­ jących d okum enty poszczególnych typów. Dostępny jest ed y to r plików z kodem źródłow ym , edytor znaczników dla kodu XML, edytor arkuszy stylów CSS i tak dalej. Także okna projektow e są specyficzne dla określonych obiektów . O kno projektow e dla kodu HTML to po części edytor tekstu, a po części narzędzie graficzne, a okna projektowe dla formularzy W indows i sieciowych to doskonałe narzędzia do tw orzenia interfejsów' w trybie WYSIWYG.

Rozdział 6. Wprowadzenie do edytorów i okien projektowych

Edytor tekstu Niektóre możliwości edytorów tekstu uznajemy za naturalne: zaznaczanie fragmentów tekstu, wsta­ wianie ich do d o k u m en tu , kopiowanie i wklejanie informacji i tak dalej. Jak można tego ocze­ kiwać, okno edytora tekstu udostępnia wszystkie te funkcje w sposób znany użytkownikom edytorów działających w systemie W indows. M ożna na przykład zaznaczyć tekst za pom ocą kilku standardowych operacji: 1. N ajpierw należy umieścić kursor na początku tekstu, który ma zostać zaznaczony. 2. Przytrzym ując lewy przycisk myszy, trzeba przenieść ku rso r na koniec zaznaczanego tekstu. 3. Na zakończenie należy zwolnić lewy przycisk myszy. Oprócz tej „standardow ej” techniki zaznaczania edytor tekstu środowiska Visual Studio udostęp­ nia także „tryb kolum now y”. Zamiast wybierać tekst w sposób liniowy od lew'ej do prawej, wiersz po wierszu, w trybie kolumnowym m ożna rozciągnąć prostokąt nad polem tekstu. D o ­ wolny znak w obrębie tego prostokąta wchodzi w skład zaznaczonego fragmentu. Ten sposób nazywany jest trybem kolumnowym, ponieważ umożliwia utworzenie obszaru obejmującego kolumny tekstu, a nie wyłącznie wiersze. Procedura zaznaczania tekstu jest bardzo podobna: 1. Należy um ieścić kursor na początku tekstu, który ma zostać zaznaczony. 2. N astępnie trzeba przytrzymać klawisz Alt oraz lewy przycisk myszy i rozwijać prostokąt dopóty, dopóki nie obejmie odpow iedniego tekstu. 3. Na zakończenie należy zwolnić lewy przycisk myszy i klawisz Alt. Po zaznaczeniu tekstu można go skopiować, wyciąć lub przeciągnąć w inne miejsce w obrębie edy­ tora tekstu. Polecenia służące do wycinania, kopiowania i wklejania są takie same, jak ich p o d ­ stawowe, standardow e wrersje w innych aplikacjach systemu W indows. Najpierw należy zazna­ czyć tekst, a następnie wyciąć go lub skopiować za pomocą opcji m enu Edit, paska narzędzi lub skrótu klaw iaturow ego edytora tekstu. Przeciągając zaznaczony tekst, można zmienić jego pozycję w bieżącym edytorze tekstu, umieścić go w innym otw artym oknie edytora lub nawet przeciągnąć do okna poleceń lub podglądu.

Zawijanie wierszy i obszar wirtualny Domyślnie edytor nie zawija tekstu autom atycznie. Oznacza to, że w czasie pisania tekst lub kod będzie ciągnął się coraz bardziej w prawą stronę edytora. Po przekroczeniu ograniczeń aktualnie widocznego obszaru okno edytora zostanie przewinięte w prawo, aby możliwe było w pi­ sanie następnych znaków'. Jednak okno edytora może działać w sposób podobny do edytora tekstu, gdzie zawartość dokum entu jest zwykle ograniczona w poziomie do wirtualnego arkusza papieru.

C zę ść II Szczegółowe omówienie środowiska IDE

Wskazówka Jeśli włączone jest zawijanie wierszy, Visual Studio automatycznie przeniesie tekst do następnego wiersza. Można także sprawić, aby środowisko IDE dodawało graficzny znacznik informujący o zawi­ nięciu wiersza. Obie te opcje można ustawić w oknie dialogowym O p tio n s w węźle T e x tE d ito r /A ll L a n g u a g e s/G e n e ra l widocznym na rysunku 6.1.

Rysunek 6.1. Okno dialogowe Options edytora

Jeśli program ista zmieni dom yślne działanie, włączając zawijanie, a następnie wpisze wiersz kodu przekraczający szerokość edytora, zauważy, że okno edytora autom atycznie zawija kod źródłowy, tak aby mieścił się w granicach okna, a także dodaje po prawej stronie inform ującą o tym ikonę (zobacz rysunek 6.2). Zawijanie wierszy umożliwia zachowanie całego kodu w zasięgu wzroku (bez konieczności poziom ego przewijania okna). Inna opcja okna dialogowego Options edytora kodu, Enable Virtual Space, to alternatyw a dla zawijania wierszy. Można włączyć obszar w irtualny albo zawijanie wierszy, ale nie obie te właściwości naraz. Obszar w irtualny umożliwia w pisywanie tekstu w dow olnym m iejscu okna edytora bez konieczności dodaw ania wielu spacji przed tekstem lub używania klawisza tabulacji. W łaściwość ta jest przydatna na przykład wtedy, kiedy program ista chce um ieścić kom enta­ rze kilka wierszy na prawo od kodu. Zamiast przechodzić do odpowiedniego miejsca za pom o­ cą klawisza tabulacji (lub dodaw ać odpow iednią liczbę spacji) w celu wcięcia i w yrów nania tekstu, m ożna umieścić kursor bezpośrednio w tej kolum nie edytora tekstu, w której ma się pojawić kom entarz. Jest to przedstawione na rysunku 6.3 — komentarz na zrzucie nie jest po­ przedzony żadnymi spacjami ani tabulacjami. Został wpisany bezpośrednio w miejscu, w którym się znajduje.

Rozdział 6. Wprowadzenie do edytorów i okien projektowych Rysunek 6.2. Zawijanie tekstu w edytorze

Rysunek 6.3. Wirtualne odstępy w oknie edytora

Program.es’

X

8 M S j8 & j j i 3 8 B S R ? 5 5 j E j '

^JAdminConsole.Program

- a^Main(strmg[] args)

»

s t a t i c vo id M a in ( s t r in g [ ] a r g s )

4=

>

{ C o n so le .W r it e L in e (" T e s t łą c z e n ia łańcuchów z n a k ó w ...’ ) ; co n st i n t M AXTEXT - 1000; s t r in g t e s t * ” ; bool s w it c h B u ild e r • f a l s e ; bool match » t r u e ; bool s w it c h s t r in g - t r u e ; if {

(m atch) ] // MAX_TEXT można u s ta w ić pow yżej, f o r ( i n t t e s t C y c le * 0 ; te s t C y c le 100%

w 4 ■ ■

— .

— ...............

......

--- ^ I M M M M

.

*

C zę ść II Szczegółowe omówienie środowiska IDE

Okna projektowe środowiska Visual Studio Okna projektow e są dużo bardziej wizualne niż edytory tekstu środowiska Visual Studio i udo­ stępniają graficzny obraz danego rozwiązania. F orm ularz w oknie projektow ym wygląda tak, jak widzi go końcowy odbiorca — ma postać graficznych konstruktów składających się z przyci­ sków, obram ow ań, menu i ramek. Kod służący do wyświetlania elementów widocznych w oknie projektow ym jest generowany przez środowisko Visual Studio. Podobnie jak w przypadku edytorów wszystkie okna projektow e mają podobną formę i funk­ cje. Z najdują się one w obszarze z zakładkami środow iska IDE (podobnie jak edytor)’)- Mogą działać w różny sposób w zależności od celu ich stosowania. Na przykład okna projektowe dla formularzy W indow s i kom ponentów' wyglądają niem al tak samo, jednak w' sposobie ich uży­ wania m ożna zauważyć drobne różnice.

Pisanie kodu w edytorze Pisanie kodu i tworzenie innych plików' opartych na składni polega na wpisywaniu tekstu. O kno edytora tekstu to narzędzie środowiska Visual Studio przeznaczone specjalnie do tworze­ nia plików tekstowych z kodem źródłowym. Jest to podstaw ow y element środow iska IDE słu­ żący do program ow ania. Umożliwia wpisywanie tekstu i obsługuje podstaw ow e operacje na nim , na przykład zaznaczanie obszarów tekstu, przeciąganie ich czy ustaw ianie tabulatorów. Już te podstaw ow a funkcje obsługi tekstu pozwalają używ ać edytora do pisania kodu. Jednak to dodatkow e właściwości, takie jak obsługa diagnozowania, formatowanie kodu, dotyczące go wskazówki i dostosowywanie ustawień do własnych preferencji, pow'odują, że narzędzie jest napraw dę przydatne. Jak już w spom nieliśmy, w środow isku IDE dostępnych jest kilka wersji edytora tekstu. Edytor kodu ma obsługiwać tworzenie i edycję plików z kodem źródłow ym , edytor XML jest przezna­ czony do pracy z plikami XML, a edytor CSS umożliwia obsługę plików CSS. C hoć mogą wystę­ pować drobne różnice w sposobie wyświetlania kodu lub znaczników' w poszczególnych oknach, wszystkie o n e mają ten sam interfejs użytkownika i udostępniają podobne funkcje związane z m odyfikow aniem tekstu.

Wskazówka Każdy edytor umożliwia pełne dostosowanie go do własnych pre­ ferencji. Wystarczy otworzyć okno dialogowe O p tio n s (z menu T o o ls/ O p tio n s ) i zlokalizować węzeł T e x t E d ito r . Pod tym węzłem znaj­ dują się różne strony właściwości, które umożliwiają dostosowanie edytora do własnych potrzeb.

Rozdział 6. Wprowadzenie do edytorów i okien projektowych

Otwieranie edytora Są dwa sposoby urucham iania edytora tekstu (lub dowolnego innego edytora środowiska IDE). Pierwszy sposób polega na użyciu okna Solution Explorer — należy wybrać istniejący plik z kodem, plik tekstowy lub plik dowolnego innego typu, a następnie kliknąć go dwukrotnie. Jeśli jest to plik z kodem , m ożna także kliknąć go prawym przyciskiem myszy i wybrać opcję View Code. Zaw artość pliku zostanie wtedy wczytana do nowego okna edytora. Drugi sposób otw ierania okna edytora wymaga wybrania opcji File/New/File. Powoduje to otwarcie okna dialogowego New Filc. Wybór szablonu kodu w tym oknie dialogowym powoduje otwarcie edytora kodu z wyjściowym szkieletem kodu specyficznym dla danego szablonu.

Wskazówka Okna edytora tekstu widoczne są jako zakładki w centralnym obsza­ rze środowiska IDE. Jeśli otwartych jest kilka edytorów kodu, m ożna uzyskać dostęp do nich poprzez te zakładki. Jeżeli jed­ nocześnie otwarto wiele edytorów, znalezienie odpowiedniego poprzez cykliczne otwieranie kolejnych zakładek może być niewy­ godne. Są cztery sposoby szybkiej lokalizacji i wyboru okien edytora kodu. Po pierwsze, można użyć okna S o lu tio n E x p lo re r. Dwukrotne kliknięcie pliku z kodem w tym oknie powoduje wybranie i wyświe­ tlenie okna odpowiedniego edytora kodu. Po drugie, można użyć menu W in d o w . W tym menu widoczna jest lista z wszystkimi otwar­ tymi oknami edytorów kodu. Trzeci sposób to użycie małej strzałki widocznej po prawej stronie nad zakładkami edytora zaraz obok przycisku zamykania okna. Kliknięcie tej strzałki powoduje wyświe­ tlenie listy rozwijanej z nazwami wszystkich otwartych okien edy­ tora, co umożliwia szybki wybór dowolnego z nich. Ostatnia metoda to dostępna w Visual Studio wersja mechanizmu przełączania okien znanego z systemu Windows. Należy przytrzymać klawisz C trl i wci­ snąć klawisz T a b , aby kolejno aktywować wszystkie otwarte okna środowiska.

Pisanie kodu Ponieważ podstawowym zadaniem edytora kodu jest „edycja tekstu” kodu źródłowego, z o ­ baczmy najpierw, jak w edytorze napisać od podstaw najprostszą pro ced u rę — funkcję w y­ świetlającą napis "W itaj, świecie". Rysunek 6.4 przedstaw ia edytor kodu z wyjściowym plikiem aplikacji konsolowej zaw ierają­ cym szkielet kodu. Ten plik został wygenerowany w wyniku utw orzenia nowego projektu apli­ kacji konsolowej języka Visual C# za pomocą okna Solution Explorer. D w ukrotne kliknięcie pliku Frogratn.es w tym nowym projekcie powoduje wyświetlenie kodu źródłow ego tej aplikacji.

C zę ść II Szczegółowe omówienie środowiska IDE Rysunek 6.4. Wyjściowy kod szablonu aplikacji konsolowej

x

Pr09 rtm .cs

HelloWorld.Program

- u s in g u s in g u sin g u s in g

»I

Main(stringll args)

System ; S y s t e n .C o lle c t io n s .G e n e r ic ; S y s te m .L in q ; S y s te m .T e x t;

F na espace HelloWorld

e


> } Aby zaobserwować działanie edytora kodu, przyjrzyjmy się aplikacji wyświetlającej napis "Witaj, świecie". W tym przypadku będzie to aplikacja konsolow a wyświetlająca łańcuch znaków

"W itaj, świecie" w oknie konsoli. W procedurze Main należy um ieścić następujący kod: Console.WriteLine("Witaj, świecie");

Aby rozpocząć pisanie kodu, należy umieścić kursor w oknie, klikając pole w ew nątrz nawia­ sów procedur)' Main. Następnie należy wcisnąć klawisz Enter, aby zrobić miejsce na nowy wiersz kodu, i użyć składni m etody C o n s o le . WriteLine.

Rozdział 6. Wprowadzenie do edytorów i okien projektowych Te i inne m echanizm y zwiększania produktyw ności opisano szczegółowo w następnym ro z­ dziale. W tym miejscu skoncentrujemy się na podstawach modyfikowania i pisania kodu w oknie edytora. Po zapoznaniu się z działaniem edytora kodu (choć w bardzo prostej sytuacji), pora przyjrzeć się elem entom składającym się na okno edytora.

Wskazówka Visual Studio 2010 obsługuje przybliżanie w otwartych edytorach kodu (tekstu). Aby przybliżyć lub oddalić tekst, należy przytrzy­ mać klawisz C tr l i przewinąć rolkę myszy.

Budowa okna edytora kodu O kna edytorów znajdują się w oknach z zakładkami w środowisku IDE i zwykle są centralnym elem entem , jeśli chodzi o układ okien. Jak widać to na rysunku 6.5, każde okno edytora kodu składa się z trzech głównych obszarów: panelu kodu, marginesu wyboru i marginesu ze wskazów­ kami. Dostępne są także dwa paski przewijania, poziomy i pionowy, które służą do nawigowania po wyświetlanym pliku. Rysunek 6.5. Elementy okna edytora kodu

Te obszary i ich funkcje są takie same we wszystkich edytorach środowiska IDE.

C zę ść II Szczegółowe omówienie środowiska IDE Edytor k o d u zawiera dodatkow y zestaw elem entów interfejsu użytkownika, które są nieobecne w innych edytorach. Są to dwie listy rozwijane w idoczne w górnej części okna edytora, które umożliwiają szybkie poruszanie się po kodzie źródłowym poprzez wybór typu (lewa lista), a na­ stępnie w ybór jego specyficznej składowej (właściwość, pole, funkcja i tak dalej; prawa lista). W V isual Basic te listy rozwijane nazywane są Class Name i Method Name. W ybór składowej powoduje bezpośrednie umieszczenie kursora w kodzie określonego typu.

Uwaga Lista rozwijana z typami wyświetla jedynie typy zadeklarowane w aktualnie otwartym oknie. N ie jest to globalna lista dla całego rozwiązania, projektu, ani nawet przestrzeni nazw. Podobnie lista rozwijana ze składowymi zawiera jedynie składowe wybranego typu.

Panel kodu Panel kodu to miejsce, gdzie wyświetlany jest dokum ent (kod źródłowy, dane XML i tak dalej) i m ożna go modyfikować. Ten obszar udostępnia podstaw ow e funkcje zw iązane z edycją tekstu, a także bardziej zaawansowane właściwości edytora zw iązane z produktywnością, na przykład m echanizm IntelliSense. Kliknięcie prawym przyciskiem myszy panelu kodu powoduje otwarcie menu podręcznego (zobacz rysunek 6.6), które zawiera standardowe polecenia służące do wycinania, kopiow ania i wklejania tekstu, a także szereg innych przydatnych opcji zw iązanych z edycją. Rysunek 6.6. Menu podręczne edytora kodu

Refactor

► a

Organize Usings y

gi

Create Unit Tests... Insert Snippet.

CW*K,X

Surround With..

CW-K.S

Go To Definition

F12

Find All References

Ctri-K, R

View Call Hierarchy

Ctrl* * Ctrl. T ►

Breakpoint Run To Cursor

c w .n o

A

Cut

c w -x

*

Copy

cw + c

A

Paste

c w -v

Outlining

Margines ze wskazówkami M argines ze wskazówkami to wąski, szary margines w idoczny po lewej stronie edytora. Służy do w yróżniania wierszy kodu z punktem przerwania lub zakładką. Rysunek 6.7 przedstawia program HelloWorld z zakładką umieszczoną przy procedurze Main oraz p u nktem przerwania przy poleceniu Console. WriteLine.

Rozdział 6. Wprowadzenie do edytorów i okien projektowych Rysunek 6.7. Zakładka i punkt przerwania

Kliknięcie m arginesu ze wskazówkami pozwala dodać lub usunąć punkt przerw ania w wybra­ nym wierszu kodu (więcej na tem at punktów przerw ania dowiesz się z dalszej części tego roz­ działu oraz z rozdziału 11. „Diagnozowanie kodu”).

Margines wyboru M argines w yboru to wąski obszar pomiędzy marginesem ze wskazówkami a służącym do edycji obszarem panelu kodu. Ten m argines udostępnia: • Możliwość zaznaczenia całego wiersza tekstu poprzez kliknięcie m arginesu. • Graficzne wskazówki w postaci kolorowych linii, które widoczne są przy wierszach kodu zm odyfikow anych w bieżącej sesji. • N um ery wierszy, jeśli programista włączy odpow iednią opcję. W poniższych punktach opisujemy, jak dostosow ać działanie edytora do własnych potrzeb. Na rysunku 6.8 wyraźnie widać wskaźnik „zmienionego tekstu” oraz num ery wierszy.

Wskazówka Visual Studio udostępnia specjalny pasek narzędzi dla edytorów kodu. Można go wyświetlić, wybierając opcję V ie w /T o o lb a r s /T e x t E d ito r . Na tym pasku znajdują się przyciski właściwości M e m b e r L i s t , Q u ic k I n fo , P a r a m e te r L i s t i W o r d C o m p le tio n I n te lliS e n s e , a ponadto przyciski do obsługi wcięć, komentarzy i nawigowania po zakładkach. Prawdopodobnie najbardziej przydatne są tu przy­ ciski do nawigacji, ponieważ pozwalają łatwo przechodzić naprzód i wstecz kodu.

C zę ść II Szczegółowe omówienie środowiska IDE Rysunek 6.8. Wskaźniki zmienionego tekstu i numery wierszy

Narzędzia do nawigowania po kodzie Kiedy zwiększa się liczba wierszy kodu w danym projekcie, wydajne poruszanie się po bazie kodu (czyli szybkie i łatwe wyszukiwanie potrzebnych fragm entów wśród tysięcy, a nawet milionów wierszy) staje się problem em . Edytor tekstu udostępnia kilka narzędzi, które pozw alają oznaczać wiersze kodu, wyszukiwać i zam ieniać tekst w plikach źródłow ych i, bardziej ogólnie, zachować o rientację w długich listingach.

Numerowanie wierszy Jak już wspomnieliśmy w opisie marginesów w yboru, num erow anie wierszy można włączyć dla dowolnego dokum entu otw artego w edytorze. Tę opcję można włączyć lub wyłączyć w oknie dialogowym Options na stronie Text Editor/All Languages/Gcneral lub na stronach General po­ szczególnych języków. Same w sobie num ery wierszy byłyby prawie bezużyteczne. D opełnieniem tej techniki jest możliwość natychmiastowego przejścia do określonego wiersza kodu, co jest bardzo przydatne ze względu na łatwość nawigacji po plikach. Kiedy otw arty jest edytor tekstu, należy wcisnąć kom binację klawiszy Ctrl+G, aby wybrać wiersz kodu. Ta kombinacja pow oduje otwarcie okna dialogow ego Go To Line (rysunek 6.9) udostępniającego pole tekstowe, które umożliwia wpisanie n u m e ru szukanego wiersza, a naw et określa dozw olony „zasięg” skoku, wyświetlając dostępne n u m ery wierszy danego d o k u m en tu . W pisanie popraw nego num eru pow oduje umieszczenie kursora na początku w ybranego wiersza.

Rozdział 6. Wprowadzenie do edytorów i okien projektowych Rysunek 6.9. Przeskakiwanie do wiersza

Zakładki Zakładki rozwiązują problem nawigowania po dużych plikach z kodem. Umieszczając zakład­ kę w wierszu kodu, można natychmiast wrócić do niego w dow olnym m om encie. Jeśli w pro­ gramie znajduje się wiele zakładek, można przechodzić naprzód i wstecz między zaznaczonymi wierszami kodu. Okazuje się, że jest to zaskakująco przydatne udogodnienie. Jeśli programista pra­ cuje nad dużą bazą kodu źródłowego, na pewno znajdą się w niej szczególnie interesujące punkty, które w pewnym m om encie będzie chciał otworzyć w edytorze. Jak już wspom nieliśm y, okno edytora tekstu umożliwia nawigowanie po kodzie za pom ocą list rozwijanych z typami i składo­ wymi. Nie są to jednak najlepsze narzędzia do wyszukiwania „ciekawych wierszy”, które mogą być dow olnym i instrukcjam i w śród milionów wierszy kodu. Zakładki są wyświetlane na m arginesach ze wskazówkami w edytorze tekstu (na rysunku 6.8 zakładka jest w idoczna w wierszu 11.). Aby dodać zakładkę lub poruszać się między zakładkami, można użyć albo paska narzędzi edytora tekstu, albo okna Bookmarks. O kno Bookmarks (widoczne na rysunku 6.10) można wyświetlić za pom ocą opcji View/Other Windows/Bookmarks Window. M ożna zauważyć, że okno to udostępnia pasek narzędzi z opera­ cjami związanymi z zakładkami oraz listę wszystkich dostępnych zakładek wraz z ich aktualną fizyczną lokalizacją (nazwą pliku i num erem wiersza w tym pliku). Rysunek 6.10. Okno Bookmarks

•n

Bookmarks

*

_j

[ o

Bookmark

✓ V

j

□)

E ,

x

A

File Location

Line Number

Bookmark3

C:\Users\lars\Oocuments\Visual Studio 10\P.M

10

B o o k n u rk 4

C:\Users\lafs\Documents\Visual Studio 10\P.~

65

Aby dodać zakładkę w danym wierszu kodu, należy um ieścić kursor w odpow iednim wierszu edytora tekstu, a następnie kliknąć przycisk Toggle Bookmark. Ten sam proces służy do usu­ wania zakładek. Za pomocą przycisków „naprzód” i „wstecz” widocznych w oknie zakładek m ożna zm ienić pozycję kursora w edytorze tekstu, przechodząc do przodu i d o tyłu między wszystkimi dostępnym i zakładkami.

C zę ść II Szczegółowe omówienie środowiska IDE

Wskazówka Okna B o o k m a r k s można używać do nawigowania po kodzie pro­ jektów. Nie trzeba ograniczać się do korzystania z zakładek umiesz­ czonych w pojedynczym wierszu kodu — zakładki mogą znajdować się w d o w o ln y m wczytanym pliku. Lista zakładek widoczna w tym oknie pozwala także szybko włączać i wyłączać zakładki (poprzez użycie pola wyboru) i przypisywać im znaczące nazwy. Kliknięcie zakładki prawym przyciskiem myszy um ożliwia także zmianę nazwy na bardziej znaczącą niż na przykład B o o k m a r k 7 . Katalogi zakładek Jedną z ciekawych właściwości okna Bookmarks jest możliwość tw orzenia katalogów zakładek. Są to logiczne kontenery służące do grupow ania powiązanych ze sobą zakładek. Na przykład programista może chcieć umieścić zakładki dla specyficznego algorytmu matematycznego w kata­ logu o nazwie MathFuncs. W tym celu musi najpierw utworzyć katalog, używając przycisku New Folder paska narzędzi. Katalogom można nadać znaczące nazwy opisujące ich zawartość. Następnie m ożna utworzyć zakładkę i przeciągnąć ją do danego katalogu. N a rysunku 6.11 w idoczne jest zapełnione okno Bookmarks. W arto zwrócić uwagę na dwa katalogi widoczne obok zakładek dla różnych plików źródłowych. Rysunek 6.11. Okno Bookmarks z 7akładkami

Bookmarks

- O X

C2ii_i Bookmark

File Location

Line Number

Q

Bookmark^

CAUsersVIarsVOocumentsWisual Studio 10''P...

10

/ / T000: S p ra w d z ić im plem entację i n t e r f e j s u p u b lic c l a s s MessageBus : MessageMapper

IMap

t p u b lic M essageBus() 100 **

_ •

4

. . . .



..

...... - ................................................................................................................................... , ■... . ». - f. * * «. * . .. *«k * * • w ie ^ ,

1

*

Ponowne kliknięcie punktu przerw ania powoduje jego usunięcie. Punkt przerw ania ustaw iony powyżej to prosta wersja, k tó ra wstrzymuje wykonywanie p ro ­ gram u niezależnie od innych zm iennych i czynników. Jednak takie proste punkty przerwania to jedynie w ierzchołek góry lodowej. Punkty przerwania obsługują rozbudow any zestaw wa­ runków umożliwiających doprecyzowanie i kontrolowanie sytuacji, które uruchamiają działanie danego punktu. Punkty przerwania m ogą być urucham iane w wyniku przyjęcia przez zmienną danego stanu lub „dojścia” program u do punktu określoną liczbę razy. Można konfigurować warunkowe p u n k ty przerwania, po p rostu wskazując je i klikając w oknie edytora kodu.

Konfigurowanie punktów przerwania Kliknięcie w skaźnika punktu przerw ania prawym przyciskiem myszy powoduje otw arcie menu kontekstowego (rysunek 6.22), które umożliwia konfigurację danego punktu. Rysunek 6.22. Konfigurowanie punktu przerwania

a

Delete Breakpoint Disable Breakpoint

Ctrl»F9

Location.. Condition... Hit Count... Filter... When Hit... Edit labels...

Alt* F9, L

Export...

To w tym miejscu można określić specjalne warunki aktywujące punkt przerw ania, a także włą­ czyć lub wyłączyć go. Wyłączenie p unk tu przerwania zam iast jego usunięcia pozw ala zacho­ wać jego lokalizację i ponownie wykorzystać, jeśli będzie jeszcze potrzebny.

C zę ść II Szczegółowe omówienie środowiska IDE

Wskazówka Język Visual Basic udostępnia polecenie, które umożliwia pro­ gramową aktywację punktu przerwania z poziomu kodu. Instruk­ cja Stop działa podobnie jak punkt przerwania i wstrzymuje wy­ konywanie kodu. Ta możliwość jest przydatna, jeśli programista uruchamia kod poza środowiskiem IDE. Za każdym razem, kie­ dy aplikacja natrafi na instrukcję Stop, debuger Visual Studio jest uruchamiany i dołączany do programu. Choć w języku C# nie ma odpowiednika instrukcji Stop z języka Visual Basic, można użyć klasy Debugger do uzyskania opisanego efektu. Wystarczy wywołać polecenie Debugger.Break, aby progra­ mowo utworzyć punkt przerwania. Klasa Debugger znajduje się w przestrzeni nazw System.Diagnostic.

Kontrolowanie wykonywania kodu Jeśli program zostanie uruchom iony w IDE, będzie działał zgodnie ze ścieżką wykonywania kodu bazowego do czasu natrafienia na p u n k t przerw ania lub instrukcję S top, ręcznego wstrzymania go lub zakończenia działania w wyniku dojścia do końca ścieżki kodu lub ręcznego zatrzymania aplikacji.

Kontrolki graficzne i powiązane z nimi skróty klawiaturowe (dostępne w menu i pasku narzędzi D eb u g ) to najłatwiejszy mechanizm uru­ chamiania, wstrzymywania i zatrzymywania kodu w IDE.

Po dojściu do punktu przerwania wiersz, w którym wykonywanie zostało wstrzymane, jest w yróż­ niany graficznie w edytorze kodu. Rysunek 6.23 przedstaw ia nieco zm odyfikowaną w ersję program u wyświetlającego napis "W ita j , ś w ie c ie " w strzym aną w punkcie przerw ania. Żółta strzałka na m arginesie ze wskaźnikami wskazuje na instrukcję, która zostanie w ykonana po wznowieniu wykonywania program u. Tu punkt przerwania znajduje się przy instrukcji, dlatego wskaźnik następnej instrukcji znajduje się wewnątrz rysunku reprezentującego punkt przerwania. Po wstrzymaniu wykonywania można określić, który wiersz kodu m a zostać w ykonany jako następny. Domyślnie jest to oczywiście wiersz, w którym debuger wstrzymał wykonywanie o p e ­ racji (należy pamiętać, że wykonywanie jest wstrzymywane bezpośrednio przed uruchom ieniem wiersza z punktem przerwania). Można jednak ręcznie określić następny wiersz kodu, klikając go prawym przyciskiem myszy i wybierając opcję Set Next Statement.

Rozdział 6. Wprowadzenie do edytorów i okien projektowych

C zę ść II Szczegółowe omówienie środowiska IDE

Rozdział 6. Wprowadzenie do edytorów i okien projektowych

c: a ise rs\ T o m e k \n n ru m e n ts\ V is u a l 1 u s in g 2 u s in g 3 u s in g 4 u s in g

S t u d io 1 0 \ . . . \ContosoCommonFrame»iork\NewConsole\Proeram. cs

1

S y ste m ; S y s t e m .C o l l e c t i o n s . G e n e r i c ; S y s t e m .L i n q ; S y s t e m .T e x t ;

6 n am espace H e llo W o r ld

7{ 8 9

c l a s s Program

{

10

11 12

s t a t i c v o id M a i n ( s t r i n g [ ] a r g s )

{

13 14 15 16 17 18 19

22 }

i

» 0;

i

+ )

C o n s o l e .W r i t e L i n e ( " W it a j, ś w i e c i e ! Prób a numer { 0 } " ,

i);

> C o n s o l e .W r i t e l i n e ( ”C zy k t o ś m n ie s ł y s z y ? " ) ;

20 21

fo r ( in t

>

}

23

Rysunek 6.26. Wydrukowany kod

Zawartość okna z definicją kodu jest odświeżana za każdym razem , kiedy zmieni się pozycja kursora w oknie edytora kodu. Jeśli kurso r znajdzie się w kodzie symbolu lub typu, okno Code

Definition wyświetli definicję tego elem entu. Rysunek 6.27 przedstaw ia otwarty edytor kodu oraz okno Code Definition. Kursor w edytorze znajduje się w polu w ewnętrznym s t a t e klasy I n te r n a lT o k e n . Rysunek 6.27. Okno Code Definition

C zę ść II Szczegółowe omówienie środowiska IDE Okno Code Definition uwzględnia pozycję kursora i wyświetla kod źródłowy z definicją typu zawierającego pole S ta te . Na powyższym rysunku m ożna zauważyć, że okno Code Definition to wersja okna edytora tekstu zawierająca wiele funkcji — obsługuje zakładki, punkty przerwania i różne narzędzia pomagające w nawigacji. Choć w tym oknie nie można modyfikować kodu, możliwe jest skopiow anie go z niego. Aby otworzyć okno Code Definition , należy użyć m enu View.

Wskazówka Okno C o d e D e f in it io n dobrze współdziała z oknem C la s s V ie w . Po jednokrotnym kliknięciu klasy w oknie C lass V ie w środowisko odświeży okno C o d e D e fin itio n i wyświetli w nim kod danej klasy.

Tworzenie i modyfikowanie dokumentów oraz szablonów XML Edytor tekstu jest odpow iednim i wydajnym narzędziem także d o edycji dokum entów z d a ­ nymi XML oraz szablonów XMI.. Środow isko urucham ia e d y to r XML, kiedy p ro g ram ista otwiera w Visual Studio plik o rozszerzeniu .xml, a także przy modyfikowaniu plików .xsl i .config. Ponadto zawsze można włączyć ten e d y to r za pom ocą polecenia Open With w oknie Solution Explorer przy otw ieraniu dowolnych elem entów projektów. Ponieważ dokum enty XML mają ustrukturyzow aną zaw artość opartą na węzłach, znaczni­ kach, atrybutach i kontenerach węzłów, edytory XML obsługują zwijanie tekstu w podobny sposób jak edytory kodu. Programista może zwijać i rozwijać węzły, aby ukryć lub wyświetlić ich zawartość (rysunek 6.28). Podobnie jak w edytorach kodu, także tu dostępna jest pełna obsługa sprawdzania składni i m echanizmu IntelliSense. Edytor XML w ykryw a w ym agania składniow e w dokum encie i wyświetla odpow iednie podpowiedzi IntelliSense oraz formatuje kod. Przy użyciu edytora XML można wykonywać następujące zadania: • modyfikować szablony XSD; • generow ać szablony na podstaw ie dokum entów XML; • modyfikować arkusze stylów XSLT; • modyfikować dokum enty DTD (ang. Document Type Definition) i XDR (ang. XMLData Reduced)-, • wstawiać fragmenty kodu XML.

Rozdział 6. Wprowadzenie do edytorów i okien projektowych Rysunek 6.28. Edycja dokumentu XML

ProductCatalog-xml X |__________________________ |c>xail v e rsio o « "l.e " encoOing.‘ utf-8" ?> B B

nai»e>*eel Garden Hose lB.SO

77809132 yes Trevaney

Pełny opis różnych narzędzi służących do edycji i sprawdzania poprawności kodu oraz zwięk­ szających produktywność zawiera rozdział 8., „Korzystanie z narzędzi zwiększających p roduk­ tywność”. W tym miejscu omówiono dw a kluczowe mechanizmy związane z form atem XML: generowanie szablonów i edycję arkuszy stylów XSLT.

G e n e ro w a n ie sza b lo n ó w Edytor XML potrafi automatycznie wygenerować szablon XML (ang. XML Schemat Document — XSD) na podstawie popraw nego do k u m en tu XMI.. Aby to zrobić, należy otw orzyć d o k u ­ m ent XML, a n astępnie wybrać opcję Create Schema z głów nego m enu edytora. Spowoduje to utworzenie dokum entu XSD i otwarcie go w odrębnym oknie edytora XML (więcej na ten temat w następnym punkcie). W tym miejscu można wprowadzić potrzebne zmiany w szablonie i zapisać go na dysku, a także dołączyć d o projektu.

Uwaga Jeśli programista uruchomi polecenie C r e a te S c h e m a dla doku­ mentu XML, który już zawiera szablon DTD lub XDR, algorytm generowania szablonów XML przekształci je, zamiast używać danych zapisanych w dokumencie XML.

P ro je k to w a n ie sza b lo n ó w XML W Visual S tudio 2010 znacznie w zbogacono obsługę projektow ania szablonów XML. W idać to natychmiast p o otw arciu pliku szablonu XML (pliku ,xsd). G raficzne okno projektowe i okno XML Schema Explorer współdziałają ze sobą, aby umożliwić szybkie sprawdzanie, m odyfiko­ wanie i rozbudow yw anie szablonu. N a rysunku 6.29 pokazano szablon otwarty w środow isku Visual Studio, w ygenerow any na podstaw ie prostego pliku XML z katalogiem produktów . W arto zw rócić uw agę na eksploratora szablonów po prawej i okno projektowe szablonów po lewej stronie. Przyjrzyjm y się dokładniej poszczególnym w idokom .

C zę ść II Szczegółowe omówienie środowiska IDE

Rozdział 6. Wprowadzenie do edytorów i okien projektowych Rysunek 6.30. Okno XML Schema Explorer

Choć ten hierarchiczny obraz szablonu jest przydatny sam w sobie, główną funkcją eksplorato­ ra jest w ybieranie elem entów do wyświetlenia lub edycji w oknie projektowym. O kna eksplo­ ratorów i p rojektow e są nieodłączne. Zam knięcie okna projektow ego prowadzi do autom a­ tycznego w yłączenia eksploratora.

Okno projektowe szablonów XML Okno projektow e szablonów służy do ich edycji. Można modyfikować lub wyświetlać szablony przez przeciągnięcie elementów z okna XM L Scheme Explorer na powierzchnię okna projektowego. Po dodaniu szablonu do powierzchni projektowej okno projektowe udostępnia trzy różne widoki struktury i zaw artości szablonu: • Start View to widok domyślny. Jak wskazuje na to nazwa, jest to strona startow a dla innych widoków. Widok Start View udostępnia też ogólne statystki na temat szablonu XM L (na przykład liczbę globalnych elementów, atrybutów i typów), a także um ożli­ w ia szybkie i łatwe dodaw anie takich danych do pow ierzchni projektowej. •

Graph View to dwuwymiarowy widok węzłów i relacji między nimi w szablonie. Jest przy d atn y głównie do obrazow ania złożoności i rodzajów relacji. Nie m ożna stoso­ w ać go do bezpośredniej edycji węzłów i relacji. Aby zm ienić sposób wyświetlania diagram u, należy użyć przycisków paska narzędzi w górnej części okna projektowego. D ostępne opcje to: od lewej do prawej, od prawej do lewej, od góry do dołu i od dołu do góry. D w ukrotne kliknięcie węzła powoduje otw arcie kodu XML szablonu w edytorze XML, przy czym kod danego węzła jest autom atycznie wyróżniany. N a rysunku 6.31 przedstaw iono widok Graph View dla złożonego pliku szablonu.

C zę ść II Szczegółowe omówienie środowiska IDE

• Content Model View to graficzny, hierarchiczny widok węzłów oraz ich elementów, atrybutów , typów i grup. W idok ten jest szczególnie przydatny przy próbie zrozu­ m ienia szczegółów określonego fragmentu szablonu. Na przykład d w ukrotne kliknię­ cie typu pozwala szybko poznać szablon danego rodzaju, w tym elem enty, atrybuty, typy i grupy, a także ograniczenia lub relacje zdefiniowane w szablonie. W idok ten um ożliw ia ponadto proste zaznaczanie węzłów. Po lewej stronie pow ierzchni p ro ­ jektowej dostępna jest alfabetyczna lista wszystkich węzłów w szablonie. Kliknięcie węzła na liście pow oduje wyświetlenie na pow ierzchni projektowej szczegółowych inform acji na jego tem at (zobacz rysunek 6.32).

Wskazówka Widok C o n te n t M o d e l V ie w umożliwia łatwe porównywanie dwóch lub więcej węzłów szablonu. Wystarczy zaznaczyć odpo­ wiednie węzły na liście umieszczonej po lewej stronie powierzchni projektowej (więcej węzłów można dodać za pomocą kombinacji Cfr/+lewy przycisk myszy). Następnie można użyć narzędzia do skalowania powierzchni projektowej, aby uzyskać ogólny obraz węzłów lub przyjrzeć się szczegółom.

Rozdział 6. Wprowadzenie do edytorów i okien projektowych

Ed ycja a r k u s z y styló w X S LT Pliki XSLT to jednocześnie pliki XML, dlatego proces edycji dokum entów obu rodzajów prze­ biega tak samo. Jednak dokumenty' XSLT mają kilka dodatkowych specyficznych cech. Po pierwsze, edytor wykrywa w nich i odpowiednio formatuje słowa kluczowe, podobnie jak w dokum entach z kodem. Po drugie, edytor XML autom atycznie przetwarza aktualny stan dokum entu na p o d ­ stawie standardow ego szablonu arkusza stylów XSLT i wskazuje błędy. Po trzecie, Visual Studio potrafi wykryć wszelkie skrypty zagnieżdżone w dokum entach XSLT. Dlatego program ista może umieścić punkty przerwania w bloku ze skryptem i korzystać z pełnej obsługi diagnozo­ wania, co pozw ala przejść przez kod krok po kroku, ustawić stan zmiennych i tak dalej. Rysunek 6.33 przedstawia arkusz stylów XSLT z punktem przerwania ustawionym w sekcji z zagnieżdżonym skryptem.

Uruchamianie szablonu XSLT dla dokumentu XML Po utw orzeniu arkusza stylów' i dołączeniu go do dokum entu XML można uruchom ić arkusz stylów XSLT dla dokum entu XML i wyświetlić wynik tej operacji w nowym oknie edytora.

C zę ść II Szczegółowe omówienie środowiska IDE Rysunek 6.33. Diagnozowanie skryptu zagnieżdżonego w dokumencie XSLT

Najpierw trzeba powiązać arkusz XSLT z dokum entem XML. Okno Properties dokum entu XML zawiera właściwość Stylesheet. Aby dołączyć do dokum entu arkusz XSLT, należy przy­ pisać do tej właściwości pełną ścieżkę i nazwę pliku arkusza. Można także ręcznie umieścić arkusz stylów w sekcji w stępnej dokum entu XML, dodając do d okum entu p ro lo g instrukcji przetwarzania xml-stylesheet, na przykład:

Kiedy arkusz stylów jest już pow iązany, wystarczy wybrać opcję Show XSLT Output z menu edytora XML, po czym środowisko przekształci d o k u m en t XML i wyświetli wyniki tej operacji w nowym oknie edytora.

Używanie kaskadowych arkuszy stylów Edytor arkuszy CSS umożliwia tw orzenie i modyfikowanie dokum entów kaskadow ych arkuszy stylów. Ponieważ dokum enty CSS są przede wszystkim dokum entam i tekstowym i, wydajny edytor służący do ich obsługi nie musi udostępniać wielu funkcji ponad podstawowe opcje edycji tekstu. Dostępnych jest jednak kilka wbudowanych narzędzi, które umożliwiają dodaw anie zasad stylów oraz tworzenie stylów za pom ocą okien dialogowych, a nie wpisywania tekstu.

Rozdział 6. Wprowadzenie do edytorów i okien projektowych

D o d a w an ie z a sa d styló w Kliknięcie praw ym przyciskiem myszy obszaru w edytorze CSS pow oduje otwarcie m enu podręcznego. Należy wybrać w nim opcję Add Style Rule. Okno dialogowe Add Style Rule u m o żli­ wia wpisanie elem entu, nazwy klasy lub identyfikatora klasy, a nawet zdefiniowanie hierarchii zasad. Z atw ierdzenie zm ian w tym oknie dialogowym pow oduje wstawienie do edytora CSS tekstu potrzebnego do utworzenia zasady.

D e fin io w a n ie atryb u tó w a rk u szy styló w Po dodaniu stylu do dokum entu CSS poprzez samodzielne napisanie składni lub użycie wspom nianego wyżej okna dialogowego Add Style Rule m ożna zmodyfikować jego atrybuty w oknie Style Builder. Aby otworzyć to okno, należy kliknąć prawym przyciskiem myszy dowolny obszar danego stylu, a następnie wybrać opcję Build Style. W tym oknie dialogowym można w pełni opisać styl za pom ocą kilku kategorii — od czcionki, poprzez układ, po formatowanie list.

Tworzenie aplikacji klienckich dla systemu Windows Istnieją dwie podstaw ow e technologie tworzenia aplikacji klienckich dla systemu W indow s za pomocą platform y .NET. Są to form ularze W indows (W inForm s) i W indows Presentation Foundation (W PF). Oba te modele oparte są na udostępnianym przez platformę .NET zbiorze klas i kontrolek interfejsu użytkownika, które pomagają p rogram istom w szybkim rozw ijaniu programów instalow anych i urucham ianych w systemie operacyjnym Microsoft W indows. W inForms i W PF to dojrzałe technologie, jednak platform a W PF jest zgodna z d łu g o term i­ nową techniczną strategią M icrosoftu w zakresie rozwijania interfejsów użytkow nika. WPF stanowi znaczny krok naprzód w tworzeniu programów łączących multimedia, dokumenty i ważne elementy interfejsu użytkownika. WPF oparto na języku znaczników XAML (ang. Extensible Application Markup Language), który służy tu do opisu obiektów aplikacji, wartości właściwości i operacji. Pod tym względem technologia ta bardzo przypomina aplikacje sieciowe, w których język H'1'ML opisuje poszczególne elementy stron. W W PF często używa się grafiki wektorowej i sprzętowej obsługi grafiki do wyświetlania interfejsu użytkownika. Niezależnie od rodzaju tworzonej aplikacji klienckiej proces jej budowania wygląda podobnie. Okna projektowe formularzy Windows i WPF umożliwiają przeciąganie kontrolek, a Visual Studio udostępnia odpow iednie szablony projektów obu typów.

C zę ść II Szczegółowe omówienie środowiska IDE

T w o rz e n ie p ro je k tó w a p lik a cji d la system u W in d o w s Proces tw orzenia aplikacji dla system u W indow s rozpoczyna się podobnie jak w przypadku projektów wszystkich innych rodzajów obsługiw anych przez Visual Studio. Należy wybrać szablon Windows Application w oknie dialogowym New Project, a następnie określić lokalizację kodu źródłowego aplikacji. Na tej podstawie Visual Studio wygeneruje wyjściowy program i otwo­ rzy okno projektow e Windows Forms, co przedstawia rysunek 6.34. Rysunek 6.34. Wyjściowy formularz w oknie W indow s Forms

Jak widać na tym rysunku, w oknie projektowym widoczna jest „makieta” bieżącego formularza. Jest to płótno interfejsu użytkownika. Używając tego płótna, można dodawać kontrolki i elementy graficzne form ularza, poprawiać wygląd i styl samego form ularza, a także bezpośrednio prze­ chodzić do powiązanego z nim kodu. Aby sprawdzić, jak działa to okno projektow e, zacznijmy od prostego zadania. Załóżmy, że program ista chce użyć pustego formularza wygenerowanego przez Visual Studio i utworzyć okno dialogowe służące do obsługi logowania, które m a umożliwiać użytkow nikom wpisanie nazwy i hasła oraz spraw dzać popraw ność danych w w yniku klik­ nięcia przycisku OK. W oknie powinien znaleźć się także przycisk Anuluj umożliwiający użyt­ kownikom rezygnację z przesyłania formularza.

Uwaga Nie powinny mylić różne postacie (na przykład okna komunikatu czy okna dialogowe), jakie mogą przyjmować formularze. Z punktu widzenia programowania wszystkie te elementy to okna, a tym samym i formularze.

Rozdział 6. Wprowadzenie do edytorów i okien projektowych O kno projektowe pozw ala program iście zbudować formularz i określić jego działanie przy użyciu minimalnej ilości kodu. Za pom ocą mechanizmu przeciągania oraz okna dialogowego Properties m ożna dostosow ać wygląd i styl aplikacji bez otw ierania edytora kodu.

Dostosowywanie wyglądu formularza W oknie projektow ym znajduje się kilka oczywistych elem entów graficznych. Przede wszyst­ kim jest to sam form ularz. Jest on widoczny w całości — z ram kam i, paskiem tytułu, obszarem klienckim i przyciskami służącymi do minimalizacji, maksymalizacji i zamykania okna. Ponadto można zauważyć uchw yty w przy dolnej i prawej krawędzi formularza oraz w prawym dolnym rogu. Uchwyty służą do zmiany rozmiaru form ularza. Aby zm ienić jego inne atrybuty, należy użyć właściwości. Pozwalają one ustawić kolor tła, wygląd i działanie ram ki, tekst widoczny na pasku tytułu i tak dalej. N a rysunku 6.35 ty tuł formularza został zm ieniony na Logowanie, a działanie ramki tak, aby odpow iadało oknu dialogowemu, a nie zwykłemu oknu, którego rozm iar można zmieniać. Rysunek 6.35. Zmienianie rozmiaru, obramowania i tytułu formularza

F o r m l.e s [Design]"

X

Dodawanie kontrolek do formularza Kontrolki to dekoracje formularza, które m ają własny interfejs użytkow nika. (Istnieją też k o n ­ trolki bez interfejsu użytkownika. O pisujem y je w dalszej części rozdziału w podrozdziale „Tworzenie kom ponentów i kontrolek”). Kontrolki to podstawowy mechanizm interakcji z for­ mularzem. O znacza to, że formularz to jed y n ie kontener na ró żn e kontrolki, które udostęp­ niają jego funkcje. Dodawanie kontrolek do formularza jest całkiem proste — w ystarczy przeciągnąć je z okna narzędzi. Kontynuując metaforyczny opis okna projektowego jako płótna, okno narzędzi m ożna traktować jako paletę.

Część II

Szczegółowe omówienie środowiska IDE

Okno narzędzi O kno narzędzi to dokowane okno środowiska IDE. Jest widoczne jedynie w czasie pracy nad tymi elem entam i projektu, które z nim współpracują. Aby upewnić się, że okno narzędzi jest widoczne, należy wybrać je z m enu View (lub użyć skrótu Cfr/+A/f+X). O kno narzędzi grupuje kontrolki w drzewie z zakładkam i. Wystarczy rozwinąć zakładkę (na przykład Common Controls lub Menus & Toolbars), po czym pokaże się lista dostępnych kon­ trolek. W tym przypadku potrzebne są: dwa pola tekstowe (kontrolki T ex t Box) do przechowy­ wania tekstu identyfikatora i hasła, kilka etykiet (kontrolki Label) do opisu tych pól, a także przyciski (kontrolki B u tto n ) OK i A nuluj do zatw ierdzania oraz usuwania danych. Wszystkie te kontrolki m ożna znaleźć pod zakładką Common Controls (zobacz rysunek 6.36). Rysunek 6.36. Okno narzędzi dla formularzy Windows

Tool boi

- O X

Contoso.Fx.Ul Components

'

^ Pointer |Q| C alendarContro l

■*| Componentl ć

j

Contoso.Fx.Integration Components

6 Data 8 Components 8 Containers 8 Menus & Toolbars & Printing 6 Dialogs 3 A1 Windows Forms 8 Common Controls

Pointer ®

B u tto n

0

C h eckBo x

H

CheckedListBox

I

v f C om boBox

DateTim ePicIcer A

Label

-

Aby umieścić kontrolkę na form ularzu, należy przeciągnąć na niego jej reprezentację z okna narzędzi. Niektóre kontrolki, tak zwane komponenty, nie mają graficznego interfejsu użytkownika. Jednym z nich jest zegar (kontrolka Timer). Komponent przeciągnięty na formularz zostaje umiesz­ czony w odrębnym obszarze okna projektowego, tak zwanym obszarze kom ponentów . W obsza­ rze kom ponentów można w ybrać jeden z nich i uzyskać dostęp do jego w łaściw ości poprzez okno Properties.

Wskazówka Zawartość i wygląd okna narzędzi można dostosować do własnych potrzeb. Programista może dodać lub usunąć zakładki, przenieść kontrolki przez ich przeciągnięcie z jednej zakładki do innej, a nawet zmienić nazw) poszczególnych elementów. Do wykonywania wielu z tych zadań służy menu kontekstowe okna narzędzi (można je otworzyć przez kliknięcie prawym przyciskiem myszy zakładki lub wybranego elementu).

Rozdział 6. Wprowadzenie do edytorów i okien projektowych Rozmieszczanie kontrolek W czasie projektow ania formularza układ kontrolek jest istotnym zagadnieniem. Zwykle ważne jest wyrównanie kontrolek w pionie lub w poziomie, używanie stałych odstępów między ich krawędziami czy m arginesów przy kraw ędziach formularza. Okno projektowe udostępnia trzy podstawowe zestawy narzędzi i pomocniczych mechanizmów', które ułatwiają określanie układu form ularza. Po pierwsze, dostępne są opcje menu Format. Po wczytaniu fo rm u larza do okna projektow ego m ożna wybrać grupę kontrolek i użyć poleceń menu Format d o w yrów nania ich względem siebie w pionie lub w poziom ie, do ujednolicenia, zmniejszenia lub zwiększenia odstępów m iędzy nimi, umieszczenia kontrolek na środku fo r­ mularza, a naw et zm iany atrybutów wyglądu kontrolek tak, aby m iały taką samą wielkość. Inne narzędzia służące do rozmieszczania kontrolek są z natury interaktywne i działają w dwóch różnych trybach: jako przyciąganie do linii i układ tabelaryczny. M ożna przełączać się między nimi za pom ocą okna dialogowego Windows Forms Designer Options (należy wybrać opcję Tools/Options, a następnie zakładkę Windows Forms Designer). Właściwość LayoutMode m ożna ustawić na w artość SnapT oG rid lub S n a p L in es. Używanie układu tabelarycznego Układ tabelaryczny, jak sama nazwa wskazuje, to tabela nałożona na formularz. Tabela jest graficznie reprezentow ana w oknie projektow ym za pomocą kropek odpowiadających przecię­ ciom linii tabeli. W czasie przeciągania i poruszania kontrolek po pow ierzchni formularza okno projektowe autom atycznie przyciąga ich krawędzie do boków kom órek tabeli.

Wskazówka Nawet jeśli włączony jest układ tabelaryczny, można zablokować przyciąganie. W tym celu należy wybrać kontrolkę, przytrzymać klawisz C tr l i użyć strzałek do przesuwania kontrolki w górę, dół, lewo lub prawo po jednym pikselu.

Rozmiar kom órek tabeli (a jednocześnie odstępy między kropkam i) m ożna określić za pom ocą właściwości G r id S iz e , która także znajduje się w oknie dialogowym Options. M niejszy ro z­ miar komórek oznacza węższe odstępy między kropkami, a co za tym idzie — możliwość bardziej precyzyjnego rozm ieszczania kontrolek. Rysunek 6.37 przedstaw ia formularz logow ania z opisanym wcześniej układem tabelarycznym. Tabeli użyto po to, aby: • W yrów nać pola tekstowe względem siebie (i nadać im tę sam ą długość). • W yrów nać etykiety w pionie względem pól tekstowych i w poziom ie względem siebie. • W yrów nać przyciski w pionie i zapewnić odpowiedni odstęp między ich kraw ędziam i a ram ką form ularza.

C zę ść II Szczegółowe omówienie środowiska IDE

I276|

Rozdział 6. Wprowadzenie do edytorów i okien projektowych W tym celu sprawdzana jest pozycja tekstu widocznego na przyciskach. Cienka różowa linia biegnąca pod napisam i pokazuje, że są o n e precyzyjnie w yrów nane. Algorytm przyciągania automatycznie uwzględnia także zalecane marginesy oraz odstępy opisane we wskazówkach dotyczących interfejsów użytkow nika w aplikacjach dla system u W indow s stosowanych przez Microsoft. Mechanizm ten podejmuje wiele decyzji związanych z układem elementów i pom aga zachować jednolitość oraz standardy w aplikacjach typu W indows Forms.

Uwaga Zmiany trybu rozmieszczania kontrolek zwykle nie są wprowadzane natychmiast. Może zajść konieczność zamknięcia okna projekto­ wego i ponownego otwarcia go po wprowadzeniu zmiany (na przy­ kład po przełączeniu się z trybu SnapLine na SnapToGrid).

Zmienianie rozmiaru kontrolek i modyfikowanie atrybutów Kiedy kontrolka znajduje się w odpowiednim miejscu formularza nadrzędnego, można wchodzić z nią w interakcje na różne sposoby. M ożna na przykład określić jej właściwości przy użyciu okna Properties. M ożna także zmienić jej rozm iar i kształt za pom ocą uchwytów znajdujących się na krawędziach kontrolki.

Pisanie kodu Choć okno projektow e to doskonałe narzędzie do graficznego tworzenia interfejsu użytkownika, nie daje zbyt dużych możliwości w zakresie określania jego działania. M ożna użyć okna do umieszczenia przycisku na formularzu, ale określenie reakcji program u na kliknięcie to wciąż dom ena kodu. Na poziomie kodu formularz to po prostu klasa zawierająca wszystkie działania formularza. W celu uproszczenia kodu i ułatwienia programowania Visual Studio umieszcza cały kod wygenerowany za pomocą okna projektowego w przejrzyście oznaczonych obszarach, a w przypadku form ula­ rzy Windows — w odrębnych plikach. Takie pliki są n azw an e na podstawie podstawowego pliku z kodem formularza według następującego wzorca: .Designer.. Na przykład z formularzem logowania powiązany jest plik Login.Designer.es, który zawiera kod wygenerowany za pomocą okna projektowego. Listing 6.1 przedstaw ia kod wygenerowany przez Visual Studio w wyniku zmian w prow adzo­ nych w form ularzu za pomocą okna projektowego. Listing 6.1. Kod wygenerowany za pomocą okna projektowego formularzy Windows namespace Contoso.Ul.WindowsForms.OrderEntry { partial class Login {

C zę ść II Szczegółowe omówienie środowiska IDE I I I I I I Required designer variable. I I I

private System.ComponentModel.IContainer components = null; III III Ill III III

Clean up any resources being used.

Button

Środowisko autom atycznie synchronizuje widok projektów}' z oknem z kodem XAML-a. Ponieważ technologia W PF jest oparta na grafice wektorowej, można przybliżać i oddalać widok okna projektowego przy użyciu suwaków widocznych w lewym górnym rogu okna. Rysunek 6.40 przedstawia form ularz Windowi z 10-krotnie powiększonym przyciskiem .

Rozdział 6. Wprowadzenie do edytorów i okien projektowych Rysunek 6.39. Wyjściowy formularz w oknie projektowym WPF

C JD e .g r>



O XAM L

“-fx /2ae «/x«ilTitle«"windo*ri" widtfu* 3ee- >

B 0 0 * £j

[

O

W in d o w W indow

Rysunek 6.40. Dziesięciokrotne powiększenie w oknie projektowym aplikacji WPF

Widok podzielony Programista może kontrolować sposób wyświetlania oraz położenie paneli projektowego i z kodem XAML-a w środowisku IDE. Kliknięcie małego przycisku z dw om a strzałkam i powoduje z a ­ m ianę pozycji obu paneli. Można też zmienić ich układ z poziomego na pionowy i w drugą s tro ­ nę przez kliknięcie przycisku Horizontal Split lub Vertical Split. D odatkowo możliwe jest zwinięcie każdego z paneli przy użyciu przycisku Collapse/Expand Pane.

C zę ść II Szczegółowe omówienie środowiska IDE W arto wspomnieć o jeszcze jednym ciekawym mechanizm ie specyficznym dla okna projektowego WPF. Programista może przechodzić naprzód i wstecz między zaznaczonymi obiektami za pomocą odpowiednich selektorów widocznych w dolnej części okna projektowego. Kontrolki do zarządzania panelam i, nawigacji po obiektach i przybliżania elem entów opisano na rysunku 6.41. R y s u n e k 6.41.

Suwak do przybliżania widoku

Kontrolki edytora WPF

Układ paneli x i lt s .'r r t t p : '/ s c N ą a s .n lrro s 5 * t.c o * /« lr Y f x / 2 « 6 / x w l / c r e * e f i ta t lc r ' xa*r< i : x » " n u p : / / s c l 'e ^ f r ^ i . r u s c f t . c m / m r.4a/ 2936/ km»1*

T itle

13 Window Window

1

------------------ -------------------------------------

Selektor znaczników języka XAML

1

Przełączanie paneli

Dodawanie kontrolek Kontrolki w formularzach W PF można umieszczać w standardowy sposób (znany z formularzy W indow s i sieciowych) — przez przeciąganie k o m p o n en tó w z okna n arzędzi. W określaniu pozycji i wielkości kontrolek pomagają linie oraz pola rozm iaru, które wyglądają nieco inaczej niż ich odpowiedniki w form ularzach W indows, ale pełnią podobne funkcje (rysunek 6.42). Tworzenie aplikacji WPF opisano szczegółowo w rozdziale 19., „Tworzenie bogatszych i bardziej inteligentnych interfejsów użytkow nika”.

Tworzenie formularzy sieciowych F orm ularze sieciowe re p rezen tu ją interfejs użytkow nika aplikacji sieciow ych. Tradycyjnie form ularz sieciowy platform y .NET oznacza stro n y przetw arzane d y n am iczn ie po stronie serw era (za pomocą technologii ASP.NET). My używ am y szerszej definicji. W edług niej formularze sieciowe to strony internetowe (statyczne i dynamiczne), które m ożna tworzyć i p ro ­ jektow ać w' IDE Visual Studio.

Rozdział 6. Wprowadzenie do edytorów i okien projektowych Rysunek 6.42. W skazówki wspomagające rozmieszczanie kontrolek

Okno projektowe HTML (nazywane także oknem projektowym aplikacji sieciowych) jest blisko spokrewnione z oknem projektowym do tworzenia formularzy W indows oraz WPF i umożliwia graficzne projektowanie oraz modyfikowanie znaczników stron internetowych. Podobnie jak okna projektow e dw óch innych rodzajów aplikacji klienckich, okno projektow e HTML i widok kodu źródłowego obsługują razem wszystkie podstawowe operacje związane z projektowaniem stron internetowych. Cały proces tworzenia aplikacji sieciowych opisujemy szczegółowo w roz­ dziale 17. „Tworzenie aplikacji ASP.NET”. W poniższych punktach opisujemy jedynie podstawy dotyczące okien projektowych i edytorów aplikacji sieciowych.

P ro je k to w a n ie a p lik a cji o p a rty ch na fo rm u la rzach siecio w ych Projektow anie strony internetow ej rozpoczyna się od wyboru projektu sieciowego. W Visual Studio są dwa różne sposoby tworzenia stron i w itryn internetow ych. O bu metodom odpo­ wiadają odrębne szablony projektów. Programiści mogą tworzyć aplikacje sieciowe i witryny internetowe. W rozdziale 4. wspomnieliśmy o kilku różnicach między projektam i obu typów. Bardziej szczegółowe omówienie tego zagadnienia zawiera rozdział 17. Jednak ponieważ tworzenie stron internetowych za pom ocą okien projektowych przebiega w obu projektach tak samo, tu opisano ten proces z perspektywy’ witryny internetowej. Należy wybrać opcję File/New Web Site, a następnie, w oknie dialogowym, szablon ASP.NET Web Site. Po określeniu katalogu na kod źródłow y oraz używanego języka można kliknąć przycisk OK, a Visual Studio utw orzy projekt i jego początkową stronę.

C zę ść II Szczegółowe omówienie środowiska IDE O kno projektowe H TM L wygląda podobnie do okna formularzy W PF. O kno dokumentu działa jak płótno, na którym m ożna umieszczać obiekty z okna narzędzi i przemieszczać je. Choć dostępne tu kontrolki różnią się od komponentów używanych w oknie projektowym WPF, pełnią te same podstawowe funkcje. Programista może używać środowiska w trybie podzielonym, w któ­ rym okno projektowe i edytor znaczników są jednocześnie widoczne w odrębnych panelach, lub wybrać jedno z dwóch w ym ienionych narzędzi. Zobaczm y teraz, jak utw orzyć sieciową wersję form ularza logowania utw orzonego wcześniej za pom ocą formularzy W indow s. (W praktyce m ożna użyć wbudowanego form ularza logowania, jednak w celu zaprezentowania procesu projektow ania podejmiemy się wyzwania i utworzymy jego uproszczoną wersję).

Dodawanie i rozmieszczanie kontrolek Proces dodawania i rozmieszczania kontrolek wygląda tak samo, jak w oknie projektowym form u­ larzy W indows — wystarczy przeciągnąć kontrolki z okna narzędzi na powierzchnię formularza. T u potrzebne będą: dwie etykiety, dwa pola tekstowe i przycisk OK (poniew aż nie jest to okno dialogowe, które m ożna zam knąć za pomocą przycisku Anuluj). M odyfikowanie właściwości kontrolek także odbywa się tak samo — za pom ocą okna Properties. M ożna wybrać etykiety oraz przyciski, a następnie ustaw ić widoczny na nich tekst.

Uwaga W czasie dodawania kontrolek do strony internetowej można za­ uważyć, że domyślnie włączony jest tryb względnego rozmieszcza­ nia elementów strony. Oznacza to, że kontrolki nie są umieszczane w miejscach określonych przez współrzędne ekranu, ale względem siebie. Absolutne określanie pozycji odbywa się poprzez arkusze stylów. Na przykład można wybrać etykietę, zmienić jej właściwości stylu i ustawić tryb absolutnego określania pozycji. Dzięki temu możliwe jest swobodne przenoszenie kontrolki po formularzu.

Pasek narzędzi form atow ania jest dostępny dom yślnie. Znajdują się na nim przyciski obsłu­ gujące podstawowe operacje związane z formatowaniem, na przykład zmienianie stylów i kolorów czcionki, określanie wcięć akapitów czy dodaw anie wypunktowania. Aby wyrównać krawędzie kontrolek wedle własnych preferencji, należy wcisnąć kombinację klawiszy Shift+Enter, co pow oduje wstawienie odstępu między k ontrolkam i, jeśli jest to ko­ nieczne (w kodzie HTM L-a zostaje wtedy wygenerowany znacznik < b r> ). Tu odstęp został dodany między pierwszym polem tekstowym a drugą etykietą i między drugim polem teksto­ wym a pierwszym przyciskiem. Rysunek 6.43 przedstawia formularz w czasie projektowania. Pola tekstowe nie są wyrównane, a ponadto warto zastosować style dla czcionek etykiet i przycisków, jednak ogólny układ strony i jej przeznaczenie powinny być oczywiste. W arto zauważyć, że okno projektow e wyświetla nad zaznaczoną kontrolką pole, w którym znajduje się typ kom ponentu i jego nazwa.

Rozdział 6. Wprowadzenie do edytorów i okien projektowych Rysunek 6.43. Tworzenie formularza sieciowego

Jako dodatkową pomoc w porządkowaniu kontrolek można włączyć linijkę, siatkę lub oba te narzędzia. Są one dostępne jako opcje R uler i G r i d w menu V iew .

Modyfikowanie znaczników W czasie dodawania kontrolek i innych elem entów d o form ularza o raz m anipulow ania nimi tw orzony jest kod HTML-a reprezentujący projekt i układ obiektów. Projektant lub program i­ sta m oże używać zarówno w arstw)' graficznej (za pom ocą okna projektow ego), jak i warstwy tekstowej w postaci kodu źródłowego (przy użyciu edytora HTML Source Editor). Podobnie jak inne edytory środowiska Visual Studio 2010, HTML Source Editor obsługuje IntelliSense oraz inne interaktyw ne m echanizm y służące do poruszania się po znacznikach i sprawdzania ich popraw ności. Na rysunku 6.42 widać znaczniki wygenerowane przez okno projektow e w wyniku dodania kontrolek do strony logowania. Podobnie jak w innych parach okno projektowe - edytor, można sam odzielnie napisać kod H TM L-a, a następnie natychm iast zobaczyć jego działanie w oknie projektow ym . Edytor HTM L-a także udostępnia pasek narzędzi, który zapewnia szybki dostęp do operacji przechodzenia „naprzód” i „wstecz” kodu, dodaw ania kom entarzy i spraw dzania popraw ności szablonu (ten konkretny mechanizm opisano w punkcie „Wygląd strony w przeglądarce i sprawdzanie p o ­ praw ności kodu”).

C zę ść II Szczegółowe omówienie środowiska IDE Kluczową właściwością edytora HTM L-a jest zachowywanie form atow ania kodu źródłowego. Edytor w dużym stopniu uwzględnia sposób form atowania znaczników stosowany przez progra­ mistę. Obejmuje to um ieszczanie znaków końca wiersza i odstępów, stosowanie wcięć, a nawet sposób zawijania słów i wierszy. Ujmijmy to krótko — Visual Studio nigdy nie zmienia sposobu form atow ania kodu H TM L-a napisanego przez programistę! Tabele Tabele HTML-a to szybki i łatwy sposób w yrów nyw ania kontrolek na stronach internetowych. W Visual Studio 2010 znajduje się specjalne o k n o dialogowe, Insert Table, które pozwala k o n ­ trolować układ i wygląd tabel. Aby umieścić tabelę w oknie projektowym, należy wybrać opcję

Insert Table z menu Table. O kno dialogowre Insert Table umożliwia określenie niestandardowego układu tabeli poprzez podanie atrybutów wierszy i kolumn, a także ogólnych atrybutów stylów, na przykład ramek i dopełnienia. W tym oknie dialogowym można także wybrać jeden z w bu­ dowanych szablonów tabeli. Po dodaniu tabeli w oknie projektowym jest ona w pełni interaktywna i m ożna zmieniać wielkość jej kolum n oraz wierszy za pom ocą przeciągania. Opcje formatowania Oprócz zachowania formatowania napisanego przez programistę kodu w HTML-u Visual Studio 2010 umożliwia także precyzyjne kontrolow anie sposobu generowania i formatowania kodu za pom ocą okna projektowego. Strona HTML i jej strony podrzędne w oknie dialogowym Options ( Tools/Options/Text Editor/HTML) służą do konfigurowania stylu wcięć, stosowania apostrofów, zawijania słów i wielkości znaków nazw znaczników (zobacz rysunek 6.44). Rysunek 6.44. Opcje formatowania kodu w HTML-u

Ustawienia można stosować globalnie, dla wszystkich znaczników, lub dla danego znacznika, klikając przycisk Specific Options (Text Editor/HTML/Format). Taki poziom kontroli jest przy­ datny na przykład wtedy, kiedy programista używa symboli końca wiersza przy znacznikach

Rozdział 6. Wprowadzenie do edytorów i okien projektowych kolum n (< td> ), ale już nie przy znacznikach wierszy (< t r>). Ustawienia widoczne na rysunku 6.45 powodują, że symbole końca wiersza będą dodawane do znacznika t r przed nim i po nim, ale nie w jego obrębie.

Zarządzanie stylami i arkuszami stylów W Visual Studio dostępny jest kom pletny zestaw narzędzi do zarządzania stylami i kaskado­ wymi arkuszami stylów. Okna Manage Styles i Apply Styles służą do wykonywania standardowych zadań związanych z modyfikowaniem stylów, w tym w łączania ich dla bieżącego do k u m en tu HTML, oraz dołączania plików arkuszy stylów do takich dokum entów i odłączania ich. Trzecie narzędzie, okno CSS Properties, zawiera listę wszystkich właściwości CSS powiązanych z w ybra­ nym elem entem strony i umożliwia szybkie wprowadzenie zm ian w ich wartościach. Typowy przebieg pracy przy m odyfikow aniu stylów wygląda następująco: 1. O tw arcie strony internetow ej. 2. Zdefiniow anie nowego stylu. 3. Zastosow anie stylu. 4. D opracow anie stylu.

C zę ść II Szczegółowe omówienie środowiska IDE Rysunek 6.46 przedstaw ia okno Manage Styles. W idać tu, że wyświetla ono elementy fo rm atu ­ jące z arkusza i pozw ala na podgląd ich działania. Przycisk Options w prawym górnym rogu okna służy do kontrolow ania sposobu wyświetlania listy elem entów arkusza (według pierw ot­ nej kolejności, typu i tak dalej) i filtrow ania widocznych stylów (wszystkie, tylko używane na bieżącej stronie i tak dalej). Rysunek 6.46. Okno Manage Styles

Menage Styles | O pttons - ~ |

CSSitytn: • A:*cbve • A: hover • HI

• H2 « H3 • H4 • UL • OL • U

• .expandable • .expanded • coiapsed

• .foot • settings

• help Selected style A aB b Y yG g LU j

O kna Manage Styles i Apply Styles można otw orzyć za pomocą m enu View.

Wygląd strony w przeglądarce i sprawdzanie poprawności kodu Efektem całej pracy włożonej w utw orzenie dokum entu HTML jest jego wygląd w przeglądar­ ce. Ponieważ na rynku dostępnych jest wiele przeglądarek obsługujących różne specyfikacje HTM L-a (włączając w to XHTML), tru d n o jest zagwarantować, że zam ierzony cel znajdzie odzwierciedlenie w rzeczywistości. Ustawienie docelowej przeglądarki w Visual Studio pom aga rozwiązać ten problem, ponieważ umożliwia tworzenie kodu specyficznego dla określonego stan­ dardu HTML-a lub danej przeglądarki. W czasie wpisywania przez programistę kodu w HTM L-u w edytorze kodu Visual Studio na bieżąco sprawdza jego poprawność z uwzględnieniem cech wybranej przeglądarki. Jeśli dany znacznik narusza zasady obowiązujące w określonej przeglądarce, zostanie oznaczony znaną czerwoną falistą linią (wraz z podpowiedzią wyjaśniającą, co powoduje naruszenie reguł), a w oknie Task List pojawi się informacja o błędzie. Docelową przeglądarkę można wybrać w oknie projektowym H TM L-a lub z paska narzędzi edytora kodu źródłowego. Wystarczy wybrać odpowiedni program z listy rozwijanej.

Uwaga Zasady sprawdzania poprawności dla danej przeglądarki i standardu można dostosować do własnych potrzeb, co pozwala dodać obsługę elementów niedostępnych w Visual Studio.

Rozdział 6. Wprowadzenie do edytorów i okien projektowych Zgodność ze standardami Kod w H TM L-u wygenerowany za pom ocą okna projektowego HTMI.-a jest domyślnie zgodny z XHTM L-em (na przykład znaczniki spełniają wymagania tego standardu). Używanie różnych docelowych środowisk do sprawdzania poprawności kodu w XHTML-u pomaga się upewnić, że również kod napisany przez program istę jest zgodny ze standardam i. Autorzy V isual Studio skoncentrow ali się także na zapew nieniu zgodności ze standardam i dotyczącymi dostępności, które dotyczą wyświetlania stron internetowych z opcjami ułatwień dla osób niepełnospraw nych. M echanizm sprawdzający zgodność z tymi standardam i, Accessibility Checker, m ożna uruchom ić za pom ocą przycisku Check Page for Accessilibility dostępnego na paskach narzędzi HTML Source Editing i Formatting. Rysunek 6.47 przedstawia okno dialogowe Accessibility Validation. Można wybrać standardy, na podstawie których ma zostać sprawdzona poprawność kodu w HTML-u. Można także wybrać poziom otrzym yw anych informacji zwrotnych (błędy, ostrzeżenia lub lista tekstowa do sam o­ dzielnego spraw dzenia). Każdy elem ent oznaczony przez m echanizm sprawdzania popraw no­ ści widoczny jest w oknie Task List, co umożliwia rozwiązanie problem u. Więcej szczegółów dotyczących dw óch obsługiwanych tu standardów (WCAG i Access Board Section 508) m ożna znaleźć na odpow iednich w itrynach internetow ych: http://www.w3.org/TR/WCAGW/ i http:// www.access-board.gov/508.h tm . R ysun ek 6.47.

Ustawianie opcji sprawdzania ułatwień

Tworzenie komponentów i kontrolek W róćm y do wcześniejszego opisu form ularzy Windows. K om ponenty to kontrolki lub klasy bez reprezentacji graficznej. Jest to dobra ogólna definicja. W edług bardziej szczegółowej kom ­ ponent to dow olna klasa dziedzicząca po interfejsie System. ComponentModel. IComponent. Interfejs ten umożliwia projektowanie i obsługę zasobów. Jeśli potrzebna jest kontrolka z obsługą projektow ania, ale bez własnego interfejsu użytkownika, należy użyć kom ponentu. Kontrolki pełnią p o d o b n e funkcje, ale mają inną postać. K ontrolka to fragm ent kodu nadający się do w ielokrotnego wykorzystania i mający elementy graficzne.

C zę ść II Szczegółowe omówienie środowiska IDE Poniew aż Visual Studio udostępnia specjalne o k n o projektowe do tworzenia komponentów form ularzy W indows, om aw iam y je w odrębnym miejscu tego podrozdziału. Także w projektach W PF m ożna stosować niestandardow e kontrolki i kom ponenty, jednak odbywa się to w spo­ sób znacznie wygodniejszy i bardziej zintegrow any z ogólnym procesem rozwijania formularzy w technologii WPF. N iektóre z tych zagadnień omawiamy w dalszej części książki — w roz­ dziale poświęconym technologii WPF (rozdział 19.).

T w o rze n ie n o w e g o k o m p o n en tu lub k o n tro lk i Zacznijm y od istniejącego projektu W inForm s. Proces tworzenia kom ponentu rozpoczyna się od okna dialogowego A dd New Item (m ożna je otworzyć z menu Project). Wybór w tym oknie szablonu Component Class powoduje dodanie do projektu pliku ze szkieletem kodu i otwarcie okna projektowego kom ponentów . Aby utworzyć kontrolkę, należy użyć okna dialogowego Add New User Control.

Uwaga W Visual Studio można tworzyć dwa różne „typy” kontrolek — kon­ trolki niestandardowe i kontrolki użytkownika. Niestandardowe kontrolki dziedziczą bezpośrednio po klasie System.Windows. •-♦Forms.Control. Zwykle wymagają napisania dużych ilości kodu, ponieważ to programista jest odpowiedzialny za przygotowanie całego kodu wyświetlającego graficzne elementy kontrolki. Kontro­ lki użytkownika (nazywane czasem k o n tr o lk a m i z ło ż o n y m i) dzie­ dziczą po klasie System.Windows.Forms.UserControi. Kontrolki użytkownika mają pewną zaletę, ponieważ można je szybko tworzyć poprzez łączenie innych kontrolek, które są już dostępne w oknie narzędzi. Dlatego kod interfejsu użytkownika takich kontrolek jest już gotowy.

O kno projektowe kontrolek i komponentów działa według tych samych zasad, co okno projektowe form ularzy W indows — umożliwia przeciąganie obiektów z okna narzędzi na pow ierzchnię projektową. Załóżmy, że program ista potrzebuje kom ponentu wysyłającego co jc m in u t sygnały przez p ort szeregowy. Ponieważ Visual Studio udostępnia w ok n ie narzędzi k o m p o n en ty reprezentujące zegar i port szeregowy, m ożna użyć okna projektowego komponentów do dodania tych obiektów do własnego niestandardowego komponentu, a następnie wykorzystać ich wewnętrzne właściwości i metody, używając ich tym samym jak cegiełek pozwalających udostępnić pożądane funkcje. Rysunek 6.48 przedstawia okno projektowe kom ponentów z owym fikcyjnym kom ponentem . Zostały dodane do niego dwa elementy: zegar i kom ponent procesu.

Rozdział 6. Wprowadzenie do edytorów i okien projektowych Rysunek 6.48. Okno projektowe komponentów

Podobną sytuację można sobie wyobrazić w przypadku kontrolki użytkownika. W e wcześniejszej części rozdziału utworzyliśmy „form ularz” logowania składający się z dwóch pól tekstowych, dwóch etykiet i dwóch przycisków. M ożna przekształcić go w kontrolkę, którą m ożna łatwo umieścić w oknie narzędzi i przenieść na formularz Windows lub sieciowy.

Uw agi n a tem at p isa n ia kodu ko m p o n en tó w Ponieważ kom p o n en ty nie mają graficznych elementów, nie są dostępne właściwości związane z układem i form atow aniem znane z okna projektowego formularzy W indows. Jednak progra­ mowanie za pom ocą przeciągania jest możliwe. Visual Studio na zapleczu wstawia kod, który program owo dodaje daną klasę do kontenera kom ponentu. W oknie projektowym m ożna zmo­ dyfikować różne właściwości obiektu, dwukrotnie kliknąć dany obiekt w celu wyświetlenia jego kodu i tak dalej. Po przeniesieniu przez program istę obiektu zegara i obiektu procesu z okna narzędzi Visual Studio dołącza je do komponentu, automatycznie generując kod widoczny na listingu 6.2. Listing 6.2. Kod komponentu wygenerowany za pomocą okna projektowego namespace Contoso.UI.WindowsForms.OrderEntry { partial class Componentl { ///

C zę ść II Szczegółowe omówienie środowiska IDE I I I Required designer variable.

I I I

private System.ComponentModel.IContainer components = null; I I I I I I Clean up any resources being used.

I l l I I I true i f managed resources should he I I I disposed; otherwise, false.

protected override void Dispose(bool disposing)

{ if (disposing && (components != null))

{ components.Dispose();

} base.Dispose(disposing);

} #region Component Designer generated code / / / I I ] Required methodfor Designer support — do not modify I I I the contents o f this method with the code editor. I l l

private void InitializeComponent()

{ this.components = new System.ComponentModel.Contained); this.timerl = new System.Windows.Forms.Timer(this.components); this.serialPortl = new System.10.Ports.SerialPort(this.components);

} #endregion private System.Windows.Forms.Timer timerl; private System.10.Ports.SerialPort serialPortl;

} } Pisanie kodu działającego „na zapleczu” obiektów umieszczonych na płótnie okna projektowego komponentów jest całkiem proste. Wystarczy dwukrotnie kliknąć ikonę danego obiektu, a środo­ wisko otworzy edytor kodu. Na przykład dw ukrotne kliknięcie ikony zegara widocznego na powierzchni projektowej spowoduje utworzenie procedur)' timerl T ic k i otwarcie jej w edytorze.

Rozdział 6. Wprowadzenie do edytorów i okien projektowych

Tworzenie klas za pomocą okna Class Designer Ostatnie okno projektow e, które om aw iam y w tym rozdziale, to Class Designer. D iagram klasy w tym oknie um ożliw ia podgląd kodu w jego statycznej (spoczymkowej) postaci. M ożna też zsynchronizować model i sam kod w czasie rzeczywistym. O kno projektowe klas należy traktować bardziej jak w izualny edytor kodu niż okno z diagram em . Z m iany w prow adzone w kodzie są odzwierciedlane na diagram ie i na odw rót.

T w o rze n ie d iag ram u k la sy Jest kilka sposobów na utworzenie diagram u klasy. Pierwszy z nich polega na dodaniu diagra­ mu do projektu za pom ocą okna dialogowego Add New Item. Należy w nim wybrać szablon diagramu klasy (. cd ) i dodać go do projektu. Następnie m ożna umieszczać na diagram ie ele­ menty z okna narzędzi lub istniejących klas z okna Solution Explorer. Drugi sposób polega na w ybraniu opcji View Class Diagram z m enu podręcznego danego projektu. W tedy środow isko Visual Studio wygeneruje diagram klasy na podstawie istniejącego projektu. To podejście zaprezentowano na rysunku 6.49. Rysunek 6.49. Uruchamianie okna projektowego klas

C zę ść II Szczegółowe omówienie środowiska IDE O ba rozwiązania prow adzą do dodania d o projektu pliku .cd zawierającego wizualny model klas. Oczywiste jest, że opcja View Class Diagram pozwala przyspieszyć pracę, ponieważ nie trzeba przeciągać wszystkich elem entów na diagram . Na rysunku 6.50 pokazano przykładowy plik .cd. Dalej om aw iam y każde okno w idoczne w opisywanym oknie dialogowym. Rysunek 6.50. Okno projektowe klas

Fife £dit View Fełattof Project guild Debug Teaej Class Diagiarn Djta Tools Tejt Analyse Window j

Help > _ J -

J

'

?*«9

U • ->



*=

*J

..

. s aT an "J ;

C lisH M vam ud* x

Customer Cuss

:n m

Invoice Class

Otde

Product

:tass

Gass

C IS ! tr ip le ,**6 *5 *

Class Datads - tm ployeeSase

Type

.I B M *

M ethods

*

Properties


- fields

Wyświetlanie składowych Ikona strzałki (skierowanej w górę lub w dół) w prawym górnym rogu każdego obiektu w oknie projektowym służy do wyświetlania lub ukryw ania składowych. Pozwala to zwolnić miejsce na ekranie, jeśli program ista chce zobaczyć składow e tylko jednej klasy. Pasek narzędzi okna projektowego klas służy d o określenia sposobu grupowania wyświetlanych składowych, a także dodatkowych inform acji widocznych na ekranie. M ożna na przykład p o ­ sortować składowe alfabetycznie, pogrupow ać je według rodzaju (właściwości, m etody i tak dalej) lub pogrupować ze względu na sposób dostępu (publiczny, pryw atny i tak dalej). N a­ stępnie można określić, że środowisko m a wyświetlać tylko nazwy składowych, nazwy i typy lub pełne sygnatury.

D o d aw an ie elem en tó w d o d iag ram u Elementy można dodaw ać do okna projektow ego klas za pom ocą okna narzędzi lub okna Solution Explorer. O kno narzędzi służy do wstawiania nowych elementów'. O kno Solution Explorer pozwala dodać do diagramu istniejące klasy. Przy stosow aniu każdej z technik wy­ starczy przeciągnąć elem ent do okna projektow ego klas. Jeśli dany elem ent już istnieje, Visual

Rozdział 6. Wprowadzenie do edytorów i okien projektowych Studio autom atycznie wygeneruje szczegółowe inform acje o klasie. Jeżeli plik zawiera więcej niż jedną klasę, na diagram ie pojawi się obiekt odpowiadający każdej z nich. Na rysunku 6.51 pokazano elem enty z kategorii Class Designer okna narzędzi. W arto zauwa­ żyć, że można dodaw ać wszystkie elementy związane z program ow aniem obiektowym — klasy, interfejsy, dziedziczenie i tak dalej. Rysunek 6.51. Kategoria Class Designer w oknie narzędzi

Toolbox s C lass Designer Pointer i C lass n Enum E Interface 0 Abstract Class 0 Struct H Delegate O

ctor < S h o rtc u t> c to r< / S h o rtc u t>

Code snippet for constructor Microsoft Corporation

Expansion



classname Class name ClassName() ClassNamePlaceholder





C zę ść III Tworzenie kodu i zarządzanie nim Podstaw owa stru k tu ra deklaracji powyższego fragm entu kodu jest opisana w tabeli 8.2. Bar­ dziej w yczerpujące omówienie szablonów można znaleźć w systemie pomocy MSDN Visual Studio, w węźle Integrated Development Environment fo r Visual Studio/Reference/XML Schema References/Code Snippets Schema Reference. Tabela 8.2. Opisy węzłów XML używanych *v plikach z fragmentami kodu

Węzeł XML

Opis

Element nadrzędny dla wszystkich informacji o fragmentach kodu. Określona jest w nim przestrzeń nazw języka XML służąca do definiowania fragmentów kodu w Visual Studio.

Główny element danego fragmentu kodu. Ten znacznik określa informacje o formacie fragmentu. Choc w jednym elemencie < C o d e S n ip p e t s > można umieścić wiele elementów C o d e S n ip p e t , zwykle w każdym pliku znajduje się tylko jeden fragment kodu.

Kontener na metadane opisujące dany fragment kodu.

Tytuł fragmentu kodu.

Zwykle ta sama wartość, co w tytule. Tekst tego elementu pojawia się na liście rozwijanej z fragmentami kodu.

Opis fragmentu kodu.

Autor fragmentu kodu.

Element nadrzędny przechowujący elementy opisujące typ fragmentu kodu.

Typ fragmentu kodu: E x p a n s io n , R e f a c t o r i n g lub S u r r o u n d s W ith . Nie można tworzyć niestandardowych fragmentów związanych z refaktoryzacją. Ta właściwość informuje Visual Studio o tym, w którym miejscu okna edytora należy wstawić dany fragment kodu. Fragmenty typu E x p a n s io n s ą wstawiane tam, gdzie znajduje się kursor. Fragmenty S u r r o u n d s W ith środowisko wstawia przed i po kodzie określonym przez bieżącą pozycję kursora lub zaznaczenia.

Główny element zawierający kod fragmentu.

Główny element literałów i obiektów używanych przez fragment kodu.

Łańcuch znaków, którego wartość można określić w procesie dodawania fragmentu kodu. Atrybut E d i t a b l e tego znacznika określa, czy literał jest statyczny, czy też można go modyfikować. Fragment kodu c to r nie zawiera literałów, które można zmieniać. Warto porównać go z fragmentem służącym do ustawiania przezroczystości, który w czasie wstawiania umożliwia podanie nazwy formularza.

Niepowtarzalny identyfikator literału.

Podpowiedż wyświetlana w momencie umieszczenia kursora nad literałem.

Nazwa funkcji (zobacz opis w tabeli 8.3) wywoływanej w momencie, kiedy literał stanie się aktywny. Funkcji można używać tylko we fragmentach kodu języka C#.

Domyślny literał wstawiany w edytorze.

Element zawierający wstawiany kod.

Rozdział 8. Korzystanie z narzędzi zwiększających produktywność Najważniejsze w pisaniu fragm entów kodu jest to, aby zrozumieć, jak działa zastępowanie literałów i zmiennych. Załóżmy, że programista chce utworzyć fragment kodu języka C# wyświe­ tlający prosty kom entarz. K om entarz ma inform ow ać, że klasa została oceniona i zaakcepto­ wana w procesie analizy kodu. Oznacza to, że fragment ma umożliwiać dodawanie komentarzy podobnych do poniższego: / / Analiza kodu ContextToken. // Recenzent: Lars Powers II Data: 1/1/2010 II Stan: Zatwierdzono

W tym fragmencie kodu cztery literały należy traktować jako zmienne. Mogą się one zmieniać za każdym razem, kiedy program ista użyje tego fragmentu kodu. Są to: nazwa klasy, imię i nazwisko recenzenta, data oraz informacje o stanie. Można zadeklarować te elementy w sekcji D e c la ra tio n s:

classname Nazwa sprawdzanej klasy/typu ClassName() TuNazwaKlasy

cLiteral Editable="true"> reviewe r Imie i nazwisko recenzenta ImieINazwiskoRecenzenta

currdate Data sprawdzania DataSprawadzania

cLiteral Editable=''true"> clD>approvalc/iD> cToolTip>Zamien na "Zatwierdzono" lub ”Odrzucono"c/ToolTip> cDefault>Zatwierdzono c/Literal> c/Declarations>

W arto zwrócić uwagę, że powyższy kod wywołuje funkcję, która określa nazw ę klasy we frag­ m encie kodu. Takie funkcje są dostępne jedynie w języku O . Ich d o k u m en tacja znajduje się w tabeli 8.3. W przypadku pozostałych literałów to program ista musi podać w odpowiednich miejscach popraw ne wartości. Należy także udostępnić pew ne podstawowe inform acje nagłówkowe: cHeader> cTitle>recenzjac/Title> cShortcut>recenzjac/Shortcut> Komentarze dotyczące recenzji koduc/Description> cAuthor>L. Powersc/Author>

C zę ść III Tworzenie kodu i zarządzanie nim Expansion

Tabela 8.3. Funkcje dostępne we fragm entach kodu

Funkcja

O pis

GenerateSwitchCases (lite ra lw y lic ze n ia )

Tworzy składnię instrukcji s w it c h obejmującą instrukcje c a s e dla wszystkich wartości zdefin iowa nych w wyliczeniu i i t e r a l w y 1 i c z e n i a (C#i J #).

ClassName()

Wstawia nazwę klasy zawierającej dany fragment kodu (C# i J#).

SimpleT ypeName ( n a z w a t y p u )

Pobiera nazwę typu określonego za pomocą literału n a z w a t y p u i zwraca najkrótszą możliwą nazwę, uwzględniając instrukcje u s in g obowiązujące w bieżącym bloku kodu. Na przykład wywołanie S im p le T y p e N a m e ( S y s t e m .E x c e p t io n ) zwróci E x c e p t io n , jeśli w pliku znajduje się instrukcja u s in g S y s te m (C#).

CallBase ( p a r a m e t r )

Przydatna przy tworzeniu szkieletów składowych, które używają typu bazowego lub zwracają go. Jeśli jako p a r a m e t r podana jest wartość g e t , s e t lub m e th o d , wywołany zostanie dany akcesor lub metoda klasy bazowej (Of).

Ostatnie zadanie polega na zaim plem entow aniu elem entu z tekstem fragm entu kodu i referencjami do zdefiniowanych wcześniej literałów.

< ! [ CDATA [ / / Analiza kodu ScIassnameS. / / Recenzent: SreviewerS I I Data: ScurrdateS I I Zatwierdzono: Sapprova/S] ]>

Po uruchomieniu tego fragmentu kodu środowisko zastąpi literał)' (otoczone symbolami $ w p o ­ wyższym kodzie) podanymi wartościami domyślnymi i wyróżni je, aby umożliwić użytkownikowi łatwe zmodyfikowanie danych w edytorze. Literał $ c l a s s n a m e $ działa nieco inaczej — zgłasza wywołanie funkcji C la s s N a m e ( ), aby pobrać nazwę klasy, w której znajduje się kod. Teraz fragm ent kodu jest składniowo kompletny. C hoć powyższy fragment dodaje k o m e n ta ­ rze, taki sam proces prowadzi do tw orzenia fragmentów generujących kod. M ają one taką samą strukturę. Jeśli programista chciałby napisać otaczający fragment kodu, powinien zmienić wartość elementu < S n ip p e t T y p e > na S u r r o u n d s W it h . Teraz trzeba poinformować o nowym fragmencie środow isko Visual Studio. Dodawanie fragmentów kodu do środowiska Visual Studio Można użyć edytora XML-a środowiska Visual Studio w celu utworzenia dokum entu XMI, i zapi­ sania go w katalogu. Dużą zaletą takiego podejścia jest możliwość wykorzystania m echanizm u IntelliSense wraz z szablonem XML fragm entów kodu. Pom aga to wpisywać nazwy elem entów

Rozdział 8. Korzystanie z narzędzi zwiększających produktywność i określać relacje między nim i. Instalator środow iska Visual Studio tw orzy dom yślny katalog przeznaczony na niestandardow e fragmenty kodu. Znajduje się on w katalogu Dokumenty: użytkownik\Dokumenty\Visual Studio 2010\Code SnippetsWisual Ot\My Code Snippets. Visual Studio autom atycznie udostępnia fragm enty kodu opisane w szablonach XML umieszczonych w tym katalogu.

W skazówka Jeśli fragm ent kodu um ieszczony w odpowiednim katalogu nie pojawia się w oknie dialogowym C o d e S n i p p e t s M a n a g e r , plik prawdopodobnie zawiera błąd składni. Aby to sprawdzić, należy spróbować zaimportować plik za pomocą przycisku I m p o r t . Visual Studio natychmiast poinform uje, czy plik z fragmentem kodu jest prawidłowy.

O kno dialogowe Code Snippets Manager (można je uruchom ić w m enu Tools) to główne na­ rzędzie do przeglądania dostępnych fragmentów kodu, dodaw ania nowych i usuwania istnieją­ cych (rysunek 8.20). Jak widać na rysunku, fragment kodu dodający inform acje o recenzjach jest w idoczny w katalogu My Code Snippets. R y su n e k 8 .2 0 .

Okno Code Snippets Manager

C o d e S n ip p e t s M a n a g e f

Language: Visual C# Location: C.'\Users\Tomek\Documents\Visual Studio 2010\Code SnippetsWisual C*\M y Code Snippets\recenjga.snippet : L A ASP.NET MVC 2

Description Komentarze dotyczące recenzji kodu

t J r My Code Snippets recenzja : ^

NetFX30

’ TŁ Office Development

r>

LAOther

Snippet Types Expansion

l L i i Refactoring & L i i Test l> CA Visual C *

Add...

L. Powers

Remove

Import...

OK

Cancel

M ożna także dodać inne okna oprócz tych standardowych. W tym celu należy kliknąć przycisk A d d , co pozwala dodać nowe katalogi, w których Visual Studio będzie szukać wyświetlanych fragm entów kodu. Rysunek 8.21 przedstawia efekt dodania nowego fragm entu kodu.

C zę ść III Tworzenie kodu i zarządzanie nim

Wskazówka Fragmenty kodu można przeglądać i udostępniać także przez sieć (informacje o społeczności internetowej znajdują się w rozdziale 7., „Społeczność .NET — interakcje w internecie”). D oskonałym sposobem na lepsze zrozumienie struktury i działania fragmentów kodu jest zapoznanie się z plikami fragmentów dostępnych w Visual Studio, a także plikami utworzonymi przez społeczność progra­ mistów.

Fragmenty kodu w oknie narzędzi Choć ta możliwość technicznie nie jest częścią oficjalnej technologii obsługi fragm entów kodu środowiska Visual Studio, m ożna dodaw ać takie fragm enty także do okna narzędzi. N ajpierw należy zaznaczyć tekst w edytorze, a potem upuścić go w oknie narzędzi. Następnie można wyko­ rzystać dany fragment w dowolnym momencie, przeciągając go z okna narzędzi do otwartego okna edytora.

Rozdział 8. Korzystanie z narzędzi zwiększających produktywność

Dopasowywanie nawiasów W językach programowania stosowane są nawiasy, nawiasy klamrowe, nawiasy ostre i inne ograniczniki, które obejmują argum enty funkcji, wyznaczają kolejność wykonywania funkcji matematycznych czy zawierają kod ciała funkcji. Wykrycie braku pasującego ogranicznika (czyli sytuacja, w której w kodzie jest więcej otwierających nawiasów niż zam ykających) może być trudne, zwłaszcza w przypadku kodu z wieloma poziom am i zagnieżdżenia. Dopasowywanie nawiasów dotyczy graficznych wskazówek, za pom ocą których edytor kodu inform uje programistę o pasujących ogranicznikach. Gdy programista pisze kod w edytorze, za każdym razem, kiedy doda zamykający ogranicznik, środowisko na krótko wyróżnia oba nawiasy. Na rysunku 8.22 mechanizm dopasowywania nawiasów pomaga określić pasujące do siebie ogra­ niczniki wewnętrznej pętli fo r . R y su n e k 8.22.

Dopasowywanie nawiasów

M ożna także uruchomić dopasow yw anie naw iasów , umieszczając kursor bezpośrednio po lewej stronie otwierającego ogranicznika lub po prawej stronie zamykającego. Jeśli programista przegląda proce­ durę pełną nawiasów i nawiasów klamrowych, m oże szybko wykryć pasujące pary, umieszczając kursor obok różnych ograniczników.

C zę ść III Tworzenie kodu i zarządzanie nim Choć ta właściwość nazywana jest dopasowywaniem nawiasów, obsługuje różne rodzaje ogra­ niczników: • N aw iasy— (). • Nawiasy kwadratowe i ostre — [],< > . • Cudzysłowy — "". • Nawiasy klamrowe — {}. W języku C# dopasowywanie nawiasów obsługuje także następujące pary słów kluczowych (służą one do ograniczania bloków kodu za pom ocą słów kluczowych):

• # r e g io n , # e n d r e g io n . • # i f , # e ls e , # e n d if. • c a s e , b re a k . • d e f a u lt , b re a k . • f o r , b re a k , c o n t in u e . • i f , e ls e . • w h ile , b re a k , c o n t in u e .

Dostosowywanie mechanizmu IntelliSense do własnych potrzeb N iektóre właściwości IntelliSense można dostosować do własnych potrzeb za pomocą okna dialogowego Options środowiska Visual Studio. Te modyfikacje dotyczą poszczególnych języków. Po otwarciu okna dialogowego Options (z menu Tools) i przejściu do węzła Text Editor widoczne są opcje mechanizmu IntelliSense w mylący sposób rozproszone między strony General i IntelliSense. Rysunek 8.23 przedstawia stronę IntelliSense okna dialogowego Options z opcjami dla języka C#. R y su n ek 8.23.

Opcje mechanizmu IntelliSense

Rozdział 8. Korzystanie z narzędzi zwiększających produktywność Sekcja Completion Lists w tym oknie dotyczy wszelkich właściwości m echanizm u IntelliSense, które obsługują automatyczne uzupełnianie kodu (na przykład wybierania składowych i listy do uzupełniania słów). W tabeli 8.4 opisano opcje dostępne w tym oknie dialogowym. Tabela 8.4. Opcje mechanizmu IntelliSense Opcja

Działanie

S how C om pletion List A fter

Zaznaczenie tego pola powoduje, że funkcja uzupełniania słów jest automatycznie uruchamiana po wpisaniu znaku w oknie edytora.

a Character Is Typed Place K eywords in Completion Lists

Place Code S nipp ets in Completion Lists

|

Jeśli to pole jest zaznaczone, na liście uzupełniania widoczne będą słowa kluczowe danego języka. Na przykład w języku C# na tej liście znajdą się słowa kluczowe c l a s s czy s t r i n g . Zaznaczenie tego pola powoduje dodanie aliasów fragm entów kodu do wyświetlanych list uzupełniania.

Following Characters

To pole zawiera znaki, które powodują uzupełnienie tekstu przez mechanizm IntelliSense. Oznacza to, że wpisanie dowolnego ze znaków z tego pola tekstowego w czasie, kiedy widoczna jest lista uzupełniania, powoduje wstawienie bieżącego wyboru w oknie edytora.

C om m itted b y Pressing the

Jeśli to pole jest zaznaczone, wciśnięcie spacji powoduje wstawienie bieżącego wyboru.

C om m itted b y Typing th e

Space Bar A d d N ew Line o n Enter a t E nd o f Fully Typed Word

Pre-select M o s t Recently Used M em bers

Zaznaczenie tego pola powoduje przesunięcie kursora do następnego wiersza po wpisaniu całego słowa w polu listy IntelliSense. Jest to przydatne wtedy, jeśli po danych słowach kluczowych zwykle nie występuje w wierszu dalszy kod. Jeśli to pole jest zaznaczone, IntelliSense będzie przechowywać listę najczęściej używanych składowych poszczególnych typów i korzystać z niej. Ta lista służy do wybierania domyślnych składowych na liście uzupełniania.

Okno Task List Lista w o k n ie Task List to zintegrow ana lista zadań do wykonania. O bejm uje ona wszystkie elem enty, które z jakiegoś pow odu wymagają uwagi lub kontroli. O kno Task List wyświetla tę listę i pozwala wchodzić z nią w interakcje. Aby wyświetlić okno, należy otworzyć menu View i wy­ brać opcję Task List. Rysunek 8.24 przedstawia okno Task List wyświetlające kilka zadań. Te zadania m ogą należeć do jednej z trzech kategorii: zadania związane z kom entarzam i, zadania zw iązane ze skrótami i zadania użytkownika. Jednocześnie m ożna wyświetlać zadania z tylko jednej kategorii. Lista rozw ijana widoczna u góry okna Task List pozwrala określić kategorię wyświetlanych zadań. K ażda kategoria wiąże się z nieco innym i kolum nam i, choć kolum ny Priority i De­ scription są widoczne w' każdym przypadku. Na przykład zadania użytkownika i związane ze skró­ tami udostępniają pole wyboru, które służy do zaznaczania zakończonych zadań, a zadaniom związanym ze skrótami i kom entarzam i towarzyszą nazwa pliku oraz n u m er wiersza.

C zę ść III Tworzenie kodu i zarządzanie nim Rysunek 8.24.

Okno Task List

M ożna posortow ać zadania w edług dowolnej kolum ny listy. Kliknięcie praw ym przyciskiem myszy nagłówka kolumny pow oduje wyświetlenie m enu podręcznego umożliwiającego zm ianę sposobu sortowania, a także w ybór wyświetlanych kolum n z listy wszystkich obsługiwanych.

Zadania związane z komentarzami Zadania związane z kom entarzam i są tworzone w kodzie źródłowym. Umieszczenie komentarza ze specjalnym literałem (znacznikiem ) powoduje dodanie go przez Visual Studio do listy zadań zw iązanych z kom entarzam i. W Visual Studio do stęp n e są trzy takie znaczniki: HACK, TODO i UNDONE. Aby wyświetlić je w oknie zadań, należy zaznaczyć opcję Comments na liście ro z­ wijanej w górnej części listy zadań. Na przykład poniższy kod języka C# powoduje dodanie do listy czterech różnych zadań zw ią­ zanych z komentarzami: namespace Contoso.Fx.Integration.Specialized { / / TODO: Zaimplementować dragi konstruktor

public class MessageMapper : IMessageSink { public MessageMapper()

( >

/ / TODO: Sprawdzić implementacji'(interfejsu IMap

public class MessageBus : MessageMapper { public MessageBus()

{ / /UNDONE: Konstruktor MessageBus

} } / / HACK: Napisać od nowa TokenStruct

public class ContextToken { public ContextToken!)

{ } public ContextToken(string guid)

Rozdział 8. Korzystanie z narzędzi zwiększających produktywność { > } > D w ukrotne kliknięcie zadania związanego z kom entarzem pozwala przejść bezpośrednio do wiersza danego kom entarza w oknie edytora.

Niestandardowe znaczniki w komentarzach W razie potrzeby m ożna dodać własny zestaw znaczników rozpoznaw anych jako zadania związane z kom entarzam i. W oknie dialogowym Tools/Options należy otw orzyć stronę Task List znajdującą się w węźle Environment. W tym miejscu m ożna dodaw ać, m odyfikow ać i usu­ wać znaczniki kom entarzy obsługiwane na liście zadań. Na rysunku 8.25 widoczny jest znacznik REVIEW dodany do standardow ej listy. W arto zauwa­ żyć, że m ożna także ustawić priorytety dla znaczników lub doprecyzować sposób ich wyświetlania, używając pól wyboru na stronie Task List okna Options. Te pola pozwalają określić, czy usuwa­ nie zadań wymaga potwierdzenia, czy nie, a także czy na liście wyświetlane są sam e nazwy plików, czy pełne ścieżki. Rysunek 8.25. Dodawanie niestandardowego znacznika zadań związanych z komentarzami

Zadania związane ze skrótami Z adania związane ze skrótam i to odnośniki do wierszy kodu. Te o d n o śn ik i można dodać za pom ocą m enu Bookmarks. W tym celu należy umieścić kursor w odpow iednim wierszu i wybrać opcję Edit/Bookmarks/Add Task List Shortcut. Zawartość tego wiersza kodu będzie widoczna jako opis zadania. D w ukrotne kliknięcie zadania powoduje bezpośrednie przejście do odpow iedniego wiersza edytora kodu.

C zę ść III Tworzenie kodu i zarządzanie nim

Zadania użytkownika Z ad an ia użytkownika są wpisywane bezpośrednio w oknie zadań. O bok listy rozwijanej z kate­ goriam i zadań okna Task Ust widoczny jest przycisk Create User Task (zobacz rysunek 8.24). Przycisk pozwala dodać nowy wpis do listy. Następnie można bezpośrednio wpisać tekst w ko­ lum nie opisu w celu określenia tytułu zadania. W przeciwieństwie do zadań związanych ze skrótam i i komentarzami zadania użytkownika nie prow adzą do specyficznych wierszy kodu.

Uwaga M o d e l a u to m a ty z a c ji śr o d o w isk a V isu al S tu d io u m o ż liw ia p e łn ą k o n tr o lę nad listą zadań. U żyw ając dostępn ych o b iek tó w a u to m a ­ tyzacji, takich jak TaskList czy TaskListEvents, m ożn a na przy­ k ład p ro g ra m o w o d o d a w a ć i usuw ać zad an ia z listy , reagow ać na d o d a n ie , m o d y fik a cję, a n a w et wy bór za d a n ia , c z y k o n tr o lo w a ć p o w ią z a n ia m ięd zy z a d a n ie m a edytorem .

Podsumowanie Visual Studio 2010 udostępnia niezwykłą liczbę funkcji zwiększających produktyw ność p ro ­ gram istów . Ten rozdział opisuje wiele aspektów technologii IntelliSense: o d uzupełniania in ­ strukcji, po nową metodę wstawiania fragmentów kodu. Pokazaliśmy także, jak korzystać z różnych elementów IntelliSense w celu szybszego pisania kodu oraz poprawy jego jakości. Opisaliśm y tu techniki nawigowania po skom plikow anych i zagm atw anych plikach z kodem oraz przeglądania ich. Przedstawiliśmy także fragm enty kodu oraz opisaliśm y różne ich typy oraz zastosowania. Na zakończenie pokazaliśmy, jak używać okna Task Ust, aby wykorzystać wszystkie jego m o ż­ liwości, a także jak organizować i śledzić różne zadania do wykonania obecne w każdym p ro ­ jekcie programistycznym. Z punktu widzenia produktyw ności Visual Studio 2010 to coś więcej niż sum a jego części. Dzięki synergii między poszczególnymi elementami środowiska każda z właściwości znosi bariery i łagodzi bolączki programistów niezależnie od ich wcześniejszych doświadczeń, poziomu biegłości czy preferowanego języka.

Rozdział 9. Testowanie kodu

C zę ść III Tworzenie kodu i zarządzanie nim W tym rozdziale: • Podstawy testów jednostek • Platforma testów jednostek • Pisanie testów jednostek działających w ASP.NET • Konfigurowanie atrybutów testów jednostek • Tworzenie testów uporządkowanych • O rganizowanie testów Programiści zawsze byli odpowiedzialni za testowanie kodu przed udostępnieniem go testerom lub użytkownikom. W przeszłości oznaczało to przejście przez każdy wiersz kodu w debugerze (w łączając w to wszystkie w arunki i błędy). W tym celu często trzeba było przygotować a p li­ kacje testowe z operacjam i potrzebnym i do w ykonania kodu. Przejście przez cały kod pozw a­ lało dojść do celu, ale nie zawsze program istom chciało się to robić (i bardzo trudno było to sprawdzić). W praktyce całą tę operację często pom ijano w czasie wprowadzania zmian w k o ­ dzie i jego aktualizacji. Opisany proces utrudniał ponadto ustalenie, czy zmiany w kodzie w pły­ wają na inne części system u, a także pow odow ał przesyłanie testerom i użytkow nikom w ersji o niższej jakości, co zwiększało liczbę usterek oraz wydłużało czas potrzebny na przesyłanie kodu tam i z pow rotem między program istam i a testerami. Ten mechanizm (i efekty jego stosowania) wskazywał na potrzebę automatyzacji testow ania jednostek. W efekcie powstały różne przeznaczone do tego platformy. Pierwszą taką platformą dla .NET była NUnit ( nmiit.org) — projekt o otwartym dostępie do kodu źródłowego działający dla większości języków .NET, który umożliwia pisanie kodu służącego do testowania innego kodu. Podobna platforma została wbudowana w Visual Studio 2005 i jest dostępna także w obecnej wersji. Platform a testów jednostek w Visual Studio umożliwia kompilowanie testów wraz z aplikacją. M ożna też zdecydować się na zastosowanie program ow ania sterowanego testami i przygotować testy przed rozpoczęciem pisania kodu. W każdym przypadku ustrukturyzow ane podejście do testów jednostek m oże doprow adzić do utw orzenia pełnego zestawu testów w spółpracującego z aplikacją. Pełny zestaw testów może składać się na test regresji dla większości kom ponentów , a nawet dla całego systemu. Daje to większą pewność przy wykonywaniu operacji, które wcześniej były bardzo ryzykowne, na przykład przy wprowadzaniu popraw ek w ostatniej chwili, dokonywaniu refaktoryzacji czy dodawaniu elementów tuż przed zakończeniem pracy. Przy wykonywaniu tych działań można wykorzystać pełny zestaw testów jednostek do sprawdzenia, jakie elem enty (i czy w ogóle) zostały zepsute w wyniku wprowadzenia zmian. W tym rozdziale opisano wiele narzędzi, technologii i technik przeprow adzania testów przez programistów. Dzięki tym inform acjom m ożna zacząć czerpać liczne korzyści ze zau to m aty ­ zowanych testów dostępnych program istom . Prow adzą one do zm niejszenia liczby błędów , powstawania bardziej zrozumiałego kodu i większej pewności przy uprow adzaniu zmian w kodzie.

Rozdział 9. Testowanie kodu

Podstawy testów jednostek Testy jed n o stek w Visual Studio polegają na tw orzeniu testów sprawdzających kod warstw aplikacji. W arstw y obejmują liczne klasy z obszaru logiki biznesowej i obsługi danych. Do spraw dzania interfejsu użytkow nika służą zwykle inne m etody autom atycznego testowania. Są one przeznaczone głównie dla testerów. Potrzebne do tego funkcje i produkty znajdują się w wersji Prem ium środow iska Visual Studio, dlatego nie opisujem y ich w tym m iejscu. W zamian koncentrujem y się na tw orzeniu kodu do testowania innego kodu. Oczywiście, zakładamy przy tym, że program ista w czasie rozwijania aplikacji stosuje prawidłowe techniki budowania architek­ tury w arstwow ej. W tym podrozdziale omawiamy podstawy' pisania testów jednostek. W dal­ szych p u n k tach szczegółowo opisujem y przedstawione tu zagadnienia.

Tworzenie projektu testów Testy program istów trzeba um ieszczać w projektach testów'. Projekt zaw iera odpow iednie referencje d o platformy testów jednostek i trzeba skonfigurow ać go tak, aby m ożna go było uruchom ić za pomocą narzędzi testowych wbudowanych w' Visual Studio. Istnieją dwa główne sposoby tw orzenia projektów testów jednostek. M ożna przygotować projekt testów w środow i­ sku IDE lub autom atycznie wygenerować testy jednostek dla istniejącego kodu w nowym pro­ jekcie testów . Zaczniemy od pierwszej z tych możliwości.

C zę ść III Tworzenie kodu i zarządzanie nim

Dobre praktyki tworzenia projektów i klas testów N a leży u sta lić r e g u ły ok reślające lic z b ę p ro jek tó w testó w tw o r z o n y c h d la ro zw ią za n ia . Z w ykle p r o g r a m iś c i tw orzą jed en p ro jek t testó w dla k a żd eg o sp ra w d za n eg o p rojek tu . N a p rzyk ład je ś li w jed n y m p ro jek cie z n a jd u ją się o b ie k ty b iz n e s o w e , a w in n ym u s łu g i zw ią za n e z d a n y m i, m o żn a u tw o r z y ć d w a p rojek ty te s to w e (p o jed n y m dla k a ż d e g o p rojek tu g łó w n e g o ). N ie jest to je d n a k w y m ó g , a jed yn ie s p o s ó b na ła tw e z r o z u m ie n ie o rgan izacji k o d u . P o d o b n e za sa d y d o ty c z ą klas te stó w . N a le ż y u tw orzyć je d n ą k la sę te stó w dla k ażd ej klasy ze sp r a w d z a n e g o d o c e lo w e g o p r o je k tu . Jeśli p ro g ra m ista tw orzy projekt te s tó w dla k od u lo g ik i b iz n e so w e j o b e jm u ją c e g o o b iek ty Customer i Order, p o w in ie n p r z y ­ go to w a ć klasy CustomerTest i OrderTest. N ie jest to k o n ie c z n e , ale p row ad zi d o d o ­ b rego, lo g ic z n e g o u p o rzą d k o w a n ia k o d u .

Projekt testów W czasie tworzenia nowego projektu testów Visual Studio dodaje referencje do platformy testów jednostek ( M i c r o s o f t . V i s u a l S t u d i o . Q u a l i t y T o o l s . U n it T e s t F r a m e w o r k ) . Ponadto dodaje do rozwiązania dwa pliki (w katalogu Solution Items). Są to pliki z konfiguracją (ustaw ieniam i) testów. Ich nazwy to Local.testsettings i TraceAndTestlmpact.testsettings. W projekcie testów tw orzona jest też klasa testów używana do pisania testów jednostek. Na rysunku 9.2 pokazano każdy z tych elem entów w oknie Solution Explorer. Poszczególne pliki om aw iam y szczegółowo w dalszych punktach. Rysunek 9.2. Projekt testów i powiązane elementy w oknie Solution Explorer

Solu tion Explorer U

J

i l

• n

x

f i

Solution 'C arioso [4 projects) Solution hems t l Contoso.tzsmdi Local testsrttmgs " ..................... , TraceAndTestJmpact.testsettings ___________________ 4 .j9 BusmessDomaei j j l Properties References Author.cs Bcok.cs •j) Customer cs Jjt) IBusmessOtject cs Order.cs Vendor.cs 4 BusJnevsDorruMtlJnJtTests Properties 4 W References J Microsoft. VisualStudio QuaityTools.UnitTestFramework ■ U System •U System.Core 0 CustomerTests.es ■ ■ > , ' Ą ContosoWeb t» ^ OataServKes s

ft? S ch em a View f t " Properties

Solution Explorer

ft

Test View

Ustawienia konfiguracji testów Ustawienia konfiguracji testów wpływu zmian

Projekt testów Referencja do platformy testowej Klasa testów

Rozdział 9. Testowanie kodu Do projektu m ożna dodać nowe pliki testów. W tym celu należy kliknąć praw ym przyciskiem myszy projekt testów i wybrać opcję Add/New Test. Ponadto można użyć m enu Project i otw o­ rzyć okno dialogow e Add New Test widoczne na rysunku 9.3. W tym m iejscu dostępne są następujące opcje: • Basic Unit Test. Ten szablon tworzy prostą klasę testów z pustą metodą testową. Używa się go zwykle przy tw orzeniu testów od podstaw (bez korzystania z funkcji autom a­ tycznego generowania testów). • Database Unit Test. Ten szablon służy do tw orzenia testów jed n o stek wykonywa­ nych na procedurach składow anych z bazy danych (do stosow ania tej funkcji po­ trzebna jest wersja Prem ium środowiska Visual Studio). •

Ordered Test. Ten szablon umożliwia utw orzenie sekwencyjnej listy wspólnie wyko­ nywanych testów (zobacz podrozdział „Tworzenie testów uporządkow anych” w dal­ szej części rozdziału).



U nit Test. Ten szablon tw orzy pustą klasę testów jednostek korzystającą z obiektu do śledzenia kontekstu testów. Tego typu klasy testów jednostek są generow ane auto­ m atycznie (zobacz punkt „Generowanie testów na podstawie istniejącego kodu”).



U nit Test Wizard. Ten szablon uruchamia kreator Unit Test W izard służący do au­ tom atycznego generow ania testów na podstaw ie istniejącego kodu rozwiązania (zo­ bacz punkt „Generowanie testów na podstawie istniejącego k o d u ”).

Rysunek 9.3. Za pomocą okna dialogowego Add New Test można dodawać nowe testy do projektu testów

Menu Test Menu Test m ożna wykorzystać do uzyskania dostępu do wszystkich funkcji środow iska Visual Studio związanych z testami przeprowadzanymi przez programistów. M enu pozwala między in­ nymi dodaw ać klasy testów jednostek do projektu testów ( Test/New Test). M ożna go ponadto

C zę ść III Tworzenie kodu i zarządzanie nim

Rozdział 9. Testowanie kodu W ygenerow any kod to dobry p u n k t wyjścia do rozwijania testów jednostek. V isual Studio analizuje m etody i właściwości klasy, na podstawie której program ista chce wygenerować testy, oraz tw orzy prawdziwe, możliwe do uruchom ienia testy. Oczywiście, trzeba dokończyć każdy test przez dodanie odpow iednich w artości zmiennych i asercji, jednak kod wygenerowany przez narzędzia to dobry punkt wyjścia. Przyjrzyjmy się przykładowi. Załóżmy, że programista używa obiektu C u s t o m e r zawierającego standardowe właściwości, takie jak N am e, A d d r e s s , P h o n e i E m a il. Może także zawierać inne m etody, takie jak S a v e , U p d a t e czy D e l e t e . Środowiska Visual Studio m ożna użyć do wyge­ nerow ania now ych testów jednostek dla klasy. W tym celu należy albo wybrać opcję Unit Test W izard w ok nie dialogowym A dd New Test, albo kliknąć praw ym przyciskiem myszy plik klasy i wybrać opcję Create Unit Tests. W obu scenariuszach Visual Studio wyświetli okno dialogowe Create Unit Tests przedstaw io­ ne na rysunku 9.5. W idoczne są w nim typy dostępne w rozwiązaniu. W powyższym oknie dialogowym można wybrać składowe, dla których trzeba wygenerować testy. M ożna też użyć ustaw ienia O utput project do określenia projektu testów, w którym mają znaleźć się wygene­ rowane testy. Polega to na utw orzeniu nowego projektu testów (w języku C# lub Visual Basic) albo na um ieszczeniu kodu w istniejącym projekcie testów. Rysunek 9.5. Można zezwolić środowisku Visual Studio na wygenerowanie testów jednostek na podstawie istniejącego kodu

Przycisk A dd Assembly w dolnej części okna dialogowego um ożliw ia w ybranie podzespołu (pliku .dli) spoza projektu. Testy m ożna wygenerować dla dow olnego podzespołu .NET.

C zę ść III Tworzenie kodu i zarządzanie nim

Zarządzanie ustawieniami procesu generowania testów Przycisk Settings pozwala otworzyć okn o dialogowe, które służy do określania różnych ustawień związanych z generowaniem testów jednostek. Rysunek 9.6 przedstawia przykładowe inform ac je w ty m oknie. W arto zauważyć, że m o żn a użyć tekstu m a k r ( [ F i l e ] , [C la ss ] i [M ethod]) do poinformowania Visual Studio o tym, jak ma tworzyć nazwy generowanych plików, klas i metod testów. Rysunek 9.6. Można kontrolować sposób generowania testów jednostek przez Visual Studio

W arto zwrócić uwagę na dodatkowe ustaw ienia w grupie General. Umożliwiają one ustaw ienie każdego generowanego testu jako niejednoznacznego, um ieszczenie komentarzy w w ygenero­ wanym kodzie i tak dalej.

Uwaga Kreator Create U nit Tests umożliwia wygenerowanie testów jed ­ nostek dla wszystkich projektów w rozwiązaniu. Zaznaczenie kla­ sy i wygenerowanie testów powoduje dodanie w projekcie testów referencji do projektu z testowanym kodein.

Wygenerowany kod testów Visual Studio generuje testy dla wszystkich metod i właściwości obiektu zaznaczonych w oknie dialogowym Create Unit Tests. Z astanów m y się na przykład nad właściwością Nam e. Listing 9.1 przedstawia kod wygenerowany jako test jednostek tej właściwości (kod w języku Visual Basic wygląda podobnie). Test tworzy now y obiekt typu C u s t o m e r , a następnie próbuje u s ta ­ wić wartość właściwości Name docelowej zmiennej. Potem określany jest oczekiwany efekt. T u właściwość Nam e jest typu s t r i n g , dlatego kod testu tworzy zm ienną o nazwie e x p e c t e d tego typu. Definiuje też zm ienną typu s t r i n g o nazwie a c t u a l . N astępnie przypisuje do w łaściw o­ ści C u s t o m e r . Nam e wartość zmiennej e x p t e c t e d i — po ustaw ieniu właściwości — w czytuje wartość zmiennej a c t u a l . Na zakończenie za pomocą asercji A s s e r t . A r e E q u a l spraw dza,

Rozdział 9. Testowanie kodu czy właściwość została popraw nie ustaw iona. Jest to praw idłow y test właściwości. P ro g ram i­ sta musi jed y n ie podać popraw ną w artość dla zm iennej e x p t e c t e d (punkt TO D O ) i usunąć wywołanie A s s e r t . I n c o n c l u s i v e . Listing 9.1. Przykładowy automatycznie wygenerowany test jednostek [TestMethod()] public void NameTestO { Customer target = new Customert); // TO D O : Initialize to an appropriate value string expected = String .Empty; // TODO: Initialize to all appropriate value string actual; target.Name = expected; actual = target.Name; Assert.AreEqualfexpected, actual); Assert.Inconclusive("Verify the correctness of this test method.");

} Testowanie m etod jest trochę bardziej pracochłonne. Jeśli m etoda zwraca wartość, trzeba ją sprawdzić, aby się upewnić, że jest zgodna z oczekiwaniami. Jeżeli m etoda nie zwraca wartości, trzeba napisać dodatkowy kod do sprawdzenia, czy działa prawidłowo. Na listingu 9.2 pokaza­ no autom atycznie wygenerowany test metody, która nie zwraca wartości. Oczywiście, jeśli wywołanie m etody spowoduje błąd, test zakończy się niepowodzeniem. M ożna jed n ak napisać dodatkowe testy i asercje. Listing 9.2. Przykładowy automatycznie wygenerowany test jednostki [TestMethod()] public void SaveTestO { Customer target = new CustomerO; / / TODO: Initialize to an appropriate value target.Save(); Assert.Inconclusive("A method that does not return a value cannot be '-►verified.");

>

Uwaga W czasie generowania kodu do testowania konstruktorów Visual Studio dodaje tekst C o n str u c to r T e st do nazwy ldasy. Jeśli ist­ nieje kilka konstruktorów, Visual Studio doda do nazw liczby, na przykład C u sto m erC o n stru cto rT estl.

Pisanie testów jednostek Możliwe, że Czytelnicy zaczynają się domyślać, jak wykorzystać autom atycznie wygenerowane testy jednostek. Przyjrzyjmy się pisaniu testów jednostek, aby lepiej je zrozumieć. W arto pa­ miętać, że test jednostek to po prostu kod testu, który ma w yw oływ ać kod aplikacji. W takim kodzie testu znajdują się założenia dotyczące tego, czy o k reślone w arunki są spełnione, czy

C zę ść III Tworzenie kodu i zarządzanie nim nie po w ykonaniu kodu aplikacji. T est m oże powieść się lub nie w zależności od wyników tych założeń. Jeśli program ista oczekuje, że w arunek będzie spełniony, a tak się nie stanie, wtedy test kończy się niepowodzeniem. Kiedy projekt i klasa testu są już gotow e, trzeba wykonać trzy operacje, aby utworzyć typowy test jednostki: 1. D odać atrybut T estM ethod do kodu testu. 2. U ruchom ić badany kod, przekazując znane wartości w taki sposób, jak param etry. 3. Zastosow ać asercje do oceny wyników testów. Przyjrzyjmy się bliżej praktycznem u przykładowi. Załóżmy, że programista korzysta z usługi sieciowej zwracającej profil użytkow nika z bazy danych. Ta usługa sieciowa przyjm uje jako param etr identyfikator klienta. S ygnatura funkcji może wyglądać tak: public Customer GetCustomerProfile(int customerld)

Można napisać prosty test wywołujący tę usługę i przekazujący znany identyfikator z bazy danych. Dobrym sposobem na testy jednostek baz danych jest sprawdzanie znanego stanu bazy. W teście można następnie sprawdzić nie tylko to, czy zwracane d an e działają, ale także czy są poprawne. Na listingu 9.3 znajduje się przykładow y test. Listing 9.3. Przykładowy test jednostek [TestMethod()] public void GetCustomerProfileTest() { CustomerProfile cutProfileService = new CustomerProfileO; int customerld = 1234; Customer customer = cutProfileService.GetCustomerProfile(customerld); Assert.AreEqual(customer.Id, 1234);

} W arto zauważyć, że powyższy kod jest podobny do dow olnego kodu w języku C# (i Visual Basic). Aby oznaczyć metodę jako test, należy dodać atrybut T e s t M e t h o d . W kodzie trzeba utworzyć egzem plarz testowanego obiektu i wywołać spraw dzaną metodę. Jeśli wywołanie się nie powiedzie (lub zostanie zgłoszony wyjątek), test zakończy się niepowodzeniem . N astępnie w teście znajduje się asercja, która pozwala sprawdzić, czy zwrócony obiekt odpowiada oczekiwa­ nemu. Jeśli ta asercja okaże się fałszywa (przekazane do niej wartości nie są sobie równe), test zakończy się niepowodzeniem. Jeśli asercja będzie praw dziwa, test się powiedzie. M ożna dodać kilka innych asercji, aby uzupełnić powyższy test (przez spraw dzenie innych znanych danych na temat klienta). Ponadto można utw orzyć pewne dodatkow e testy spraw dzanej m etody, na przykład określające, co się stanie przy próbie pobrania danych nieistniejącego klienta. Powyższy kod powinien pozwolić zrozum ieć podstawy działania testów' jednostek. W dalszej części rozdziału zajmiemy się nimi nieco bardziej szczegółowo.

Rozdział 9. Testowanie kodu

U ru ch a m ia n ie testó w je d n o ste k Testy jednostek m ożna urucham iać w kilku miejscach środowiska Visual Studio. Dwa z nich to pasek narzędzi Test Tools i m enu Test. Obie możliwości związane są z podobnym zestawem opcji pokazanych na rysunku 9.7. W górnej części rysunku znajduje się pasek narzędzi Test Tools. W dolnej części pokazano zestaw przycisków opcji, które m ożna dodać do paska lub usunąć z niego. Lista ta pomaga zrozum ieć znaczenie ikon paska narzędzi i poznać klawisze skrótu służące do urucham iania testów. Rysunek 9.7. Menu Test umożliwia uruchamianie testów i debugerem lub bez niego

Testy m ożna urucham iać z debugerem lub bez. Pierwsza z tych opcji um ożliw ia włączenie debugera, jeśli test zakończy się niepow odzeniem . Ta właściwość jest przydatna do używania testów do rozwiązywania problem ów z kodem. Częściej stosuje się jed n ak dru g ie rozw iąza­ nie, które pozw ala po prostu uruchom ić zestaw testów jednostek i spraw dzić wyniki. Testy m ożna urucham iać wtedy w bieżącym kontekście lub w kontekście całego rozwiązania. Bieżący kontekst pozwala uruchomić dow olne wybrane teksty, przeprow adzić testy od lokalizacji k u r­ sora lub włączyć wszystkie testy danej klasy (jeżeli wyświetlany jest kod klasy, a nie testu). Czasem tru d n o określić, co jest bieżącym kontekstem dla środowiska Visual Studio. W tedy m ożna albo uruchom ić wszystkie testy z rozwiązania, albo przeprow adzić testy z poziom u okna Test View (zobacz podrozdział „Organizowanie testów ”).

Uwaga Przy uruchamianiu projektu testów wszystkie projekty, do których dodano referencje, są rekom pilowane razem z projektem testów.

Przeglądanie wyników testów Po uruchom ieniu testów wyniki m ożna zobaczyć w oknie Test Results (zwykle zadokow ane jest w dolnej części środowiska IDE). O kno umożliwia sprawdzenie, które testy zakończyły się pow odzeniem , a które nie. Rysunek 9.8 przedstawia liczne funkcje dostępne w tym oknie. W arto

C zę ść III Tworzenie kodu i zarządzanie nim Wybór wyświetlanych niedawnych przebiegów testów

Ponowne uruchamianie testów widocznych w oknie

Oznacza test zakończony niepowodzeniem

•;

M W ł ł t t W t l i PC 2009-11-1'. •

Test rur V «d Ri

Rcsolt

f

Importowanie lub eksportowanie wyników testu

*> fcm -



Grupowanie wyników

*

J

le t* Naene

Project

Account Test

Buti nett Domem Unit T e tt:

Pasted

Add rc ttl Test

BusmettDc mam Unit T ettt

Patted

Addretu Tett

Buti nettOomamUnrt T ettt

y j J

Patted

CityTett

Butm estOomamUmt I ettt

y JV

Patted

C uttomerC oottruct oeTett

Butm ettOom am UrviT ettt

C uttomeK.oostructorTetU

Patted

Depe keywced»

frror Mettage

fW W U 1

ButmettOomamUmt Tettt

Patted

PhoneTest

v JV

Patted

P otta 1Code T ett

Bui-neiiO om em UnitT ettt

y j^

Patted

Region StateTest

Butm ettDom amUndT ettt

y j J

Patted

SaveTest

B u wnettO omamU n»t Tettt

Patted

TeflM d h o tfl

B u un ett Dom emUrwt T ettt

ŁaJed

V enfyC uttomerOrdef t

Bu wnet:D omamUnit T ettt

y y JO

• %’j

Wyszukiwanie wyników

16 19 p«tt«d k e m d i checked 3

Passed

OOGZZ3

Dodawanie kolumn do wyników

Tett method BouneiiDom em U m t Tests CuttomerTest Ne*


«

! ■

a

r

C zę ść III Tworzenie kodu i zarządzanie nim •» n X

Test Runs Con nect ied\Contoso\Contoso\TestResults - i

X

Test Run Name I *

Disconnect Status

Owner

Com |*letcd R u m (16) (G V o d c \U n lca th cd \C o n lo so \to n to so \T « lR c su h i) O

M Snell®MSNELL2-PC 2009-11-17 20:38:02

16/18 passed. 2 failed

CELDOMAINMSnell

O

M Snell®MSNELL2-PC 2009-11-17 20:36:33

16/18 passed. 2 failed

CEI. DOMAIN, MSnell

o

M Snell©MSNELL2-PC 2009-11-17 20:31:31

15/18 passed. 3 failed

CH.DOMAINMSnell

o

M Snell$M SN ELL2-PC 2009-11-17 20:30:59

16/18 passed, 2 failed

CD.DOMAIN'.MSnell

o

M Snell@M SN£lL2-PC 2009-11-17 20:29:41

1/18 passed. 17 failed

CELDOMAINMSnell

©

MSnell@MSNELL2-PC 2009-11-17 20:29:19

0/18 passed, 1 failed

CH.DOMAINMSnell

Q

M Snell®MSNELL2-PC 2009-11-17 20:28:32

1/18 passed, 17 failed

C H.DOM AIN MSnell

Q

M Snell@ M SNEU2-PC 2009-11-17 20:27:56

1/18 passed. 17 failed

CEI.DOMAIN\MSnell

o

M Snell© M SN £U2-PC 2009-11-17 20:26:16

0/18 passed, 10 failed

CELDOMAINMSnell

O

M Sn eltSM SN ELU -P C 2009-11-17 20:25:40

17/18 passed, 1 failed

CELDOMAINMSnell

O

MSnell®MSNELL2-PC 2009-11-17 20:24:41

16/18 passed 2 failed

CEI.DOMAlN'.MSnell

O

MSnell@MSNELL2-PC 2009-11-17 20:24:20

16/18 passed, 2 failed

CELDOMAINMSnell

O

MSnell@MSN£LL2-PC 2009-11-17 20:23:38

14/18 passed. 4 failed

CELDOMAINMSnell

O

M Snell® MSNELL2-PC 2009-11-17 20:17:41

15/18 passed, 3 failed

CELDOMAINMSnell

&

M Snell®MSNELL2-PC 2009-11-17 20:17:21

1/1 passed

C EL D O M AIN MSnell

©

M Snell® M SN Ell2-PC 2009-11-1719:51:58

l A passed

CELDOMAINMSnell

Rysunek 9.10. Okno dialogowe Test Runs umożliwia wyświetlenie wyników wszystkich przebiegów testów z bieżącej sesji środowiska Visual Studio

Opcje projektów testów M ożna kontrolow ać sposób generow ania projektów testów przez Visual Studio. Należy to zrobić w węźle Test Tools/Test Project w oknie dialogowym Options (Tools/Options). Na rysunku 9.11 pokazano przykładową zaw artość tego okna. M ożna tu określić język dom yślny (Visual Basic lub C #) dla projektu testów stosow any przez Visual Studio przy tw orzeniu lub genero­ waniu nowego projektu tego typu. W arto zauważyć, że m ożna zmienić dom yślny język usta­ wiony w środow isku IDE dla projektów testów. Rysunek 9.11. Okno dialogowe Options umożliwia dostosowanie domyślnych ustawień szablonów projektów testów w Visual Studio

Rozdział 9. Testowanie kodu Opcje w węźle Test Project pozwalają też określić, które pliki należy domyślnie umieścić w projekcie testów w czasie jego tworzenia. To, jakie opcje są dostępne, zależy od języka. M ożna określić pliki podstaw ow ych testów jednostek, testów jednostek baz danych, testów uporządkow anych lub testów jed nostek (urucham iany jest w tedy kreator U nit Test W izard).

Zarządzanie wynikami testów Visual Studio dom yślnie przechowuje wyniki ostatnich 25 przebiegów testów. Po przekrocze­ niu tego lim itu środow isko przed zapisaniem wyników now ego przebiegu usunie inform acje o najstarszym. W oknie dialogowym Options (Tools/Options) można zwiększyć (lub zmniejszyć) tę wartość. Należy wybrać węzeł podrzędny Test Execution w węźle Test Tools, aby wyświetlić opcje w idoczne na rysunku 9.12. W arto zwrócić uwagę na opcję Limit Number o f Old Test Runs To (czyli ogranicz liczbę dawnych przebiegów testów do). Rysunek 9.12. W oknie dialogowym Options można określić liczbę przechowywanych przebiegów testów

Kontrolowanie ustawień testów Visual Studio udostępnia plik ustaw ień umożliwiający k o n tro lo w an ie w ykonyw ania testów. W większości sytuacji można pozostawić dom yślną zaw artość pliku ustawień. Jednak nieraz warto zmodyfikować niektóre opcje, dotyczące na przykład urucham iania skryptów instalacyj­ nych w ram ach testów, limitu czasu i tak dalej. Pliki z ustaw ieniam i testów można znaleźć na poziomie rozw iązania w oknie Solution Explorer (zobacz rysunek 9.2). Każdy plik ustawień testów ma rozszerzenie .testsettings. W dowolnym mo­ mencie za pom ocą opcji Test/Select Active Test Settings m o żn a określić, który plik .testsettings ma być aktywny. Na rysunku 9.13 pokazano, jak wybrać aktyw ny plik ustawień. Pliki .testsettings w Visual Studio to zwykłe pliki XML z konfiguracją. Kod w języku XML m ożna bezpośrednio edytować. V isual Studio udostępnia jed n ak okno dialogowe d o łatw iej­ szego m odyfikow ania ustawień. O kno dialogow e Test Settings m ożna uruchom ić p rzez dw u­ krotne kliknięcie pliku .testsettings. Na rysunku 9.14 pokazano to okno z w ybranym węzłem Test Timeouts.

C zę ść III Tworzenie kodu i zarządzanie nim oO Contoso • M icrosoft Visual Studio T est

W in d o *

Help

N e w T e it .. lo a d M etadata File... Create N ew Test list. po-ution Eipicrer

^ 8 usmessDoroasnUnrt TestvC ustomerTeit u s in g B u s in e s s D o a e in ; u s in g M ic r o s o f t . V is u a lS t u d io •T e s t T o o l:

Select A ctive Test Settings Edit Test Settings Windows

u s in g S y s t e « ;

. j , Local testsettmgs

u s in g S y s t e w .D a t a ;

T raceArvdT estlmpact test settings

u s in g S y s t e m .C o l le c t io n s .G e n e r i c ;

■jp BusmessDomam n a a r s p a c c 8 u s in e s s D o * a in U n it T e s t s

-JŚ. Properties •jii References Author.cs

[T e s t C l* s s ()) p u b li c c l a s s Custom er-Test {

B o o te s ^

Customer.es

J J Kusm essO bject cs

[T e s ty te tb o d O ] p u b li c v o id C u s t o a e r C o n s t r u c t o r T e s t ( ) Cu stom er t a r g e t • new C u s t o * e r ( ) ;

[TestM ethod()J p u b li c v o id C u s t o a e r C o n s t r u c t o r T e s t l( ) i n t i d • ©; C u sto m er t a r g e t ■ new C u sto m e r( i d ) ;

(T e s tn e th o d ()] [O e p lo y m e n tIte « < ” B u s i n e * s O o a a i n .d ll” ) )

^

0rder.es Vendor.es

*5? BudnessDomainUnitTests ’jl Properties References ^ CustomerTest.es OrderTests.cs 31 ContosoWeb U OataServices ■Jk Properties > References CustomerProfite.es

p u b li c v o id D e l e t e T e s t ( ) { I B u s in e s s O b je c t t a r g e t • new C u sto m e r^ ) t a r g e t .O e le t e ( ) ;

-^5 Solution Explorer f t Test View U i rror 1st »

Test Runs

f t

Test Results

Rysunek 9.13. Za pomocą menu Test można wybrać aktywny plik z ustawieniami testów

Rysunek 9.14. Okno dialogowe Test Settings umożliwia zarządzanie ustawieniami związanymi z przeprowadzaniem testów (w tym limitem czasu)

Rozdział 9. Testowanie kodu Zaznaczenie węzła po lewej stronie okna dialogowego Test Settings pozwala skonfigurować różne ustawienia. Poniżej znajduje się przegląd opcji, którym i można zarządzać w każdym węźle okna Test Settings: •

Zawiera opcje do określania nazwy pliku ustawień, udostępniania opisu, ge­ nerow ania nazw dla poszczególnych przebiegów testów (na rysunku 9.10 pokazano nazwy takich przebiegów). G e n e r a l.

• D e p l o y m e n t . Umożliwia określenie dodatkowych plików i katalogów instalowanych w ram ach przeprowadzania testów. Domyślnie testowane podzespoły są autom atycz­ nie instalow ane w katalogu bin testu. Pozwala to przed przeprow adzeniem testów zainstalow ać nowe elem enty (na przykład bazy danych oparte na plikach). • S e t u p a n d C l e a n u p S c r i p t s . Umożliwia określenie skryptu urucham ianego przed uruchom ieniem testów lub po ich zakończeniu (albo w obu sytuacjach). Różni się to od urucham iania kodu przed testam i klas. Tu m ożna zdefiniować kod wykonywany przed dow olną grupą testów (lub po niej). • H o s t s . Umożliwia określenie hosta, na którym m ożna przeprowadzić testy. Zwykle jest to host domyślny (środow isko Visual Studio). Ponadto m ożna ustawić testy tak, aby działały na serwerze środow iska ASP.NET. • T e s t T i m e o u t s . Umożliwia określenie czasu oczekiw ania środow iska Visual Studio (lub innego hosta) przed porzuceniem długo działających testów. Ponadto można oznaczyć zbyt długo trwające testy jako nieudane. N a rysunku 9.12 przedstaw iono przykładow e ustawienia w tym oknie dialogowym. • U n i t T e s t. Udostępnia zaaw ansow ane opcje wczytywania dodatkowych podzespołów potrzebnych do przeprowadzenia testów.

Platforma testów jednostek Platforma testów jednostek to część środow iska Visual Studio, a nie platform y .NET. System testowania jednostek w Visual Studio obejmuje: zestaw klas platform y, narzędzia i host, gdzie wykonywane są testy. Przestrzeń nazw zawierająca klasy platformy testów jednostek to M i c r o s o f t . ^ V i s u a l S t u d i o . T e s t T o o l s . U n i t T e s t i n g . Dla program istów najw ażniejsze w tej prze­ strzeni nazw są klasy atrybutów i klasa A s s e r t . W tym podrozdziale om aw iam y podstaw ow e scenariusze korzystania z klas atrybutów i asercji (a także innych klas).

Klasa TestContext Platforma testów jednostek obejm uje klasę służącą do przechow yw ania informacji związanych z wykonywaniem testów. Jest to klasa T e s t C o n t e x t . W łaściwości tej klasy służą do pobierania danych o działających testach. Inform acje obejmują: ścieżkę do katalogu z testem, adres URI. urucham ianego testu (jeśli są to testy jednostek ASP.NET) i inform acje o wiązaniu danych (na

C zę ść III Tworzenie kodu i zarządzanie nim przykład połączenie z danym i lub obecny wiersz danych w wykonywanym teście). W iadom o­ ści na tem at kontekstu testu są przechowywane we właściwościach omawianej klasy. Kluczowe właściwości i ich zastosow ania opisano w tabeli 9.1. Tabela 9.1. Kluczowe właściwości klasy TestContext

W łaściwość

Opis

C u rre n tT e stO u tco m e

Umożliwia określenie wyniku ostatniego przeprowadzonego testu. Jest to przydatne w metodach oznaczonych jako T e s t C le a n u p (zobacz punkt „Klasy atrybutów testów").

D a t a C o n n e c t io n

Umożliwia wyświetlenie łańcucha połączenia używanego w testach jednostek sterowanych danymi (zobacz punkt „Tworzenie testów jednostek zależnych od danych").

D a ta R o w

Umożliwia dostęp do kolumn w wierszu z danymi w czasie pracy z testami jednostek zależnych oddanych (zobacz punkt „Tworzenie testów jednostek zależnych od danych").

R e q u e s te d P a g e

Zapewnia dostęp do obiektu Page reprezentującego żądaną stronę w testach jednostek ASP.NET (zobacz podrozdział „Pisanie testów jednostek działających w ASP.NET").

T e s t D e p lo y m e n t D ir

Umożliwia wyświetlenie ścieżki do katalogu, w którym testy są instalowane i uruchamiane. Jest to przydatne, jeśli trzeba zapisywać lub wczytywać dane z pliku z tego katalogu.

T e s t L o g s D ir

Umożliwia wyświetlenie ścieżki do katalogu, w którym zapisywane są wyniki testów.

T e s tN a m e

Umożliwia określenie nazwy obecnie przeprowadzanego testu.

Klasa T e s t C o n t e x t dom yślnie jest niedostępna w kodzie. Aby uzyskać do niej dostęp, n a j­ pierw trzeba zdefiniować właściwość o tej samej nazwie i typie w klasie testu (potrzebna w ła­ ściwość jest automatycznie tw orzona w czasie generowania testów jednostek na podstaw ie istniejącego kodu). Platform a testów jednostek w m om encie urucham iania testów automatycz­ nie tworzy egzemplarz klasy T e s t C o n t e x t , a następnie sprawdza, czy w kodzie źródłowym z n a j­ duje się właściwość o tej nazwie. Jeśli ją znajdzie, przypisuje egzemplarz klasy T e s t C o n t e x t do właściwości. Od tego m om entu można korzystać z właściwości do pobierania informacji o k o n ­ tekście przeprowadzanego testu. Poniższy kod pokazuje, jak zdefiniować właściwość T e s t C o n t e x t w teście jednostek w języku C#: public TestContext TestContext { get; set; }

Środowisko Visual Studio w czasie tworzenia obiektu typu T e s t C o n t e x t generuje kom pletną właściwość. Poniżej pokazano kod właściwości wygenerowany przez Visual Studio: private TestContext testContextlnstance; public TestContext TestContext { get { return testContextlnstance;

1 set { testContextlnstance = value;

1

Rozdział 9. Testowanie kodu

Uwaga Niektóre klasy atrybutów wymagają zdefiniowania parametru typu TestContext dla metod opatrzonych danym atrybutem. Dotyczy to na przykład atrybutu Classlnitialize (zobacz dalej). W takim scenariuszu platforma testów jednostek automatycznie przekazuje egzemplarz klasy TestContext do m etody w mom encie jej uru­ chamiania.

Klasy atrybutów testów Testy jednostek są urucham iane przez Visual Studio za pom ocą hosta do przeprow adzania testów jednostek. Host musi zbadać kod, znaleźć w nim testy jednostek i uruchom ić je w o d ­ powiedni sposób. W ykorzystuje do tego atrybuty. Przypom nijm y, że atrybuty służą do u d o ­ stępniania metadanych na temat kodu. Inny kod (na przykład host testów jednostek) może wyko­ rzystać m echanizm refleksji do określenia różnych informacji na temat urucham ianego kodu. W dotychczasowych krótkich przykładach pokazaliśmy, że testy jednostek oznaczane są za pomocą klas atrybutów zdefiniowanych w przestrzeni nazw testów. Przykładowo, klasa testu ma atrybut TestClass, a metodę testow ą należy oznaczyć atrybutem TestMethod. W tabeli 9.2 pokazano listę najczęściej stosow anych klas atrybutów' z przestrzeni nazw testów jednostek. Tabela 9.2. Klasy atrybutów testów dostępne w Visual Studio

Test

Opis

AssemblyCleanup

Służy do definiowania metod, które należy uruchomić po wykonaniu przez platformę wszystkich testów z danego podzespołu. Jest to przydatne, jeśli trzeba uporządkować zasoby po wykonaniu wszystkich testów. Warto zauważyć, że taki atrybut można przypisać tylko do jednej metody w podzespole.

Assemblylnitialize

Służy do definiowania metod, które należy uruchomić przed uruchomieniem przez platformę testów z danego podzespołu. Jest to przydatne, jeśli trzeba zainicjować zasoby dla wszystkich testów z podzespołu. Warto zauważyć, że taki atrybut można przypisać tylko do jednej metody w podzespole.

ClassCleanup

Służy do określania metody, którą należy uruchomić jeden raz po wykonaniu wszystkich testów z danej klasy testów. Jest to przydatne, jeśli trzeba zresetować stan systemu (na przykład w bazie danych) po zakończeniu testów.

Classlnitialize

Służy do określania metody, którą host powinien uruchomić jeden raz przed uruchomieniem testów z danej klasy testów. Jest to przydatne, jeśli trzeba zresetować bazę danych lub wykonać kod przygotowujący środowisko testowe. Metoda musi przyjmować parametr typu T e s t C o n t e x t .

DataSource

Służy do udostępniania informacji o połączeniu w testach jednostek zależnych od danych („Tworzenie testów jednostek zależnych od danych").

C zę ść III Tworzenie kodu i zarządzanie nim Tabela 9.2. Klasy atrybutów testów dostępne iv Visual Studio — ciąg dalszy

Test

! Opis

D e p lo ym e n tlte m

Służy do określania dodatkow ych plików {.dll, .txt i innych), które trzeba zainstalow ać w katalogu, gdzie przeprow adzane są testy.

Exp e cte d E xce p tio n

Służy do określania, że zgodnie z oczekiwaniami kod metody testowej powinien zgło sić wyjątek podanego typu. Działanie metod testowych tego rodzaju jest uważane za prawidłowe, jeśli w czasie wykonywania testu pojawi się w yjątek odpowiedniego typu (w przeciwnym razie test kończy się niepowodzeniem). M echanizm ten jest przydatny do testowania oczekiw anych warunków wystąpienia błędów w kodzie (zobacz punkt „Testowanie w yjątków ").

HostType

Używany do zastępow ania dom yślnego hosta testów (środowiska Visual Studio). Zw ykle nie trzeba stosować tego atrybutu. Jeśli jednak program ista pisze testy uruchamiane w procesie innego hosta (na przykład w środowisku ASP.NET), może wykorzystać ten atrybut (w raz z atrybutam i U r l T o T e s t i A s p N e t D e v e l o p m e n t S e r v e r H o s t ) .

Igno re

Dodawany do metody testowej w celu określenia, że daną m etodę należy pom inąć, jeśli stosowany jest host do przeprowadzania testów.

Te stCIass

Służy do określania, że dana klasa jest klasą testów zaw ierającą jeden lub kilka testów jednostek (metod testow ych).

TestCle a n u p

Służy do wskazywania m etody, którą należy uruchom ić jednokrotnie po w ykonaniu każdej m etody testow ej. W skazaną metodę m ożna w ykorzystać do uruchom ienia operacji porządkujących po wykonaniu każdej metody testowej w danej klasie testów. Porządkowanie na poziom ie klasy można przeprowadzić za pomocą atrybutu C la s s C le a n u p .

T e stln itia lize

Służy do określania, że daną metodę należy uruchomić jednokrotnie przed w ykonaniem każdej metody testowej. Jest to przydatne, jeśli trzeba zresetow ać stan systemu przed wykonaniem każdej m etody testowej w danej klasie testów. Jeśli programista chce tylko zainicjować stan dla w szystkich metod z danej klasy testów , powinien użyć atrybutu C la s s ln it ia liz e .

TestProperty

Służy do definiowania właściw ości (pary nazwa - w artość) m etody testowej. Inform acje zapisane w e właściwości można wczytać w kodzie m etody testowej.

TestM ethod

Służy do oznaczania metod w klasie testów jako testów jednostek. Metody testowe nie mogą zwracać wartości (zw racają typ v o id ) . Powodzenie lub niepowodzenie zależy od warunków błędów oraz asercji. Metody testowe nie m ogą przyjm ować parametrów, ponieważ host nie potrafi przekazyw ać parametrów do m etod. Istnieją jednak sposoby na zasymulowanie przekazyw ania parametrów. Więcej informacji na ten temat zaw iera punkt „Tworzenie testów jednostek zależnych od danych".

Tim eout

Służy do określania limitu czasu (w milisekundach) dla danej metody testowej. Jeśli test będzie trwał dłużej, środowisko zatrzyma go i uzna za zakończony niepowodzeniem.

Rozdział 9. Testowanie kodu W tabeli 9.2 pokazano, że istnieje wiele klas atrybutów. Zapewniają one kontrolę nad testami jednostek. Jeśli program ista pisze klasę testów dla obiektu Customer, może zdefiniow ać klasę CustomerTest. Na listingu 9.4 pokazano szkielet kilku testów z tej klasy. Z adem onstrow ano też liczne atrybuty stosowane w typow ych klasach testów. W arto zwrócić uwagę na m etody do inicjowania klasy testów i porządkow ania zasobów po przeprow adzeniu testu. Listing 9.4. Przykładowa klasa testów u sin g

System ;

u sin g

B usinessD om ain;

u sin g

M ic ro s o ft.V isu a lS tu d io .T e stT o o ls.U n itT e stin g ;

u sin g

System .D ata;

u sin g

Syste m .C o lle c tio n s .G e n e ric;

namespace

B u sin essD om ainllnitTests

{

[T e stC la ssO ] p u b lic

cla ss

p u b lic

Custom erTest

TestContext

{

TestContext

{ get;

set;

}

[ C l a s s l n i t i a l i z e ( )] p u b lic

/ /

sta tic

void

In itT e stsfT e stC o n te x t

testContext)

{

Wywołanie kodu resetujqcego testową bazę danych (Utilities.ReselTeslDbO;).

} [C la ssC le a n u p t) ] p u b lic

sta tic

void

C le a n u p P o stTe sts()

{

/ / Wywołanie kodu resetujqcego testową bazę danych (Utilities. ResetTestDh();).

} [TestM ethod() ] p u b lic

//

void

C u s t o m e r C o n s t r u c t o r T e s t ()

{

Testuje konstruktor domyślny.

} [TestM ethodt) ] p u b lic

//

void

Custo m erC o n stru cto rTestl() {

Testuje konstruktor przyjmujący identyfikator klienta.

} [ T e s t M e t h o d t )] [D ep loym en tItem ("B u sin essD o m ain . d l l " ) 1 p u b lic

void

D e le te T e stO

{

} [TestM ethod() ] [D ep lo ym en tItem ("B u sin essD o m ain .d li") ]

C zę ść III Tworzenie kodu i zarządzanie nim p u b lic

vo id

G e t L is t T e s t ()

{

> [TestM ethod()] [D ep lo ym en tItem (" B u sin e ssD o m a in .d ll" ) ] [Tim eo u t(5000)] p u b lic

vo id

SaveTestO

{

} } }__________________________________________ _______________________________ _______________________________

Następny krok polega na napisaniu kodu w każdej metodzie testowej. Kod powinien kierow ać wywołania do obiektu C ustom er i spraw dzać asercje związane z wynikami wywołań. D o tw o­ rzenia asercji służy opisana dalej klasa A s s e r t.

Operacje wykonywane przed testami jednostek i po nich Dobrą praktyką przy tw orzeniu testów jednostek jest pisanie ich dla znanego stanu system u. Dotyczy to bazy danych, plików i innych elem entów składających się na system. W ten sposób programista może mieć pewność, że potrzebne elementy będą dostępne przy przeprow adzaniu testów. Oczywiście, same testy często naruszają stan. Testy usuwają dane, m odyfikują je, d o ­ dają nowe rekordy i wykonują podobne operacje. Wtedy potrzebna jest możliwość przyw róce­ nia stanu system u przed wykonaniem testów (i [lub] po ich zakończeniu), aby zagw arantow ać stały stan na czas testów i umożliwić program istom u ru ch am ian ie ich za pom ocą jed n eg o kliknięcia (jest to następna dobra praktyka z obszaru testów jednostek). Zwykle trzeba napisać kod utrzym ujący stały stan systemu. Kod może kopiować zn an ą i p o ­ prawną testową bazę danych do katalogu testów (można wykorzystać do tego także atrybut Deploymentltem), resetować bazę danych za pomocą instrukcji w SQL-u, realizować plan generowania danych w celu utw orzenia bazy, kopiować pliki lub sprawdzać inne instalow ane elementy. Kod resetujący system jest specyficzny dla środowiska. Jednak aby zagw arantow ać w yw ołanie potrzebnego kodu w czasie przeprow adzania testów, m ożna zastosować kilka klas atrybutów : C la s s ln itia liz e i ClassCleanup lub T e s tln itia liz e i TestCleanup. Pierwsza para powoduje wykonanie kodu na początku (i na końcu) przebiegu testów dla całej klasy testów jednostek. Druga para pozwala uruchom ić kod przed w ykonaniem każdego testu w danej klasie testów i po ich przeprowadzeniu. Zwykle operacje inicjujące i porządkujące wywoływane są na poziom ie klasy. Jeśli pro g ram ista używa klasy U t i l i t i e s z metodą resetującą bazę danych, może zagwarantować w yw ołanie metody, oznaczając ją atrybutem C l a s s l n i t i a l i z e . W arto zauważyć, że m etoda p rzyjm uje

Rozdział 9. Testowanie kodu obiekt TestContext przekazywany przez platformę testów jednostek. Dobrą praktyką jest ponowne resetowanie systemu po wykonaniu testów jednostek. W poniższym kodzie pokazano dwie m etody testów. Metody przygotow ują testy i porządkują po nich. [ C l a s s l n i t i a l i z e ( )] p u b lic

sta tic

void

In itT e sts(T e stC o n te x t

testContext)

{

U tilitie s.R e se tT e stD b ();

} [ C l a s s C l e a n u p ( )) p u b lic s t a t i c void C le a n u p P o s t T e s t s () U t i l i t i e s .ResetTestD b();

{

}

Kontrolowanie operacji inicjujących i porządkujących na poziomie wykonywania testów Zdarza się, że operacje inicjujące i porządkujące trzeba u ru ch o m ić na poziom ie wyższym niż klasa testów. Czasem przed uruchom ieniem klas testów trzeba wywołać skrypty. W tedy m ożna wykorzystać plik .testsettings (zobacz wcześniejszy punkt „Kontrolowanie ustawień testów ”) do zdefiniowania skryptu wywoływanego przed uruchom ieniem testów i po ich zakończeniu. Na rysunku 9.15 pokazano węzeł Setup and Cleanup Scripts w oknie dialogowym Test Settings. W tym miejscu m ożna zdefiniować skrypty inicjujące i porządkujące wywoływane przy u ru ­ cham ianiu dow olnych testów z rozwiązania. Rysunek 9.15. Definiowanie skryptów inicjujących i porządkujących wywoływanych przy wykonywaniu dowolnych testów z rozwiązania

C zę ść III Tworzenie kodu i zarządzanie nim

Klasy asercji Przestrzeń nazw UnitTesting zaw iera także typ statyczny Assert. Ten typ udostępnia liczne m etody um ożliw iające spraw dzenie, czy wynik testów jest zgodny z oczekiw aniam i. Należy wywołać statyczne m etody i spraw dzić wartość w arunku (true lub false). Jeśli warunek logiczny nie jest spełniony, d ziałanie asercji kończy się niepow odzeniem . Same asercje nie zwracają wyników. Zamiast tego w czasie wykonywania program u autom atycznie pow iada­ miają platform ę testów jednostek o sukcesie lub niepowodzeniu. Można na przykład napisać test jednostki wczytujący znany rekord z bazy danych. N astępnie można dodać asercję dotyczącą tego rekordu, aby udowodnić, że program potrafi pobrać dane z bazy, praw idłow o wywołać odpow iednie zbiory danych i dotrzeć do konkretnego obiektu. Poniżej pokazano prostą asercję d o sprawdzania, czy dwie zm ienne mają tę samą w artość. Jeśli wartości są sobie równe (AreEqual), działanie asercji kończy się powodzeniem. Jeżeli wartości są różne, asercja zgłasza niepow odzenie, a platforma testów jednostek oznacza test jako nieudany. A sse rt.A re E q u a l(c u s t.Id ,

cu sto m e rld );

AreEqual to tylko jedna z wielu m etod asercji dostępnych w klasie Assert. W iększość m etod asercji dotyczy jednego zagadnienia — porównywania dwóch wartości. W tabeli 9.3 przedsta­ wiono bardziej kom pletną listę m etod. Tabela 9.3. Asercje testów

Test

Opis

A re E q u a liA reN otEqual

Służy do spraw dzania, czy dwie wartości są sobie równe, czy nie.

AreSam e i A re N otSam e

Pozw ala spraw dzić, czy dwa obiekty są tym samym obiektem, czy nie.

F a il

Metoda A s s e r t . F a i l oznacza warunek jako niespełniony bez jego spraw dzania. Może to być przydatne przy wartościowaniu warunku za pomocą operacji logicznych i dojściu do m iejsca w kodzie, gd zie operacje reprezentują test zako ńczo ny niepow odzeniem .

In co n clu siv e

Służy do oznaczania, że test nie zakończył się ani niepowodzeniem, ani powodzeniem (w ynik jest niejednoznaczny).

IsIn sta n ce O fT y p e

Pozw ala spraw dzić, czy obiekt jest określonego typu, czy nie.

iIsN o tln sta n ce O fT y p e IsN u lliIsN o tN u ll

Pozw ala określić, czy obiekt zawiera referencję n u l i , czy nie.

I s T rue i I s F a l s e

Służy do sprawdzania, czy warunek jest spełniony, czy nie.

Każda m etoda asercji ma kilka przeciążonych wersji. Umożliwiają one porów nyw anie różnych typów danych — łańcuchów znaków, liczb, obiektów i kolekcji ogólnych. Ponadto dostępne są wersje, które pozwalają po prostu zastosować asercję lub dodatkowo wyświetlić kom unikat w sytu­ acji, kiedy asercja nie jest spełniona. Na przykład poniżej zapisano tę samą asercję, co wcześniej, jednak ta wersja wyświetla kom unikat o błędzie, jeśli warunek nie jest spełniony. A s s e r t.A re Eq u al(cu st.Id ,

custo m erld,

"Id e n tyfika to ry

k lie n ta



ró żn e.");

Rozdział 9. Testowanie kodu Przyjrzyjmy się kilku przykładowym m etodom , których szkielet pokazano na wcześniejszym listingu (zobacz listing 9.4). Należy uzupełnić te m etody przez napisanie kodu korzystającego z klasy C ustom er, a następnie poczynić asercje na tem at wyników. Listing 9.5 zawiera przykła­ dowy test k o n stru k to ra klasy C u sto m er. W arto zauważyć, że testujem y znany rekord danych przez wczytanie egzemplarza klasy C ustom er na podstaw ie identyfikatora rekordu. Następnie sprawdzam y wyniki w klasie A s s e r t. Listing 9.5. Przykładowy test jednostek ilustrujący korzystanie z klasy Assert [TestM ethodO ] p u b lic

//

vo id

C u sto m erC o n stru cto rT estl() {

Testuje konstruktor przyjmujący identyfikator klienta.

in t

CU Stom erld =

Custom er cust

1;

//

Testowanie danych klienta.

= new C u s t o m e r ( c u s t o m e r l d ) ;

/ / Sprawdzanie, czy dla testowego klienta zwrócono poprawne dane. / / Sprawdzanie operacji ustawiania i wczytywania wartości właściwości. A s s e r t .A re E q u a l(cu st. I d , " Id e n tyfika to ry

custo rnerld,

k lie n ta



A s s e r t .A reEq u al(c u s t . Em ail,

ró żn e."); " j d e v lo p @ c o n t o s o . com" );

A s s e r t . A r e E q u a l ( c u s t . Name,

"Jan

P ro g ra m ista ");

A s s e r t .A re E q u a l(cu st.C ity ,

"Brzeg");

A s s e r t .A re E q u a l(c u s t.P o sta lC o d e, A s s e r t .A reEq u al(cu st.R e gio n State ,

"00000"); "D L");

A s s e r t .A re E q u a l(cu st.A d d re ssl,

"ul.

A s s e r t . IsT ru e (cu st.A d d re ss2

==

"");

A s s e r t . I s T r u e ( c u s t . Phone ==

"");

M icro so ftu

100");

} Klasa Assert zawiera też wersje m etod AreEqual i AreNotEqual dla ogólnych typów danych. W ersje te umożliwiają sprawdzanie, czy dwa typy ogólne są takie same. Program ista musi określić typ ogólny za pomocą standardowej składni, [łub (o f T) w języku Visual Basic], i przekazać dwie porównywane zm ienne. Poniżej pokazano przykładowy kod: A s s e r t .A re E q u a l< C u sto m e r> (cu stl,

cust2);

Sprawdzanie kolekcji obiektów Przestrzeń nazw UnitTesting obejm uje też klasę asercji CollectionAssert. Przy jej użyciu m ożna sprawdzić zawartość klas kolekcji. Można na przykład wywołać metodę Contains, aby ustalić, czy dana kolekcja zawiera konkretny element (lub go nie zawiera). M etoda Allltems ^A reins tan cesOf Type służy do sprawdzania, czy kolekcja zawiera egzemplarze tego samego typu. M ożna też sprawdzić, czy dwie kolekcje są takie sam e (AreEqual i AreNotEqual) lub czy zawierają identyczne elementy, ale niekoniecznie w tej samej kolejności (AreEquivalent i AreNotEquivalent).

Czę ś ć III

Tworzenie kodu i zarządzanie nim

S p r a w d z a n ie ła ń c u c h ó w z n a k ó w Klasa StringAssert zawiera m etody służące do sprawdzania łańcuchów znaków i ich frag­ mentów. M etoda Contains pozwala ustalić, czy łańcuch obejm uje określony podłańcuch. Metoda StartsWith umożliwia określenie, czy łańcuch rozpoczyna się od podanych znaków, a metoda EndsWith sprawdza końcową część łańcucha. Metody Matches i DoesNotMatch um oż­ liwiają ustalenie, czy łańcuch znaków pasuje do zdefiniowanego wyrażenia.

Testowanie wyjątków Testy jednostek należy pisać w taki sposób, aby ustalić, czy kod działa w oczekiwany sposób zarówno w korzystnych, jak i niekorzystnych warunkach. Korzystne warunki m ożna spraw ­ dzić w opisany wcześniej sposób za pom ocą m etod klasy Assert. Jednak często trzeba o k re ­ ślić, czy kod zgłasza odpowiedni wyjątek w odpowiedzi na specyficzne wywołanie. Można wtedy zastosować atrybut ExpectedException do przetestowania określonych warunków wystąpienia błędów. Atrybut ExpectedException należy dodać do metody testowej. Atrybut przyjmuje jako p a­ ram etr typ oczekiwanego wyjątku. Jeśli wywołanie m etody testowej spowoduje zgłoszenie wyjątku odpow iedniego typu, test zakończy się powodzeniem. Jeżeli wyjątek nie wystąpi lub będzie miał niewłaściwy typ, test zakończy się niepowodzeniem. Załóżmy, że program ista chce sprawdzić, co stanie się przy próbie utworzenia now ego klienta przy użyciu niepełnych danych. M oże w tym celu napisać kod zgłaszający niestandardow y wyjątek typu InvalidCustomerException i dodać do m etody testowej następujący atrybut: [TestM ethod() ] [Exp ected Excep tio n (typ eo f(In v a lid C u sto m e rE xce p tio n ), "N ie p u b lic

//

zg ło szo n o w yjątku In v a lid C u s to m e rE x c e p tio n .* ')] v o id NewCustom erTest() {

Tworzenie nieprawidłowego nowego egzemplarza klasy Customer.

1 Warto zauważyć, że jeśli powyższy kod nie zgłosi wyjątku, jako wynik testu przekazany zostanie kom unikat o błędzie ("Nie zgłoszono wyjątku InvalidCustomerException." ). K om u­ nikat to opcjonalny param etr atrybutu ExpectedException. Można łączyć asercje z atrybutem ExpectedException. Aby m etoda testowa w takich w aru n ­ kach przeszła test, asercje muszą być spełnione, a metoda m usi zgłosić wyjątek.

Uwaga Zgłoszony wyjątek musi mieć dokładnie taki sam typ, jak oczeki­ wany. Wyjątek nie może na przykład dziedziczyć po oczekiwa­ nym. Wtedy test zakończy się niepowodzeniem.

Rozdział 9. Testowanie kodu

Tworzenie testów jednostek zależnych od danych Często lepiej jest napisać jeden test jednostek i uruchom ić go wielokrotnie dla różnych w arto­ ści param etrów , niż przygotowywać wiele podobnych testów. Cechą dobrych testów jednostek jest pokrycie różnych warunków. Oczywiście, testy jednostek nie przyjmują param etrów . Utrudnia to przekazywanie danych do testów. Dlatego trzeba powiązać testy jednostek z danymi. N astępnie m ożna nakazać platform ie testów jednostek uruchom ienie testu dla każdego wiersza danych. M ożna też wykorzystać pow iązane dane testowe w samym teście jednostek i wywołać kod na wiele sposobów.

Łączenie się z danymi Do wiązania testów jednostek z danym i testowymi służy klasa atrybutu DataSource z plat­ formy testów jednostek. Klasa um ożliwia bezpośrednie podanie łańcucha połączenia z danym i testowymi lub określenie nazwy łańcucha połączenia zapisanego w pliku konfiguracji projektu. Obie techniki pozwalają nawiązać połączenie z bazą danych (na przykład SQL Server lub Access), plikiem ,csv (zwykle tworzonym w N otatniku lub Excelu) lub plikiem .xml. Klasa atrybutu DataSource ma trzy wersje. Pierwsza przyjm uje jeden param etr, dataSource '-♦SettingName. W ymaga to przekazania nazwy ustaw ień źródła danych zdefiniow anych w pliku konfiguracji. Druga wersja przyjmuje param etry connectionstring i tableName. Należy w tedy przekazać popraw ny łańcuch połączenia ze źródłem danych i określić nazwę tabeli, którą system ma powiązać z testem jednostek. O statn ia wersja przyjm uje param etry providerlnvariantName, connectionstring, tableName i dataAccessMethod. Pierwszy służy do określania typu dostawcy, na przykład dostawcy plików CSV, bazy SQL Server i tak dalej. Drugi, łańcuch połączenia, zależy od wybranego dostaw cy i określa sposób dostępu do danych. Trzeci param etr to nazwa tabeli (lub pliku) z danym i. Czwarty, m etoda dostępu do danych, określa sposób powiązania danych z testem jednostek — sekwencyjny lub swobodny. Załóżmy, że programista pisze test jednostek do sprawdzenia informacji o zamówieniach i koncie klienta. M oże wczytać dane klienta, pobrać złożone zam ów ienia, określić p rzyznany kredyt i sprawdzić obecny stan rachunku. W szystkie te operacje dla danego klienta m ożna wykonać w jednym teście jednostek. Test m ożna powiązać z w ierszam i danych testowych klienta, aby sprawdzić poprawność kodu w różnych scenariuszach. Przyjm ijm y, że dane testow e znajdują się w pliku .csv w aplikacji testowej. W tedy atrybut DataSource m ożna dodać do m etody testowej w następujący sposób: [TestM ethod() , D a t a S o u r c e ( " M ic r o s o f t . V i s u a l S t u d i o . T e s t T o o l s . D a t a S o u r c e . CSV", " |D ataD ir e c t o r y |\\0rd e rT e s tD a ta .e s v " , DataA ccessM ethod.S e q u e n t i a l ) ,

"O rderTestD ata#csv",

D e p l o y m e n t I t e m ( " B u s i n e s s D o m a i n U n i t T e s t s W O r d e r T e s t D a t a . c s v " )] p u b lic void V e r ify C u s to m e rO r d e r s () {

/ / Kod sprawdzający informacje o zamówieniach i koncie klienta.

}

C zę ść III Tworzenie kodu i zarządzanie nim W arto zauważyć, że w przykładow ym kodzie pierwszy param etr atrybutu D a t a S o u r c e określa dostawcę plików .csv. N astępny p a ra m e tr to łańcuch połączenia z plikiem danych. Trzeci param etr ( O r d e r T e s t D a t a # c s v ) inform uje, że nazwa tabeli nie istnieje (użyto nazwy pliku). O statni param etr, wartość w yliczeniowa D a t a A c c e s s M e t h o d . S e q u e n t i a l , określa, że każdy wiersz należy powiązać z testem je d n o stek w sposób sekwencyjny. Zwróćmy też uwagę na to, że dodano atrybut D e p l o y m e n t l t e m , aby zagwarantować, że plik z danymi testowymi zostanie zainstalowany wraz z testem jednostek. Nawiązywanie połączenia przy użyciu pliku konfiguracyjnego W innym scenariuszu można przechowywać informacje o połączeniu w pliku konfiguracyjnym. Jest to przydatne, jeśli program ista nie chce na trwałe zapisywać informacji w kodzie testów jednostek. Możliwe, że ta sama testowa baza danych jest wykorzystywana w wielu testach. W śro­ dowisku programistycznym i testowym połączenie z bazą może wyglądać inaczej. W tedy um iesz­ czenie inform acji o połączeniu w pliku konfiguracyjnym ułatwia zarządzanie nimi. Pierwszy krok w tym podejściu polega na utworzeniu pliku konfiguracyjnego. W tym celu wystarczy dodać plik app.config do projektu testów jednostek (należy kliknąć plik projektu prawym przyciskiem myszy i wybrać opcję Add/New Item). Jedyna trudność to praw idłow e określenie form atu pliku konfiguracyjnego. Trzeba dodać sekcję konfiguracyjną specyficzną dla narzędzi testowych środowiska Visual Studio. W arto zauważyć, że w sekcji należy wskazać wersję 10. platform y testów jednostek. O to przykładowy kod:

< section name="microsoft. v is u a ls tu d io .te s tto o ls " t ype="M icro so ft.Visu a lS tu d io .T e s tT o o ls .U n itie stin g .T estC o n fig u ratio n S ectio n , M ic ro so ft.V isualS tudio.Q u a lity T o o ls. U nitT estFramework, Version=10.0 .0 .0 , '-►Culture= n e u tra l, PublicKeyToken=b03f5f7fIld50a3a" />

Następnie należy dodać sekcję z łańcuchem połączenia. Trzeba określić nazwę łańcucha i po­ dać informacje o połączeniu oraz dostawcy danych. Tekst łańcucha zależy oczywiście od do­ stawcy i rodzaju danych. Dla danych przechowywanych w plikach .xlsx , .csv i .xml oraz bazach Access, Oracle i SQL potrzebne są specyficzne elementy w łańcuchu połączenia. W poniższym przykładzie wykorzystano dostawcę O l e D b do utworzenia łańcucha połączenia dla pliku .csv:

< /connectio n S trings> Ostatni krok polega na utworzeniu sekcji źródła danych zagnieżdżonej w sekcji narzędzi testowych. Należ)' określić nazwę testowego źródła danych i wskazać łańcuch połączenia. P o n ad to można podać m etodę dostępu do danych (dostęp sekwencyjny lub swobodny) i nazwę tabeli (jeśli jest potrzebna). Ostatecznie plik konfiguracyjny powinien wyglądać tak jak na listingu 9.6.

Rozdział 9. Testowanie kodu Listing 9.6. Przykładowy plik konfiguracyjny testu jednostek

< co n figu ratio n > < co n fig Se ctio n s> < se ctio n

nam e ="m icro so ft. v i s u a l s t u d i o . t e s t t o o ls "

ty p e = " M ic r o s o ft .V is u a lS t u d io .T e s t T o o ls .U n it T e s t in g .T e s t C o n f ig u r a t io n S e c t io n , M i c r o s o f t . V i s u a l S t u d i o . Q u a l i t y T o o l s . U n i t i e s t Framework,

V e rsio n =1 0 .0 .0 .0 ,

'-*Cu ltu re = n e u tral,

P u b licK eyTo ken =b 0 3f5f7fIld 50a3a"

/>

< /co n fig Se ctio n s>

< m icro so ft.v isu a ls tu d io .te stto o ls>

< /m icro so ft.v is u a ls tu d io .te stto o ls> < /co n figu ra tio n >

Uwaga Warto zauważyć, że w jednym pliku konfiguracyjnym można zdefiniować wiele łańcuchów połączeń (każdy z nich musi mieć inną nazwę).

Następnie można wykorzystać skonfigurowane testowe źródło danych w metodzie testowej. W tym celu wystarczy podać nazwę źródła danych w atrybucie D ataS o u rce metody testowej. Prowadzi to do zwiększenia przejrzystości kodu, ułatwia w ielokrotne w ykorzystanie łańcuchów połączeń i umożliwia centralne zarządzanie połączeniem, jeśli jest ono inne na poszczególnych komputerach. Poniżej pokazano, jak wykorzystać źródło danych:

[TestMethodO, DataSource!"OrderTestDataSource"] public void VerifyCustomerOrders() { / / Kod sprawdzający informacje o zamówieniach i koncie klienta.

} W arto zauważyć, że w tym przykładzie dane testowe znajdują się w pliku .csv o nazwie OrderTcstData.csv. Plik dodano do katalogu TestData w projekcie testów. Katalog i plik są następnie przenoszone do katalogu bin, w którym środowisko uru ch am ia testy. Dzieje się tak, ponieważ

C zę ść III Tworzenie kodu i zarządzanie nim łańcuch połączenia obejmuje fragm en t | DataDirectory | TestDataV M ożna też bezpośred­ nio w ym usić instalowanie plików, dodając atrybut Deployment Item do m etody testowej.

Wskazówka H

i

Łańcuchy połączeń dla testów jednostek można skonfigurować za pomocą okna dialogowego P r o p e r tie s . Zobacz na przykład punkt „Konfigurowanie atrybutów testów jednostek” w dalszej części rozdziału.

y BM jjgH WT

Stosowanie danych testowych w asercjach Dostęp do danych testowych pow iązanych z m etodam i testowymi można uzyskać za pom ocą obiektu kontekstu testu. Przypomnijmy, że jeśli programista ustawi właściwość typu TestContext (zobacz p u n k t „Klasa T estC ontext”), obiekt kontekstu zostanie udostępniony przez platformę. M etoda DataRow klasy TestContext pozwala pobrać wiersz powiązany z wykonywanym testem. D o m etody można przekazać nazwę pola lub indeks, aby pobrać dane z odpowiedniej kolumny. Zwykle należy ustawić zm ienne dla wszystkich pól danych testowych. Następnie można wykorzystać zmienne w asercjach w testach jednostek. Na listingu 9.7 pokazano przykład zastosowania danych testowych (układ danych testowych przedstawiono na rysunku 9.18 w dalszej części rozdziału). W arto zauważyć, że każdą kolumnę trzeba zrzutow ać lub przekształcić na odpowiedni typ danych. Następnie m ożna napisać wła­ ściwe asercje. Listing 9.7. Przykładowy test jednostek, w którym wykorzystano powiązane dane [TestM ethod() , D ataSo urce("O rderTestD ataSource")1 p u b lic void V e rify C u sto m e rO rd e rs() {

//

Pobieranie wartości z wierszy danych.

strin g in t

em ail =

numOrders =

( s t r i n g ) T e s t C o n t e x t . DataRow !" e m a i l " ] ; (int)TestCo ntext.D ataR ow ["n um

do uble

cre d itLim it

do uble

accountBalance

orders

= C o n v e rt.T o D o u b le fT e s tC o n te x t.D ataRow !"credit =

'-► C o n v e rt.T o D o u b le ( T e s t C o n t e x t .DataRow! " a c c o u n t

//

b a la n ce "]) ;

Tworzenie obiektu Customer na podstawie adresu e-mail.

C u s t o m e r c u s t = new C u s t o m e r ( e m a i l ) ;

//

Sprawdzanie informacji o zamówieniach i koncie klienta.

A s s e r t . I s T r u e ( c u s t . O r d e r H i s t o r y . Count == "Liczb a

zamówień j e s t

num Orders,

niep raw id ło w a.");

A s s e r t . I s T r u e ( c u s t . A c c o u n t . B a la n c e == a c c o u n t B a la n c e , "Stan

rachunku j e s t

n iep raw id ło w y.");

A s s e r t .IsT ru e (cu st.A cco u n t.C re d itLim it "Lim it

todate"];

debetu j e s t

n iep raw id ło w y.");

==

cre d itLim it,

lim it" J ) ;

Rozdział 9. Testowanie kodu

C zę ść III Tworzenie kodu i zarządzanie nim

Pisanie testów jednostek działających w ASP.NET M ożna wybrać, czy testy jednostek mają być przechowywane i urucham iane w środowisku ASP.NET zamiast w dom yślnym procesie hosta VSTest. Jest to przydatne przy pisaniu testów współdziałających z obiektam i ASP.NET, takimi jak Page i Session. Czasem program ista chce przetestow ać usługę sieciową lub inny kod aplikacji związany z interfejsem sieciowym. M ożna wtedy umieścić testy jednostek dla aplikacji ASP.NET na serwerze I IS lub na serwerze środow iska Visual Studio. Takie rozwiązanie gwarantuje, że testy będą miały pełny dostęp do zm iennych środowiskowych ASP.NET.

Definiowanie atrybutów środowiska ASP.NET Aby określić, że test jednostek ma działać w środow isku ASP.NET, należy dodać odpow iednie atrybuty do metody testowej. Liczne atrybuty znajdują się w przestrzeni nazw UnitTesting.Web. Dlatego należy najpierw dodać odpow iednią instrukcję using (imports w języku Visual Ba­ sic) w górnej części pliku klasy testów, które mają działać w ASP.NET. Instrukcja pow inna wyglądać tak: using

M ic r o s o ft.V is u a lS t u d io .T e s t T o o ls .U n itTestin g.W eb ;

Ponadto w aplikacji z testem jednostek należy dodać referencję do witryny. Umożliwi to d o ­ stęp do stron witryny i innych klas, które mogą znajdow ać się w katalogu App_Code oraz in ­ nych miejscach. Przy tw orzeniu testów jednostek w ASP.NET używane są trzy główne atrybuty: UrlToTest, HostType i AspNetDevelopmentServerHost. A trybut UrlToTest um ożliw ia określenie strony, którą należy wywołać w czasie urucham iania danego testu jednostek. Strona jest w y­ woływana przez platformę testów, a dla testu jednostek dostępny jest kontekst żądania sieciowego (poprzez obiekt Page). W kodzie testu jednostek m ożna korzystać ze środow iska ASP.NET w taki sam sposób, jak w pliku z kodem ukrytym strony internetowej. A trybut H ostType umożliwia zm ianę typu hosta na ASP.NET. W tym celu należy przekazać do atrybutu łańcuch znaków ASP. NET. Przy korzystaniu z hosta w postaci serwera IIS wystarczy ustawić atrybuty UrlToTest i HostType. Jeśli jednak programista używa serwera ASP.NET D evelopm ent (współdziałającego z Visual Studio), musi ponadto dodać atrybut AspNetDevelopmentServerHost. Jako param etr a try ­ butu należy przekazać ścieżkę do aplikacji sieciowej. Trzeba też podać nazwę głów nego katalo­ gu aplikacji sieciowej. Na listingu 9.8 pokazano przykład zastosowania wszystkich trzech wym ienionych atrybutów do zdefiniow ania testu jednostek ASP.NET działającego na lokalnym serwerze rozwojowym.

Rozdział 9. Testowanie kodu Listing 9.8. Test jednostek ASP.NET [TestM ethod() ] [H o stTyp eC A SP .N ET")] [A sp N e tD ev e lo p m e n tSe rv erH o st( " C : \\CO D E\\U nleashed \\Conto so \\ContosoW eb",

“ / " )]

[ U r l T o T e s t ( " h t t p : / / l o c a l h o s t : 5 5 1 3 6 / S h o p p i n g C a r t . a s p x " )] p u b lic

vo id

A ddSh o p p in gC artIte m Te st() {

/ / Pobieranie żądanej strony. Page

reqPage = T e s t C o n t e x t . RequestedPage;

A sse rt.IsT ru e (re q P a g e .T itle

==

"Koszyk

zakupów",

"Tytuł

strony

je st

^ ■ n iew łaściw y." ) ;

/ / Rzutowanie na typ strony. Sh oppingCartP age a ctu a lP a g e

=

(Sh oppingCartPage)reqPage;

A sse rt.IsN o tN u lK a ctu a lP a g e .C a rt,

"Na s t r o n i e

n ie

ma k o s z y k a . " ) ;

/ / Sprawdzanie poprawności kodu do obsługi koszyka zakupów. a c t u a lP a g e .C a r t . A ddltem ("Produkt

1",

1,

12.75);

a c t u a lP a g e .C a r t . AddItem ("Produkt

2",

2,

26.95);

A s s e r t . Is T r u e ( a c t u a lP a g e .C a r t . Item s.Count '-► n ie w ła ściw a . " );

== 2,

"Liczb a

A ssert.A re E q u a K a ctu alP a ge .C a r t .C a lcu la te C a rtT o ta l(),

elem entów

je st

66.65);

} W arto zauważyć, że referencje do obiektów ASP.NET pochodzą z właściwości RequestedPage obiektu TestContext. Właściwości tej można użyć do zrzutowania danych bezpośrednio na typ żądanej strony (tu jest to typ ShoppingCartPage). Oczywiście, właściwość RequestedPage ma typ System.Web.Ul.Page, dlatego zapewnia dostęp do obiektów Server, Session, Request, Response i podobnych.

Generowanie testów jednostek ASP.NET Za pomocą Visual Studio można autom atycznie wygenerować testy jednostek ASP.NET. Czę­ sto jest to zalecana metoda tworzenia testów, ponieważ przygotow uje projekt testów do pracy ze środowiskiem ASP.NET i autom atycznie konfiguruje atrybuty. Testy jednostek ASP.NET generuje się w taki sam sposób, jak wszystkie inne testy jednostek. Najpierw należy otworzyć kod (plik z kodem ukrytym strony lub inny plik klasy). N astępnie trzeba kliknąć prawym przyciskiem myszy kod i wybrać opcję Create Unit Tests. Spow oduje to uruchom ienie kreatora Create Unit Tests (zobacz rysunek 9.5). W tym miejscu m ożna wybrać metody, dla których kreator ma wygenerować testy. O bsługiw ane są zdarzenia zw iązane ze stroną, kliknięcie przycisków i inne zdarzenia kontrolek. M ożna też napisać test jednostek wyszukujący kontrolki na stronie i sprawdzający ich zawartość.

C zę ść III Tworzenie kodu i zarządzanie nim

Konfigurowanie hosta projektu testów Program iści często tworzą dla witryny odrębny projekt testów jednostek. Projekt może d o ty ­ czyć testów powiązanych z funkcjam i witryny. M ożna też utworzyć dodatkow e projekty testów do spraw dzania innych bibliotek kodu. Tego typu podział ułatwia pisanie i przeprow adzanie testów jednostek. Ponadto można skonfigurow ać ustawienia projektu testów specyficznie pod kątem hosta. Dzięki tem u nie trzeba definiow ać licznych atrybutów ASP.NET w każdym teście jednostek. Zam iast tego można skonfigurow ać plik .testsettings w taki sposób, aby w spółdziałał ze specy­ ficznym hostem . W tym celu należy kliknąć d w u k ro tn ie plik .testsettings (Solution Item s/ Local.testsettings), co spow oduje wyświetlenie okna dialogowego Test Settings, widocznego na rysunku 9.17.

V

Test Sett.^gs

General Deployment

Test Timeouts Unit Test

S

Hosts Select the host where tests will run. The default host runs tests normally. For tests that cannot be hosted by the specified host adapters: Run in default host o Do not run Host type ASP.NET

-

Host Process Platform: ! X86



URL to test http://iocałhost5S136/ •

Run tests in ASP.NET Development Server Path to Web site. C:\Users\Milce\Desktop\COOE\Unleashetl\Contoso\Contoso\ContosoWeb

Browse..

Web application root

/ Run tests in OS

Save As..

Apply

Rysunek 9.17. Plik .testsettings można wykorzystać do skonfigurowania całego projektu testów, tak aby działał dla witryny ASP.NET

Wskazówka Jeśli rozwiązanie zawiera wiele projektów testów jednostek, warto utworzyć kilka wersji pliku .te s ts e ttin g s . Następnie można łatwo przełączać się między konfiguracjami dla hostów ASP.NET i stan­ dardowego (VSTest).

Rozdział 9. Testowanie kodu W oknie dialogowym należy otworzyć widoczny po lewej stronie węzeł Hosts, a następnie ustawić w artość ASP.NET dla opcji Host type. Spowoduje to udostępnienie kilku dodatkow ych opcji: URL to Test, Path to Web Site i Web Application Root. Każdą z tych opcji m ożna ustawić na wartości dom yślne dla całego projektu testów jednostek.

Konfigurowanie atrybutów testów jednostek Pokazaliśmy, że istnieje wiele atrybutów , które można zastosować do testów jednostek. Oczy­ wiście, możliwe jest skonfigurowanie każdego z nich w edytorze kodu. Jednak Visual Studio udostępnia pew ną pomoc w oknie dialogowym Properties. M ożna wybrać dany test jednostek, wyświetlić okno Properties, a następnie skonfigurować atrybuty stosowane do m etody testowej. Visual Studio wygeneruje kod atrybutów dla metody testowej. Przyjrzyjmy się przykładowi.

Definiowanie połączenia za pomocą okna dialogowego Properties Pierwszym krokiem przy stosowaniu ok n a Properties do konfigurow ania testów jednostek jest wybranie testu. Należy to zrobić w oknie Test View (Test/W indows/Test View). Następnie m ożna kliknąć prawym przyciskiem myszy test na liście i wybrać opcję Properties, aby wyświe­ tlić okno Properties dla danego testu. Na rysunku 9.18 pokazano przykładowe dane. W arto zauważyć, że w oknie Properties znajdują się właściwości wielu atrybutów, któ re można zastosować do metody testowej. Zmiana wartości jednej z właściwości spowoduje wygenerowanie przez środowisko Visual Studio atrybutu i kodu w pliku z kodem (między kodem i omawianym oknem następuje dw ustronna synchronizacja). Przykładowo, właściwość Data Connection String ułatwia zdefiniowanie atrybutu D a ta S o u rc e . Kliknięcie przycisku z wielokropkiem przy właściwości pow oduje uruchom ienia kreatora, dzięki którem u m ożna zdefiniować łańcuch połączenia z bazą danych SQL, plikiem CSV lub plikiem XML (oczywiście, można nawiązać połączenie także z innymi źródłami danych, ale wymaga to napisania własnego łańcucha połączenia). We wcześniejszym przykładzie używaliśmy pliku CSV. Po zaznaczeniu opcji związanej z tym formatem m ożna przejść do pliku CSV, a nawet podejrzeć zapisane w nim dane. Na rysunku 9.19 pokazano przykładowy ekran kreatora. Po usta­ wieniu wszystkich opcji kreator zaktualizuje kod, dodając atrybuty' D ataS ource i D eploym entltem . Poniżej znajduje się uzyskany kod konfiguracyjny: [T e s tM e th o d (), D e p lo y m e n tItem( " B u s i n e s s D o m a i n U n i t T e s t s W T e s t D a t a W O r d e r T e s t D a t a . c s v " ), D a taSo u rce ( "M icro so ft.V is u a lS t u d io .T e s t T o o ls .D a ta S o u rce .CSV", " |D a t a D i r e c t o r y | \ \ 0 r d e r T e s t D a t a . c s v " , D ata A cce ssM e th o d .Se q u e n tia l)] p u b lic

vo id

V e rifyC u sto ire rO rd e rs()

{

...

"O rderTestD ata#csv",

C zę ść III Tworzenie kodu i zarządzanie nim

R y su n e k 9.19.

Testy jednostek można powiązać z testowymi danymi, w tym z prostym plikiem ,csv

New Test Data Source Wizard

Select the CSV file the data source is based on

Choose a CSV file C :\U s e rs \ rm n e ll\ D e s lc to p \ C O O E \U n le a 5 h « f\ C o n to s o \ C o n to s o \ B u s in e s s D o m e in U n rtT e s ts \ O rd e rT e s tP a t

►M M

m ta

C aned

. .. j

Rozdział 9. Testowanie kodu

Tworzenie testów uporządkowanych Visual Studio umożliwia łączenie grup testów jednostek, określanie kolejności ich wykonywania i traktow anie wyników w taki sposób, jakby uzyskano je dla pojedynczego testu. Może to być przydatne, jeśli program ista chce napisać testy jednostek zależne od siebie. M ożna na przykład wstawić rekord w jednym teście i oczekiw-ać, że ten sam rekord będzie dostępny w dalszym teście. Oczywiście, jest to niezgodne z dobrymi praktykami testów jednostek — możliwe powinno być przeprow adzenie każdego testu niezależnie od pozostałych. Na szczęście m ożna utworzyć test uporządkow any, który łączy poszczególne testy jednostek w nowy, niezależny test. 'fest uporządkow any można dodać do projektu testów, klikając projekt prawym przyciskiem myszy i wybierając opcję Add/Ordered Test. Można też w ybrać szablon Ordered Test w oknie dialogowym A dd New Test (zobacz rysunek 9.3). Test uporządkow any to po prostu plik XML oparty na szablonie Ordered Test. Nie trzeba jed­ nak ręcznie edytować kodu w języku XML. Środowisko Visual Studio udostępnia jako pomoc okno projektow e dla testów uporządkowanych. Przykładową zawartość takiego okna pokazano na rysunku 9.20.

C zę ść III Tworzenie kodu i zarządzanie nim Po lewej stronic okna dialogowego znajdują się wszystkie testy z rozwiązania. Można wyświe­ tlić testy z wybranej listy (zobacz podrozdział „Organizowanie testów”). Po lewej stronie należy zaznaczyć poszczególne testy i użyć strzałki (>) w celu ich dodania do testu uporządkowanego. Skierowane w górę i w dół strzałki widoczne po prawej stronie służą do zmiany kolejności przeprow adzania testów. Przy wykonywaniu testów uporządkow anych środow isko Visual Studio urucham ia każdy test jednostek w podanej kolejności. Jeśli którykolwiek test się nie powiedzie, cały test uporządkowany zakończy się niepowodzeniem. Oczywiście, można wyświetlić szczegółowe informacje na tem at testu uporządkowanego, aby zobaczyć, które testy zakończyły się sukcesem, a które — porażką.

Organizowanie testów W iększość projektów testów jednostek składa się z licznych testów — nieraz są ich setki. P o ­ nadto często w jednym rozwiązaniu znajduje się wiele projektów testów jednostek. Zarządzanie wszystkimi testami i urucham ianie tylko tych potrzebnych w danym m om encie bywa trudne. Visual Studio udostępnia pew ną pomoc w tym zakresie — okna Test View i Test List Editor.

Okno Test View O kno Test View umożliwia wyświetlenie wszystkich testów w otwartym rozwiązaniu, zazna­ czenie tych, którymi program ista jest zainteresowany, i albo uruchomienie ich, albo zarządzanie właściwościami ich atrybutów . Dostęp do okna Test View można uzyskać z m enu Test ( Test/Windows/Test View). Na rysunku 9.21 pokazano przykładową zawartość okna. W arto zauważyć, że m ożna zaznaczyć jeden lub kilka testów, kliknąć prawym przyciskiem myszy i uruchom ić wybrane testy w jednym p rz e ­ biegu. Dzięki temu nie trzeba uruchamiać wszystkich testów jednostek, jeśli ważna jest tylko jedna metoda testowa (lub ich mała grupa). W górnej części okna Test View znajduje się pasek narzędzi. Umożliwia on wyszukiwanie testów na podstawie słów kluczowych i modyfikowanie sposobów grupow ania lub filtrowania testów. Sprawia to, że znalezienie testów jest łatwiejsze. Można na przykład zmienić wartość opcji Group By na Class Name , aby wyświetlić wszystkie testy dla określonej klasy. Przykładowe ustawienia pokazano na rysunku 9.22.

Rozdział 9. Testowanie kodu

C zę ść III Tworzenie kodu i zarządzanie nim D ostęp do okna Test List Editor m ożna uzyskać z m enu Test ( Test/Windows/Test List Editor). Pojawi się okno podobne do tego z rysunku 9.23. Po lewej stronie widnieją listy testów. D o­ myślnie dostępne są opcje Lists o f Tests, Tests Not in a List i All Loaded Tests. Jeśli program ista wybierze listę z testami (na przykład All Loaded Tests), może albo uruchomić całą listę, albo użyć pól wyboru widocznych po prawej stronie okna do wybrania z listy testów do przeprow adzenia. u o Contoso - M iecsoi Visual Studio

Project

Bold

.■

Debug

Dala

Tools

Test

Window

Help

: tt . J -> S b) M Z Z □ ^ , ,

J - J r J ■* ;



compilation

Test List Editor '• *



\

[A« Columi •

G-cupE

« T>pe kr/.vord

_jk i

Run Checked Tests becked tests ^ ' All Loaded Tests

Test List Fu« Name

public strin g T it le { g et; s e t; } public strin g D escription { g et; s e t; }

;

S o lu tio n Explorer

using Systetr.Text;

Iv n a n e sp a c e



u e a te Publish Settings

M ainW m dow >aml 3

Bu siness D o m ain

: Mcibi References 0 Customer.es

■ 4

0 rd er.es

C J ] Product.es Business Ser\.ces

public in t Referencetiuwber { g et; s e t; ; public strin g Creator { g e t; s e t ; } public in t Pages . g e t; s e t ; public strin g Type { g et; s e t ; >

100% VS Error list Hernia) Saved

To samo menu można otworzyć, klikając obszar w edytorze praw ym przyciskiem myszy. Także w tym scenariuszu trzeba wyróżnić słowo lub fragment kodu (lub umieścić kursor w odpow ied­ nim miejscu), a następnie kliknąć prawym przyciskiem myszy. Pojawi się wtedy p o d ręczn a wersja m enu Refactor, co pokazano na rysunku 10.2. W arto zauważyć, że drugi elem ent m enu to Refactor. Po jego rozwinięciu pokazuje się pełne menu Refactor.

Refaktoryzacja w oknie kodu za pomocą inteligentnych znaczników Inteligentne znaczniki po raz pierwszy pojawiły się w pakiecie M icrosoft Office. Ich zadanie jest proste, co opisano w rozdziale 8., „Korzystanie z narzędzi zwiększających produktyw ność”. Mają próbować przewidzieć, co pisze użytkownik, i na tej podstaw ie udostępniać dodatkow e,

Rozdział 10. Refaktoryzacja kodu

Ą

^

________________________

-

Solution Eiploin_________________ - 9 *

K Errof List Rnn(s) Savrd

In 7

C o ll9

C h l9

1NS

Na przykład programista może używać właściwości R eferen ceN u m b er, a w pew nym m om en­ cie stwierdzić, że chce zmienić jej nazwę na ISBN. W tym celu powinien otworzyć plik z daną klasą i umieścić kursor obok nazwy' tej właściwości, a następnie zacząć wpisywać nową nazwę. Edytor kodu C# wykryje wtedy wprowadzoną zmianę i podkreśli ostatni znak nowej nazwy, co widać na rysunku 10.3. Należy zwrócić uwagę na mały prostokąt pod nazwą właściwości. Rysunek 10.3. Zmiana nazwy właściwości powoduje wyświetlenie inteligentnego znacznika do refaktoryzacji

public int ISBN { get; set; }

C zę ść III Tworzenie kodu i zarządzanie nim Mały prostokąt widoczny pod w prow adzoną zmianą to graficzna wskazówka informująca o tym, że edytor kodu języka C# wykrył możliwość pomocy program iście. Umieszczenie ku rso ra myszy przy tym prostokącie pozwala wyświetlić m enu kontekstow e opisujące dostępne opcje pomocy. Rysunek 10.4 przedstawia taki inteligentny znacznik wyświetlony w wyniku zm iany nazw)' właściwości z Ref renceN um ber na ISBN (ponieważ wszystkie produkty to książki). Rysunek 10.4. Działanie inteligentnego znacznika do zmiany nazwy

public i n t

ISBN {

mr

>et; set;

>

R e n a m e R e f e r e n c e N u m b e r ' t o ISBN' R e n a m e w ith p re v ie w ...

Wskazówka Inteligentne znaczniki można wyświetlać także bez konieczności korzystania z myszy. W tym celu należy wybrać kombinację kla­ wiszy S h if t+ A lt+ F 1 0 .

Refaktoryzacja za pomocą okna Class Designer Visual Studio 2010 udostępnia okno Class Designer służące do pracy nad klasami. O k n o to umożliwia podglądanie zawartości klas i relacji między nim i. M ożna go także używać jako narzędzia zwiększającego produktyw ność, bezpośrednio tworząc w nim nowe klasy i m odyfi­ kując istniejące.

Omówienie okna Class Designer Okno C la s s D e s ig n e r opisano w rozdziale 6., „Wprowadzenie do edytorów i okien pro­ jektowych”.

Kiedv program ista pracuje nad klasami języka C#, okno Class Designer środowiska Visual Studio udostępnia narzędzia do refaktoryzacji. Jest to p rzydatne na przykład wrtedy, kiedy użytkownik chce zmienić nazw'ę właściwości w omawianym oknie, a jednocześnie mieć pewność, że referencje do niej zostaną automatycznie zaktualizowane. W tym celu należy kliknąć prawym przyciskiem myszy daną właściwość w oknie Class Designer i wybrać opcję Rename menu Refactor. Rysunek 10.5 przedstawia menu refaktoryzacji (używane do zmiany nazwy właściwości z C r e a t o r na A uthor) otwarte bezpośrednio w oknie Class Designer.

Rozdział 10. Refaktoryzacja kodu

Podgląd zmian Po nabyciu wprawy w korzystaniu z narzędzi do refaktoryzacji można pozwolić im na wykony­ w anie odpow iednich operacji bez dodatkowej kontroli. Jednak większość program istów nie lubi, aby ktokolwiek (lub cokolwiek) modyfikował kod bez ich wiedzy. Na szczęście narzędzia do refaktoryzacji umożliwiają podgląd zmian. M echanizm ten pozwala śledzić zm iany wprowa­ dzane przez dane narzędzie i akceptować je lub odrzucać. O k n o dialogowe Preview Changes można wywołać, zaznaczając odpowiednią opcję (pole wyboru) danej refaktoryzacji. W przypadku inteligentnych znaczników m ożna je otworzyć za pomocą drugiej opcji menu. Na rysunku 10.6 zaznaczona jest opcja Preview Reference Changes dla operacji Rename. Rysunek 10.6. Wywoływanie refaktoryzacji z zaznaczoną opcją Preview reference changes

C zę ść III Tworzenie kodu i zarządzanie nim Po wywołaniu refaktoryzacji z opcją Preview Changes Visual Studio wyświetla okno dialogow e o takiej samej nazwie. G órna część tego okna dialogowego przedstawia wszystkie zm iany, jakie mają zostać w prow adzone w wyniku danej refaktoryzacji. Lista modyfikacji jest widoczna jako drzewo, a zew nętrzne gałęzie pokazują, gdzie dana zmiana m a miejsce. Liście danej gałęzi to pliki, w’ których zostaną w prow adzone zmiany. W nazwach plików zagnieżdżone są inform acje o modyfikowanych miejscach kodu. Za pomocą tej listy można podejrzeć dowolny element. Rysu­ nek 10.7 pokazuje zmiany potrzebne przy modyfikacji nazwy właściwości Id klasy Product. Rysunek 10.7. Podgląd zmian dla operacji Rename

Po kliknięciu dow olnego elem entu drzew a wr oknie Preview Changes środow isko w yśw ietla odpowiadający m u kod w obszarze Preview Code Changes tego okna dialogowego. Dzięki temu program ista może szybko przejrzeć miejsca, w których w prow adzone zostaną zm iany. Aby zablokować daną zmianę, wystarczy usunąć zaznaczenie elem entu w' drzewie. Oczywiście, można zapobiec wprowadzeniu zmian w całym pliku, usuwając zaznaczenie wyższego elem entu hierarchii na poziomie pliku. Kiedy programista zakończy przegląd i jest zadowolony z w prow a­ dzonych zm ian, m oże kliknąć przycisk Apply, aby je wprowadzić.

Zmienianie nazw Zmienianie nazw elementów kodu to najczęściej stosowana refaktoryzacja. Choć opcja Rename jest dostępna wr edytorze C#, podobna funkcja znajduje się w edytorze języka Visual Basic. Obecnie także projekty bazodanowe umożliwiają bezpieczną zmianę nazw elementów w sch em a­ tach baz danych. W tym miejscu om ów iliśm y m echanizm y używane przez p ro g ram istó w języka C#, jednak zmienianie nazw w języku Visual Basic i projektach bazodanow ych przebiega w podobny sposób. Rzadko jest tak, że programiści najpierw rozwijają działający kod, a dopiero potem stw ierdzają: „w porządku, teraz się cofnę i zmienię nazwy kilku elementów', aby zwiększyć przejrzystość k o d u ”.

Rozdział 10. Refaktoryzacja kodu C hoć tak się zdarza w niektórych zespołach na etapie refaktoryzacji, bardziej praw dopodobne jest, że w czasie tworzenia aplikacji program ista nieustannie zmienia nazwy elem entów, aby popraw ić błędy oraz zwiększyć przejrzystość i czytelność kodu. Oczywiście, w czasie powsta­ wania bazy kodu zmienianie nazw klas, metod, pól i innych elementów bez jednoczesnego po­ w odowania błędów staje się coraz trudniejsze. Dlatego możliwość zm ieniania nazw elementów z jednoczesnym zachowaniem pewności, że nie wprowadzi się żadnych nowych błędów w kodzie, jest niezwykle istotna. Edytor języka C# to um ożliw ia. Dzięki temu narzędziu m ożna zmienić nazwy wszystkich odpowiednich elementów kodu, włączając w to przestrzenie nazw, klasy, pola, właściwości, m etody i zm ienne. Kompilator pom aga zagwarantować, że nie pojawią się błędy, a zm iany zostaną wprowadzone we wszyst­ kich wystąpieniach danego elem entu w kodzie źródłowym. Za pomocą opcji Rename można naw et przeszukiwać kom entarze i aktualizować je przy użyciu nowych nazw.

Uruchamianie operacji Rename Zm ienianie nazw można uruchom ić w wielu miejscach środowiska IDE. W jednym z po­ przednich punktów , „U rucham ianie narzędzi do refaktoryzacji”, pokazaliśmy, jak uruchom ić operację Rename za pomocą m enu Refactor, kliknięcia prawym przyciskiem myszy, inteligent­ nego znacznika i okna Class Designer. Można także wywołać ją z okna Object Browser, Solution Explorer i Class View. Ponadto jeśli programista używa okna dialogowego Properties do zmie­ niania nazw kontrolek umieszczonych na formularzu, operacja Rename jest wywoływana na zaple­ czu, a nazwra zostaje zmieniona w' odpowiednich miejscach. W oknie Object Browser można wywołać operację Rename jedynie z menu Refactor. Oczywi­ ście, trzeba wtedy przeglądać własne typy rozwiązania. W ystarczy wybrać element, którego nazwę chce się zm ienić, a następnie kliknąć menu Refactor. Rysunek 10.8 przedstawia urucham ianie operacji Rename w oknie Object Browser (górna część ilustracji). W oknie Solution Explorer m ożna zmieniać nazwy plików, które odpowiadają nazwom klas. Przyjm ijm y, że program ista korzysta z pliku Customer, ale chce zmienić nazwrę klasy i pliku na Shopper. W tym celu pow inien kliknąć nazwę pliku praw ym przyciskiem myszy i wybrać opcję Rename. Visual Studio umożliwi zmianę nazwy pliku, a następnie wyświetli pytanie, czy ma zmodyfikować także nazwę klasy. Jeśli program ista potw ierdzi, Visual Studio wyszuka w kodzie wystąpienia o tej samej nazwie, co nazwa pliku. Dlatego jeśli w pliku Customer.es znajduje się klasa C ustom er, operacja zmiany nazwy na Shopper będzie dotyczyć zarówno pliku, jak i klasy (a także wszystkich referencji do niej).

Warto zauważyć, że choć cofnięcie operacji R e n a m e powoduje anulowanie zmian, po zmodyfikowaniu nazwy plików opcja U n d o pozwala cofnąć zmiany wprowadzone w kodzie, jednak nie przy­ wraca oryginalnej nazwy pliku.

C zę ść III Tworzenie kodu i zarządzanie nim taj—a w

Vtiu ol Otudio-

•aO Contoso

Data

Refactor

File Edit

« t/

Rename.

Object Browser X Order.cs

Tools

Test

Window

Help

Mixed Platforms

DomamDiagram, cd

Product.cs

Solution Explorer

Browse: My Solution

a

^

_Y Address

BusinessAdminUserlnterfac BusinessDomain {) BuwnessDomain :> Book A t Customei Order "23 BusmessServices cJ Microsoft.CSharp

^ Properties m References

.5* W '•'* LastName ? State

*• MainWmdowjcaml j]

3* z»

BusinessDomain

Properties References Customer.es DomarnDiagram.cd

- J m scorlib

□ PresentationCore vJ Presentation Framework j

Solution Contoso (3 projects) ~J) BusinessAcminUserlnterface

T City

0 0rd er.es

Product.cs j | Business-ervices

System

• J System.Configuratior ■J System.Core uJ System.Data . j System .Data DataSetExtensi J

System.Drawing

public string FName set: g e t:} M em ber of BusinessDomain Customer

System. Enterpnse Services rl* m

C a n t l .'l l i o

R{| Error List Class Details

Col 19

Ready

R y su n e k 1 0 .8 .

Dostęp do operacji Rename w oknie Object Browser

Nazwy m ożna zmieniać także za pom ocą okna Class View ( View/Class View). To podejście jest przydatne, jeśli programista przegląda kod w kontekście przestrzeni nazw i obiektów , a nie tekstu w pliku. Aby użyć tej techniki, należy kliknąć prawym przyciskiem myszy m odyfikowany element i wybrać opcję Rename. Rysunek 10.9 przedstaw ia zmianę nazwy właściwości S t a t e obiektu O rd e r (na nazwę S ta tu s ) za pomocą okna Class View. Warto zauważyć, że zmiana nazwy klasy z tego poziomu nie ma wpływu na nazwę zawierającego ją pliku.

Wskazówka Dostęp do operacji R en a m e można uzyskać za pomocą kilku poleceń. We wcześniejszych wersjach Visual Studio wprowadzono pojęcie akordów. Działają one jak zwykłe polecenia uruchamiane z kla­ wiatury, jednak należy je wcisnąć (lub zagrać) w określonej sekwen­ cji. Można na przykład wywołać operację R en a m e bez konieczności korzystania z myszy. W tym celu należy umieścić kursor w elemen­ cie, który ma zostać zmieniony. Następnie trzeba wcisnąć sekwencję C trl+ R , C tr l+ R . Wciśnięcie tej sekwencji powoduje wyświetlenie okna dialogowe R e n a m e z opcjami refaktoryzacji wybranego ele­ mentu.

Rozdział 10. Refaktoryzacja kodu R y su n e k 1 0 .9 .

Dostęp do opcji Rename w oknie Class View

Używanie okna dialogowego Rename Okno dialogowe Rename pozwala określić kilka opcji operacji zm iany nazwy. Jest ono widocz­ ne na rysunku 10.6. Fole tekstowe na tym formularzu umożliwia zdefiniowanie operacji zmiany nazwy. W polu New Name można podać now;} nazwę modyfikowanego elementu. Pole Location pozwala określić przestrzeń nazw tego elementu. Oczywiście przeszukane zostaną wszystkie loka­ lizacje, do których prowadzą referencje. O kno dialogowe Rename udostępnia program istom także pewne opcje związane z operacją zmieniania nazw (domyślnie wszystkie one są wyłączone). Trzy pola opcji widoczne pod polem tekstowymi Location umożliwiają ustawienie opcji opisa­ nych w tabeli 10.2. T a b e la 1 0 .2 . O pcje okna dialogowego Renam e

Opcja

Opis

Preview Reference Changes

Ta opcja pozwala programiście określić, czy chce przejrzeć zmiany przed wprowadzeniem ich w kodzie. Jest szczególnie przydatna, jeśli programista wprowadza zmiany po raz pierwszy lub zmienia nazwy w łańcuchach znaków lub komentarzach. Zmiany w łańcuchach znaków i komentarzach nie są oparte na kompilatorze, a na dopasowywaniu łańcuchów (zobacz rysunek 10.10). Możliwość podglądu zmian przed ich wprowadzeniem jest wtedy szczególnie cenna. Programista może chcieć na przykład zmienić nazwę typu, ale już nie podobnego tekstu na etykiecie.

C zę ść III Tworzenie kodu i zarządzanie nim T a b e la 1 0 .2 . O p cje okna dialogowego R e n a m e — cięg dalszy

Opcja

Opis

Search in Comments

Ta opcja umożliwia określenie, czy operacja Rename ma szukać w komentarzach wystąpień nazw, które mają zostać zmienione. Komentarze często dotyczą typów, dlatego należy je zsynchronizować ze zmianami. Rysunek 10.10 przedstawia okno dialogowe Preview Changes— Rename z rozwiniętymi katalogami Strings i Comments. Warto zauważyć, że dopasowanie łańcuchów odbywa się z uwzględnieniem wielkości znaków. Dlatego warto zachować staranność przy pisaniu komentarzy zawierających nazwy typów.

Search in Strings

To ustawienie pozwala określić, czy operacja Rename ma przeszukiwać literały łańcuchów znaków i szukać w nich danej nazwy. Literały łańcuchów znaków obejmują stałe, nazwy kontrolek, nazwy formularzy i tak dalej. Ta właściwość jest najbardziej przydatna, jeśli występuje ścisłe powiązanie między kodem a elementami interfejsu użytkownika. Także ten mechanizm uwzględnia wielkość znaków.

Rysunek 10.10.

Okno dialogowe Preview Changes — Rename

Wyodrębnianie metod Kiedy program ista cofa się i przygląda swemu kodowi, na przykład w czasie okresowego prze­ glądu kodu lub po szczególnie długiej sesji program ow ania bez sprawdzania stanu kodu, czę­ sto znajduje metody, które są zbyt długie lub na złym poziomie ogólności, zawierają powtarzający się kod lub są po prostu źle zorganizowane. Standardowym zadaniem jest przejrzenie kodu i utwo­ rzenie precyzyjnych, odrębnych metod w celu zredukowania powyższych problemów i utworzenia bazy kodu, która jest bardziej czytelna, nadaje się do w ielokrotnego w ykorzystania i jest łatwa w pielęgnacji.

Rozdział 10. Refaktoryzacja kodu Problem polega oczywiście na tym , że takie operacje zajmują dużo czasu i często powodują pow staw anie nowych błędów w kodzie. Edytor kodu języka C# w Visual Studio 2010 udostępnia narzędzie Extract Method , które zapewnia szybką i bezbłędną pomoc przy popraw ianiu organi­ zacji kodu. Dzięki temu narzędziu m ożna tworzyć nowe metody na podstawie istniejącego kodu.

Uruchamianie refaktoryzacji Extract Method Aby uzyskać dostęp do operacji Extract Method, należy najpierw zaznaczyć fragm ent kodu poddawany refaktoryzacji. Następnie można użyć menu Refactor i wybrać opcję Extract Method. Tę opcję m ożna uruchomić także z m enu podręcznego otwieranego za pomocą kliknięcia prawym przyciskiem myszy.

Aby uruchomić operację E x tr a c t M e th o d za pomocą klawiatury, należy najpierw zaznaczyć fragment pobieranego kodu. Następnie należy wybrać akord C trl+R > C tr l+ M .

Wyodrębnianie metod Za pom ocą operacji Extract Method m ożna utworzyć (lub wyodrębnić) nową m etodę na pod­ stawie grupy wierszy kodu, pojedynczego wiersza lub w yrażenia. W każdym przypadku n a­ tychmiast tworzona jest metoda z pobranym kodem, a w jego miejsce środowisko umieszcza wy­ wołania nowej metody. Listing 10.1 przedstawia typową zbyt długą metodę. D odaliśm y num ery wierszy, aby ułatwić opis metody. W czasie przeglądania kodu często można natrafić na podobne metody i właśnie ich należy szukać. Ta metoda jest statyczna i ma zwracać obiekt typu O rd e r dla danego klienta na podstawie identyfikatora klienta oraz identyfikatora zamówienia. Jednak zamówienie, jego zawar­ tość oraz szczegóły dotyczące klienta są pobierane za pom ocą odrębnych w yw ołań kierowa­ nych do bazy danych i zapisywane w specyficznych obiektach. T e obiekt)' są następnie przecho­ wywane w obiekcie zamówienia jako właściwości. Listing 10.1. Długa metoda statyczna 01 p u b l i c

sta tic

Order G e tC u stom e rO rd e r(in t

cu sto m e rld ,

in t

o rd e rld )

{

02 03 04

D a t a A c c e s s . D A L d a l = new D a t a A c c e s s . D A L ( ) ; O r d e r o r d e r = new O r d e r ( ) ;

05 06

II

07

System .D ata.D ataTab le

Pobieranie szczegółów dotyczących zamówienia.

dtOrder = d a l .GetData( "custom erO rder", o r d e rld );

08 09

II

10

if

11

Sprawdzanie poprawności zamówienia na podstawie danych klienta.

(custom erld

!=

( i n t ) d t O r d e r . R ows [ 0 ] [ " c u s t o m e r

t h r o w new A p p l i c a t i o n E x c e p t i o n ( ' ' N i e p o p r a w n e

id" ] )

{

zam ów ienia danego k l i e n t a . " ) ;

C zę ść III Tworzenie kodu i zarządzanie nim 12

}

13

o rd er.Id

14 15

//

16

List

17

System .D a ta .D a ta T a b le

18

foreach

=

( s t r i n g ) d t O r d e r . Rows[ 0 ] [ " i d " ];

Pobieranie danych dotyczących zamówienia.

item s

= new L i s t < 0 r d e r l t e m > ( ) ; dtltem s

( S y s t e m . D a t a . DataRow

= d a l.G etD a ta C o rd e rltem s", r in

d t l t e m s . Rows)

19 20

O rd erltem item .N am e

i t e m = new O r d e r I t e m ( ( i n t ) r [ " p r o d u c t = ( s t r i n g ) r [ "name"] ;

21 22

ite m .D e scrip tio n = (s trin g ) r f 'd e s c r ip t io n " ] ; item .Q u an tity = ( i n t ) r[" q u a n t it y " ] ;

23 24

ite m .U n itP ric e = (d o u b le )r ["u n it item s.A dd( it e m ); } order.Item s

27 28

/ / Pobieranie danych dotyczących klienta.

29

System .D ata.D a taTab le

30 31

S h o p p e r c u s t = new S h o p p e r ( c u s t o m e r l d ) ; order.Cu sto m er = c u s t ;

32 33 34

return

id " ],

o rd e rld );

p ric e " ];

25 26

=

o rd e rld );

{

item s;

dtCustom er = d a l .G e tD a ta ("cu sto m e r",

cu sto m erld );

order;

>

W powyższym kodzie jest sp o ro możliwości w yodrębnienia metod. W arto rozważyć pobranie wywołania inicjującego obiekt O rder, wywołania pobierającego dane dotyczące zamówienia i wy­ wołania pobierającego szczegóły dotyczące klienta. Pozwala to lepiej zorganizow ać kod, dzięki czemu będzie bardziej czytelny, a także daje więcej okazji do ponownego wykorzystania bazy kodu oraz ułatwia jej pielęgnację. Przyjrzyjmy się, jak wyodrębnić odpow iednie metody. N ajpierw pobierzemy wywołanie tworzące zamówienie. Określenie elem entów , które należy pobrać, wymaga pewnego dośw iadczenia w korzystaniu z tego narzędzia. W tym przypadku należy pobrać wiersze od 3. do 13., czyli kod od utw orzenia obiektu DataAccess po inicjację zamówienia. Jednak ta operacja utrudnia wykonanie operacji Extract Method , ponieważ w dwóch wcześniejszych wierszach tw orzone są obiekty typu DataAcess i Order. Funkcja Extract Method potrafi wykryć, że te dwa obiekty są potrzebne do działania metody, dlatego utworzy je jako param etry wyjściowe tej metody. Potrzebna jest jednak metoda, która zwraca obiekt typu 0 rde r i tw orzy własny obiekt typu DataAcess. Można to zrobić za pomocą następujących operacji: 1. Wybrać wiersze od 4. do 13. (od utworzenia zamówienia do jego zainicjowania).

.

2 Wybrać operację Extract Method (z m enu refaktoryzacji, poprzez kliknięcie prawym przyciskiem myszy lub akord z klawiatury). 3. Visual Studio wyświetli wtedy okno dialogow e Extract Method w idoczne na rysunku 10.11. Okno wyświetla nową nazwę m etody (domyślnie NewMethod) i jej sygnaturę. Jeśli sygnatura jest niepoprawna, można anulować operację i wybrać inne wiersze kodu. W tym przypadku m etoda jest statyczna, zwraca obiekt typu Order, a przyjm uje obiekty customerld, orderld i DataAccess. Ta ostatnia nie pow inna znajdować się w sygnaturze, jednak można szybko sobie z tym poradzić.

Rozdział 10. Refaktoryzacja kodu

4. T e ra z należy nadać m etodzie znaczącą nazwę. W tym przypadku będzie to In i t

'-►CustomerOrder. 5. Trzeba kliknąć przycisk OK, aby wyodrębnić m etodę. 6. Z ostanie utworzona nowa m etoda, a zamiast starej pojawi się poniższe wywołanie: Order order = In itC u s to m e rO rd e r(c u s to m e rId , o r d e r ld ,

d a l);

Wciąż pozostaje pewien problem związany z w yodrębnioną m etodą. Przyjmuje ona obiekt typu DataAccess, natomiast lepiej byłoby utworzyć w łasny egzemplarz tego typu. Na szczęście można do tego użyć innej refaktoryzacji — operacji usuwania parametrów, Remove Parameters. Tę refaktoryzację opisujemy w dalszej części rozdziału. W ażne jest, aby zapam iętać, że usunięcie param etru pozwala usunąć go z sygnatur}' metody i jej wywołań. Nie powoduje to jednak utwo­ rzenia obiektu typu DataAccess w nowej metodzie (ani nie usuwa tej operacji z oryginalnej funkcji). Te dwie rzeczy trzeba zrobić samodzielnie. Następnie w yodrębnimy wywołanie pobierające szczegóły dotyczące zam ów ienia. Najpierw należy zaznaczyć wiersze od 16. do 25. (listing 10.1). W yw ołanie ustaw iające właściwość za­ mówienia (wiersz 26.) nie jest tu potrzebne. Metoda ma po prostu zwracać obiekt, który reprezen­ tuje wszystkie wiersze danego zam ów ienia. Rysunek 10.12 przedstaw ia m etodę pobraną po zaznaczeniu odpowiednich wierszy. Tę nową metodę nazwiemy GetOrderltems. Po pobraniu kodu zostaje on zastąpiony wywołaniem nowej metody: List< 0 rd erltem >

Item s

= G e tO rd e rlte m s(o rd erld ,

d a l);

C zę ść III Tworzenie kodu i zarządzanie nim

Ponow nie pojawia się problem z przekazywaniem obiektu typu DataAcess do nowej m etody. M ożna rozwiązać go w taki sam sposób, jak poprzednio. Na zakończenie przyjrzymy się pobieraniu fragm entu metody, który pobiera szczegóły dotyczące klienta. Na tym etapie procedura powinna być już całkiem prosta. Należy zaznaczyć odpowiedni kod (wiersze od 29. do 30.) i wybrać operację Extract Method. Nowej m etodzie należy nadać nazw ę GetCustomer i ponow nie rozwiązać problem z pobieranym param etrem DataAccess. M etoda zorganizowana w now y sposób jest dużo krótsza. Przedstawia ją listing 10.2. Ponadto w program ie znajdują się teraz trzy nowe, precyzyjne, odrębne metody, które można p o w tó r­ nie wykorzystać w przyszłości (i prawdopodobnie przekształcić na publiczne). Te metody znaj­ dują się na listingu 10.3. Listing 10.2. Statyczna metoda po pobraniu jej fragmentów do nowych metod p u b lic

sta tic

Order G e tC u stom erO rd er(in t

Order order = / /

custo m erld,

In itC u sto m e rO rd e r(c u sto m e rId ,

o rd e rld );

Pobieranie szczegółów zamówienia.

List< 0 rd e rlte m > order.Item s

=

item s

item s;

in t

= G e tO rd e rlte m s(o rd erld );

o rd e rld )

{

Rozdział 10. Refaktoryzacja kodu / /

Pobieranie szczegółów dotyczących klienta.

Custom er cust = G etC u sto m er(cu sto m erld ); o r d e r .Cu sto m er = c u s t ; return

order;

Listing 10.3. Wyodrębnione melody p riv a te

sta tic

Shopper NewM ethod(int c u s t o m e r ld )

D ataA ccess.D A L dal

{

= new D a t a A c c e s s . D A L ( ) ;

Syste m .D a ta .D a ta T a b le dtCustom er = d a l.G e tD a ta C 'cu sto m e r",

cu sto m erld );

S h o p p e r c u s t = new S h o p p e r ( c u s t o m e r l d ) ; return cust;

p riv a te

sta tic

List< O rd erIte m >

D ataAccess.D AL List

dal

=

item s

Syste m .D a ta .D a ta T a b le foreach

G etO rd e rItem s(in t

o rd e rld )

new D a t a A c c e s s . D A L ( ) ; = new L i s t < O r d e r I t e m > ( ) ; d tltem s

(System .D ata.D ataRow

= d al.G e tD ataC 'o rd e rlte m s", r in

d tltem s.Row s)

item .Q u an tity = item .U n itP rice = it e m s .A dd(ite m );

=

o rd e rld );

{

O r d e r l t e m i t e m = new O r d e r I t e m ( ( i n t ) r [ " p r o d u c t item .N am e = ( s t r i n g ) r [ "nam e"]; item .D e scrip tio n

{

id "],

o rd e rld );

( s t r i n g ) r [ " d e s c r ip t io n " ];

( i n t ) r [ " q u a n t i t y " ]; (d o u b le)r["u n it

p ric e " ];

} return

p riv a te

item s;

sta tic

Order In it C u s t o m e r O r d e r (in t

DataAccess.DAL dal =

cu sto m erld,

in t

o rd e rld )

{

new D a t a A c c e s s . D A L ( ) ;

O r d e r o r d e r = new O r d e r ( ) ; / /

Pobieranie szczegółów doty czących zamów ienia.

S y s t e m .D a t a . DataTable / /

if

dtOrder = d al.G etD ata("cu sto m e rO rd e r",

o rd e rld );

Sprawdzanie poprawności zamówienia na podstawie danych klienta.

(custom erld

!=

(in t)dtO rd er.R ow sfO ] [ "custom er

t h r o w new A p p l i c a t i o n E x c e p t i o n ( " N i e p o p r a w n e

} o r d e r .Id = (in t)d t0 rd e r.R o w s[0 ]( " id " ] ; re tu rn order;

id "])

{

zam ówienia d la danego k l i e n t a . " ) ;

C zę ść III Tworzenie kodu i zarządzanie nim

Uwaga Refaktoryzacja E x tra c t M e th o d nie pozwala wybrać miejsca umiesz­ czenia wyodrębnianych metod. Wielokrotnie można natrafić na fragment kodu, który warto umieścić w m etodzie w odmiennej klasie. Wtedy trzeba wyodrębnić metodę, a następnie samodzielnie przenieść ją do innej klasy.

Wyodrębnianie pojedynczych wierszy kodu Czasem programista chce pobrać pojedynczy wiersz kodu lub jego fragment i zawrzeć go w o d rę b ­ nej metodzie. Na przykład wiersz może zawierać obliczenia wykonywane tak często, że w arto um ieścić je w osobnej m etodzie. Czasem może też zajść potrzeba pobrania operacji przypisania obiektu w celu dodania do niej nowej logiki. Edytor kodu języka C# obsługuje obie powyższe możliwości pobierania kodu. Przyjrzyjmy się przykładow em u kodowi. Program ista może używać poniższego wiersza kodu do obliczania łącznej wartości zamówienia w pętli przechodzącej przez pozycje zamówienia: total

= total

+ ite m .Q u an tity

* ite m .U n itP rice ;

W arto pobrać fragm ent przypisania obliczający wartość pozycji zam ów ienia (liczba * cena jednostkow a). W tym celu należy zaznaczyć odpow iedni kod i uruchom ić refaktoryzację Extract Method. Rysunek 10.13 przedstawia działanie tej operacji.

Rysunek 10.13. Wyodrębnianie fragmentu wiersza kodu

Rozdział 10. Refaktoryzacja kodu W arto zauważyć, że domyślnie now a m etoda przyjmuje egzemplarz typu Orderltem. W zamian wskazane m oże być przekazywanie liczby produktów i ich ceny jednostkowej. Takie zmiany trzeba w prow adzać samodzielnie. Jeśli liczba produktów i cena jednostkowa zostały przypisane do zmiennych przed w yodrębnieniem kodu, nowa m etoda będzie przyjmowała te param etry, a nie obiekt typu Orderltem. Taką sytuację przedstawia rysunek 10.14. lo 0

oO Contoso * Microsoft Visual Studio File

Edit View

Refactor

Project

Build

Debug

Data

Tools

Test

Windcw Help

£2

_____ _

Extract M ethod

OcdeiHf

GetItem! otal Preview method signature private static double GethemTotaJ(mt qty, double unitPrice)

Cancel

p ub lic double C»lculateOr*derTotal() { double to ta l • 0 foreach (Orderlte* ite« in t h is .It e n s ) { in t qty - itee.Q u antity; double unitPrice ■ it e » .U n it P ric e ; to ta l - to ta l ♦ qty * u n itP ric e ;

return total

Col 40

R y su n e k 1 0 .1 4 .

Ch40

Inny sposób wyodrębniania fragmentu wiersza kodu

W wyniku refaktoryzacji powyższy wiersz kodu zostanie zastąpiony następującą wersją: total

=

total

+ G e tIte m To tal(q ty,

u n itP rice );

Ponadto w program ie pojawi się now a metoda: p riv a te return

sta tic qty

double G e t I t e m T o t a l ( i n t

qty,

d o u b le

u n itP rice )

{

* u n itP rice ;

>

Generowanie szkieletu metody Można sprawić, że Visual Studio autom atycznie w ygeneruje szkielet metody. N ie jest to re­ faktoryzacja, jednak właściwość ta pozwala w podobny sp o só b zwiększyć produktyw ność. Tę technikę m ożna zastosować w następującej sytuacji: program ista pisze kod wywołujący metodę jednego z obiektów, jednak metoda ta jeszcze nie istnieje. M ożna jednak napisać wywołanie tej nieistniejącej metody. Visual Studio wykryje, że dana m etoda nie istnieje, i udostępni inteligentny znacznik, który umożliwia jej utw orzenie (rysunek 10.15).

C zę ść III Tworzenie kodu i zarządzanie nim

Rozdział 10. Refaktoryzacja kodu

Wyodrębnianie interfejsów Jeśli klasy zawierają ten sam podzbiór składowych, przydatne może być zdefiniowanie wspólnego kontraktu współdzielonego m iędzy tym i klasami. Służą do tego oczywiście interfejsy. Niektóre podstaw ow e zalety związane z interfejsam i to: większa czytelność kodu, łatwiejsza konserwacja i możliwość takiego samego korzystania z podobnych składowych. Jednak programiści często nie zauważają wspólnych elementów klas dopóty, dopóki nie napiszą ich kodu, a późniejsze tworzenie interfejsów jest kłopotliwe. Edytor języka C# w Visual Studio 2010 udostępnia refaktoryzację Extract Interface, która uła­ twia ten proces. Ten mechanizm umożliwia automatyczne wygenerowanie odpowiedniego interfej­ su na podstaw ie istniejących klas lub struktur, które następnie będą go im plem entow ać.

U ru ch a m ia n ie re fak to ry za cji Extract Interface W celu uruchom ienia refaktoryzacji Extract Interface należy najpierw umieścić kursor w klasie, strukturze lub innym interfejsie zawierającym składowe, które programista chce pobrać. Następnie m ożna użyć m enu Refactor i wybrać opcję Extract Interface. Opcję Extract Interface można wywołać także z menu kontekstowego za pomocą kliknięcia prawym przyciskiem myszy i w oknie Class Designer.

Wskazówka Aby uruchom ić operację E x t r a c t I n t e r f a c e za pom ocą klawiatury, należy najpierw umieścić kursor w klasie, strukturze lub interfejsie zawierającym składowe, które programista chce pobrać. Następnie należy wybrać akord C tr l+ R , C tr l+ 1 .

W y o d rę b n ian ie in te rfejsó w Aby lepiej zrozum ieć działanie refaktoryzacji Extract Interface, w arto przyjrzeć się przykłado­ wi. Załóżmy, że programista przegląda kod i zauważa, że liczne obiekty mają podobne właści­ wości i metody. Na przykład obiekty Customer, Vendor, Manufacturer, SalesAgent i Product mogą zawierać te same właściwości Id, Name i Description oraz metody Save i Delete. W takiej sytuacji warto umieścić wspólne elementy w interfejsie, który powinny implementować wszystkie te klasy. Przyjrzyjmy się, jak refaktoryzacja Extract Interface pom aga w w ykonaniu tego zadania. Po pierwsze, należy umieścić kursor w docelowej klasie, której składowe m ają zostać pobrane. W tym przykładzie należy wybrać klasę Vendor. U ruchom ienie operacji Extract Interface p o ­ woduje wyświetlenie okna dialogowego o tej samej nazwie. Rysunek 10.17 przedstaw ia to okno z danymi dla omawianego przykładu.

C zę ść III Tworzenie kodu i zarządzanie nim R y s u n e k 1 0 .1 7 .

Wyodrębnianie interfejsu

Najpierw należy zdefiniować nazwę interfejsu. Domyślnie narzędzie nadaje interfejsowi nazw ę klasy poprzedzoną literą I. W tym przypadku jest to nazwa IVendor. Oczywiście, interfejs ten będzie używany dla całej grupy obiektów, dlatego nazwiemy go IDomainObj ect. O kno dialogowe Extract Interface zawiera także wygenerowaną nazwę oraz nową nazwę pliku tego interfejsu. W ygenerow ana nazwa to po prostu pełna nazwa interfejsu, której należy uży­ wać w implementujących go klasach. Pole tekstowe New File Name wyświetla nazwę pliku języka C# zawierającego ten interfejs. W yodrębnienie interfejsu zawsze pow oduje utworzenie now ego pliku. Narzędzie stara się zapewnić synchronizację między nazwą pliku a nazwą interfejsu. Na zakończenie należy wybrać, które składowe obiektu mają znaleźć się w interfejsie. Oczywiście, na liście widoczne są jedynie składowe publiczne. W tym przypadku wybierzemy w szystkie składowe publiczne: Id, Name, Description, Save i Delete. Kliknięcie przycisku OK powoduje wygenerowanie interfejsu. Jedyna zmiana w klasie Customer polega na tym, że obecnie implementuje ona nowy interfejs, tak jak w poniższym wierszu kodu: p u b lic

cla ss

Vendor

: B u sin e s s D o m a in . ID om ainO bject

Następnie interfejs umieszczany jest w nowym pliku. Listing 10.4 przedstaw ia kod now ego interfejsu. Listing 10.4. Wyodrębniony interfejs using

System;

namespace B u s in e s s D o m a in in te rfa ce

ID om ainO bject

{ {

void D e le t e O ; strin g D escrip tio n

{ get;

int

}

Id

strin g

{ get;

set;

Name { g e t ;

set;

}

set;

}

Rozdział 10. Refaktoryzacja kodu vo id

S a v e ( );

> } Następny etap w tym ćwiczeniu polega na dodaniu nowego obiektu i zaimplementowaniu w nim pobranego interfejsu. W tym scenariuszu nie da się wykorzystać zalet refaktoryzacji. Visual Studio udostępnia jednak inteligentny znacznik, za pom ocą którego można dodać im plem en­ tację interfejsu. Rysunek 10.18 przedstawia taki znacznik, który środowisko wyświetliło w wy­ niku w pisania tekstu : ID om ainO bject po deklaracji klasy Book. l^ - s Ł a g

o o C ontojo * M icrosoft Visual Studio

File

Edit

1*

View

A' J

Refactor

A

Project

Build Debug

Data

Tools

Test

D

* - J i 'J

4*

k j a* rff *;?

Debug

l *2

Book.cs" x IDomainObject.«

Window

Help >e i P iWOfmi

Cj^ Vendor .cs

-

^BusmessDcmdin.Book u s i n g System ; u s in g S y s te m .C o lle c tio n s .G e n e ric ;

u s i n g S y s te m .w in q ; u s in g S y stem .T ex t; nam esp ace B usinessD om ain ’

'

p u b lic

c l a s s Bj o » :

p u b lic in t

Id { T it 1

>



Implement interface TDcirwnObjecl Explicitly implement interface IDcmamObjecV

p u b lic

strin g

p u b lic

s tr in g D escrip tio n { g e t;

p u b lic

in t

p u b lic

s t r i n g Author { g e t ;

p u b lic

i n t Pages { g e t ;

ISB'l { g e t ;

se t;

se t;

p u b l i c s t r i n g Type { g e t ;

se t;

}

> se t;

/

>

se t;

}

100s 9 i Error List

Ready

R y s u n e k 1 0 .1 8 .

Implementacja interfejsu

D ostępne są tu dwie opcje. M ożna zaim plem entow ać interfejs w zwykły sposób lub bezpo­ średnio. W pierwszym przypadku narzędzie sprawdza, czy w bieżącej klasie nie ma już stosow­ nych składowych. Druga opcja pow oduje wygenerowanie kodu, który bezpośrednio wywołuje elem enty interfejsu. W tym przypadku cały kod umieszczany jest w regionie interfejsu. Może być to bardzo przydatne przy tworzeniu szkieletów nowych klas na podstawie interfejsów. Poniższy w iersz kodu to przykład bezpośredniej deklaracji składowej interfejsu: vo id

ID o m ain O b ject.Save()

throw

>

{

ne w N o t I m p l e m e n t e d E x c e p t i o n ( ) ;

C zę ść III Tworzenie kodu i zarządzanie nim

Refaktoryzacja parametrów Czasem trzeba zmodyfikować sygnaturę metody, usuwając elem ent, dodając zm ienną lokalną jako param etr lub zmieniając kolejność istniejących param etrów . Te zmiany wymagają zm o­ dyfikowania także wszystkich wywołań danej metody. Samodzielne wprowadzanie takich zmian może spowodować nowe błędy w kodzie. Na przykład programista może chcieć zmienić kolejność dwóch p aram etró w tego samego typu (na przykład i n t ) . Jeśli zapomni w prow adzić zm ianę w wywołaniu zmodyfikowanej m etody, kod wciąż będzie działać, ale niepoprawnie. Znalezienie takich błędów może być trudne, dlatego Visual Studio udostępnia refaktoryzacje służące do usuwania, przekształcania i zm ieniania kolejności parametrów.

Usuwanie parametrów Refaktoryzacja Remove Parameters pozwala wybrać param etry metody, konstruktora lub de­ legata, a następnie usunąć je. To narzędzie aktualizuje także wszelkie miejsca w yw ołania m e­ tody i usuwa wartości przekazywane w miejscu zbędnych param etrów . Aby uruchom ić operację Remove Parameters , należy um ieścić kursor w sygnaturze m etody, a następnie wybrać opcję Remove Parameters z menu Refactor. Można także włączyć tę refaktoryzację z m enu podręcznego (kliknięcie prawym przyciskiem myszy). Ponadto operacja jest dostępna w oknie Class Designer zarów no w widoku klasy, jak i w okienku Class Details.

W skazówka Aby wywołać operację R e m o v e P a r a m e te r s za pomocą klawiatury, należy najpierw umieścić kursor w metodzie zawierającej usuwany parametr. Następnie trzeba użyć akordu C tr l+ R , C tr l+ V .

Przyjrzyjmy się przykładowemu kodowi. Załóżmy, że program ista napisał m etodę o poniższej sygnaturze: p u b lic

sta tic

Order G e tC u sto m e rO rd e r(in t

custo m erld,

in t

orderld)

Ta metoda zw'raca obiekt typu Order utworzony na podstawie identyfikatorów klienta i zam ó­ wienia. Program ista wykrywa nagle, że d o zwrócenia zamówienia wystarcza sam identyfikator. W takim przypadku należy wywołać refaktoryzację Remove Parameters, co powoduje wyświetlenie okna dialogowego o tej samej nazwie (zobacz rysunek 10.19). Parametry m etody są w ym ienio­ ne w górnej części tego okna. Aby usunąć jeden z nich, należy go wybrać i kliknąć przycisk Re­ move. Usuwany element zostanie wtedy wyróżniony przekreśleniem . Jeśli program ista zmieni zdanie, może użyć przycisku Restore do anulow ania operacji usuw ania poszczególnych p ara­ metrów.

Rozdział 10. Refaktoryzacja kodu Rysunek 10.19. Okno dialogowe Remove Parameters

Kiedy program ista zdecydował się już na usunięcie param etrów , może przejrzeć zm iany przed ich wprowadzeniem lub zastosować je wszystkie od razu. Opcja przeglądania działa tak samo jak w innych m etodach refaktoryzacji. Środowisko po prostu wyświetla każdą zm ianę w drzewie i pozwala przyjrzeć się szczegółom. Oczywiście, można anulować poszczególne zmiany. Po zakoń­ czeniu należy wprowadzić ostateczny zestaw zmian.

Ostrzeżenie Deklarowanie zmiennych lokalnych w metodach i przekazywanie ich w wywołaniach innych metod to często stosowana technika. Jeśli programista zastosuje refaktoryzację polegającą na usuwaniu parametrów wywoływanych metod, zmienna lokalna wciąż będzie istniała w wywołującej metodzie. Należy dobrze się zastanowić, czy taki stan jest pożądany. Jeśli nie, trzeba samodzielnie usunąć niepotrzebne zmienne lokalne.

Zmiana kolejności parametrów Zwykle kolejność parametrów m etody zmieniana jest w celu poprawy czytelności i ułatwienia pielęgnacji kodu. Programista m oże chcieć umieścić ważniejsze param etry na początku sy­ gnatury lub starać się zachować taki sam porządek w podobnych metodach lub przeciążonych wersjach jednej metody. Refaktoryzacja Reorder Parameters umożliwia zmianę porządku, w jakim param etry występują w metodzie, delegacie lub konstruktorze. Narzędzie aktualizuje także miej­ sca wywołania metod i zmienia kolejność parametrów przekazywanych w wywołaniu. Aby uruchom ić operację Reorder Parameters, należy najpierw umieścić kursor w sygnaturze m etody, której parametry mają zostać uporządkow ane w o d m ien n y sposób. N astępnie należy wybrać opcję Reorder Parameters z m enu Refactor. M ożna także wywołać tę operację z menu podręcznego(kliknięcie prawym przyciskiem myszy). Refaktoryzacja ta jest dostępna także w oknie Class Designer.

C zę ść III Tworzenie kodu i zarządzanie nim

W skazówka W celu u ru ch om ien ia refaktoryzacji

Reorder Parameters z k la w ia ­

tur)' n a leż y najpierw u m ieścić k u rsor w m etod zie, k tórej p a r a m e ­ try m ają z o sta ć uporządkow ane w nowy sposób, a n a stę p n ie w p is a ć ak ord

Ctrl+R , Ctrl* O.

Przyjrzyjm y się przykładowemu kodowi. Załóżmy, że programista korzysta z m etody o nastę­ pującej sygnaturze: p riv a te

sta tic

Order

In itC u sto m erO rd er(in t

orde rld,

in t

custom erld)

Nazwa tej m etody to In itC u s to m e rO rd e r. Załóżmy, że ponieważ człon C u sto m er w ystępuje jako pierw szy w nazwie m etody, powiązany z nim param etr powinien znaleźć się na początku listy param etrów . Najpierw należy umieścić kursor w powyższej metodzie i w ywołać refaktoryzację Reorder Parameters. Spow oduje to wyświetlenie okna dialogowego Reorder Parameters (zobacz rysunek 10.20). R y s u n e k 1 0 .2 0 .

Okno dialogowe Reorder Parameters

To o k n o dialogow e umożliwia zm ianę kolejności param etrów danej metody. N a g ó rze okna w idoczna jest lista w-szystkich tych parametrów. Po prawej stronie listy znajdują się dw a przy­ ciski. Przycisk ze strzałką skierowaną w górę pozwala przenieść parametr w' górę listy. Przycisk ze strzałką skierowaną w dół umożliwia wykonanie przeciwnej operacji. Za pomocą tych przyci­ sków' należy określić pożądaną kolejność parametrów. Rysunek 10.20 przedstawia okno dialogowe Reorder Parameters z danymi z omawianego przykładu. W arto zauważyć, że w czasie zmieniania kolejności parametrów pod ich listą w yśw ietlana jest wynikowa sygnatura metody. Można także przejrzeć wszystkie zmiany, które zostaną wprow adzo­ ne w miejscach jej wywołania. Kliknięcie przycisku OK powoduje wprowadzenie zm ian wr metodzie oraz m iejscach jej wywołania.

Rozdział 10. Refaktoryzacja kodu

Hermetyzacja pól Często zdarza się, że w obiekcie znajduje się prywatne pole, którego program ista chce użyć do utw orzenia właściwości. Takie pola mogły zostać zaprojektowane jako pryw atne, poniew aż były używ ane jedynie wewnątrz obiektu. Programista mógł też po prostu zdefiniow ać publicz­ ne pole zam iast ukrywać je jako właściwość. W każdym razie jeśli zachodzi potrzeba utworzenia właściwości na podstawie pola, m ożna posłużyć się refaktoryzacją Encapsulate Field.

Uruchamianie refaktoryzacji Encapsulate Field Operacja Encapsulate Field pozwala szybko wygenerować właściwość na podstaw ie danego pola. W łaściwości umożliwiają oczywiście ochronę pola przed bezpośrednim dostępem , a także pozwalają określić, kiedy dane pole jest modyfikowane lub używane. Aby ukryć pole, należy umieścić w nim kursor i wybrać opcję Encapsulate Field z menu Refactor. M ożna zrobić to samo za pomocą m enu podręcznego (kliknięcie prawym przyciskiem myszy) lub w oknie Class Designer.

W celu uruchomienia refaktoryzacji R e o r d e r P a r a m e te r s z klawia­ tury należy najpierw umieścić kursor w polu, które ma zostać ukryte, a następnie wpisać akord C tr l+ R , C trl+ F .

Okno dialogowe Encapsulate Field Okno dialogow e Encapsulate Field (zobacz rysunek 10.21) pozwala ustaw ić kilka opcji tej re­ faktoryzacji. Nazwa pola poddawanego refaktoryzacji widoczna jest w polu przeznaczonym tylko do odczytu. M ożna za to zdefiniow ać nazwę nowej właściwości. D obra w iadom ość jest taka, że narzędzie próbuje poprawnie nazywać właściwości. N a przykład jeśli nazw a pola prywatnego to r a t i n g , domyślną nazwą właściwości będzie R a tin g . Rysunek 10.21. Okno dialogowe Encapsulate Field

C zę ść III Tworzenie kodu i zarządzanie nim D odatkow ą opcją w tym oknie dialogowym jest możliwość określenia, jakie referencje n a rz ę d z ie ma zaktualizować. Dotyczy to istniejących przypadków użycia pola. Załóżmy, że p ro g ra m is ta używa pola publicznego. Pola tego rodzaju można używać zarówno w obiekcie, w którym jest o n o zdefiniowane, jak i w innych, zewnętrznych obiektach. Można wymusić na zewnętrznych je d n o s t­ kach wywołujących, aby używały nowej właściwości. W tym celu należy ustaw ić opcję External. W tym przypadku obiekt zawierający pole wciąż będzie korzystał z lokalnego, p ry w a tn e g o pola (a nie z właściwości). Ustawienie opcji Update references na All spowoduje, że z a ró w n o zewnętrzne, jak i wewnętrzne jednostki wywołujące będą używały nowej właściwości. N arzędzie do ukrywania pól najpierw przekształca w ew nętrzne pole na pryw atne (jeśli jeszcze takie nie było), a następnie generuje właściwość. W łaściwość zawiera akcesory get i set pola. Jeśli pole było zadeklarowane jako przeznaczone tylko do odczytu, narzędzie wygeneruje jedynie akcesor get. Przyjrzyjmy się kodowi. Załóżmy, że programista napisał następującą deklarację pola: p riv a te

in t

ratin g;

To pryw atne pole ma zostać przekształcone na publiczną właściwość. W ygenerow any k o d wygląda tak: p r iv a t e in t ratin g; p u b lic in t R a tin g { get

{

set

{

return rating

ratin g; = value;

} }

} Ponadto jeśli opcja Update references w oknie dialogowym Encapsulate Field jest ustawiona na A lf wewnętrzne wywołania pola (prywatnego) zostają zaktualizowane tak, aby korzystały z właściwości.

Podsumowanie Ten rozdział opisuje, jak za pomocą narzędzi do refaktoryzacji w budowanych wr edytor języka C# środowiska Visual Studio 2010 można znacznie zwiększyć produktywność i zniwelować niepo­ żądane efekty uboczne (błędy) przy w prow adzaniu w kodzie istotnych zm ian, k tó re mają ułatw iać pielęgnację i powiórne wykorzystanie kodu oraz poprawić czytelność. N arzędzia do refaktoryzacji są oparte na kompilatorze środowiska Visual Studio, a nie na wyszukiwaniu i za­ stępowaniu tekstu. Zwiększa to zaufanie do tych mechanizmów oraz ich niezawodność. D ostęp do narzędzi do refaktoryzacji można uzyskać z klawiatury, m enu Refactor, m enu pod­ ręcznego, okna Class Designer i innych miejsc. Narzędzia do refaktoryzacji um ożliwiają zmie­ nianie kodu na wiele sposobów. Można łatwo zm ienić nazwy elem entów kodu. M ożna użyć istniejących wierszy kodu i umieścić je w nowych m etodach. Obiektów m ożna użyć jako pod­ stawy do definiowania nowych interfejsów. Można modyfikować sygnatury za pom ocą operacji Remove i Reorder. M ożna także użyć istniejącego pola i szybko przekształcić je na właściwość.

Rozdział 11. Diagnozowanie kodu

C zę ść III Tworzenie kodu i zarządzanie nim W tym rozdziale: •

Podstawy diagnozow ania

• Debuger środow iska Visual Studio • Diagnozowanie zaawansowane Współcześni programiści spędzają prawie tyle samo czasu, diagnozując kod, co pisząc go. W ynika to po części z natury dzisiejszych wysoce powiązanych, rozproszonych aplikacji. O parte są one na istniejących funkcjach, platformach, cegiełkach, bibliotekach i tak dalej, a ponadto często muszą komunikować się z innym i aplikacjami, usługami, komponentami, bazami danych, a nawet serw eram i wymiany danych. Programiści często żądają większej pom ocy ze strony debugera, aby zwiększyć produktyw ność. Debuger środowiska Visual Studio 2010 m a spełniać te w ym a­ gania przez udostępnianie wielu doskonałych mechanizmów przydatnych w procesie diagnozo­ wania. Są to między innymi: • Zarządzanie punktam i przerwań i punktam i śledzenia. • Narzędzia graficzne i podpowiedzi debugera. • Opcja „zmień i kontynuuj”. • Diagnozowanie w trybie „tylko mój kod” • Okno Exception Assistant. • Obsługa diagnozow ania na etapie projektowania. • Diagnozowanie skryptów urucham ianych po stronie klienta. • Diagnozowanie aplikacji WCF. • Diagnozowanie zapytań 1.INQ. • Diagnozowanie kodu wielowątkowego i równoległego. • Zdalne diagnozowanie. W tym rozdziale opisujem y powyższe właściwości i nie tylko. Oczywiście jeśli Czytelnik dopie­ ro rozpoczyna swą przygodę z .NET, nowością będą dla niego także inne funkcje. D ebuger środow iska Visual Studio ewoluuje od czasu pierwszego wydania platform y .NET, w której udostępniono jednolite narzędzie do diagnozowania kodu różnych języków. W tym rozdziale roz­ poczniemy od opisu podstaw diagnozowania aplikacji. Następnie szczegółowo opiszemy debuger środowiska Visual Studio 2010.

Podstawy diagnozowania W spółczesny program ista zwykle rozpoczyna pisanie aplikacji od utw orzenia ekranu lub for­ mularza, a następnie dodaje obsługujący go kod. Ponadto programiści m ogą korzystać z plat­ form y lub określonych cegiełek, które udostępniają dodatkowe funkcje. Aplikacja może także kom unikow ać się z warstwą usług i prawie na pewno z bazą danych. Nawet najbardziej typowe

Rozdział 11. Diagnozowanie kodu aplikacje składają się z wielu części. Wielość tych elementów powoduje, że wykrycie i wyeliminowa­ nie błędów jest dużo bardziej skomplikowane. Narzędzia pomagające śledzić i poprawiać błędy nie tylko muszą pom agać w radzeniu sobie z tą złożonością, ale także ułatwiać diagnozowanie. W poniż­ szych punktach opisujemy, w jaki sposób programiści mogą używać wbudowanych narzędzi środo­ wiska Visual S tudio 2010 do diagnozow ania w typowych sytuacjach występujących w czasie tworzenia oprogram ow ania.

Scenariusz Najpierw zdefiniujem y scenariusz, do którego będziemy wracać zarówno w czasie przedsta­ wiania podstaw diagnozowania, jak i w całym rozdziale przy opisie wielu właściwości narzędzi diagnostycznych. Załóżmy, że program ista tworzy stronę internetową, która umożliwia klientom przeglądanie i modyfikowanie profili. Strona ma zapewniać dodatkowe funkcje w większej, istnieją­ cej aplikacji. Poniżej opisane są pewne w arunki związane ze scenariuszem tw orzenia tej aplikacji: • Profile klientów są przechowywane w bazie danych SQL 2008. • Biblioteka obsługi danych um ożliw ia abstrakcję dostępu do bazy. • Inform acje o profilu klientów udostępnia usługa sieciowa. Zadanie program isty polega na napisaniu potrzebnej strony. Do dyspozycji ma usługę sieciową zwracającą profile klientów. Strona pow inna wyświetlać inform acje z profilu klienta i um ożli­ wiać użytkownikom edycję danych. Trzeba też zapisywać zmiany z powrotem do bazy za pomocą biblioteki obsługującej dostęp do danych. Aplikacja diagnozow ana w tym scenariuszu jest napisana w języku C#, jednak narzędzia diagnostyczne dostępne w Visual Studio dotyczą zarówno C#, jak i Visual Basica. Oznacza to, że wszystkie opisane w tym rozdziale funkcje dotyczą obu języków, o ile nie jest napisane inaczej.

Wiele etapów diagnozowania Niemal za każdym razem, kiedy program ista otwiera IDE, w pewien sposób diagnozuje kod. Róż­ nica między diagnozow aniem a pisaniem kodu staje się coraz mniej wyraźna. Edytor pomaga na przykład eliminować błędy w czasie pisania kodu. W yróżnia niepopraw ne elem enty i po­ zwala je popraw ić. W tym czasie program ista jednocześnie pisze i diagnozuje aplikację. Ponadto kom pilator działa jak następne narzędzie diagnostyczne. Przy pierwszym kliknięciu przycisku Run kom pilator analizuje kod i informuje o wszelkich błędach, które trzeba popra­ wić przed podjęciem dalszych działań. Jest to diagnozowanie. M ożna wyróżnić następujące etapy lub fazy diagnozowania:

• Kodowanie — edytor pomaga programiście, wskazując problemy i możliwe rozwiązania. • Kompilowanie — kompilator analizuje kod i inform uje o błędach, które trzeba rozwią­ zać przed podjęciem dalszych działań.

C zę ść III Tworzenie kodu i zarządzanie nim • Samodzielne sprawdzanie — program ista uruchamia aplikację w trybie diagnozow a­ nia i kroczy przez strony oraz kod w celu sprawdzenia funkcji programu. • Testy jednostek — program ista pisze i urucham ia testy jednostek, aby spraw dzić działanie aplikacji (zobacz rozdział 9., „Testowanie kodu”). • Analiza kodu — programista urucham ia narzędzie Static C ode Analyzer, aby sprawdzić, czy aplikacja jest zgodna ze standardam i określonymi na potrzeby projektu (w ym aga wersji Visual Studio Premium). • Przegląd kodu — kod jest analizow any przez w spółpracow ników lub architektów , którzy rejestrują problemy. • Rozwiązywanie problemów — po wykryciu problem u w kodzie trzeba odtw orzyć i zdiagnozow ać daną sytuację. W tym rozdziale koncentrujem y się na dw óch etapach: sam odzielnym sprawdzaniu i ro zw ią­ zywaniu problemów. To w tych dwóch fazach w największym stopniu używa się narzędzi d ia ­ gnostycznych w budow anych w Visual Studio. Dlatego zakładamy, że kod został już n ap isan y i się kompiluje. Zacznijm y od przedstaw ienia, w jaki sposób m ożna samodzielnie spraw dzać działanie kodu.

Diagnozowanie aplikacji (samodzielne sprawdzanie) W tym scenariuszu program ista niedawno zaczął pisanie strony internetow ej służącej d o m o ­ dyfikowania profili klientów'. Zakładamy, że określił już układ strony, powiązał ją z usługą sieciową zwracającą profile i napisał kod zapisujący profil użytkownika do bazy danych. T eraz może przystąpić do samodzielnego spraw dzania wyników swej pracy w' celu upew nienia się, że wszystko działa zgodnie z oczekiwaniami. Pierwszy etap wymaga uruchom ienia aplikacji w trybie diagnozowania. Dzięki tem u m o żn a wejść w kod, jeśli wystąpi błąd. W trakcie tw orzenia programu jest to zwykle dom yślny tryb uruchamiania. Aby wywołać tryb diagnozowania, należy kliknąć przycisk Run (zielona strzałka na pasku narzędzi Standard lub Debug). Rysunek 11.1 przedstawia przykładową aplikację, która ma zostać po raz pierwszy uruchomiona w trybie diagnozowania. Należy zwrócić uwagę na k u r­ sor umieszczony nad przyciskiem Run.

Włączanie diagnozowania stron internetowych Przykładowy program to aplikacja sieciowa. Jako taka wymaga włączenia diagnozowania kodu działającego po stronie serwera, a błędy i inform acje związane z tym kodem mają być p rzesy ­ łane do zdalnego klienta. Prawdopodobnie Czytelnik tworzy i diagnozuje ten program na pojedyn­ czej maszynie, jednak czasem zachodzi konieczność diagnozowania działania aplikacji za pom ocą serwera testowego.

Rozdział 11. Diagnozowanie kodu ►Contojc - Microsoft Visual Stud '0

File

Edit

Viev* Project

Build

Debug

Data

Format Table

Tools

Test

Window

■. I et. • */ e

s

s

h

h

b

I a Standard

b

-ei : 'None*

; (Del

tF c n ti^ V

'T W a i* . .



EditCustcmerPicfileaspx X Srte.Master

Help

-n_. CP'J B

/

Defautt j&px

*

U

® •

Heigh*

: = :. =

.

• .

v

...

.

Publish. -Create Publish Setting* ........... ... *■ Solution Explorer

S4e.cs*

* 1

SlteXaster

Pointer

I I

*1

Home

CheckBor

Account

Customers

- J Styles

DropDownlist i HataContentfcurtom)'_

Hiddenfield

E d i t C ll S t O J ^ J :TÓ«c«*'atBeii»ii

3 3

About .asp* Defautt^spx

3

EdrtCustomerProfile -

l. » 1 1 Solution b p L Class View I Properties * ?X I Text Box Name System. Web.Ul.V • 1 : Ur

A

HyperImk

U

Image

S

ImageButton

•a i

ImageMap

1 w an t t o ...

Address

A

L1 Ocontoso.com*

4 * stmg A * atrng A * string

1 •JIDevicper*

^ * itrn ę

'*j* Home ♦ •

*

-j

- c u s t .R o w s [ 0 ] ( - c it y " ] .T o S t r in g ( ) ;

3S

37 38|

^ 3 :3 * 3 >

+ *

29

:

-

^ * -

CdttCustomei Profile .m pa.es O

^BusmessDomatn Custom er

32

a

Help

OrderHstory

nt

Count ■C

System.Colect>ons.Geneoc.l«t

j

nx

Running (1) Running

7 I

Location Task

Action 0

2

0 SchedUed

DoWorkSO

1 (TaskDebugging. vshost.es

3

^ Scheduled

DoWork 10

1 (TaskDebugging.vshost.es

«

£

5

Scheduled

DoWork7()

1 (TaskDebuggmg.vshost.e*

4) Scneduec

Do'Work80

1 (TaskDebugging. vshost.es

[Ti W aiting (2)

1

6

?

TaskDebi DoVVorklO

7876 (Worker Thread)

1 (TaskDebugging.vshost.es

7 Waiting

TaskDebi. DoWork20

8292 (Worker Thread)

1 (TaskDebugging. vshost.es

Rysunek 11.52. Okno Parallel Tasks działa podobnie jak okno Threads

O kna Parallel Tasks m ożna też użyć do oznaczenia zadań, co jest p rzydatne przy ich wyświe­ tlaniu. W tym celu należy użyć strzałek widocznych w oknie dialogow ym na lewo od zadań. Kliknięcie zadania prawym przyciskiem myszy pozwala wstrzymać lub wznowić wątek pow ią­ zany z zadaniem. Ponadto m enu kontekstowe udostępnia opcję Freeze All Threads But This, która pozwala skoncentrow ać się na określonym wątku i zadaniu. K olum na Location wyświetla obecną lokalizację zadania. Po um ieszczeniu kursora nad lokali­ zacją pojawia się stos wywołań związany z zadaniem . Znajduje się tu cały kod wywołany d o tej pory w danym zadaniu. W idoczne okienko (okienko stosu) pozwala wykonywać pewne o p era­ cje. M ożna przełączać się między ramkami stosu i wyświetlać kod z w ybranego wywołania ze stosu. Na rysunku 11.53 pokazano wybór przykładowego elem entu w okienku stosu. Element m ożna kliknąć dw ukrotnie, aby przejść do kodu i zm ienić kontekst diagnozow ania, co pozwala skoncentrować się na danym wywołaniu.

C zę ść III Tworzenie kodu i zarządzanie nim

Diagnozowanie skryptów działających po stronie klienta Środowisko V isual S tudio um ożliw ia diagnozow anie kodu skryptów w językach JavaScript i VBScript urucham ianych po stronie klienta. W tym celu trzeba włączyć diagnozow anie skryptów’ w przeglądarce. W aplikacji Internet Explorer można to zrobić w oknie dialogowym Opcje internetowe (opcja Narzędzia/Opcje internetowe). W oknie należy wybrać zakładkę Z a ­ awansowane i przejść do kategorii Przeglądanie (zobacz rysunek 11.54). W tym miejscu należy wyłączyć domyślnie włączoną opcję Wyłącz debugowanie skryptu. Jest to informacja dla p rz e ­ glądarki Internet Explorer, że po napotkaniu błędu w skrypcie pow inna wyszukać debuger (na przykład środowiska Visual Studio). Rysunek 11.54. Włączanie diagnozowania wykonywanych po stronie skryptów w oknie dialogowym Opcje internetowe przeglądarki Internet Explorer

Rozdział 11. Diagnozowanie kodu N astępnie należy dodać punkty przerwania w blokach < s c r ip t> w plikach .aspx i .html. M oż­ na wtedy wstrzymywać działanie kodu w tym punktach i diagnozować aplikacje za pomocą środow iska Visual Studio. Trzeba jednak pamiętać o pewnych ograniczeniach, których opis znajd u jesię w punkcie „Lim itations on Script D ebugging” w dokumentacji MSDN.

Diagnozowanie informacji o awarii (plików zrzutów) W środowisku program istycznym często nie m ożna odtworzyć wszystkich scenariuszy specy­ ficznych dla środowiska lub użytkownika. W iele błędów i awarii aplikacji ma miejsce, kiedy program ista nie jest obecny lub środowisko Visual Studio nie jest uruchom ione. W tedy m ożna wygenerować plik zrzutu ze stanem aplikacji z m om entu wystąpienia problem u. Pliki zrzutów przechow ują inform acje o stanie aplikacji. Pliki tego rodzaju powstają zwykle w odpowiedzi na pow ażny błąd lub awarię aplikacji. Plik zrzutu m ożna następnie przesłać do program isty. Ten może otw orzyć plik, powiązać go z kodem źródłowym i symbolami diagno­ zow ania, a następnie zdiagnozow ać stan aplikacji z m om entu wystąpienia problem u.

Tworzenie zrzutów informacji diagnostycznych M ożna zapisać działający (ale wstrzymany lub po dojściu do punktu przerw ania) kod zarzą­ d zan y platformy .NET jako pliki m inidum p. Służy do tego kilka technik. W czasie diagnozo­ w ania można wykorzystać środowisko Visual Studio do utworzenia plików , a następnie u d o ­ stępnić je innym program istom , jeśli zajdzie taka potrzeba. Oczywiście, inne aplikacje też m ogą generować pliki m inidum p, które m ożna potem otworzyć w środow isku Visual Studio w celach diagnostycznych. O to dostępne techniki tworzenia plików zrzutów : • Zastosowanie opcji Save Dump As z m enu Debug w czasie aktywnej sesji diagno­ stycznej w środow isku Visual Studio. • Dołączenie debugera do działającego zdalnego procesu lub takiego, który uległ awarii, za pomocą środow iska Visual Studio (zobacz zamieszczony we wcześniejszej części ro z ­ działu opis dołączania debugera do procesów ). Następnie m o żn a zatrzymać ten p ro ­ ces i zapisać plik zrzutu przy użyciu opcji Save Dump As. • Microsoft udostępnia narzędzie U serD um p w ramach pakietu OEM Support Tools. Narzędzie pozwala tworzyć pliki zrzutów odczytywane przez środowisko Visual Studio. • Microsoft udostępnia narzędzie Autodump+ w ramach pakietu Microsoft Debugging T o ­ ols for Windows. Także to narzędzie tworzy pliki zrzutów dla środowiska Visual Studio. T u koncentrujem y się na tworzeniu plików zrzutów przez środow isko Visual Studio. Po k ró t­ kich poszukiwaniach w wyszukiwarce można pobrać inne narzędzia do generow ania zrzutów.

Tworzenie plików zrzutów za pomocą środowiska Visual Studio Tw orzenie pliku zrzutu w środowisku Visual Studio to proste zadanie. Należy zatrzymać apli­ kację (lub wkroczyć w nią) w miejscu zapisu. Może to być punkt w ystępow ania znanego p ro ­ blem u. Następnie trzeba wybrać opcję Save Dump As z menu Debug. Pojawi się okno dialogowa Save Dump As widoczne na rysunku 11.55.

C zę ść III Tworzenie kodu i zarządzanie nim Rysunek 11.55. Można zapisać plik minidump z informacjami ze sterty lub bez nich

W arto zauważyć, że przy zapisywaniu pliku zrzutu można dołączyć lub pominąć inform acje ze sterty. W wielu scenariuszach diagnozow ania kodu zarządzanego informacje te nie są potrzeb­ ne. Dlatego m ożna pom inąć je przy zapisyw aniu pliku i zaoszczędzić w ten sposób miejsce na dysku twardym.

Diagnozowanie z wykorzystaniem pliku zrzutu Pierwszy krok w czasie diagnozow ania z wykorzystaniem pliku zrzutu polega na otw arciu pliku z menu File ( File/Open/File) lub przez dw ukrotne kliknięcie pliku zrzutu. Po otw arciu pliku pojawia się now a strona z podsum ow aniem inform acji na jego temat. Strona wyświetla czas utworzenia pliku, wersję systemu operacyjnego lub środow iska uruchom ieniow ego uży­ wanego w czasie zapisania pliku, a także wersje różnych k o m p o n en tó w (m odułów ) działają­ cych w tym czasie. Na rysunku 11.56 pokazano przykładowe inform acje na tej nowej stronie. W arto zauważyć, że pole wyszukiwania m odułów pozwala określić, czy w czasie tw orzenia zrzutu wczytany był konkretny plik .dli lub .exe. Strona widoczna na rysunku 11.56 dotyczy pliku zrzutu dla w strzym anej aplikacji C ontoso opisanej we wcześniejszej części rozdziału. Przypomnijmy, że aplikacja obejm uje stronę umożliwiającą klientom zarządzanie ich profilami zapisanymi w bazie danych. T u w ystąpił błąd. Załóżmy, że program ista, który zarejestrował błąd, nie m ógł go zdiagnozować. Dlatego utworzył plik zrzutu i przekazał go następnem u programiście d o sprawdzenia. Plik zrzutu może też pochodzić od testera, który wykrył błąd, lub z serwera W W W . Strona z inform acjam i o zrzucie umożliwia wykonanie kilku operacji. Dwie najczęściej sto so ­ wane przez program istów to: Set Symbol Paths i Debug with Mixed. Opcja Set Symbol Paths umożliwia określenie ścieżek do plików' z symbolami {.pdb) odpow iadających wersji aplikacji, dla której utw orzono zrzut. Visual Studio domyślnie szuka plików symboli w miejscu, gdzie

Rozdział 11. Diagnozowanie kodu

Minidump Filo Summary 1/13/2010 5cl4.03 PM

A D u m p S u m m a ry Dum p File Last Write Time Process Name Process Architecture Exception Code Exception Information Heap Information

N o t ilk jt io m IL Interpreter is Enabled Disable IL Interpreter

C C ode'. W ebDev. WefcSer.er40.dmp 1/13/2010 5:14 0 3 PM C :\Pro g ram Files (* )'.Common riles Microsoft Shared>DevSer.er 100\WebDev.WebServer40 e»e

*66

86

0.EO434F4D An exception cam e from the CLR Present

A ctio n s ► Debug with Mixed ► Debug with Natrve Only

*

S y s t e m In fo r m a tio n

Set symbol paths

61.7600

OS Version C lR Version!si

r

Copy ak to clipboard

40.21006.1

A M o d u le s ! Search Module Name

[

'

Ready

M odule Version

Module Path

09rem Fites (> 46}\C o m m o nFil

WebDev.WebSefter40.exe

10.0.21006.1

n td ild fl

61.7600.16385

C:v Windows'. SysWOW64\ntdHdfl

mscoree.dN

4.0.30902.0

C:\W indows\5ystem 32\m scor ee.d II

Icemef32.dll

61.7600.16385

C \ Wmdows\SysWOW64\lcer nel32. d

KERN EL BASE, d l

61.760016385

G \ WmdowsS S»sW O W64 >KERNEL B /

advapi32.dll

61.760016385

C\W mdc*s\SysW OW 64Vadvapi32.4

m svcrtdH

70.760016385

C Windo ws\SysWOW 64\m svcr1.dll

sechcst.dll

61.760016385

C NWindows vSysWOW64 \sechost dl

rp o t4 .d ll

61.7600.16385

C \ Wmdovys\SysWOW64\rpcrt4.dll

. . .

C :\Pr

;B j

:\

.

.

.1 ------------------- .-.-n

J

C zę ść III Tworzenie kodu i zarządzanie nim

W środkowej części okna dialogowego, Cache Symbols in This Directory, można określić lokalny katalog na pam ięć podręczną symboli pobranych z serwera. Pozwala to zaoszczędzić czas, ponieważ potem m ożna używać plików z lokalnego źródła. O statnia część okna pozwala okre­ ślić, które m oduły plików z sym bolam i środow isko ma wczytać (lub pominąć). Opcję tę m ożna ustawić na All Modules. Inna opcja, Debug with Mixed, umożliwia uruchom ienie debugera na podstawie danych z pliku z uproszczonym zrzutem . W arto wiedzieć, że plik symboli platform y .NET [.pdb) zawiera głównie inform acje o plikach źródłowych, nazwach zmiennych i num erach wierszy w kodzie. W czasie diagnozow ania pliku zrzutu Visual Studio sprawdza pliki .pdb (znalezione w katalo­ gach z kodem lub symbolami) i próbuje wykorzystać informacje z nich do wyszukania plików z kodem na kom puterze. Jeśli znajdzie kod, otworzy plik i umożliwi zaawansowane diag n o zo ­ wanie. Na rysunku 11.58 pokazano wygląd pliku zrzutu po kliknięciu opcji Debug with Mixed. Warto zauważyć, że wiersz, w którym w strzym ano wykonywanie kodu, jest wyróżniony. M ożna też uzyskać pełne informacje ze stosu wywołań i okna podglądu. Tu błąd pojawił się w łańcuchu połączenia z bazą danych.

Podsumowanie Ten rozdział opisuje debuger środowiska Visual Studio 2010. Pokazaliśmy, jak ustawiać punkty przerwania, a także warunki określające, kiedy mają zadziałać. Omówiliśmy przechodze­ nie przez kod po dojściu do punktu przerwania. Ponadto przedstawiliśmy punkty śledzenia, które po dojściu debugera do danego wiersza kodu pozwalają wykonywać operacje takie jak wyświe­ tlanie kom unikatów w oknie Output. Ten rozdział opisuje także liczne sposoby przeglądania danych wyświetlanych przez debuger, włączając w to okna podglądu, narzędzia wizualizacyjne i podpowiedzi DataTip.

Rozdział 11. Diagnozowanie kodu

'■**

Custom erProftle.es (Debugging • M icrosoft V isual Studio

File

Edit

View

J

'

Project

A 4

r*

!►

-d

V

Debug

A

D«ta

Tools

Test

vJ .S

Window



r r 1

% G • i

*1 .3 * J

Hei

*

3 ’ ;

Help • £ Any CPU

'

JJ

-

h3

3 :1 3 *

BV

«rj.* Process: [N/A] WebDe. WebSetver40.dmp * Thread: |4956J Worker Thiead *

CustomerProfile.es X j WebDev.WebServef40.dmp • ^DataServKes.CustomerProfile

Solution Ex_

• j 'eGetCustomer(tr>l custornedd) ^3 Solution Solutic

SqlCom rand c*d - new S q lC o w a n d ( J

)'1

‘select * from customer wrtere id ■ ©id* a

S q lP e ra e e te r p a r* - new S q lP a r a m e te r(" i d “ , c u s t o a e r ld ); c a d .P a ra m e te rs .A d d (p a ra ); u sin g (e n n ) { cn n .O p e n ();| DataSet ds - new D a t a S e t ( ) ; SqlDataAdapter adp - new S p lD a ta A d a p te ^ c a d ); a d p .F ill( d s ) ; re tu rn d s .T a b le s [ t t ];

} } 100%

• -

IM

Locals Name 3) t • •

Seirceptwn p customer Id y ds

9

p cnr

±

9



9

sd ond parm

CaflStack

- 9

Name

lane

Value I t vp « *1 fAn attempt to attach an auto-named database for f»eC:\-i) System E 1 nJ •p: System D nJ {System.Data -ScfOent. SqlComecbor} ’select * from customer *here id - ♦Q

9

[External Code] Iwrnell2.di«7b3736770

Locah U l

r»tdK Icon MIME

tik (None)

Description Specifies the descnptio n for the selected file type

Edytor User Interface Edytor User Interface umożliwia dostosowanie wyglądu kreatora instalacji używ anego przez instalator systemu Windows. K reator instalacji m ożna traktować jak zestaw okien dialogowych służących albo do pobierania inform acji od użytkow nika (na przykład ścieżek lub opcji instalacji), albo do udostępniania danych (na przy k ład wskaźnik p o stęp u pozw ala śledzić przebieg procesu instalacji). Instalator systemu W indow s udostępnia podstaw ow y zestaw stron podzielonych na trzy etapy instalacji. Faza początkowa {Start) składa się z ekranu powitalnego, okna dialogowego do pobierania katalogu instalacyjnego i strony z potw ierdzeniem . Etap postępu instalacji (Progress) obejm uje tylko jeden ekran z paskiem postępu, który przedstawia zaawansowanie instalacji. Faza końcowa (End) zawiera ekran zakończenia z podsum ow aniem . Aby dodać do jednej z faz nowe okno dialogowe, należy w edytorze U ser Interface kliknąć jej nazw ę i wybrać opcję Add Dialog. Można wybrać jedno z wielu gotowych okien, które służą do w ykonywania różnych operacji (zobacz rysunek 12.11). Istnieje na przy k ład kilka różnych rodzajów okien dialogowych typu Checkbox, które służą do udostępniania w czasie instalacji zestawu opcji konfiguracyjnych typu tak - nie. Nie m ożna zmienić wyglądu ani działania tych ekranów, ale możliwe jest dostosowanie tekstu i innych elementów. Służy do tego okno właściwo­ ści. Przykładowo, jeśli programista doda do etapu początkowego okno dialogowe Checkboxes (B), m oże użyć okna właściwości do w prow adzenia tekstu czterech pól w yboru w yświetlanych w oknie. Aby zm ienić kolejność okien dialogowych w danym etapie, należy kliknąć jedną z pozycji repre­ zentujących okno i przenieść ją w górę lub w dół listy za pomocą m enu Action oraz poleceń Move Up i Move Down.

C zę ść III Tworzenie kodu i zarządzanie nim Rysunek 12.11.

Wybieranie okna dialogowego dodawanego do instalatora

Edytor Custom Actions Jeśli występują wyjątkowe w ym agania związane z instalacją, których nie da się zrealizować za pomocą gotowych opcji instalacyjnych, można zaimplementować operacje za pom ocą edytora Custom Actions. O program ow anie może na przykład rejestrować się autom atycznie przez internet. Edytor Custom A ctions nie służy bezpośrednio do rozwijania niestandardow ych operacji, a jedynie pozwala określić plik wykonywalny lub skrypt, który należy uruchom ić. Można też podać m om ent uruchom ienia pliku w czasie instalacji. D ostępne są cztery etapy:

Install, Commit, Rollback i Uninstall. W przykładzie chcemy urucham iać plik ,exe do rejestro­ wania aplikacji CSR przez internet. M ożna to zrobić na etapie Install, a w fazie Uninstall dodać odpowiednią operację do wyrejestrowania aplikacji. Aby określić pliki urucham iane w poszczególnych fazach, należy kliknąć prawym przyciskiem myszy docelowy etap w edytorze Custom Actions i wybrać opcję Add Custom Action. W wyświe­ tlonym oknie można wybrać uruchamiany plik wykonywalny lub skrypt (zobacz rysunek 12.12).

Edytor Launch Conditions Ostatni z omawianych edytorów to Launch Conditions. Większość instalatorów aplikacji sprawdza w arunki w stępne, które muszą być spełnione przed rozpoczęciem procesu instalacyjnego. Możliwe, że aplikacja działa tylko w wybranych systemach operacyjnych lub w ym aga, aby na docelowej maszynie zainstalowane były określone komponenty. Na rysunku 12.13 przedstaw io­ no edytor Launch Conditions otw arty w środowisku IDE. Jeśli aplikacja C ontoso CSR wymaga zainstalow anej bazy SQL Server, za p o m o cą edytora Launch C onditions można dodać ten warunek. Najpierw trzeba określić, w jaki sposób spraw­ dzać warunek. Można poszukać pewnych plików na docelowej maszynie, określonych wartości kluczy w rejestrze lub aplikacji w bazie danych instalatora przechowywanej na każdym komputerze z systemem Windows. Tu sprawdzimy rejestr. Poszukamy wersji 10. bazy SQL Server Express przez

Rozdział 12. Wdrażanie kodu

C zę ść III Tworzenie kodu i zarządzanie nim sprawdzenie wartości wpisu CurrentVersion w kluczu HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Microsoft SQL Server\SQLEXPRESS\MSSQLSERVER\CurrentVersion. Za pomocą edytora spraw dzanie w artości m o żn a dołączyć w dwóch krokach. Najpierw należy dodać ope­ rację w yszukiw ania klucza w rejestrze, a następnie skonfigurować sprawdzanie warunku. W a­ runek obejm uje porów nyw anie w yników wyszukiwania z wymaganiami i zwraca wartość lo­ giczną TAK lub NIE. Aby do d ać wyszukiwanie klucza w rejestrze, należy kliknąć prawym przyciskiem myszy węzeł Search Target Machine w lewym panelu edytora. N astępnie trzeba wybrać opcję Add Registry Search (w arto zauważyć, że m ożna też wybrać jeden z dwóch innych rodzajów wyszukiwania z tego sam ego m enu). Po d o d a n iu pozycji dla w yszukiw ania nadajm y jej opisow ą nazwę (SQLExpress-vIO). Kiedy w yszukiw anie jest zaznaczone, można użyć okna właściwości do okre­ ślenia, co należy znaleźć w rejestrze. Na rysunku 12.14 włdoczne są wartości zwłązane z wy­ szukiw aniem . W arto zw rócić uw agę na wartość właściwości P ro p e rty — REGISTRYVALUE1. M ożna zm ienić tę wrartość, ale w tym przypadku dom yślne ustawienie jest odpow łednie. Rysunek 12.14. Ustawianie właściwości związanych z przeszukiwaniem rejestru

^ n x l

I Properties I SQLExpress-vlO Launch Condition Properties 1 * A1 1' SHTNarre) Property RegKey Root Value

|

* 1

SQlExpress-vlO REG1STRYVAIUE1 HKEV_LOCAl_MACHINE\SOFTWARE\Microsolt\Microsoft vsdrrHKIM 10DJ600.22

(Name) Specifies the name used in the launch Conditions Editor to identify a selected registry search

Po d o d aniu w edytorze procesu wyszukiwania m ożna dołączyć sprawdzanie w arunku. Należy kliknąć praw ym przyciskiem myszy węzeł Launch Conditions, a następnie wybrać opcję Add

Launch Condition. Podobnie jak przy wpisie dotyczącym wyszukiwania w arto nadać w arun­ kowi nazwę. Następnie m ożna użyć okna właściwości do skonfigurowania w'arunku. Należy uzupełnić trzy pola. W łaściwość Condition zawiera nazwę sprawdzanego wyszukiwania, właściwość InstallURL to opcjonalny adres URL kierujący użytkowników bez zainstalowanej bazy SQL Express do strony, gdzie można ją pobrać, a właściwość M essage zawiera kom unikat wyświetlany użytkownikom, którzy nie zainstalowali wymaganej bazy danych. Na rysunku 12.15 pokazano uzupełnioną listę właściwości omawianego w arunku uruchom ie­ niowego. O m ów iliśm y już dwa główme sposoby wdrażania aplikacji klienckich. Za pom ocą środowiska IDE m ożna też wdrażać aplikacje ASP.NET.

Rozdział 12. Wdrażanie kodu Rysunek 12.15.

Ustawianie właściwości warunku uruchomieniowego

| Properties 1SQLExpress-vlO : 41

Launch Condition Properties

SQOxpress-vlO

(Name) Condition

i H In stallU rl Message

» n xl * f

£

REGISTRYVALUE1 http://go.rmcrosoft.com/7linkidz9671608 This application requires SQL Server Express.

InstallUrl

1 Links to 0 resource that contains information for installing an external 1component

1

Uwaga Korzystaliśmy z edytorów, uzyskując dostęp do menu A c tio n przez kliknięcie prawym przyciskiem myszy w panelach. Po urucho­ mieniu jednego z edytorów instalacji menu A c tio n staje się także jednym z menu głównych środowiska IDE. Menu jest dynamiczne i zm ienia się, tak aby zawierało polecenia poprawne w obecnie otwartym edytorze.

Publikowanie witryn i aplikacji ASP.NET Visual Studio udostępnia dw a narzędzia do w draż.ania rozw iązań o p arty ch na ASP.NET. Pierwsze, urucham iane za pom ocą m enu Build, to Web Deployment Tool. Przy użyciu narzędzia Web Deployment Tool m ożna skom pilować istniejący projekt aplikacji sieciowej, umieścić w pakiecie sieciowym wszystkie katalogi, pliki, ustawienia i bazy danych używane przez aplikację, a następnie przesłać pakiet na serwrer W W W . Zaletą kom pilowania wńtryny przed jej w drażaniem jest to, że k o m p ilato r w ykryw a błędy czasu kom pilacji przed umieszczeniem plików' na docelow ym serwerze. N astęp n ą korzyścią jest w iększa wydajność witryny. Ponieważ wszystkie strony są .skompilowane, nie trzeba kom pilow ać ich dynamicznie w czasie pierwszych odw iedzin użytkowników na stronie. Drugie narzędzie to Copy Web Site Tool. Służy do w drażania w itryn, a nie aplikacji sieciowych (dokładne omówienie różnic zawiera rozdział 4., „Rozwiązania i projekty”, oraz 17., „Twrorzenie aplikacji ASP.NET”). Zgodnie z nazwą narzędzie Copy Web Site Tool p o b iera wszystkie pliki wńtryny i kopiuje je do docelowej struktury katalogów docelowego serwera. Narzędzie to jest przydatne z uwagi na obsługę synchronizacji. Jego działanie nie ogranicza się do kopiowania plików w jednym kierunku (z systemu źródłowego do docelow ego). Narzędzie przeprowadza pełną synchronizację między obom a lokalizacjam i, co oznacza, że now sze pliki z serwera są

C zę ść III Tworzenie kodu i zarządzanie nim kopiow ane do projektu. Jest to doskonałe rozwiązanie, jeśli wielu program istów (a nawet licz­ ne zespoły) publikuje pliki w tej sam ej witrynie, ale nie istnieje centralne repozytorium kodu źródłowego. Narzędzie Copy Web Site Tool potrafi kopiować dane na zdalne maszyny (narzędzie Web De­ ployment Tool tego nie um ożliw ia). Dalej przedstawiamy krótki przegląd obu m echanizm ów wdrażania.

Korzystanie z narzędzia Web Deployment Tool Dostęp do narzędzia Web Deployment Tool można uzyskać za pomocą polecenia Publish z menu Build (zobacz rysunek 12.16). R y su n e k 12.16.

Uruchamianie narzędzia Web Deployment Tool w środowisku IDE

oO ContosoWeb - Microsoft Visual Studio File

Ean

View

Project

Build

a ew Inline

Debug

Data

Format

Table

Tools

Test

Build Solution

Window -

Help

Any CPU

Rebuild Solution Clean Solution

Default.aspn X Build ContosoWeb Rebuild ContosoWeb Clean ContosoWeb Publish ContosoWeb

Shift* F6

ster 33 Solution Co . j f ContosoW' J Ś Propedj a l Referen

Configuration Manager.

Accow *1 ApP-f*

- i Scfn*

Przed uruchomieniem narzędzia należy skonfigurować ustaw ienia publikacji. Aby je wyświetlić, trzeba otworzyć stronę właściwości projektu i przejść do zakładek Package/Publish i Deploy SQL.

Opcje zakładki Package/Publish Zakładka Packagc/Publish zawiera wszystkie dom yślne informacje używ ane przez narzędzie Web Deployment Tool (zobacz rysunek 12.17). Pierwsza lista rozwijana w oknie umożliwia wskazanie, które pliki należy dołączyć w procesie w drażania. Dostępne są trzy opcje: tylko pliki potrzebne do uruchom ienia aplikacji (na przy­ kład wszystkie strony, pliki konfiguracyjne, pliki binarne i tak dalej), wszystkie pliki projektu (w tym pliki pomocnicze, na przykład readme.txt, dokum entu edytora W o rd i tak dalej) lub wszystkie pliki z katalogu projektu (obejmuje to także pliki umieszczone w katalogu projektu, które jednak z dowolnych przyczyn nie są dołączone do projektu w środow isku Visual Studio). W dolnej części ekranu znajdują się pola umożliwiające określenie, gdzie środow isko ma zapi­ sać spakowaną aplikację (w arto zauważyć, że dom yślnie wszystkie m ateriały są pakowane do pliku .zip) i w jakiej witrynie serwera I1S ma ją umieścić.

Rozdział 12. Wdrażanie kodu

Opcje z zakładki Deploy SQL O kno to jest używane wraz z opcjam i wdrażania baz SQL Server z wcześniej opisanej zakładki i umożliwia podanie listy baz danych SQL Server, które należy opublikować razem z aplikacją sieciową (zobacz rysunek 12.18). Istnieją trzy główne grupy właściwości, które należy uzupełnić w tym miejscu. Najpierw trzeba dodać wpis w górnej tabeli, klikając przycisk Add i określając nazwę połączenia z bazą danych. N astępnie konieczne jest podanie łańcucha połączenia dla źródłowej i docelowej bazy danych. W ostatnim kroku trzeba określić, które elementy bazy danych należy opublikować. Służy do tego lista rozwijana Database scripting options z opcjami: Schema only, Data only i Schema and Data.

C zę ść III Tworzenie kodu i zarządzanie nim

Uwaga Jeśli w ramach wdrażania trzeba uruchomić skrypt w SQL-u, m ożna podać lokalizację skryptu w oknie D e p l o y SQ L . Należy kliknąć przycisk A d d S c r i p t , a następnie przejść do pliku ze skryptem. Warto zauważyć, że na liście znajduje się już wpis doty­ czący skryptu. Skrypt ten jest wygenerowany przez narzędzie do wdrażania na podstawie udostępnionych ustawień. Dodane nie­ standardowe skrypty są wykonywane w kolejności, jaką zajmują na liście. Przykładowo, jeśli programista chce, aby dany skrypt działał p r z e d ogólnym skryptem obsługi schem atu i danych wy­ generowanym przez narzędzie, należy umieścić swój skrypt na liście i za pomocą umieszczonych po prawej stronie strzałek przenieść go nad domyślny.

Rozdział 12. Wdrażanie kodu W szystkie opcje na stronie właściwości dotyczą konkretnej konfiguracji. M ożna ją określić za pom ocą listy rozwijanej widocznej w górnej części strony. Na rysunku 12.18 na liście zazna­ czona jest konfiguracja Active (Debug). Jeśli zm ienim y ją na Release, otrzym am y pustą stronę, na której m ożna podać zupełnie inny zestaw właściwości wdrażania baz SQL, stosowany wy­ łącznie do wersji Release.

Wskazówka Dlaczego na stronie można udostępnić wiele wpisów dotyczących baz danych? Wyobraźmy sobie, że programista publikuje rozwią­ zanie na serwerze publicznie udostępnianym i na serwerze pro­ dukcyjnym. Chce wtedy użyć dwóch wpisów (z dwoma zestawami łańcuchów połączeń, skryptów SQL i tak dalej). Ponieważ nazwy wpisów można zmienić, łatwo jest zachować odrębność zbiorów właściwości i uniknąć pomyłek. Aby informacje były jedno­ znaczne, jeden zestaw można nazwać „LocalToStage”, a drugi — „LocalToProd”.

Po ustaw ieniu opcji wdrażania w pożądany sposób spróbujm y opublikować aplikację sieciową. Należy przejść do menu Build i wybrać opcję Publish (m ożna też kliknąć projekt w oknie Solution Explorer prawym przyciskiem myszy, a następnie wybrać tę samą opcję).

Uruchamianie procesu publikowania O kno dialogowe urucham iane po wybraniu polecenia Publish w menu Build służy do podaw a­ nia ostatniej grupy informacji potrzebnych do rozpoczęcia wdrażania (zobacz rysunek 12.19). W szystkie dane z tego ekranu m ożna zapisać w profilu wdrażania. Duże przyciski w dolnej części okna dialogowego służą do zmieniania nazwy, usuw ania i zapisywania bieżącego profilu. M etodę w drażania można wybrać za pomocą listy rozwijanej Publish Metod. W wersjach sta r­ szych od Visual Studio 2010 dostępne były trzy różne metody. M ożna było użyć ścieżki do: serwera FTP, m echanizm u FrontPage Server Extensions (FPSE) lub systemu plików. W Visual Studio 2010 pojawiła się czwarta opcja — One-Click Publishing. Technika ta jest bardziej n ie­ zawodna od innych i korzysta z usług zdalnego zarządzania serwera I IS do kopiow ania p o ­ trzebnych plików aplikacji na zdalny lub lokalny serwer. Działają już firmy hostingow e obsłu­ gujące m etodę One-Click Publishing, dlatego jest ona szczególnie atrakcyjna przy korzystaniu z serwerów W W W przechow yw anych poza siedzibą Firmy i zarządzanych przez niezależnych operatorów . Pozostałe opcje w oknie dialogowym zmieniają się w zależności od w ybranej metody. Przy w drażaniu na serwerze FTP trzeba podać informacje potrzebne przy logow aniu. Profile p u b li­ kacji O ne-C lick wymagają udostępnienia adresu URL usługi i aplikacji. Po uzupełnieniu wszystkich potrzebnych właściwości należy kliknąć przycisk Publish, aby rozpocząć proces publikowania.

C zę ść III Tworzenie kodu i zarządzanie nim Rysunek 12.19. Okno dialogowe Publish Web

Uwaga Metoda O n e -C lic k P u b lis h in g aktualizuje witrynę dynamicznie (przyrostowo). Oznacza to, że potrafi wykryć, które pliki uległy zmianie, i przesłać tylko je. Jest to doskonała funkcja do publikowa­ nia stron przez internet. W przypadku dużych witryn może znacznie przyspieszyć proces publikowania.

Korzystanie z narzędzia Copy Web Site Tool D ostęp do narzędzia Copy Web Site Tool można uzyskać za pomocą m enu Website. W lewym panelu narzędzia widoczne są wszystkie pliki źródłow e (które m ożna przesłać), a prawy panel zawiera listę wszystkich plików umieszczonych obecnie w docelowej lokalizacji (zobacz rysu­ nek 12.20). Wcześniej wspom nieliśmy, że narzędzie przeprowadza synchronizację d w u stro n ­ ną. Po bliższym przyjrzeniu się rysunkowi 12.20 m ożna zauważyć strzałki obok każdego pliku. Strzałki wskazujące w p ra w o inform ują, że plik zostanie przesłany do lokalizacji docelow ej, a strzałki skierowane w lewo oznaczają kopiow anie plików do lokalnego projektu. Pierwszą rzeczą, jaką trzeba zrobić po uruchom ieniu narzędzia, jest naw iązanie połączenia ze zdalną witryną. Należy kliknąć przycisk Connect, po czym pojawi się okno dialogow e połączenia (zobacz rysunek 12.21).

Rozdział 12. Wdrażanie kodu

Rysunek 12.21. Nawiązywanie połączenia z witryną przed rozpoczęciem kopiowania

C zę ść III Tworzenie kodu i zarządzanie nim Po lewej stronie pokazano opcje połączenia: z system em plików, lokalnym serwerem I1S, ser­ werem FTP lub zdalną w itryną. Aby skopiow ać pliki, należy wybrać te, które mają zostać prze­ niesione w ramach w drażania, a następnie kliknąć jeden z przycisków operacji w środkowej części ekranu. Przyciski te (w ym ienione od góry d o dołu) umożliwiają: skopiowanie zaznaczo­ nych plików do zdalnej w itryny, skopiow anie plików ze zdalnej witryny do lokalnego projektu, przeprow adzenie dw ustronnej synchronizacji (czyli skopiowanie plików w obu kierunkach) lub zatrzymanie trwającego kopiow ania.

Uwaga Po włączeniu opcji R e m o te S ite do łączenia się z serwerem WWW na zapleczu wykorzystywany będzie mechanizm FrontPage Server Extensions. W systemie Windows Server 2008 (a także Windows Vista i Windows 7) FPSE domyślnie nie jest włączony, ani nie pojawia się jako dostępna funkcja w czasie instalacji. Jeśli pro­ gramista chce zarządzać witrynami za pomocą mechanizmu FPSE w systemach Windows Server 2008, Windows Vista lub Windows 7, pow inien pobrać odrębny plik instalacyjny zawierający FPSE, uruchomić go na docelowym serwerze, a następnie zastosować się do instrukcji opisujących włączanie mechanizmu dla konkretnej witryny z serwera IIS. W czasie powstawania książki pliki instala­ cyjne mechanizmu FPSE można było pobrać ze strony h ttp ://g o . m ic r o s o f t.c o m /f w lin k /? L in k I d = 8 6 5 4 4 .

Podsumowanie W tym rozdziale przedstawiliśmy wprowadzenie do różnych narzędzi środowiska Visual Studio przeznaczonych do wdrażania aplikacji klienckich i aplikacji serwerowych (ASP.NET). W zakresie aplikacji klienckich om ów iliśm y dwie główne technologie w drażania, C lickO nce i instalator systemu Windows, oraz wyjaśniliśmy, w jakich w arunkach stosować każdą z nich. Dokładnie przyjrzeliśmy się tym technologiom, analizując, jak za pomocą każdej z nich opublikować w śro ­ dowisku Visual Studio przykładową aplikację opartą na formularzach W indows. Omówiliśmy też narzędzia do przesyłania w itryn i aplikacji sieciowych ASP.NET z lokalnego kom putera na serwer W W W , a także zaprezentowaliśm y m echanizm y środow iska IDE służące do wykonywania tych zadań.

CZĘŚĆ IV WZBOGACANIE ŚRODOWISKA VISUAL STUDIO

Rozdział 13. Wprowadzenie do obiektowego modelu automatyzacji Rozdział 14. Tworzenie makr

559

611

Rozdział 15. Tworzenie dodatków i kreatorów 635 Rozdział 16. Rozbudowywanie edytora kodu przy użyciu platformy MEF

687

Rozdział 13. Wprowadzenie do obiektowego modelu automatyzacji

Część IV

Wzbogacanie środowiska Visual Studio

W tym rozdziale: • Przegląd obiektow ego m o d e lu autom atyzacji • Obiekty rozw iązań i p ro jek tó w • Okna • Paski poleceń • Dokumenty • Obiekty poleceń • Obiekty debugera • Zdarzenia m odelu autom atyzacji Visual Studio jest z założenia „rozszerzalne” i udostępnia własny interfejs API, który um ożli­ wia programistom kontrolow anie wielu elem entów IDE. W spom niany interfejs API to tak zw any obiektowy model autom atyzacji środowiska Visual Studio, a jego poznanie to klucz d o program ow ania i kontrolow ania samego środowiska IDE poprzez kod m akr i dodatków (tego typu projekty opisano w rozdziale 14., „Tworzenie m akr”, i 15., „Tworzenie dodatków i kreatorów ”). W tym rozdziale przedstaw iam y układ i strukturę obiektowego m odelu automatyzacji. O d ­ wzorowujemy rozm aite elem enty m odelu obiektowego na ich odpowiedniki w środowisku IDE, zagłębiając się w różne sposoby obsługi tych obiektów za pomocą kodu zarządzanego. Po­ nadto krótko opisujemy n iektóre m ożliw ości w zakresie dostosow yw ania Visual Studio do własnych potrzeb. Aby przedstawić zagadnienia związane z m odelem obiektow ym autom atyzacji i um ieścić je w szerszym kontekście, udostępniam y fragm enty kodu i listingi, z których niemal wszystkie są napisane w języku Visual Basic. W ynika to z tego, że Visual Basic to język służący do pisania m akr (inne nie są obsługiwane), a za pom ocą m akr można w zdecydowanie najłatwiejszy i naj­ szybszy sposób uzyskać dostęp do elementów środowiska IDE. Dlatego też makra to doskonałe narzędzie do eksplorowania i poznawania m odelu obiektowego. W rozdziałach 14. i 15. wyj­ dziemy poza ten model i pokażemy, jak używać makr i dodatków, pisać je i uruchamiać (dodatki można pisać także w innych językach, a nie tylko w języku Visual Basic, dlatego w następnym rozdziale zmieniamy nastawienie i większość kodu dodatków przedstawiamy w języku C#). Na razie Czytelnik nie powinien m artw ić się o techniczną stroną pisania dodatków i m ak r. W zamian warto skoncentrować się na zrozum ieniu obiektów służących do automatyzacji oraz sposobów korzystania z nich. Ambitni Czytelnicy mogą wykorzystać kod przedstaw ionych tu listingów, wklejając go bezpośrednio w edytorze m akr środow iska IDE i urucham iając go (nie wymaga to w prow adzania żadnych zm ian).

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji

Przegląd obiektowego modelu automatyzacji Obiektowy m odel automatyzacji to ustrukturyzowana biblioteka klas, której nadrzędny obiekt główny to DTE (lub DTE2; więcej na ten temat już za chwilę), co jest skrótem od Development Tools Environm ent (środowisko narzędzi programistycznych). Za pomocą podzespołu obiektu DTE (DTE2) można utworzyć egzemplarz obiektu głównego i użyć jego składowych oraz klas potom­ nych do uzyskania dostępu do składników środowiska IDE.

Wersje modelu obiektowego Obiektowy model automatyzacji jest zaimplementowany w czterech różnych uzupełniających się i współdziałających ze sobą głównych podzespołach: EnvDTE, EnvDTE80, EnvDTE90 i Env '-►DTE100. EnvDTE to oryginalny podzespół modelu automatyzacji udostępniony w wersji Visual Studio .NET 2003. EnvDTE80 to biblioteka dostępna w Visual Studio 2005, a podze­ spół EnvDTE90 to biblioteka z wersji Visual Studio 2008 (w wersji Visual Studio 2008 Servi­ ce Pack 1 zainstalow any jest jeszcze inny podzespół, EnvDTE90a). EnvDTElOO to podzespół modelu autom atyzacji używany w środow isku Visual Studio 2010. Powód udostępniania kilku wersji tego podzespołu jest prosty: pomaga to z jednej strony udostępniać nowe funk­ cje, a z drugiej — zachować zgodność wstecz. Na przykład w czasie projektow ania wersji Visual Studio 2008 Microsoft stanął przed często pojawiającą się decyzją projektową — czy zamienić lub zaktualizować starszy podzespół udostępniany w Visual Studio 2005 (EnvDTE80) i ryzykować brak zgodności z istniejącym i makrami oraz dodatkam i, czy udostępnić nowy podzespół, który można wykorzystać w sytuacjach, kiedy potrzebne są nowe funkcje (istnie­ jący kod mógłby wtedy wciąż korzystać z wcześniejszej, niezmienionej biblioteki). Zdecydowano się na to drugie rozwiązanie, dlatego EnvDTElOO (człon 100 odpow iada wersji 10.0) zawiera typy i składowe modelu automatyzacji wprowadzone w Visual Studio 2010, a pod­ zespół)' EnvDTE90 (z Visual Studio 2008) i EnvDTE80 (z Visual Studio 2005) udostępniają pod­ stawowe funkcje oraz zapewniają zgodność wstecz. W podzespole EnvDTElOO znajdują się typy, które zastępują ich poprzednie wersje z podze­ społu EnvDTE90 (podobna zależność występuje między typam i z podzespołów EnvDTE90 oraz EnvDTE80 i tak dalej — aż do pierwotnego podzespołu EnvDTE). Nazwy nowych typów mają numer oznaczający poprawioną wersję. Dlatego dostępne są na przykład typy DTE oraz DTE2, S o lu tio n , S o lu tio n 2 oraz S o lu tio n 3 i tak dalej. Tabela 13.1 przedstawia listę niektórych z najważniejszych typów' dostępnych w bibliotekach EnvDTE. Ta lista typów jest niepełna i należy ją traktować jedynie jako podręczne źródło in­ formacji. Dzięki tej liście można jednak szybko zauważyć niektóre now'e typy dostępne w naj­ nowszym podzespole automatyzacji. W następnym punkcie pokażemy, jak typy te można umieścić w pojemnych kategoriach modelu automatyzacji środowiska Visual Studio i jak o d ­ wzorować je na fizyczne elementy IDE.

C zę ść IV Wzbogacanie środowiska Visual Studio T a b e la 13.1.

Lista wybranych typów modelu automatyzacji

Typ

Opis

A d d ln

Reprezentuje dodatek Visual Studio.

Breakpoint, Breakpoint2

Reprezentuje obiekt debugera.

BuildDependencies

Reprezentuje kolekcję obiektów B u i l d D e p e n d e n c y wybranego projektu.

BuildDependency

Reprezentuje projekty, od których zależy udana kompilacja wybranego projektu.

BuildEvents

Udostępnia listę zdarzeń związaną z kompilacją rozwiązania.

Command

Reprezentuje polecenie w IDE.

Commands, Commands2

Zwraca kolekcję wszystkich poleceń obsługiwanych przez IDE.

CommandWindow

Reprezentuje okno poleceń (Command Window).

Configuration

Reprezentuje właściwości konfiguracji projektu.

Debugger, Debugger2, Debugger3, Debugger4, Debugger5

Reprezentuje debuger środowiska Visual Studio.

DebuggerEvents

Udostępnia zdarzenia debugera.

Document

Reprezentuje dokument otwarty w IDE.

Documents

Zwraca kolekcję wszystkich dokumentów otwartych w IDE.

DTE

Reprezentuje środowisko IDE. Jest to nadrzędny obiekt główny obiektowego modelu automatyzacji.

EditPoint

Reprezentuje punkt edycji tekstu w dokumencie.

Events

Udostępnia wszystkie zdarzenia autom atyzacji.

ExceptionGroups

Reprezentuje kategorie wyjątków obsługiw ane przez Visual Studio.

Find

Reprezentuje właściwość F in d w yszukiw ania tekstu w IDE.

HTMLWindow, HTMLWindow3

Reprezentuje okno dokumentów HTML.

OutputWindow

Reprezentuje okno Output.

Program, (Process2)

Reprezentuje program działający w IDE. Ten obiekt jest przydatny do analizow ania procesów i wątków programu. Funkcje podzespołu E n v D T E 8 0 udostępniane są w obiekcie P r o c e s s 2 .

Project

Reprezentuje projekt wczytany w IDE.

Projectltem

Reprezentuje element danego projektu.

Projectltems

Zwraca kolekcję wszystkich elementów projektu.

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji T abela 13.1.

Lista wybranych typów modelu automatyzacji — day dalszy Opis

Property

Reprezentuje ogólną w łaściw ość obiektu (tego typu można używać w różnych obiektach biblioteki automatyzacji).

Selectedltem

Reprezentuje projekt lub projekty wybrane w IDE.

Solution, Solution2, Solution3, Solution4

Reprezentuje rozwiązanie w czytane w Visual Studio.

SourceControl, SourceControl2

Reprezentuje system kontroli kodu źródłowego rekordu w Visual Studio.

Taskltem

Reprezentuje element okna Task List.

Taskltems, Taskltems2

Zw raca kolekcję wszystkich elem entów okna Task List.

TaskList

Reprezentuje okno TaskList.

Template

Reprezentuje szablon środowiska Visual Studio.

TextDocument

Reprezentuje plik tekstowy otwarty w IDE.

TextPane, TextPane2

Reprezentuje panel otw artego okna edytora tekstu.

TextWindow

Reprezentuje okno tekstowe.

ToolBox

Reprezentuje okno narzędzi.

ToolBoxItem, ToolBoxItem2

Reprezentuje element okna narzędzi.

ToolBoxTab, ToolboxTab2, ToolboxTab3

Reprezentuje zakładkę z elem entam i okna narzędzi.

Window, Window2

Ogólna reprezentacja dow olnego okna w IDE.

Windows, Windows2

Zw raca kolekcję wszystkich okien IDE.

Kategorie automatyzacji Ponieważ wszelkie zadania związane z automatyzacją środow iska Visual Studio rozpoczynają się od m odelu obiektowego, należy najpierw zrozumieć, w jaki sposób jego obiekty odpow iadają elem entom IDE i jakie dokładnie możliwości udostępnia. O gólnie m o żn a uporządkow ać klasy m odelu obiektow ego w edług kategorii b ezp o śred n io odpowiadającym poniższym elem entom IDE: • rozwiązaniom i projektom, • oknom i paskom poleceń (paskom narzędzi i p ask o m m enu), • dokum entom , • poleceniom ,

• debugerowi, • zdarzeniom .

C zę ść IV Wzbogacanie środowiska Visual Studio Każdy obiekt należący do powyższych kategorii reprezentuje inny elem ent środow iska IDE, a dostęp do wszystkich obiektów zawsze odbywa się poprzez obiekt główny, DTE2.

Obiekt główny DTE (DTE2) Obiekt D T E ( D T E 2 ) reprezentuje w ierzchołek drzewa interfejsu API. M ożna sobie wyobrazić, że reprezentuje całe środowisko Visual Studio, a jego obiekty podrzędne można odwzorować na różne elementy IDE. Jak już w spom nieliśm y, D T E 2 to najnow sza wersja obiektu, a D T E zapewnia zgodność ze star­ szymi wersjami. W tym rozdziale, o ile nie ma potrzeby rozróżnienia między możliwościami obu podzespołów, ogólnie opisujemy obiekty D T E i D T E 2 jako D T E . Właściwości obiektu DTE służą do uzyskania dostępu do konkretnego obiektu reprezentującego element IDE (lub kolekcji takich obiektów ). M etody takich obiektów umożliwiają w ykonyw a­ nie poleceń środow iska IDE, urucham ianie kreatorów lub zam ykanie IDE. Tabela 13.2 przedstaw ia główne właściwości i metody udostępniane przez obiekt DTE2. Są one uporządkowane w edług sześciu kategorii obiektów wspomnianych w poprzednim punkcie. T ab ela 13.2.

Właściwości i metody obiektu DTE2 dające dostęp do IDE

Kategoria

Właściwość

Polecenia

Co m m a n d s

Zwraca kolekcję obiektów Com m and. Ogólnie polecenie to operacja, którą m ożna wykonać w IDE, na przykład otwarcie lub zapisanie pliku.

Debuger

D ebugger

Zwraca obiekt debugera.

Dokumenty

A c t iv e D o c u m e n t

Zwraca obiekt D o c u m e n t reprezentujący aktyw ny dokument.

Dokumenty

D o cu m e n ts

Zwraca kolekcję obiektów D o c u m e n t reprezentującą wszystkie otwarte dokum enty.

Powiadomienie o zdarzeniu

E v e n ts

Zwraca obiekt E v e n t s służący do obsługi p ow iad om ień o zdarzeniach.

Rozwiązania i projekty

A c t iv e S o lu t io n '-► P r o je c t s

Zwraca kolekcję obiektów P r o j e c t reprezentującą projekty wybrane w okni e Solution Explorer.

Rozwiązania i projekty

S o lu t io n

Zwraca obiekt S o l u t i o n reprezentujący w czytane rozwiązanie.

Okna i paski poleceń

A c t iv e W in d o w

Zwraca obiekt W in d o w reprezentujący aktywne okno IDE.

Okna i paski poleceń

C o m m a n d B a rs

Zwraca kolekcję obiektów C o m m a n d B a r reprezentującą wszystkie paski narzędzi i menu.

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji T a b ela 13.2.

Właściwości i metody obiektu DTE2 dające dostęp do IDE — ciąg dalszy

Kategoria

Właściwość

Okna i paski poleceń

MainWindow

Zwraca obiekt W in d o w reprezentujący głów ne okno sam ego środowiska IDE.

Okna i paski poleceń

StatusBar

Zwraca obiekt StatusBar reprezentujący pasek statusu środowiska Visual Studio.

Okna i paski poleceń

ToolWindows

Zwraca egzem plarz typu T o o l W i n d o w s , który daje dostęp do kilku najw ażniejszych okien n arzęd zi: okna Command Window, okna Errors, okna Output, okna Solution Explorer, okna Task List i okna ToolBox.

Okna i paski poleceń

WindowConfigurations Zwraca kolekcję obiektów WindowC onfiguration.

I Opis

Te obiekty reprezentują różne sposoby rozmieszczania okien w Visual Studio.

Kategoria

Metoda

Opis

Polecenia

ExecuteCommand

W ykonuje polecenie środowiska.



LaunchWizard

Uruchamia określony kreator z podanymi parametrami.



Quit

Zam yka Visual Studio.

Uwaga Stosowanie i tworzenie egzemplarzy obiektu DTE wygląda nieco inaczej w zależności od tego, czy programista tworzy dodatek, czy makro, dlatego szczegóły opisujemy w punktach dotyczących tych elementów w rozdziałach 14. i 15.

W podsum ow aniu: obiekt DTE to narzędzie służące do bezpośredniego wchodzenia w interak­ cje w różnym i elem entam i IDE i dające dostęp do głębszych warstw interfejsu API poprzez kolekcję właściwości. Na niższym poziomie interfejsu API można znaleźć obiekty główne niższego poziomu, które stanowią podstaw)' system u automatyzacji.

Obiekty Solution i Project Obiekt Solution reprezentuje aktualnie wczytane rozwiązanie. Poszczególne projekty rozw ią­ zania są dostępne poprzez obiekty typu Project dostępne w kolekcji S o l u t i o n . Proj eets. Dostęp do elementów projektów m ożna uzyskać w podobny sposób, używając kolekcji Proj ect.

--Projectltems. Na rysunku 13.1 widać, że ta hierarchia dokładnie odzw ierciedla hierarchię rozw iązań i p ro ­ jektów opisaną w rozdziale 4., „Rozwiązania i projekty”.

C zę ść IV Wzbogacanie środowiska Visual Studio

Rysunek 13.1. Odwzorowanie hierarchii rozwiązań i projektów

Występują tu pewne różnice (na przykład katalogi rozwiązania są traktowane jak projekty), jednak w większości miejsc drzewo m od elu obiektowego ściśle odpow iada z n an e m u drzew u rozwiązań i projektów. Składowe obiektów Solution umożliwiają interakcję z bieżącym rozwiązaniem i w ykonyw a­ nie standardow ych operacji takich jak: • O kreślanie liczby projektów w rozwiązaniu (właściwość Count). • Dodawanie projektu do rozwiązania na podstawie pliku projektu (metoda AddF romFile). • Tw orzenie nowego rozwiązania lub zamykanie bieżącego (metody Create i Close). • Zapisywanie rozwiązania (m etoda SaveAs). • Usuwanie projektu z rozwiązania (metoda Remove). Można także bezpośrednio pobrać referencję do dow olnego projektu w chodzącego w skład aktualnie wczytanego rozw iązania, przechodząc przez kolekcję Solution. Projects. Jako przykład obsługi interakcji z obiektami Solution i Project przedstaw iam y fragm ent kodu języka Visual Basic, który usuwa z bieżącego rozwiązania pierwszy projekt: Dim sol As Solution = DTE.Solution Dim proj As Project = sol.Projects.Item(l) If proj.Saved Then sol.Remove(proj) Else End If

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji

Uwaga Większość fragmentów kodu w tym rozdziale ma jedynie ilustrować dostęp do omawianych komponentów interfejsu A P I . Szczegółowe informacje o korzystaniu z tych elementów w makrach i dodatkach zawierają następne rozdziały. Jeśli Czytelnik chce szybko zacząć pracę i wypróbować kod w trakcie lektury', musi najpierw otw o­ rzyć środowisko Macros I D E (opcja T o o ls /M a c r o s /M a c r o s I D E ).

Tabela 13.3. przedstawia listę najczęściej używanych właściwości i metod udostępnianych przez obiekty S o lu tio n . T ab ela 13.3.

Podstawowe składowe obiektów Solution, SoIution2 i Solution3

Właściwość

Addins

Zwraca kolekcję obiektów typu Addln powiązanych z bieżącym rozwiązaniem.

Count

Zwraca liczbę projektów bieżącego rozwiązania.

DTE

Udostępnia referencję prowadzącą z powrotem do obiektu głównego DTE.

FullName

Udostępnia pełną ścieżkę do pliku rozwiązania oraz jego nazwę.

Globals

Zwraca obiekt G lo b a ls , który pełni funkcję pamięci podręcznej na zmienne używane w rozwiązaniu.

IsOpen

Informuje, czy rozwiązanie jest otwarte.

Projects

Zwraca kolekcję obiektów typu P ro j e c t reprezentującą wszystkie projekty rozwiązania.

Properties

Zwraca kolekcję obiektów typu Prope r t y , która udostępnia wszystkie właściwości rozwiązania.

Saved

Informuje, czy rozwiązanie zostało zapisane od czasu ostatniej modyfikacji.

SolutionBuild

Zwraca referencję do obiektu S o lu tio n B u ild . Jest to punkt wejścia do obiektów automatyzacji kompilacji powiązanych z bieżącym rozwiązaniem.

Metoda

Opis

AddFromFile

Dodaje projekt do rozwiązania, używając istniejącego pliku projektu.

AddFromTemplate

Pobiera istniejący projekt, klonuje go i dodaje do rozwiązania.

AddFromTemplateEx Dodaje istniejący projekt do rozwiązania na podstawie nazwy tego ostatniego. AddSolutionFolder Tworzy nowy katalog rozwiązania. Close

Zamyka rozwiązanie.

Create

Tworzy puste rozwiązanie.

FindProjectltem

Inicjuje wyszukiwanie danego elementu w jednym z projektów rozwiązania.

C zę ść IV Wzbogacanie środowiska Visual Studio Tabela 13.3. Podstawowe składowe obiektów Solution, Solution2 i Solution3 —ciąg dalszy j Opis

Właściwość

GetProjectltem '-►Template

Zwraca ścieżkę do szablonu, który jest podstawą danego elementu projektu.

GetProject ^►Template

Zwraca ścieżkę do szablonu, który jest podstawą danego projektu.

Item

Zwraca egzemplarz obiektu P ro je c t.

Open

Otwiera rozwiązanie (używając specyficznego widoku).

Remove

Usuwa projekt z rozwiązania.

SaveAs

Zapisuje rozwiązanie.

Kontrolowanie projektów wchodzących w skład rozwiązania Jednym z zadań, do których dobrze nadaje się obiekt S o lu tio n , jest pobieranie referencji do różnych projektów wchodzących w skład rozwiązania. Każdy obiekt Pro j e c t ma własny zestaw przydatnych składowych służących do obsługi p rojektów i ich elem entów . Za pom ocą tych składowych można wchodzić w interakcję z projektami na różne sposoby, na przykład zmieniać ich nazwy, usuwać je czy zapisywać. W tabeli 13.4 opisane są najczęściej używane składowe obiektu P r o je c t. Tabela 13.4. Podstawowe składowe obiektu Project Właściwość

; Opis

CodeModel

Zwraca obiekt CodeM odel powiązany z projektem.

Collection

Zwraca kolekcję obiektów P ro je c t z danego rozwiązania.

DTE

Udostępnia referencję prowadzącą z powrotem do obiektu głównego DTE.

FullName

Udostępnia pełną ścieżkę do pliku projektu oraz jego nazwę.

Kind

Zwraca łańcuch z identyfikatorem GUID określającym typ projektu. Każdy typ projektu jest zarejestrowany w Visual Studio za pomocą identyfikatora GUID. W dokumentacji pakietu SDK środowiska Visual Studio znajduje się lista identyfikatorów GUID i odpowiadających im tekstowych opisów typów projektów.

Name

Zwraca nazwę danego projektu.

Pa rent ^►Project Item

Zwraca egzemplarz nadrzędnego obiektu P r o je c t. Niektóre typy projektów w Visual Studio mogą zawierać projekty innych typów. Właściwość P a re n tP ro je c tlte m pozwala ustalić dla danego projektu projekt nadrzędny (jeśli taki istnieje).

Projectltems

Zwraca kolekcję P ro j e c tlte m s zawierającą wszystkie obiekty danego projektu.

Properties

Zwraca kolekcję obiektów typu P ro p e rty , która udostępnia wszystkie właściwości projektu.

Saved

Informuje, czy projekt został zmodyfikowany od czasu ostatniego zapisania lub otwarcia.

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji Tabela 13.4. Podstawowe składowe obiektu Project — ciąg dalszy Właściwość

Opis

Metoda

Opis

Delete

Usuwa dany projekt z rozwiązania.

Save

Zapisuje projekt.

SaveAs

Zapisuje projekt. Metoda umożliwia podanie nowej nazwy projektu.

Dostęp do kodu projektu Oprócz zapewniania dostępu do podstawowych atrybutów i elementów projektów jedną z ciekaw­ szych możliwości obiektu Project jest dostęp do kodu plików źródłowych projektu. Za pomocą właściwości CodeModel można uzyskać dostęp do różnych obiektów pośredniczących repre­ zentujących elem entu kodu projektu. Na przykład interfejs CodeClass pozwala spraw dzić i zmienić kod danej klasy określonego projektu.

Uwaga Obsługa różnych encji obiektu CodeModel jest odmienna w poszcze­ gólnych językach. Dokumentacja M SDN dotycząca różnych typów obiektu CodeModel dokładnie opisuje obsługę języka kodu źródło­ wego danego elem entu.

Po pobraniu referencji do obiektu CodeModel z obiektu P r o j e c t m ożna uzyskać d o stęp do kolekcji CodeElements (która, co nie zaskakuje, jest kolekcją obiektów typu CodeElement). Obiekt CodeElement to ogólna reprezentacja określonej stru k tu ry kodu projektu. O biekty tego typu są ogólne i udostępniają specjalną właściwość, Kind, k tó ra pozwala precyzyjnie określić rodzaj obiektu reprezentującego kod, zawartego w danym obiekcie CodeElement. Właściwość CodeElement .Kind to wyliczenie (typu vsCMElement), które określa rodzaj kodu znajdującego się w obiekcie CodeElement. Za pomocą właściwości Kind można sprawdzić praw ­ dziwą naturę elem entu kodu, a następnie zrzutować obiekt CodeElement na jego faktyczny typ. Poniżej znajduje się fragment kodu języka C#, który w ykonuje taką operację: if (element.Kind == vsCMElement.vsCMElementClass)

{ CodeClass myClass = (CodeClass)element;

} Aby lepiej zrozumieć hierarchię modelu kodu, warto zastanowić się nad kodem języka C# przed­ stawionym na listingu 13.1. Jest to rozwiązanie urucham iane z wiersza poleceń, k tó re zawiera jedynie im plem entację przestrzeni nazw, klasy w tej przestrzeni oraz jednej funkcji w tej klasie.

C zę ść IV Wzbogacanie środowiska Visual Studio

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji Tabela 13.5. Odwzorowanie wartości wyliczenia vsCMElement Wartość wyliczenia

| Typ

I Opis

vsCMElementAssignmentStmt

Instrukcja przypisania.

vsCMElementAtt ribute

Atrybut.

vsCMElementClass

C o d e C lass

Klasa.

vsCMElementDeclareDecl

Deklaracja.

vsCMElementDefineStmt

Instrukcja definicji.

vsCMElementDelegate

C o d e D e le g a te

Delegat.

vsCMElementEnum

CodeEnum

Wyliczenie.

vsCMElementEvent

C o d eE vent

Zdarzenie.

vsCMElementEventsDeclaration vsCMElementFunction

Deklaracja zdarzenia. C o d e F u n c tio n

Funkcja.

vsCMElementFunctionlnvokeStmt

Instrukcja wywołania funkcji.

vsCMElementIDLCoClass

Klasa pomocnicza języka IDL.

vsCMElementIDLImport

Instrukcja importu języka IDL.

vsCMElementIDLImportLib

Biblioteka importu języka IDL.

vsCMElementIDLLibrary

Biblioteka języka IDL.

vsCMElementlmplementsStmt

Instrukcja implementacji.

vsCMElementImportStmt

C o d e im p o rt

Instrukcja importu.

vsCMElementlncludeStmt

Instrukcja douczania.

vsCMElementInheritsStmt

Instrukcja dziedziczenia.

vsCMElementlnterface

C o d e in te rfa c e

Interfejs.

vsCMElementLocalDeclStmt

Instrukcja lokalnej deklaracji.

vsCMElementMacro

Makro.

vsCMElementMap

Odwzorowanie.

vsCMElementMapEnt ry

Element odwzorowania.

vsCMElementModule

Moduł.

vsCMElementNamespace

CodeNamespace

vsCMElementOptionStmt vsCMElementOther

Przestrzeń nazw. Instrukcja opcji.

C odeElem ent

Element kodu, który nie jest zdefiniowany w tym wyliczeniu.

vsCMElementPa rameter

C o d eP aram eter

Parametr.

C zę ść IV Wzbogacanie środowiska Visual Studio Tabela 13.5. Odwzorowanie wartości wyliczenia vsCMEIement —ciąg dalszy Wartość wyliczenia

vsCMEIementProperty

I Typ

CodeProperty

I

Właściwość. Instrukcja ustawiania właściwości.

vsCMEIementPropertySetStmt vsCMElementStruct

I Opis

CodeStruct

Struktura.

vsCMElementTypeDef

Definicja typu.

vsCMElementUDTDecl

Typ zdefiniowany przez użytkownika. Unia.

vsCMElementllnion vsCMEIementUsingStmt

Codeimport

Instrukcja u s in g .

vsCMElementVariable

Zmienna.

vsCMElementVBAtt ributeGroup

Grupa atrybutu języka Visual Basic.

vsCMElementVBAtt ributeStmt

InstrukcjaatrybutujęzykaVisual Basic.

vsCMElementVCBase

Klasa bazowa języka Visual C++.

Okna W idoczne elem enty środow iska Visual Studio są reprezentow ane przez obiekty Window. Są to egzemplarze otw artych okien IDE, takich jak Solution Explorer, Task List, otwarte okno e d y to ­ ra kodu i tak dalej. Nawet samo IDE jest reprezentow ane przez obiekt Window. Każde okno to albo okno dokum entu, albo okno narzędzi. O kna dokum entu zawierają d o k u ­ menty, które można modyfikować za pom ocą edytora tekstu. W oknach narzędzi znajdują się kontrolki, które wyświetlają informacje związane z bieżącym kontekstem środowiska IDE, takie jak Solution Explorer czy Task List. Oknem dokum entu jest na przykład edytor z otw artym plikiem z kodem źródłowym języka Visual Basic.

Dostęp do okien Jeśli potrzebny jest egzemplarz danego okna, można go pobrać na kilka sposobów. Poszcze­ gólne techniki pobierania okien są optym alne w różnych sytuacjach. W ramach rozgrzewki — główne okno IDE m ożna szybko pobrać bezpośrednio z obiektu DTE: Dim IDE As Window IDE = DTE.MainWindow

Jeśli program ista chce wykonać specyficzną operację na oknie środow iska IDE, jest to oczyw i­ ście najszybsze rozwiązanie.

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji Właściwość DTE.ActiveWindow także zapewnia bezpośredni i szybki dostęp do okna Window. W tym przypadku jest to aktywne okno: Dim CurrentWindow As Window CurrentWindow = DTE.ActiveWindow

O kna narzędzi w IDE — Com m and W indow , Errors, O u tp u t , Solution Explorer , Task List i ToolBox— także umożliwiają bezpośredni dostęp do ich egzemplarzy w modelu obiektowym. W tym celu należy użyć właściwości DTE. ToolWindows. Zwraca ona obiekt ToolWindows, który udostępnia odrębną właściwość dla każdego z okien narzędzi. Poniższy kod w języku Visual Basic pobiera referencję do okna Task List i zamyka je: Dim taskwin As Window taskwin = DTE.ToolWindows.TaskList taskwin.Close()

Ostatni, czwarty sposób dostępu do okien IDE wymaga użycia kolekcji DTE.Windows. Ta k o ­ lekcja przechow uje wszystkie okna IDE. M ożna uzyskać dostęp do danego okna, podając liczbę całkowitą reprezentującą jego pozycję w kolekcji lub obiekt albo łańcuch znaków reprezentujący szukane okno. Poniższy kod pobiera uchwyt do okna Solution Explorer: Dim windows As Windows2 = DTE.Windows Dim window As Window = windows.Item(Constants.vsWindowKindSolutionExplorer)

Interakcja z oknami Tabela 13.6 przedstaw ia właściwości i m etody dostępne w każdym obiekcie Window. Tabela 13.6. S k ła d o w e

o b ie k tó w ty p u W in d o w

Właściwość

Opis

AutoHides

Flaga logiczna informująca o tym, czy okno m ożna ukryć (dotyczy wyłącznie okien narzędzi).

Caption

Tytuł (nagłów ek) okna.

Collection

Kolekcja W in d o w s , do której należy bieżący obiekt W in d o w .

CommandBars

Kolekcja C o m m a n d B a r s zawierająca paski poleceń udostępniane przez okno.

ContextAttributes

Kolekcja obiektów typu C o n t e x t A t t r i b u t e . Służą one do wiązania bieżącego kontekstu okna z oknem pomocy Dynamie Help.

Document

Jeśli obiekt W in d o w zawiera dokum ent, ta w łaściw ość zwraca referencję do niego.

DTE

Referencja do obiektu głów nego D T E .

Height

Wysokość okna w pikselach.

C zę ść IV Wzbogacanie środowiska Visual Studio Tabela 13.6. S k ła d o w e

o b ie k tó w ty p u W in d o w

Właściwość

— c ią g

d a ls z y

' Opis

Is F lo a t in g

Flaga logiczna inform ująca o tym, czy okno jest pływające, czy zadokowane.

L e ft

O dległość w pikselach m iędzy lewą kraw ędzią okna a lewą krawędzią zaw ierającego je kontenera.

L in k a b le

Flaga logiczna inform ująca o tym, czy okno można zadokować wraz z innymi oknam i.

L in k e d W in d o w F ra m ę

Zwraca referencję do obiektu W indow , który działa jako ramka dla zadokowanego okna.

L in k e d W in d o w s

Kolekcja obiektów W in d o w reprezentująca okna powiązane ze sobą w tej samej ramce.

O b je c t

Zwraca obiekt pośredniczący reprezentujący okno, do którego można uzyskać dostęp za pomocą jego nazw y.

O b je c t K in d

Identyfikator GUID inform ujący o typie obiektu zw róconego przez w łaściw o ść W in d o w . O b je c t .

P r o je c t

Egzem plarz typu P r o j e c t reprezentujący projekt otwarty w obiekcie W in d o w .

P r o je c t lt e m

Egzem plarz t y p u P r o j e c t l t e m reprezentujący element projektu otwarty w obiekcie W in d o w .

S e le c t io n

Zwraca obiekt reprezentujący element wybrany w oknie (w przypadku okien dokumentów może to być tekst; w oknach narzędzi może to być na przykład pozycja na liście).

Top

Odległość w pikselach między górną krawędzią okna a górną krawędzią zaw ierającego je kontenera.

V is ib le

Flaga logiczna inform ująca o tym, czy okno jest widoczne, czy ukryte.

W id t h

Szerokość okna w pikselach.

W in d o w S t a t e

Pobiera lub u staw ia bieżący stan okna (za pom ocą w artości w yliczenia v s W in d o w S t a t e : v s W in d o w S t a t e M a x im iz e , v s W i n d o w S t a t e M i n i m i z e , v s W in d o w S t a t e N o r m a l) .

M etoda

O pis

A c t iv a t e

Powoduje, że okno staje się aktywne.

C lo s e

Zam yka okno. Za pom ocą wartości w yliczenia v s S a v e C h a n g e s m ożna określić, czy dokum ent przechowywany w oknie należy zapisać, czy nie, lub czy IDE pow inno poprosić użytkownika o podjęcie tej decyzji.

S e t S e le c t io n C o n t a in e r

Przekazuje tablicę obiektów do okna Properties, jeśli dany obiekt W in d o w je st ak tyw n y . Ta w łaściw ość je st używ ana głów nie dla niestandardow ych okien n a rzę d zi, kiedy potrzebna jest możliwość kontrolowania info rm acji w yśw ietlanych w oknie Properties.

S e t T a b P ic t u r e

Określa obiekt używany jako rysunek widoczny na zakładce. Ten rysunek jest wyświetlany zawsze wtedy, kiedy okno w chodzi w skład gru p y okien IDE i jest dostępne poprzez zakładkę.

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji Po zapoznaniu się z obsługą podstawowych operacji (takich jak używanie właściwości H e ig h t i W idth do spraw dzania lub modyfikowania wymiarów okna czy ustawianie aktywnego okna za pomocą m etody S e t Focus) warto poświęcić szczególną uwagę kilku właściwościom: • W łaściwość Document um ożliwia program ow e w chodzenie w interakcję z d o k u ­ m entem znajdującym się w danym oknie (jeśli taki istnieje). • Właściwości P r o je c t i P r o je c tlte m pozwalają uzyskać dostęp do składowej Window interfejsu API obiektów' P r o j e c t i S o lu tio n . Tych właściwości (podobnie jak właści­ wości Document) można użyć d o wchodzenia w interakcje z projektem pow iązanym z oknem lub elementami takiego projektu (na przykład plikiem z kodem języka Visual Basic, plikiem tekstowym, plikiem zasobów i tak dalej). • Jeśli program ista obsługuje okno narzędzi, może użyć m etody S e tT a b P ic tu r e do określenia ikony widocznej w sytuacji, kiedy dane okno jest częścią grupy okien d o ­ stępnych poprzez zakładki (na przykład na zakładce okna narzędzi Toolbox widoczny jest rysunek klucza i młota). • N astępna metoda, S e tS e le c tio n C o n ta in e r , także jest specyficzna dla okien n arzę­ dzi. Tej m etody można użyć w celu udostępnienia obiektów wyświetlanych w oknie Properties. Jest to przydatne, jeśli program ista używa niestandardow ego okna i musi kontrolow ać elem enty wyświetlane w oknie Properties wtedy, kiedy dane o k n o n a ­ rzędzi jest aktywne (wszystkie standardow e okna Visual Studio autom atycznie o b słu ­ gują wyświetlanie właściwości). Listing 13.2 przedstaw ia proste m akro ilustrujące zastosowanie obiektu Window. Poniższy kod sprawdza każde okno, aby określić jego typ, a następnie w prostym oknie kom unikatu wyświe­ tla podsumowanie dotyczące okien. Listing 13.2. Makro języka Visual Basic służące do sprawdzania kolekcji okien

Imports Imports Imports Imports

EnvDTE EnvDTE80 System.Diagnostics System.Windows.Forms

Public Module MacroExamples Public Sub InventoryWindows() 1

P o b ie ra kolek cję w szystkich o tw a rty c h okien.

Dim windows As Windows2 = DTE.Windows 1

Z lic za lic zb ę otw artych okien.

Dim windowCount As Integer = windows.Count 1

Z m ienne lokaln e słu żą ce J o p rz e c h o d ze n ia

w p ę tli p r z e z

o k n a o ra z

' p rz e c h o w y w a n ia tych okien o r a z w yg en ero w a n ych ła ń c u c h ó w zn aków .

Dim idx As Integer Dim results As String Dim window As Window2 results = "Liczba otwartych okien: " + windowCount.ToString + vbCrLf

C zę ść IV Wzbogacanie środowiska Visual Studio '

P rze c h o d ze n ie p r z e z k o le k c ją o k ie n .

For id x = 1 To windowCount window = windows . Ite m (id x ) Dim t i t l e As S t r in g = window.Caption ' '

J e śli o k n o p r z e c h o w u je do k u m en t, w ła śc iw o ść W indow. D ocu m en t zw ró c i p o p r a w n y o b ie k t D ocu m en t.

I f Not (window.Document Is Nothing) Then 1

D a n e okno to o k n o doku m en tu .

Dim docName As S t r in g = window.Document.Name re su lts = r e s u lt s + "Okno + t it le + to okno dokumentu" + vbCrLf Else ‘

J e śli n ie m a d o k u m e n tu , j e s t to okno n arządzi

' (o k n a n a rzą d zi n ie p r z e c h o w u ją dokum entów ).

re su lts = r e s u lt s = "Okno '" + t i t l e + " 1 to okno n arzędzi" + vbCrLf End I f Next '

W yśw ietlen ie wyników.

M essageBox.Show(results, "Okna", MessageBoxButtons.OK, MessageBoxIcon. Inform ation) End Sub End Module

Uwaga Jeśli programista chce zagnieździć własną niestandardową kon­ trolkę w oknie narzędzi, musi napisać dodatek i użyć m etody Windows.CreateToolWindow. Opisujemy to w rozdziale 14.

Okna tekstowe i panele Okna tekstowe można reprezentować nie tylko za pomocą ogólnego obiektu W in d o w , ale także jako specyficzny dla nich typ. Okna edytora tekstu reprezentuje obiekt T e x t W in d o w . Aby pobrać referencję do obiektu T e x t W in d o w danego okna, należy pobrać wartość obiektu W in d o w i przy­ pisać ją do typu TextWindow: Dim textWindow As TextWindow textWindow = DTE.ActiveWindow.Object Obiekt TextWindow nie udostępnia wielu dodatkowych funkcji w porównaniu z typem Window. Jego prawdziwa wartość polega na umożliwianiu dostępu do paneli.

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji Okna edytora tekstu w Visual Studio mogą być rozbite na dwa panele. W otwartym edytorze tekstu wystarczy wybrać opcję S p lit z menu W in d o w , aby otworzyć nowy panel okna. Właści­ wość T e x t W i n d o w . A c t i v e P a n e zwraca obiekt T e x t P a n e reprezentujący aktywny panel okna, a właściwość T e x t W i n d o w . P a n e s daje dostęp do wszystkich paneli okna tekstu: 1

P o b ie ra e g z e m p la r z pan elu z kolekcji.

Dim newPane As TextPane2 newPane = textWindow.Panes.Ite m (l) 1

P o b ie ra a k ty w n y p an el.

Dim currPane As TextPane2 currPane = textWindow.ActivePane Jedną z bardziej użytecznych operacji, do jakich można wykorzystać obiekt T e x t P a n e , jest przewijanie obszaru klienckiego (na przykład widocznej części dokumentu w panelu) w celu wyświetlenia specyficznego fragmentu tekstu. Służy do tego metoda T e x t P a n e . T r y T o S h o w . Poniżej znajduje się definicja metody: Function TryToShow( Point As T e xtP o in t, Optional How As vsPaneShowHow, PointOrCount As Object) Parametr T e x t P o i n t reprezentuje specyficzną lokalizację w dokumencie tekstowym, która ma być widoczna w panelu tekstu (obiekty typu T e x t P o i n t opisujemy szczegółowo w dalszej części rozdziału, w podpunkcie „Modyfikowanie dokumentów tekstowych”). Wartość v s P a n e S h o w H o w określa, jak panel powinien funkcjonować w czasie przewijania tekstu do określonego punktu: • Wartość v s P a n e S h o w H o w .v s P a n e S h o w C e n t e r e d powoduje wyśrodkowanie w panelu (w pionie i w poziomie) tekstu lub zaznaczonego fragmentu. • Wartość v s P a n e S h o w H o w . v s P a n e S h o w T o p umieszcza wskazany tekst u góry w i­ docznego obszaru. • Wartość v s P a n e S h o w H o w . v s P a n e S h o w A s I s powoduje, że wskazany tekst zostanie umieszczony w widocznym obszarze panelu bez zmian pozycji w pionie lub poziomie. Ostatni parametr, obiekt P o i n t O r C o u n t , służy do określenia końca obszaru tekstu, który ma być widoczny. Jeśli programista poda w tym miejscu liczbę całkowitą, będzie ona reprezen­ tować liczbę znaków od wyjściowego miejsca w tekście. Jeśli podany zostanie następny punkt tekstu, wtedy zaznaczony zostanie tekst pomiędzy oboma określonymi punktami. Obiekt T e x t P a n e pozwala także uzyskać dostęp do mechanizmu wyszukiwania przyrostowego danego panelu okna. Listing 13.3 przedstawia działanie tej właściwości. L istin g

13.3. Kontrolowanie mechanizmu wyszukiwania przyrostowego

Imports Imports Imports Imports Imports

EnvDTE EnvDTE80 M icro so ft.VisualStudio.CommandBars System .Diagnostics System.Windows.Forms

C zę ść IV Wzbogacanie środowiska Visual Studio P u b lic Module MacroExamples P u b lic Sub In cre m e n ta lS e a rch () '

P o b ie r a referen cję d o a k ty w n e g o okna.

'

W ty m m iejscu za k ła d a m y , ż e j e s t to

' o k n o tekstow e.

Dim window As Window2 = DTE.ActiveWindow ' ‘

P o b ie r a eg zem p la rz o b ie k tu T ex t W indow o d p o w ia d a ją c y aktyw n em u oknu.

Dim txtWindow As TextWindow = window.Object 1

P o b ie r a a k tyw n y p a n e ! z o k n a tek sto w eg o .

Dim pane As TextPane2 = txtWindow.ActivePane '

Z a p o m o c ą a k ty w n e g o p a n e lu p o b ie r a je g o o b ie k t

' In crem en talS earch .

Dim search As Increm entalSearch = pane.IncrementalSearch 1

P r ó b a zn a lezien ia in te rfe jsu I M e ssa g e M apper p o p r z e z

'

w yszu k iw a n ie ła ń c u c h a z n a k ó w "IM"

' K o n fig u ra cja w y szu k iw a n ia :

'

w yszu k iw a n ie o d p o c z ą tk u d o końca dokum entu

'

d o d a w a n ie w y szu k iw a n y c h zn aków



za k o ń czen ie w yszu k iw a n ia .

se a rch .StartFo rw ard () se a rch .AppendCharAndSearch(AscW{"I")) se a rch .AppendCharAndSearch(AscW("M")) 1 1

A b y w yjść z try b u w y szu k iw a n ia p rzyro sto w eg o , m o ż n a w yw o ła ć fu n k c ję In crem entalSearch. Exit().

' se a rc h . Exit()

End Sub End Module

Rodzaje okien narzędzi Oprócz obiektu W in d o w każde domyślne okno narzędzi środowiska IDE — C o m m a n d W in d o w , i T a sk L is t — jest także reprezentowane przez odrębny typ, który udostępnia właściwości i metody specyficzne dla danego okna. Tabela 13.7 przedstawia domyślne okna narzędzi O u tp u t , T o o lb o x

oraz typy odpowiadające im w obiektowym modelu automatyzacji. Tabela 13.7. Okna narzędzi i ich typy Okno narzędzi

Typ

Okno Command Window

C o m m a n d W in d o w

Okno Output

O u t p u t W in d o w

Okno Task List

T a s k L is t

Okno Toolbox

T o o lB o x

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji Aby uzyskać dostęp do jednego z tych obiektów, należy najpierw pobrać ich reprezentację w postaci obiektu W in d o w , a następnie zrzutować go na wartość W i n d o w . O b j e c t odpowiedniego typu. Na przykład poniższy fragment kodu Visual Basic rozpoczyna się od pobrania referencji typu W in d o w do okna T a s k L ist, a następnie używa wygenerowanego obiektu W in d o w do utwo­ rzenia referencji do obiektu T a s k L i s t : Dim windows As Windows = DTE.Windows Dim twindow As Window = DTE.Windows. Item (EnvDTE.Constants. vsW indowKindTaskList)

Zadania i okno Task List Obiekt T a s k L i s t umożliwia dostęp do elementów aktualnie wyświetlanych w oknie T a s k L ist. Każdy element tego okna jest reprezentowany przez odrębny obiekt T a s k l t e m . Te obiekty udostępniają metody i właściwości umożliwiające manipulowanie elementami zadań. Na przykład można oznaczyć elem ent jako zakończony, pobrać lub ustawić numer wiersza powiązanego z zadaniem lub zmienić priorytet zadania. Do usuwania zadań z listy' służy metoda T a s k l t e m . D e l e t e , a do dodawania ich — T a s k l t e m s . " ♦ A d d . Metoda A d d pozwala określić kategorię zadania, kategorię podrzędną, opis, priorytet, ikonę i inne właściwości: Dim t l i s t As T a sk L ist = CType(twindow.Object, T a s k L is t) t lis t .T a s k lt e m s .Add("Najlepsze p ra k ty k i" , "Style p is a n ia kodu", "Wcięcia p rzy nawiasach są niespó jne", v s T a s k P r io r it y .vsTaskPriorityM edium, vsT a sklco n . vsTasklconUser, True, "S:\ContosoCommonFramework\Contoso.Fx.Com m on\Classl.cs", 7, True, True) Tabela 13.8 przedstawia wybór składowych obiektu T a s k l t e m . Tabela 13.8. S k ła d o w e

o b ie k tu T a sk ltem

Właściwość

Opis

Category

Kategoria zadania.

Checked

Flaga logiczna informująca, czy zadanie jest oznaczone ja ko zakończone (w polu obok zadania pojawia się wtedy symbol „ptaszka").

C o lle c tio n

Kolekcja T a s k L i s t , do której należy bieżący obiekt T a s k l t e m .

D e sc rip tio n

Opis zadania.

D isplayed

Flaga logiczna informująca, czy zadanie jest aktualnie w idoczne w oknie listy zadań.

DTE

Referencja do obiektu głów nego D T E .

FileName

Nazwa pliku powiązanego z zadaniem (jeśli taki istnieje).

C zę ść IV Wzbogacanie środowiska Visual Studio Tabela 13.8. Składowe obiektu Taskltem — ciąg dalszy Właściwość

Opis

Is S e t t a b le

Przekazując w artość wyliczenia v s T a s k L i s t C o l u m n do tej właściwości, można określić, czy daną kolum nę można modyfikować.

L in e

Numer w iersza pow iązanego z zadaniem.

P r io r it y

W artość w yliczenia v s T a s k P r i o r i t y określająca priorytet zadania. M ożliwe wartości to v s T a s k P r io r i t y H i g h , v s T a s k P r io r it y M e d iu m i v s T a s k P r io r it y L o w .

S u b C a te g o ry

Kategoria podrzędna zadania.

Metoda

Opis

D e le t e

Usuwa zadanie z okna TaskList.

N a v ig a t e

Pow oduje p rzejście środowiska IDE do m iejsca zw iązanego z zadaniem (na przykład do określonego w iersza pliku).

S e le c t

Powoduje, że dane zadanie staje się aktywne w oknie Task List.

Listing 13.4 przedstawia krótkie makro w języku Visual Basic demonstrujące zastosowanie obiek­ tów T a s k L i s t , T a s k l t e m s i T a s k l t e m do przechodzenia po zadaniach oraz zmiany ich stanu. Listing 13.4. Przełączanie stanu ukończenia zadań Imports Imports Imports Imports Imports Imports

EnvDTE EnvDTE80 EnvDTE90 M icrosoft.VisualStudio.CommandBars System .Diagnostics System.Windows. Forms

P u b lic Module MacroExamples P ub lic Sub T o g g le A llT a sk sf) ‘

P obranie k o lek cji okien.

Dim windows As Windows = DTE.Windows '

P obranie okna Task L is t z kolekcji.

Dim twindow As Window = _ DTE.Windows. Item (EnvDTE.Constants. vsW indowKindTaskList) 1

P rzekształca o b iek t okn a na egzem plarz typu T askL ist p o p r z e z

' zrzu tow an ie je g o w ła śc iw o śc i O bject.

Dim t l i s t As T a s k L is t = CType(twindow.O bject, T a s k L is t) '

P rzechodzi p o w szystk ich zadan iach listy.

For Each task As Taskltem In t l i s t . Taskltems '

P rzełączen ie s y m b o lu „ ukończone " p r z y k a żd y m za d a n iu użytkownika.

I f task.Category = "User" Then ta s k .Checked = Not task.Checked End I f

]

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji Next End Sub End Module

Okno Toolbox Do programowej obsługi okna T o o lb o x służą cztery obiekty: • T o o l B o x — obiekt reprezentujący samo okno T o o lb o x .

• ToolBoxTabs — kolekcja reprezentująca zakładki paneli okna T o o lb o x . • T o o l B o x I t e m s — kolekcja reprezentująca elementy danej zakładki okna T o o lb o x • T o o l B o x I t e m — pojedynczy element widoczny w zakładce okna T o o lb o x .

Rysunek 13.3 przedstawia hierarchię obiektów okna T o o lb o x . Rysunek 13.3. Hierarchia obiektu ToolBox

Te obiekty służą przede wszystkim do dodawania, usuwania i modyfikowania elementów prze­ chowywanych w oknie T o o lb o x . Na przykład można łatwo dodać niestandardową zakładkę do okna T o o lb o x , używając kolekcji T o o l B o x T a b s : Dim tBox As ToolBox Dim myTab As ToolBoxTab tBox = DTE.Windows. Item (Constants. vsWindowKindToolbox).Object myTab = tBox.ToolBoxTabs.Add( "Zakładka TBox") Można także dodać elementy do dowolnej zakładki, używając metody T o o l B o x I t e m s .A d d . Ta metoda przyjmuje nazwę dodawanego elementu, obiekt danych reprezentujący ten element oraz wartość wyliczenia v s T o o l B o x I t e m F o r m a t , która określa format elementu. Metoda A d d używa tej ostatniej wartości do określenia, w jaki sposób ma interpretować wartość obiektu danych. Na przykład jeśli programista chce dodać kontrolkę .NET do zakładki utworzonej za pomocą poprzedniego fragmentu kodu, może to zrobić w jednym wierszu: myBoxTab.ToolBoxItems.Add( "ContosoControi", "C:\C o n to so \C o n tro ls\C ale n d a rC o n tro l.d ll", vsToolBoxItemFormat. vsToolBoxItemFormatDotNETComponent)

C zę ść IV Wzbogacanie środowiska Visual Studio Warto zwrócić uwagę na to , ż e w tym przypadku element jest reprezentowany przez ścież­ kę prowadzącą do p o d ze sp o łu zawierającego daną kontrolkę, a jego format to v s T o o l B o x '“► I t e m F o r m a t D o t N E T C o m p o n e n t . Listing 13.5 zawiera funkcję języka Visual Basic, która dodaje zakładkę do okna T o o lb o x , na­ stępnie umieszcza w niej kontrolkę oraz fragment tekstu, a na zakończenie usuwa zakładkę. L istin g 1 3 .5 .

Dodawanie i usuwanie elementów okna Toolbox

Imports Imports Imports Imports Imports Imports

EnvDTE EnvDTE80 EnvDTE90 M icro so ft. VisualStudio.CommandBars Sy ste m .D iag n o stics System.Windows. Forms

Public Dim Dim Dim Dim Dim

Sub AddAToolBoxTab() toolBox As ToolBox tabs As ToolBoxTabs tab As ToolBoxTab tabltems As ToolBoxItems win As Window

Try 1

P o b ie ra n ie re fe re n c ji J o okna Toolbox.

win = DTE. Windows. Item (Constants. vsWindowKindToolbox) toolBox = w in.O bject 1

P o b ie ra n ie refe re n c ji Jo kolekcji za k la J ek okn a Toolbox.

tabs = to o lB o x.ToolBoxTabs 1

D o d a w a n ie n o w ej zakładki J o okna T oolbox.

tab = tabs.A dd( "Nowa zakładka okna Toolbox") 1

A k tyw o w a n ie d o d a n e j zakładki.

ta b .A c tiv a te !) tabltems = tab.ToolBoxItems With tabltems ‘ 1

D o d a w a n ie fragm entu tekstu d o o k n a T oolbox. K lik n ięcie te g o tekstu spow odu je d o d a n ie

' g o d o aktyw n ego dokumentu...

.Add( "Komentarz do kodu", "To fragment tekstu dodany do okna Toolbox", vsToolBoxItemFormat. vsToolBoxItemFormatText) 1

Teraz k o d d o d a je kontrolkę do okn a Toolbox.

' D o d a ją c kontrolkę, trzeba o kreślić śc ie żk ę ' J o podzespołu. Można dodać w szystk ie k la sy ' podzespołu (tak ja k poniżej) lu b tylko ' w ybraną klasę (składnię tej o p e ra c ji m ożn a

1

zn aleźć

w dokumentacji MSDN).

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji . Add("Kontrolka logowania", "C : \MyComponents\Contoso\LoginControl. d l i " , vsToolBoxItemFormat. vsToolBoxItemFormatDotNETComponent) '

D la c e ló w d em o n stra cyjn ych p r o g r a m usuw a

‘ J o J a n e elem en ty, a n a stę p n ie n o w ą ‘ za k la J k ę ... '

O k n o kom unikatu p r o s i o p o tw ie rJ ze n ie usunięcia elem en tów .

MessageBox. Sh o w ("K likn ij OK, aby usunąć zakładkę i dodane" + " elem enty.", "Usuwanie elementów za k ła d k i", MessageBoxButtons.OK, _ MessageBoxIcon. In fo rm atio n ) '

U su w a n ie zaklaJki.

t a b .D e le te () End With Catch ex As Exception MsgBox("Błąd: " & e x .T o S tr in g ()) End Try End Sub

Wykonywanie poleceń w oknie poleceń Okno poleceń ( C o m m a n d W in d o w ) to narzędzie służące do wywoływania poleceń i aliasów środowiska IDE. Te polecenia pozwalają nakazać środowisku IDE wykonanie określonych operacji. Niektóre z nich odpowiadają bezpośrednio opcjom menu (na przykład File O p e n ), a inne nie mają takich odpowiedników. Obiekt CommandWindow umożliwia programowe przekazywanie instrukcji do okna poleceń i wykonywanie ich. Można także wyświetlić w tym oknie łańcuchy znaków (dla celów infor­ macyjnych) i wyczyścić jego bieżącą zawartość: 1

P obieran ie re fe re n c ji J o okna poleceń.

Dim cmdWindow As CommandWindow = DTE.Windows. Item (Constants. vsWindowKindCommandWindow).Object '

W yśw ietlanie tek stu

w ok n ie poleceń.

cmdWindow.OutputString("W itaj, ś w ie c ie " ) '

U suw anie z a w a r to ś c i okna.

cmdWindow.Clear() Listing 13.6 przedstawia programowe wywoływanie poleceń za pomocą obiektu C o m m a n d W in d o w . Listing 13.6. Wykonywanie poleceń w oknie poleceń Imports Imports Imports Imports

EnvDTE EnvDTE80 EnvDTE90 M icro so ft. V isu a lS tu d io . CommandBars

C zę ść IV Wzbogacanie środowiska Visual Studio Imports System. D ia g n o stics Imports System.Windows. Forms P u b lic Module MacroExamples P u b lic Sub ExecCommandWindow() Dim cmdWindow As CommandWindow = DTE.Windows. Item ( Constants . vsWindowKindCommandWindow) .Object 1

W yśw ietla n ie tekstu

tv o k n ie p o lece ń .

cmdWindow.OutputString( "Polecenie w obiektowym modelu a u to m a ty za c ji...") 1

P rze sy ła n ie ła ń c u c h ó w zn a k ó w p o le c e n ia d o o k n a p o le c e ń i w ykon yw an ie

'

ich...

*v o k re ślo n y m

'

To p o le c e n ie ro z p o c zy n a za p isy w a n ie

'

w szystkich d a n y c h w e jśc io w y c h i w y jśc io w y c h o k n a poleceń.

pliku

cmdWindow.Sendlnput( "T o o ls. LogCommandWindowOutput cmdwindow.log", True) '

O tw ie ra p lik

w e d y to r z e

kodu:

'

I. U ży w a m y a lia su 'o f d la p o le c e n ia F ile. O p e n F ile

'

2. To p o le c e n ie p rz y jm u je p a ra m e try w o g ra n ic zn ik a c h (w tym p rzy p a d k u



p a r a m e tr to n a zw a okn a edytora,

w k tó ry m

n a le ż y o tw o rzyć p lik ).

Dim cmd As S trin g = "of " cmd = cmd & .... . C: \Contoso\ContosoCommonFramework\Integ r a t io n \ In te g r a t io n . c s ..... cmd = cmd & "/e:""CSharp E d it o r ..... cmdWindow.Sendlnput(cmd, True) cmdWindow.Sendlnput(" E d it.F in d M essageTrxId", True) '

W yłączen ie re je stro w a n ia .

cmdWindow.Sendlnput( "To o ls. LogCommandWindowOutput / o f f " , True) End Sub End Module

Okno Output Okno O u tp u t wyświetla komunikaty generowane przez różne elementy środowiska IDE. Najczę­ ściej są to komunikaty generowane przez kompilator w czasie kompilacji projektu. Więcej informacji o możliwościach okna O u tp u t znajduje się w rozdziale 11., „Diagnozowanie kodu”. Okno O u tp u t można kontrolować za pomocą trzech obiektów: • O u t p u t W in d o w to obiekt nadrzędny reprezentujący okno O u tp u t. • O u t p u t W in d o w P a n e s to kolekcja obiektów typu O u t p u t W in d o w P a n e . • O u t p u t W in d o w P a n e reprezentuje jeden z paneli okna O u tp u t.

Przy użyciu trzech powyższych obiektów można dodawać i usuwać panele okna O u tp u t, w y­ świetlać w nich tekst i reagować na zdarzenia związane z tym oknem.

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji Poniższy fragment kodu języka Visual Basic pobiera referencję do okna O u tp u t i wyświetla łańcuch znaków w panelu B u ild : Dim outWindow As OutputWindow = DTE.Windows. Item ( Constants. vsWindowKindOutput) .Object Dim pane As OutputWindowPane = _ outWindow.OutputWindowPanes. Ite m ("B u ild ") p an e.O u tp u tStrin g("te st") Za pomocą obiektu O u t p u t W in d o w P a n e można równolegle dodawać elementy do określonego panelu okna O u tp u t i do okna T ask List. Metoda O u t p u t W in d o w P a n e . O u t p u t T a s k l t e m S t r i n g wyświetla tekst w oknie O u tp u t i jednocześnie dodaje go do okna T a s k L ist: Dim output As S trin g = "Brak metody o b słu gi wyjątku" Dim task As S trin g = "Dodać metodę o b słu gi wyjątku" pane.OutputTaskltem Strin g(o u tp u t, v s T a s k P r io r it y . vsTaskPriorityM edium, vsTasklcon.vsTasklconNone, 0, ta s k , True) Ponieważ zwykle operacje w oknie O u tp u t dotyczą określonego panelu, większość przydatnych metod jest dostępna poprzez obiekt O u t p u t W in d o w P a n e . Informacje o składowych tego obiektu znajdują się w tabeli 13.9. Tabela 13.9. Składowe o b ie k tu

O u tp u tW in d o w P a n e

Właściwość

Opis

C o lle c t io n

Kolekcja O u t p u t W in d o w P a n e s , do której należy dany obiekt O u t p u t W in d o w P a n e .

DTE

Referencja do obiektu głów nego D T E .

G u id

Identyfikator GUID danego panelu okna Output.

N am e

Nazwa danego panelu okna Output.

T e x tD o cu m e n t

Obiekt T e x t D o c u m e n t reprezentujący zawartość panelu okna.

Metoda

Opis

A c t iv a t e

Sprawia, że okno Output staje się aktywne.

C le a r

Usuwa zawartość panelu okna.

F o r c e lt e m s T o T a s k L is t

W yświetla wszystkie niew yśw ietlone elementy w oknie Task List.

O u t p u t s t r in g

W yświetla łańcuch znaków w panelu okna Output.

O u t p u t T a s k lt e m ' ■ ♦ S t r in g

Wyświetla łańcuch znaków w panelu okna Output i jednocześnie dodaje zadanie do okna Task List.

Listing 13.7 pokazuje, jak kontrolować okno O u tp u t. Przedstawiony na nim kod dodaje nowy panel do okna, wyświetla tekst w tym panelu, a następnie usuwa jego zawartość.

C zę ść IV Wzbogacanie środowiska Visual Studio L is tin g

13.7. Wyświetlanie informacji w oknie Output

Imports Imports Imports Imports Imports Imports

EnvDTE EnvDTE80 EnvDTE90 M icro so ft. VisualStudio.CommandBars System .D iagnostics System.Windows. Forms

Public Module MacroExamples Public Sub WriteToOutputWindow() 1

P o b ie ra n ie re fe re n c ji J o okn a Output.

Dim outWindow As OutputWindow = DTE.Windows.Itern(Constants . vsWindowKindOutput) . Object '

T w o rzy n o w y p a n e l

if o k n ie

Output.

Dim pane As OutputWindowPane = outWindow.OutputWindowPanes. Add( "Nowy panel") pane.O u tp u tStrin g ( “Tekst w 'Nowym panelu'") p a n e .C le a r() End Sub End Module

Okna połączone Okna narzędzi można rozmieścić w IDE na wiele sposobów. Okna mogą pływać sw obodnie w ogólnym kontenerze IDE, można zadokować je do krawędzi IDE, połączyć w grupę, przy­ czepić lub odczepić i wykonać na nich inne operacje (wprowadzenie do rozmieszczania okien znajduje się w podrozdziale „Zarządzanie wieloma oknami środowiska IDE” w rozdziale 2., „Środowisko IDE Visual Studio”). Okna połączone to przynajmniej dwa okna narzędzi połączone w grupę. Rysunek 13.4 przed­ stawia często spotykaną przykładową sytuację — okna T o o lb o x i S o lu tio n E x p lo re r połączone w grupę we wspólnej ramce. Każde okno wchodzące w skład tej grupy można wyświetlić za pomocą jego zakładki. W wvniku połączenia okien narzędzi powstaje nowy obiekt nazywany oknem połączonym lub ramką okien. Ten obiekt działa jako kontener dla zawieranych okien narzędzi i jest dostępny jako część kolekcji D T E . W in d o w s . Używając właściwości W in d o w . L in k e d W in d o w s i W in d o w .W in d o w F r a m ę oraz metody W in d o w s 2 . * - « - C r e a t e L in k e d W in d o w F r a n ie , można programowo dołączać oraz odłączać wszelkie dostępne okna narzędzi. Kod języka Visual Basic przedstawiony na listingu 13.8 demonstruje ten proces. W kodzie wykonywane są następujące operacje:

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji Rysunek 13.4.

- n x

Toolbox

Okna połączone

• ContOło.Ul.Windowsforms-Orderf nt...

4 Contoso.Fx.UI Components * C0nt0s0.FxJnte9r.ti0n Components Si

Data

Com ponents t Containers

Si

Menus & Toolbars $ Printing Dialogs * All W indows Forms

SI

SI Common Controls 9

WPf Interoperability

* Visual Bask PowerPacks General

j ę Toolbox

1. Kod pobiera obiekty reprezentujące okna T o o lb o x i S o lu tio n E x p lo re r. 2.

Następnie oba okna są programowo łączone ze sobą, co powoduje utworzenie okna połączonego widocznego na rysunku 13.4.

3. Po połączeniu okien kod pobiera referencję do nowego okna połączonego i używa jego właściwości L in k e d W i n d o w s do rozłączenia połączonych wcześniej okien Listing 13.8. Łączenie i rozłączanie okien narzędzi Imports Imports Imports Imports Imports

EnvDTE EnvDTE80 EnvDTE90 System .D iagnostics System.Windows. Forms

Public Module MacroExamples P ub lic Sub LinkU nLinkO Dim windows As Windows2 = DTE.Windows '

P o b ie ra r e fe r e n c je d o okien S olution E x p lo re r i Toolbox.

Dim so lE x p lo re r As Window2 = windows. Item fConstants.vsW indowKindSolutionExplorer) Dim toolbox As Window2 = windows. Item(Constants.vsWindowKindToolbox) '

U ży c ie k o le k c ji IVindows2 d o u tw o rzen ia o k n a p o łą c z o n e g o (ra m k i okien ).

' k tó r e b ę d z ie p r z e c h o w y w a ć okna T oolbox i S o lu tio n E xplorer.

Dim windowFrame As Window2 windowFrame = windows.CreateLinkedW indowFrame(solExplorer, to o lb o x, vsLinkedWindowType. vsLinkedWindowTypeTabbed) '

tV tym m o m e n c ie zo s ta ło u tw orzon e okn o p o łą c z o n e z a w ie r a ją c e d w ie za k ła d k i

' d la okien „ w ew n ętrzn ych

Solu tion E x p lo re r i T oolbox...

C zę ść IV Wzbogacanie środowiska Visual Studio MessageBox.Show("Wciśnij OK, aby odłączyć okna", "LinkU nLink", MessageBoxButtons.OK, MessageBoxIcon.None) 1

A b y o d łą c z y ć o kn a: — n a le ż y u ż y ć kolekcji L in k ed W in d o w s ram ki okien,

— i u su n ą ć

o b ie k ty z te j kolekcji

windowFrame. LinkedWindows. Remove(toolbox) windowF ramę. LinkedWindows. Rem ove!solExplorer) End Sub End Module

Paski poleceń Pasek poleceń to pasek menu lub pasek narzędzi. W modelu obiektowym takie paski są repre­ zentowane przez obiekty typu C o m m a n d B a r . Ponieważ paski menu i paski narzędzi znajdują się w oknach, dostęp do poszczególnych obiektów C o m m a n d B a r można uzyskać za pomocą obiektu W in d o w , poprzez jego właściwość W in d o w . C o m m a n d B a r s . Z kolei każdy obiekt C o m m a n d B a r zawiera kontrolki takie jaki przyciski, listy rozwijane i inne. Rysunek 13.5 przedstawia okno S o lu tio n E x p lo r e r z wyróżnionym paskiem narzędzi.

Uwaga Kolekcja Windows przechowuje tylko egzemplarze otwartych okien, natomiast w kolekcji CommandBars znajdują się egzemplarze wszyst­ kich zarejestrowanych pasków narzędzi — niezależnie od tego, czy dany pasek jest obecnie wyświetlany w oknie.

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji Kod w języku Visual Basic przedstawiony na listingu 13.9 sprawdza obiekt C o m m a n d B a r po­ wiązany z oknem S o lu tio n E x p lo r e r i wyświetla znalezione obiekty typu C o m m a n d B a r C o n t r o l Efekt działania kodu przedstawiono na rysunku 13.6. Listing 13.9. Sprawdzanie obiektu CommandBar Imports Imports Imports Imports Imports Imports

EnvDTE EnvDTE80 EnvDTE90 M icro so ft.VisualStudio.CommandBars System .D iagnostics System.Windows.Forms

P ub lic Module MacroExamples P u b lic Sub QueryCommandBar() Dim windows As Windows2 = DTE.Windows '

P o b ie ra n ie re fe re n c ji J o okna Solution E xplorer.

Dim so lE x p lo re r As Window2 = windows. Item (Constants.vsW indowKindSolutionExplorer) 1

P o b ie ra n ie o b ie k tu rep rezen tu jącego p a s e k n a rz ę d zi okna S olu tion E x p lo rer.

Dim cmdBar As CommandBar = CType(solExplorer.Com m andBars(l), CommandBar) 1

P o c zą te k tw o r z e n ia w yjścio w eg o ła ń cu ch a zn aków .

Dim output As S trin g = "Pasek n arzęd zi zawiera: " + vbCrLf 1

P o b iera n ie re fe re n c ji d o kontrolek zn a jd u ją c y c h s ię

' na p a sk u n a rzę d zi.

Dim co n tro ls As CommandBarControls = cmdBar.C o n tro ls 1

L iczb a k on trolek.

Dim i As In te g e r = 1 '

P rze c h o d ze n ie p o kontrolkach p a tk a n a rzęd zi.

For Each co n tro l As CommandBarControl In co n tro ls I f con trol.En ab led Then output = output + i.T o S t r in g ( ) + " " + c o n tro l.T y p e .T o S trin g () + " : " + con trol.Captio n + vbCrLf i = i + 1 End I f Next MessageBox. Show(output, "Pasek n arzęd zi okna S o lu tio n Exp lo re r", MessageBoxButtons.OK) End Sub End Module

C zę ść IV Wzbogacanie środowiska Visual Studio Rysunek 13.6. Kontrolki znalezione na pasku poleceń P a s e k n a rz ę d z i zaw iera: 1 m s o C o n t r o lB u t t o n P & ro p e rtie s 2 m s o C o n t r o lB u t t o n S h & o w All Files 3 m s o C o n t r o lB u t t o n R e& fresh 4 m s o C o n tr o lB u tto n View & C o d e 5 m s o C o n tr o lB u tto n View & O e sig n e r 6 m s o C o n tr o lB u tto n & V iew C lass D ia g ra m

OK

Na listingu 13.9 warto zwrócić uwagę na jawne rzutowanie obiektu zwróconego przez właściwość Window. CommandBa rs. Co ciekawe, nie jest to silnie typowana właściwość i zwraca ona obiekt typu O b je c t.a nie CommandBa rs.

Wskazówka M ożna użyć właściwości CommandBar .Type do sprawdzenia, czy dany pasek poleceń to pasek narzędzi, czy pasek menu. Wartość MsoBarType.msoBarTypeNormal informuje, że jest to pasek na­ rzędzi, a wartość MsoBarType.msoBarTypeMenu wskazuje na pasek m enu.

Dokumentacja właściwości i metod obiektu CommandBar znajduje się w tabeli 13.10. Tabela 13.10. Składowe obiektu CotnmandBar Właściwość

| Opis

AdaptiveMenu

W przypadku pasków menu ta flaga logiczna informuje o tym, czy dany pasek narzędzi udostępnia menu inteligentne. W takim m enu, zw anym też menu personalizowanym, opcje na liście rozw ijanej zm ieniają się w zależności od oczekiwanego lub faktycznego stosowania ich przez użytkow nika. Ma to na celu wyświetlanie jedynie tych poleceń, które są przydatne, a ukrywanie niepotrzebnych opcji.

A p p lic a tio n

Obiekt reprezentujący aplikację zaw ierającą dany pasek poleceń.

B u ilt ln

Flaga logiczna służąca do rozróżniania wbudowanych pasków poleceń od niestandardowych.

Context

Ła ń cu ch znaków inform ujący o tym , gd zie zapisany je st dany obiekt C o m m a n d B a r (form at i oczekiwana zawartość łańcucha znaków zależy od aplikacji zawierającej pasek).

C o n tro ls

Kolekcja Com m andBa r C o n t r o l s zawierająca obiekty C o m m a n d B a r C o n t r o i , które reprezentują kontrolki widoczne na pasku narzędzi.

C re a to r

Liczba całkowita reprezentująca aplikację zawierającą dany pasek poleceń.

Enabled

Flaga logiczna informująca o tym, czy dany pasek poleceń jest w łączony.

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji Tabela 13.10.

S k ła d o w e o b ie k tu C o m m a n d B a r

— c ią g

d a ls z y

Właściwość

o p is

H e ig h t

W ysokość paska poleceń w pikselach.

In d e x

Indeks danego paska poleceń w ich kolekcji.

L e ft

Odległość w pikselach między lewą krawędzią paska poleceń a lewą krawędzią jego kontenera.

N am e

Nazw a danego paska poleceń.

N am eLo cal

Lokalna nazw a danego paska poleceń.

P a re n t

Obiekt nadrzędny danego paska poleceń.

P o s it io n

W artość w yliczenia M so B a r P o s i t i o n służąca do pobierania lub ustawiania pozycji paska poleceń (na przykład M so B a r P o s i t i o n . m s o B a rT o p ).

P r o t e c t io n

W artość w yliczenia M so B a r P r o t e c t i o n określająca zabezpieczenia przed zmianami (na przykład M so B a r P r o t e c t i o n . m s o B a rN oM ove).

R o w ln d e x

Liczba całkowita reprezentująca wiersz, w którym zadokowany jest dany pasek poleceń.

Top

Odległość w pikselach między górną krawędzią paska poleceń a górną krawędzią jego kontenera.

Type

Rodzaj paska poleceń (w artość w yliczenia M so B a r T y p e , na przykład M so B a r T y p e . m so B a r T y p e N o r m a l) .

V is ib le

Flaga logiczna określająca, czy dany pasek narzędzi jest widoczny.

W id t h

Szerokość paska narzędzi w pikselach.

Metoda

Opis

D e le t e

Usuwa pasek poleceń z nadrzędnej kolekcji.

F in d C o n t r o l

Pozwala pobrać referencję do przechowywanej na pasku kontrolki na podstawie różnych parametrów, takich jak jej rodzaj, identyfikator, symbol i widoczność.

R eset

Przywraca domyślną konfigurację określonego wbudowanego paska poleceń.

Show Popup

W yświetla okno wyskakujące reprezentujące pasek poleceń.

Uwaga Wcześniejsze wersje Visual Studio przy definiowaniu obiektu CommandBar korzystały z podzespołu pakietu Microsoft Office (Microsoft.Office.Core). Visual Studio 2005 i nowsze wersje udostępniają własną implementację obiektu CommandBar, k tó­ ra znajduje się w przestrzeni nazw M ic r o s o ft.VisualStudio. '-►CommandBars, choć w przypadku niektórych typów' zachowano nazewnictwo z podzespołu pakietu MS Office, na przykład w róż­ nych wyliczeniach MsoXXX.

i

C zę ść IV Wzbogacanie środowiska Visual Studio

Dokumenty Obiekty typu D o c u m e n t reprezentują otwarte dokumenty środowiska IDE. Warto porównać te obiekty z abstrakcją udostępnianą przez obiekt W in d o w . Obiekty typu W in d o w reprezentują fizyczne aspekty interfejsu użytkownika okna dokumentu, natomiast obiekt D o c u m e n t od p o­ wiada fizycznemu dokumentowi widocznemu w takim oknie. Dokumentem może być projekt w oknie projektowym, na przykład w oknie projektowym for­ mularzy Windows, lub dokument tekstowy, taki jak plik „readme” czy plik z kodem języka C# otw'arty w edytorze. Podobnie jak można pobrać listę wszystkich otwartych okien przy użyciu kolekcji D T E .W in d o w s , tak można wykorzystać kolekcję D T E . D o c u m e n t s do pobrania listy wszystkich otwartych do­ kumentów: Dim documents As Documents = DTE.Documents Indeksy kolekcji D o c u m e n t s to wartości właściwości N am e dokumentów, którymi są nazwy ich plików bez ścieżki dostępu. Dzięki temu można łatwo uzyskać dostęp do egzemplarza obiektu D o cu m e n t: Dim documents As Documents = DTE.Documents Dim readme As Document = documents.ItemCReadMe.txt") Używając obiektu D o c u m e n t , można: • Zamknąć dokument (i opcjonalnie zapisać zmiany). • Pobrać nazwę pliku i ścieżkę do dokumentu. • Określić, czy dokument został zmodyfikowany od czasu ostatniego zapisania. • Określić, jakie elementy (jeśli w ogóle) są zaznaczone w dokumencie. • Pobrać egzemplarz obiektu P r o je c tlte m reprezentujący element projektu powiązany z dokumentem. • Odczytać i zmodyfikować zawartość dokumentu tekstowego. Tabela 13.11 zawiera opis składowych obiektu Document. Tabela 13.11. S k ła d o w e

o b ie k tu D o c u m e n t

Właściwość

Opis

ActiveWindow

Bieżące, aktywne okno pow iązane z dokumentem (w artość n u l i lub N o t h i n g inform uje o braku aktywnego okna).

C o lle c tio n

Kolekcja obiektów D o c u m e n t, do której należy dany obiekt.

DTE

Obiekt głów ny D TE.

Extender

Zw raca obiekt rozszerzający obiektu D o c u m e n t.

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji Tabela 13.11. S k ła d o w e Właściwość

o b ie k tu D o c u m e n t

— c ią g d a ls z y

.... II......

.~..

E x t e n d e rC A T ID

Zwraca identyfikator kategorii obiektu rozszerzającego.

E x te n d e rN a m e s

Lista obiektów rozszerzających dostępnych dla bieżącego obiektu D o c u m e n t.

F u l lN a m e

Pełna ścieżka i nazwa pliku dokum entu.

K in d

Identyfikator GUID reprezentujący rodzaj dokumentu.

Name

Nazwa (nazwa pliku bez ścieżki) danego dokumentu.

Path

Ścieżka do pliku dokumentu bez jego nazwy.

P ro je c tlte m

Obiekt P r o j e c t l t e m powiązany z danym dokumentem.

Saved

Inform uje, czy rozwiązanie zostało zapisane od czasu ostatniej m odyfikacji.

S e le c tio n

Obiekt reprezentujący zaznaczony fragm ent dokumentu (jeśli w dokum encie jest taki fragm ent).

Windows

Kolekcja W in d o w s zawierająca okna wyświetlające dany dokum ent.

Metoda

Opis

A c t iv a t e

Aktyw uje dokument.

C lo se

Zamyka dokument. Za pomocą wartości wyliczenia v s S a v e C h a n g e s można określić, czy dokument widoczny w oknie należy zapisać, czy nie, a także czy IDE powinno poprosić u żytkow nika o podjęcie tej decyzji.

NewWindow

Otwiera dokument w nowym oknie i zwraca nowy obiekt okna, W in d o w .

O b ject

Zw raca obiekt pośredniczący, który reprezentuje okno, i u m o żliw ia korzystanie z niego za pom ocą nazwy.

Redo

Ponaw ia ostatnią operację użytkow nika dotyczącą dokumentu.

Save

Zapisuje dokument.

Undo

Anuluje ostatnią operację użytkownika dotyczącą dokumentu.

Dokumenty tekstowe Jak już wspomnieliśmy, dokumenty mogą mieć zawartość tekstową i nietekstową. Dokumentom z zawartością tekstową odpowiada odrębny typ, TextDocum ent. Obiekty tego typu dają dostęp do funkcji przeznaczonych specyficznie do zarządzania zawartością tekstową. Jeśli programista ma poprawny wyjściowy obiekt Document i jeśli obiekt ten reprezentuje dokument tekstowy, wtedy można utworzyć egzemplarz typu TextD ocum ent na podstawie wła­ ściwości Document. Obj e c t w następujący sposób: Dim doc As TextDocument Dim myDocument As Document doc = myDocument.Object

C zę ść IV Wzbogacanie środowiska Visual Studio Tabela 13.12 zawiera składowe obiektów TextDocum ent. Iabcla 13.12. S k ła d o w e Właściwość

o b ie k tu T e x tD o c u m e n t

i Opis

DTE

Obiekt główny D T E .

EndPoint

Obiekt Text P o in t reprezentujący koniec dokumentu.

Parent

Pobiera obiekt nadrzędny dokum entu tekstowego.

S e le c tio n

Zwraca obiekt T e x t S e l e c t i o n reprezentujący aktualnie zaznaczony tekst dokum entu.

S ta rtP o in t

Obiekt T e xtP o in t reprezentujący początek dokum entu.

Metoda

Opis

ClearBookm arks

Usuwa wszelkie anonim ow e zakładki znajdujące się w elemencie.

C re a te E d itP o in t

Zw raca punkt edycji dla określonej lokalizacji (jeśli m iejsce nie zostanie określone, dom yślnym punktem jest początek dokumentu).

MarkText

Tworzy zakładkę dla wiersza dokumentu odpowiadającego danemu wzorcowi.

R ep laceP attern

Zam ienia tekst dokumentu odpowiadający danemu wzorcowi.

j

Wskazówka Dokument tekstowy może być reprezentowany zarówno przez obiekt Document, jak i obiekt TextDocument. Dokumenty nietekstowe, na przykład formularze Windows czy okna projektowe form u­ larzy Windows, mają reprezentację w postaci obiektu Document, ale już nie jako obiekt TextDocument. Niestety, nie ma prostego sposobu na odróżnienie dokumentów tekstowych od nietekstowych w czasie wykonywania programu. Jedno z rozwiązań polega na próbie rzutowania lub przypisania wartości do obiektu Text '-►Document i przechwytywaniu wyjątków, które mogą wystąpić w czasie tej operacji.

Dwie metody obiektów TextDocument są przydatne do manipulowania zakładkami w doku­ mencie. Metoda C le a rB o o k m a rk s usuwa z dokumentu wszystkie anonim owe zakładki, a MarkText wyszukuje łańcuchy znaków pasujące do wzorca i umieszcza zakładki w wierszach dokumentu zawierających te łańcuchy. Na listingu 13.10 przedstawione jest proste makro, które tworzy zakładki dla pętli Fo r w dokumentach języka Visual Basic. Listing 13.10. Zakładki dla pętli For w dokumentach języka Visual Basic

Imports Imports Imports Imports

EnvDTE EnvDTE80 EnvDTE90 M ic ro so ft.V isu a lS tu d io . CommandBars

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji Imports System. D iagn o stics Imports System.Windows. Forms P u b lic Module MacroExamples ' '

T w orzy z a k ła d k i d la w szystkich sy m b o li T o r ' w bieżą cym d o k u m en cie.

Public Sub BookmarkFor() Dim doc As Document Dim txtDoc As TextDocument '

R eferen cja d o b ie ż ą c e g o dokumentu.

doc = DTE.ActiveDocument 1 1

T w orzen ie o b ie k tu TextD ocum ent na p o d s ta w ie obiektu D ocu m en t.

txtDoc = doc.Object '

W yw ołan ie m e to d y M arkText z łań cu ch em zn a k ó w 'For'ja k o p a ra m etrem .

Dim found As Boolean = txtDoc.M arkText( "For", vsFin dO ptio ns. vsFindO ptionsFrom Start) 1 1

M etoda M arkT ext zw ra c a fla g ę lo g ic zn ą in fo rm u ją c ą o tym, c zy s zu k a n y w zo rzec z o s ta ł z n a le zio n y w danym d o k u m en cie tekstow ym , c z y nie.

I f found Then MessageBox.Show("Zakładki zo sta ły dodane dla w szystkich p ę t li 'F o r'." ) Else MessageBox. Show("Nie znaleziono p ę t li 'F o r '." ) End I f End Sub End Module Następna kluczowa funkcja udostępniana przez obiekty T e x t D o c u m e n t to możliwość odczy­ tywania i modyfikowania tekstu dokumentu.

Modyfikowanie dokumentów tekstowych Dla środowiska Visual Studio tekst w dokumencie tekstowym ma dwie odrębne reprezentacje: wirtualną i fizyczną. Fizyczna reprezentacja to czysty plik kodu znajdujący się na dysku. Re­ prezentacja wirtualna to tekst wyświetlany przez Visual Studio na ekranie. Jest to wygląd tekstu pliku z kodem po interpretacji uwzględniającej różne właściwości edytora, takie jak generowanie schematów' kodu (obszarów'), wirtualne odstępy lub zawijanie słów. Rysunek 13.7 przedstawia relacje między tymi reprezentacjami. W czasie wyświetlania d o ­ kumentu tekstowego Visual Studio wczytuje plik źródłowy do bufora tekstu, a następnie edytor wyświetla jeden z widoków danego pliku (na podstawie opcji konfiguracji tego edytora). Tekstem dokumentu można manipulować lub wczytywać go albo poprzez tekst w buforze, albo za pomocą widoku tekstu wyświetlanego w edytorze. Do edycji tekstu służą cztery różne obiekty modelu automatyzacji. Dwa operują na buforze tekstu, a dwa — na widoku edytora.

C zę ść IV Wzbogacanie środowiska Visual Studio Rysunek 13.7. Wyświetlanie dokumentów tekstowych w IDE

Bufor teksto w y %■

A --------- N Plik teksto w y

Obiekty bufora tekstu: • Obiekty T e x t P o i n t służą do ustalania położenia określonych punktów w dokumen­ cie tekstowym. Sprawdzając właściwości obiektu T e x t P o i n t , można określić numer wiersza danego punktu tekstu, liczbę znaków od początku wiersza, liczbę znaków od początku dokumentu i kolumnę w edytorze tekstu. Za pomocą tego obiektu można także pobrać referencję do obiektu C o d e M o d e l, który reprezentuje kod znajdujący się w danym punkcie tekstu. • Obiekt E d i t P o i n t dziedziczy po obiekcie T e x t P o i n t i jest podstawowym obiektem służącym do manipulowania tekstem w buforze. Za pomocą punktów edycji można dodawać, usuwać lub przenosić tekst, a punkty te można przemieszczać w obrębie bufora tekstu. Obiekty widoku edytora: • Obiekt V i r t u a l P o i n t to odpowiednik obiektu T e x t P o i n t , można go jednak używać do obsługi punktów tekstu w wirtualnym obszarze widoku tekstu (obszar wirtualny to region poza ostatnim znakiem wiersza dokumentu). Egzemplarz typu V i r t u a l P o i n t można pobrać za pomocą obiektu T e x t S e l e c t i o n . • Obiekt T e x t S e l e c t i o n operuje na tekście widoku edytora, a nie na buforze tekstu. Obiekty tego typu działają podobnie jak obiekty E d i t P o i n t . Używając obiektu T e x t ' - ► S e l e c t i o n , można dynamicznie modyfikować tekst widoczny w edytorze. Dlatego metody i właściwości tego obiektu są programowym odpowiednikiem samodzielnego wprowadzania zmian w tekście. Można przejść o stronę naprzód lub do tyłu, wyciąć, skopiować lub wkleić tekst, zaznaczyć fragment tekstu, a nawet wygenerować obszar kodu i rozwinąć go lub zwinąć.

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji Ponieważ obiekt V i r t u a l P o i n t działa niemal identycznie jak T e x t P o i n t , a obiekt T e x t • - ► S e l e c t i o n prawie tak samo jak E d i t P o i n t , nie będziemy szczegółowo omawiać wszystkich czterech obiektów. Zamiast tego skoncentrujemy się na operacjach na buforze tekstowym wyko­ nywanych za pomocą obiektów E d i t P o i n t i T e x t P o i n t . Czytelnik powinien bez problemów móc zastosować przedstawione niżej informacje do obsługi widoku tekstu w edytorze. Ponieważ to obiekty E d i t P o i n t udostępniają najbardziej rozbudowane funkcje i odgrywają kluczową rolę w modyfikowaniu tekstu, w tabeli 13.13 przedstawiamy listę składowych tego typu. Tabela 13.13.

S k ła d o w e ty p u E d itP o in t2

Właściwość

Opis

A b s o lu t e C h a rO f f s e t

Liczba znaków od początku dokumentu do bieżącej lokalizacji punktu edycji.

A t E n d O f D o cum ent

Flaga logiczna informująca o tym , czy punkt znajduje się na końcu dokumentu.

A t En d O f L in e

Flaga logiczna informująca o tym , czy punkt znajduje się na końcu wiersza.

A t S t a r t O f D o cum ent

Flaga logiczna informująca o tym , czy punkt znajduje się na początku dokumentu.

A t S t a r t O fL in e

Flaga logiczna informująca o tym , czy punkt znajduje się na początku wiersza.

C o d e E le m e n t

Zw raca element kodu odpow iadający bieżącej lokalizacji punktu edycji.

D is p la y C o lu m n

Num er kolumny punktu edycji.

DTE

Zw raca główny obiekt m odelu autom atyzacji D T E .

L in e

Num er wiersza, w którym znajduje się dany punkt.

L in e C h a r O f f s e t

Pozycja punktu edycji w wierszu.

L in e L e n g t h

Długość wiersza, w którym znajduje się dany punkt edycji.

Pa re n t

Zw raca obiekt nadrzędny obiektu E d i t P o i n t 2 .

M e to d a

O pis

C h an geCase

Zm ienia wielkość znaków we fragm encie tekstu.

C h a rL e ft

Przenosi punkt edycji w lewo o określoną liczbę znaków .

C h a r R ig h t

Przenosi punkt edycji w prawo o określoną liczbę znaków .

C le a r B o o k m a r k

Usuwa wszystkie nienazwane zakładki z bieżącego w iersza punktu.

Copy

Kopiuje wybrany tekst do schow ka.

C r e a t e E d it P o in t

Tworzy nowy obiekt E d i t P o i n t w t y m samym m iejscu, w którym znajduje się bieżący obiekt tego typu.

Cut

Usuwa wybrany tekst i um ieszcza go w schowku.

D e le t e

Usuwa wybrany tekst z dokum entu.

D e le t e W h it e s p a c e

Usuwa wszystkie odstępy w okół punktu edycji.

C zę ść IV Wzbogacanie środowiska Visual Studio Tabela 13.13. S k ła d o w e

ty p u E d itP o in t2

Właściwość ..... ............ ~ i r ~Opis

— c ią g

d a ls z y

_

.............. ..........;.......................

EndOf Document

Przenosi p unkt edycji na koniec dokumentu.

EndOfLine

Przenosi p unkt edycji na koniec wiersza.

EqualTo

W artość lo g iczn a inform ująca o tym, czy w artość A b s o l u t e C h a r O f f s e t danego punktu edycji odpow iada pozycji innego takiego punktu.

Fin d P atte rn

W yszukuje w dokum encie wszystkie łańcuchy znaków pasujące do wzorca.

Get Lin e s

Łańcuch znaków reprezentujący tekst znajdujący się między dwoma wierszami dokumentu.

GetText

Łańcuch znaków reprezentujący tekst znajdujący się między danym punktem edycji a innym m iejscem dokum entu.

GreaterThan

W artość lo g iczn a inform ująca o tym, czy w artość A b s o l u t e C h a r O f f s e t danego punktu edycji jest większa od pozycji innego punktu.

Indent

Wcina w ybrany wiersz o określoną liczbę poziomów.

In s e rt

W staw ia do dokum entu łańcuch znaków , rozpoczynając od bieżącej lokalizacji punktu edycji.

In s e rtF ro m F ile

W staw ia całą zaw artość pliku tekstow ego do dokum entu, rozpoczynając od bieżącej lokalizacji punktu edycji.

LessThan

W artość lo giczn a inform ująca o tym , czy w artość A b s o l u t e C h a r O f f s e t danego punktu edycji jest mniejsza od pozycji innego punktu.

LineDown

Przenosi punkt edycji o określoną liczbę w ierszy w dół.

Linelip

Przenosi punkt edycji o określoną liczbę w ierszy w górę.

MoveToAbsoluteOffset

Przenosi punkt edycji do znaku o określonej pozycji.

MoveToLineAndOffs e t

Przenosi punkt edycji do znaku o określonej pozycji w danym wierszu.

MoveToPoint

Przenosi punkt edycji do lokalizacji określonej przez inny obiekt E d i t P o i n t lub obiekt T e x t P o in t .

NextBookmark

Przenosi punkt edycji do następnej dostępnej zakładki dokumentu.

O u tlin e S e c tio n

Tworzy obszar kodu między bieżącą lokalizacją punktu a innym miejscem dokum entu.

PadToColumn

Dodaje odstępy w bieżącym wierszu, aby dopełnić tekst do kolumny o określonym numerze.

Paste

Wkleja zawartość schowka w bieżącej lokalizacji punktu edycji.

PreviousBookm ark

Przenosi punkt edycji do poprzedniej zakładki.

Readonly

Zwraca flagę logiczną informującą o tym, czy wybrany tekst dokumentu jest przeznaczony tylko do odczytu.

R e p la ce P a tte rn

Zam ienia tekst pasujący do podanego wzorca.

R e p laceText

Zam ienia wybrany fragment tekstu na podany łańcuch znaków.

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji Tabela 13.13. S k ła d o w e

ty p u E d itP o in t2

Właściwość

— cią g

d a ls zy

1 °p 's

S e tB o o k m a rk

Tworzy anonimową zakładkę w bieżącym wierszu punktu edycji.

S t a r t O f D o cum ent

Przenosi punkt edycji na początek dokumentu.

S t a r t O fL in e

Przenosi punkt edycji na początek wiersza, w którym dany punkt się znajduje.

T ry T o S h o w

Próbuje wyświetlić w oknie edytora tekstu kod z bieżącej lokalizacji danego punktu.

U n in d e n t

Usuwa określoną liczbę poziom ów wcięcia z wybranych w ierszy dokumentu.

W o rd L e ft

Przenosi punkt edycji w lewo o określoną liczbę słów.

W o r d R ig h t

Przenosi punkt edycji w prawo o określoną liczbę słów.

Przyjrzyjmy się teraz różnym rodzajom manipulowania tekstem. Dodawanie tekstu Obiekty typu E d i t P o i n t to kluczowe elementy służące do dodawania tekstu. Można je two­ rzyć albo za pomocą obiektu T e x t D o c u m e n t , albo używając obiektu T e x t P o i n t . Za pomocą egzemplarza typu T e x t P o i n t można utworzyć egzemplarz typu E d i t P o i n t w tym samym miejscu, wywołując funkcję T e x t P o i n t . C r e a t e l n s t a n c e . W przypadku typu T e x t ^ ■ D o c u m e n t można wywołać metodę C r e a t e E d i t P o i n t i przekazać do niej poprawny obiekt T e x t P o in t . Ponieważ obiekty T extP oin t służą do lokalizowania określonych miejsc w dokumencie, obiekt tego typu można wykorzystać jako parametr wejściowy metody C r e a te E d itP o in t. Mówiąc ściśle, obiekt T extP oin t stanowi informację dla metody dotyczącą miejsca, w którym należy utwo­ rzyć punkt edycji. Jeśli programista nie udostępni obiektu T ex tP o in t, metoda utworzy punkt edycji na początku dokumentu. Poniższy fragment kodu tworzy punkt edycji na końcu dokumentu: Dim Dim Dim Dim 1

doc As Document = DTE.ActiveDocument txtDoc As TextDocument = doc.Object tp As TextPoint = txtDoc.EndPoint ep As Ed itPoin t2 = txtD o c.C re ate E d itP o in t(tp )

P on iższa instrukcja d z ia ła ta k sam o.

ep = tp .C rea te Ed itP o in t Po utworzeniu punktu edycji można użyć go do dodania tekstu do dokumentu (należy pamiętać, że jeśli programista używa obiektu E d itP o in t, edycja dotyczy tekstu w buforze). Aby wstawić łańcuch znaków do dokumentu, należy wywołać metodę I n s e r t: 1

W stawianie w iersza k o m e n ta rza ję z y k a C ił.

ep. In s e rt( "// ja k iś komentarz")

!

C zę ść IV Wzbogacanie środowiska Visual Studio Używając metody E d i t P o i n t . I n s e r t F r o m F i l e , można nawet pobrać zawartość pliku i dodać ją do dokumentu: '

W staw ia kom en tarze z p lik u z k o m e n ta rza m i.

e p .In se rtF ro m F ile ("C :\C o n to so \std comments.txt")

Modyfikowanie tekstu Obiekt E d i t P o i n t obsługuje usuwanie, zamienianie, wycinanie, kopiowanie i wklejanie tekstu w dokumencie. Niektóre z tych operacji wymagają użycia więcej niż jednego punktu. Na przykład jeśli pro­ gramista chce wyciąć z dokumentu słowo lub cały wiersz kodu, musi określić punkt początkowy i punkt końcowy, definiując w ten sposób pobierany fragment (zobacz rysunek 13.8). Rysunek 13.8. Zaznaczanie fragmentu tekstu dokumentu za pomocą punktów

co n se cte tu e r ad ip iscin g elit. S e d so d a le s dui hendrerit urna.

Poniższy fragment kodu używa dw óch punktów — jednego znajdującego się na początku, a drugiego na końcu tekstu — do usunięcia całej zawartości dokumentu: Dim doc As Document = DTE.ActiveDocument Dim txtDoc As TextDocument = doc.Object Dim tp S ta rt As TextPoint = txtD o c.S ta rtP o in t Dim tpEnd As TextPoint = txtD o c . EndPoint Dim epStart As Ed itP o in t2 = txtD o c.C re a te E d itP o in t(tp S ta rt) Dim epEnd As Ed itP oin t2 = txtD o c.C re a te E d itP o in t( tpEnd) epStart.Delete(epEnd) Oprócz drugiego obiektu E d itP o in t metody operujące na fragmentach tekstu mogą przyj­ mować także liczby całkowite reprezentujące liczbę znaków. Także w ten sposób można określić fragment tekstu. Na przykład poniższa instrukcja powoduje wycięcie z dokumentu 10 znaków: e p S ta r t.Cut(10) Zmienianie pozycji obiektu EditPoint Po dodaniu obiektu E d i t P o i n t można przenieść go w dowolne miejsce dokumentu, używając do tego różnych metod. Metody C h a r L e f t i C h a r R i g h t przenoszą punkt o określoną liczbę znaków w lewo lub prawo, a metody W o r d L e f t i W o r d R i g h t wykonują te same operacje na słowach: '

P rze n o si pun kt e d y c ji o 4 s ło w a w p ra w o .

epStart.W ordRight(4)

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji M etody LineUp i LineDown przenoszą punkt w górę lub w dół o określoną liczbę wierszy. Można także przenosić obiekty EditPoint do danego wiersza dokumentu, używając metody MoveToLineAndOffset. Ta metoda pozwala także umieścić punkt przy dowolnym znaku wiersza: '

P rze n o si pu n ki e d y c ji d o w ie r s z a 100, a następn ie

'

o p ię ć zn a k ó w

w p ra w o .

epStart.M oveToLineAndOffset(100, 5) Kod makra przedstawiony na listingu 13.11 łączy różne omówione wcześniej operacje związa­ ne z modyfikowaniem dokumentów tekstowych. To makro i jego funkcje pomocnicze ilustrują zastosowanie obiektów E d itP o in t do zapisywania tekstu w dokumencie. W tym przypadku makro automatycznie wstawia szablonowy' komentarz przed procedurą. Aby to zrobić, makro wykonuje następujące operacje: 1. Pobiera referencję do bieżącego dokumentu środowiska IDE. 2. Pobiera lokalizację kursora dokumentu za pomocą właściwości TextDocument. '-►Selection.ActivePoint. 3. Tworzy obiekt E d itP o in t przy użyciu obiektu V ir tu a lP o in t zwróconego przez właściwość A c tiv e P o in t. 4. Tworzy drugi obiekt E d itP o in t. Dwa punkty tego typu służą do pobrania całej za­ wartości wiersza z definicją procedury. 5. Przetwarza definicję procedury w celu pobrania elementów takich jak jej nazwa, zwracana wartość i lista parametrów. 6. Tworzy łańcuch znaków przy użyciu informacji dotyczących procedury i wstawia go do dokumentu tekstowego za pomocą obiektu EditPoint. Listing 13.11. Wstawianie komentarzy do okna z tekstem Imports Imports Imports Imports Imports Imports Imports Imports Imports

EnvDTE EnvDTE80 EnvDTE90 M icrosoft. VisualStudio.CommandBars System System .Collections System .Diagnostics System.Text System.Windows.Forms

P u b lic Module MacroExamples ‘ ‘

P on iższa p ro c e d u ra d em o n stru je za sto so w a n ie ró żn ych s p o s o b ó w m o d y fik o w a n ia tekstu z a p o m o cą o b ie k tó w typu E ditPoint i TextP o in t J e ś li p ro g r a m is ta u m ie ś c i k u rso r

w procedu rze 1 1

lu b funkcji, p rze d sta w io n a p ro c e d u r a u tw o rz y d o m yśln y o b s z a r

szablon ow ego k o m en ta rza , w sta w i g o b ezp o śred n io n a d d a n ą p ro c e d u rą tu b fu n k c ją i u tw orzy z a w ie r a ją c y g o o b sz a r kodu.

I

A b y za sto so w a ć to m akro, n ależy:



I) um ieścić k u rso r w d ow oln ym m iejscu w ie rs za z p ro c e d u r ą lub funkcją.

C zę ść IV Wzbogacanie środowiska Visual Studio '

2 ) uruchom ić m akro.

'

J e ś li m akro n ie w y k ry je p o c z ą tk u fu n k c ji lu b p ro ced u ry,

'

n ie w ykona s i ę (po p r o s tu n ie w sta w i k o m en ta rza ) i

'

n ie w yśw ietli ża d n y c h in fo rm a c ji o n iepow odzen iu .

I

P u b lic Sub InsertTem plateFlow erbox() 1

P o b iera n ie re fe re n c ji d o a k ty w n e g o dokum entu.

Dim doc As Document = DTE.ActiveDocument Dim txtDoc As TextDocument = doc.Object Dim isFunc As Boolean T ry Dim ep As E d itP o in t2 = tx tD o c .S e le c tio n .A c tiv e P o in t.C re a te E d itP o in tf) ep .StartO fL in e ( ) Dim ep2 As E d itP o in t2 = ep .C re ate E d itP o in tO ep 2 .En d 0fLin e() Dim lin e T e xt As S trin g = ep .G e tText(ep 2 ).Trim () I f In S t r (lin e T e x t , " Function ") > 0 Then isFunc = True E ls e lf In S t r ( lin e T e x t , " Sub ") > 0 Then isFunc = F a lse Else E x it Sub End I f '

P obieran ie in fo rm a cji, któ re m ożna u zyskać z d e fin ic ji

' procedu ry: ty p u zw r a c a n e j w a rto ści (jeśli j e s t to fu n k c ja ), ' nazw p a r a m e tr ó w i n a zw y sa m ej p ro ced u ry.

Dim returnType As S trin g = "" I f isFunc Then returnType = ParseRetValueType(lineText) End I f Dim parameters As S t r in g ! ) = ParseParam eters(lineText) Dim name As S t rin g = ParseRoutineName(lineText) Dim commentBlock As S trin g = BuildCommentBlock(isFunc, name, returnType, parameters) 1

P rzen osi p u n k t e d y c j i w g ó r ę o je d e n w iersz (do p o z y c ji

' b ezpośredn io p r z e d p ro ced u rą ).

ep.LineU p(l) 1

Zapew nia m ie js c e n a w sta w ien ie n ow ego p u ste g o w iersza .

ep.InsertN ew Line!) 1

W stawia b lok ko m en ta rza .

e p .In se rt(commentBlock.ToStr in g ! )) Catch ex As Exception End Try End Sub

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji P riv a te Function BuildCommentBlock(ByVal isFunc As Boolean, ByVal name As S t r in g , ByVal returnType As S trin g , ByVal parameters As S t r in g O ) Try Dim comment As S trin g B u ild e r = New S trin g B u ild e r () 1

T w orzy s z a b lo n o w y blok kom en tarza za p o m o c ą p rzek a za n ych inform acji.

comment. Append ( " ' ' .................................................................................................. ) comment.Append(vbCrLf) comment.Append(" ' Procedura: " + name) comment.Append(vbCrLf) comment.Append(" ' Opis: [wpisz o p is procedury)") comment.Append(vbCrLf) comment.Append( .....) comment.Append(vbCrLf) I f isFunc Then comment.Append("' Zwraca: " & returnType & _ " [wstaw opis zwracanej w a rto śc i]") End I f comment.Append(vbCrLf) comment.Append( .....) comment.Append(vbCrLf) comment.Append( " ' Parametry:") comment.Append(vbCrLf) For i As In te g e r = 0 To param eters. GetUpperBound(O) comment.Append("' ") comment.Append(parameters(i)) comment.Append(": [wstaw opis parametru]") comment.Append(vbC r L f ) Next comment. Append ( ......................................................................................................... ) Return comment.ToString() Catch ex As Exception Return "" End Try End Function P riva te Function ParseRetValueType(ByVal code As S trin g ) As S trin g Try '

P o b iera w a rto ść zw ra c a n ą p rz e z fu n k c ję (V isu a l B asic).

'

W yszukuje łań cu ch 'As', rozp o czyn a ją c o d k o ń ca p o b ra n e g o łań cu ch a zn aków .

Dim length As Integer = code.Length Dim index As In teger = co d e.Lastlnd exO f(" As ") Dim retVal As Strin g = code.Substring(index + 3, length - (index + 3)) Return re tV a l.T rim () Catch ex As Exception Return End Try End Function

C zę ść IV Wzbogacanie środowiska Visual Studio P riv a te Function ParseParam eters(ByVal code As S trin g ) As S trin g O Try 1

P o b ie ra n ie p a r a m e tr ó w określon ych

w d e fin ic ji

' funkcji lu b p r o c e d u r y ję z y k a Visual B asic.

Dim lenght As In te g e r = code.Length Dim in d e x S ta rt As In teger = co d e.In dexO f("(") Dim indexEnd As In te g e r = code. Lastln d e xO f( " ) " ) Dim params As S t r in g = co d e.Su b strin g(in d e xStart + 1, indexEnd - (in d e xS ta rt + 1 )) Return pa r a m s .S p lit ( " ," ) Catch ex As Exception Return Nothing End Try End Function P riva te Function ParseRoutineName(ByVal code As S trin g ) As S trin g T ry Dim name As S t r in g Dim length As In te ge r = code.Length Dim in d e xS ta rt As In teger = code.IndexO f(" Sub ") Dim indexEnd As In teger = code. IndexO f( " ( " ) I f in d e xS ta rt = -1 Then in d e xSta rt = code.IndexOf ( " Function ") I f in d e x S ta rt -1 Then in d e xS ta rt = indexStart + 9 End I f Else in d e xSta rt = in dexStart + 5 End I f name = co d e .S u b strin g (in d e xS ta rt, indexEnd - in d e xS ta rt) Return name.TrimO Catch ex As Exception Return "" End Try End Function End Module

Obiekty polecenia Każda operacja, którą można wykonać za pomocą menu i pasków narzędzi środowiska Visual Studio, jest nazywana poleceniem. Polecenie to na przykład wklejenie tekstu w oknie, skompi­ lowanie projektu, przełączenie stanu punktu przerwania czy zamknięcie okna.

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji Dla każdego polecenia obsługiwanego przez IDE istnieje odpowiedni obiekt Command. Kolekcja DTE.Commands przechowuje wszystkie poprawne egzemplarze typu Command. Dostęp do każdego polecenia można uzyskać poprzez jego nazwę, która kategoryzuje i opisuje dane polecenie oraz stanowi jego niepowtarzalny identyfikator. Na przykład polecenie „wklej” jest dostępne jako łańcuch znaków "Edit.Paste". Jeśli programista chce pobrać obiekt Command odpowiadający poleceniu „wklej”, powinien wybrać element kolekcji Commands za pom ocą tego łańcucha znaków: Dim commands As Commands2 = DTE.Commands Dim cmd As Command = commands. Item("Edit. Paste") Można sprawdzić nazwę polecenia, posługując się jego właściwością Name: '

N a zw a to "Edit.Paste".

Dim name As S trin g = cmd.Name Tabela 13.14 przedstawia składowe interfejsu Command. Tabela 13.14.

S k ła d o w e in terfejsu C o m m a n d

Właściwość

Opis

B in d in g s

Klawisze, których można użyć do w yw ołania danego polecenia.

C o lle c t io n

Kolekcja C o m m a n d s, do której należy dany obiekt Com m and.

DTE

Referencja do obiektu głównego D T E .

Guid

Identyfikator GUID identyfikujący grupę polecenia.

ID

Liczba całkow ita identyfikująca polecenie w obrębie grupy.

Is A v a ila b le

Flaga logiczna informująca o tym, czy dane polecenie jest aktywne.

LocalizedNam e

Lokalna nazw a polecenia.

Name

Nazwa polecenia. v i *.o *4 . O pis

•j -- - * • : f

M e to d a

i/\

,

c.

i .

u/

AddControl

Tworzy kontrolkę reprezentującą polecenie. Taką kontrolkę można następnie umieścić na pasku poleceń.

D e le te

Usuwa określone polecenie dodane w cześniej za pomocą metody C o m m a n d s . A d dN am ed Co m m an d.

Lista wszystkich dostępnych poleceń jest niezwykle długa (prawie 3000), dlatego nie możemy opisać ich wszystkich (a nawet większości) w tym miejscu. Aby zobaczyć, jakie polecenia są dostępne, można otworzyć okno dialogowe służące do dostosowywania pasków narzędzi śro­ dowiska Visual Studio do własnych potrzeb. Po wybraniu opcji C u sto m iz e z menu V ie w /T o o lb a r s , a następnie kliknięciu zakładki C o m m a n d s można przejrzeć wszystkie polecenia podzielo­ ne na kategorie (rysunek 13.9). Innym rozwiązaniem jest programowe przejście przez kolekcję DTE.Commands i wyświetlenie wszystkich dostępnych poleceń. W rozdziale 14. używamy tego sce­ nariusza przy opisie procesu tworzenia dodatków.

C zę ść IV Wzbogacanie środowiska Visual Studio

R y su n e k 1 3 .9 .

Przeglądanie poleceń za pomocą okna dialogowego Customize

Dlatego choć nie możemy opisać wszystkich poleceń, pokażemy, jak wykonywać na obiektach Command standardowe operacje, takie jak wywoływanie poleceń, sprawdzanie stanu polecenia, a nawet dodawanie własnych poleceń do ich biblioteki.

Wykonywanie poleceń Polecenia można wykonywać na dwa sposoby. Obiekt DTE udostępnia metodę ExecuteCommand, której można użyć do wywołania polecenia za pomocą jego nazwy’: DTE. ExecuteCommand( "Window.CloseDocumentWindow") Z kolei kolekcja Commands udostępnia metodę Raise, która umożliwia uruchamianie poleceń. Zamiast nazwy poleceń metoda Raise używa ich identyfikatorów GUID i ID: Dim commands As Commands2 = DTE.Commands Dim cmd As Command = commands. Item("Window.CloseDocumentWindow") Dim customln, customOut As Object commands.Raise(cmd.Guid, cmd.Id, customin, customout) Niektóre polecenia przyjmują argumenty. Na przykład polecenie S h e ll służy do uruchamiania zewnętrznych aplikacji w środowisku powłoki, dlatego jeden z przyjmowanych parametrów to nazwa pliku aplikacji. Można uruchomić to polecenie, używając metody ExecuteCommand w nastę­ pujący sposób: Dim commands As Commands2 = DTE.Commands Dim cmd As Command = commands.Item("Tools. S h e ll" ) Dim a r g l = "MyApp.exe" DTE. ExecuteCommand( cmd. Name, a rg1)

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji Także metoda R aise obsługuje argumenty. Dwa ostatnie parametry tej metody służą do określa­ nia tablicy argumentów używanych w poleceniu oraz tablicy wartości wyjściowych zwracanych przez dane polecenie.

Dodawanie klawiszy skrótu Większość poleceń można wywołać nie tylko za pomocą opcji menu lub przycisku paska pole­ ceń, ale także za pomocą skrótów klawiaturowych. Można przypisać taki skrót do polecenia, używając właściwości Command. B indings. Ta właściwość zwraca i przyjmuje obiekt SafeArray (w uproszczeniu jest to tablica obiektów), którego elementami są skróty. Klawisze skrótu są reprezentowane jako łańcuchy znaków o następującym formacie: "[ nazwa

'—z a s ię g u ] : : [mody fik a to r + ] [ k la w is z ] ". Nazwazasiegu służy do określania zasięgu, w jakim dany skrót jest poprawny (na przykład Text Editor lub Global). Element m odyfikator służy do określania klawiszy kontrolnych, na przykład " ctrl+ " , "alt+" czy "shift+" (te modyfikatory są opcjonalne). K la w isz to klawisz klawiatury, którego wciśnięcie (wraz z opcjonalnymi modyfikatorami) ma powodować wywołanie polecenia. Aby dodać skrót do istniejącego polecenia, trzeba najpierw pobrać całą tablicę skrótów, przypi­ sać nowy łańcuch znaków skrótu do tej tablicy i przypisać całą tablicę z powrotem do właści­ wości B ind ings: Dim commands As Commandsż = DTE.Commands Dim cmd As Command = commands.Item(" F i le . SaveSelectedltem s") Dim b in d in g s() As Object b in dings = cmd.Bindings 1

Z w ię k sza ro zm ia r tablicy o I. a b y p o m ie ś c iła n o w y skrót.

ReDim Preserve bindings(bindings.G etllpperBound(0) + 1) 1

P rzy p isu je n o w y skrót do tablicy.

bindings(bindings.GetUpperBound(O)) = " G lo b a l: :S h ift+ F 2 " '

P rzy p isu je ta b lic ę z p o w ro te m d o o b iek tu polecen ia.

cmd.Bindings = bindings

Uwaga Można tworzyć własne nazwane polecenia i uruchamiać je z paska poleceń środowiska IDE (lub z okna poleceń). Do dodawania obiektu Command do kolekcji Commands służy metoda Commands .AddNamed '♦Command. Kod uruchamiany w wyniku wywołania tego polecenia trzeba zaimplementować jako dodatek. Opisujemy to w rozdziale 14.

C zę ść IV Wzbogacanie środowiska Visual Studio

Obiekty debugera Obiektowy model automatyzacji udostępnia obiekt Debugger, który umożliwia kontrolowanie debugera środowiska Visual Studio. Egzemplarz typu Debugger można utworzyć za pomocą właściwości DTE. Debugger: Dim debugger As EnvDTE.Debugger debugger = DTE.Debugger

Za pom ocą poprawnego obiektu Debugger można: •

ustawiać punkty przerwania,



uruchamiać i zatrzymywać debuger dla danego procesu,



kontrolować różne operacje debugera związane z kroczeniem przez kod, na przykład i S te p O u t,

S te p In to , S te p O v e r



przesłać do debugera polecenie R u n to C u rso r,



sprawdzić bieżący tryb debugera (na przykład tryb przerwania, tryb projektowania lub tryb wykonywania).

Poniższy kod uruchamia debuger, jeśli ten jeszcze nie działa: Dim debugger As Debugger2 debugger = DTE.Debugger If debugger.CurrentMode dbgDebugMode.dbgRunMode Then debugger.Go() End If

Zdarzenia automatyzacji Jeśli makro lub dodatek mają otrzymywać powiadomienia o wystąpieniu określonego zdarzenia, można użyć różnych obiektów zdarzeń powiązanych z wszystkimi opisanymi wcześniej kategoria­ mi obiektów automatyzacji. Dostępne są zdarzenia dla okien, edytorów, projektów i tak dalej. W przypadku każdego zdarzenia obsługiwanego przez IDE odpowiadająca mu klasa modelu auto­ matyzacji umożliwia połączenie się z nim i podjęcie odpowiednich działań w mom encie jego zgłoszenia. Drzewo obiektów zdarzeń wyrasta z właściwości DTE.Events, jak przedstawia to rysunek 13.10. Ponieważ zdarzenia są obsługiwane w różny sposób w zależności od tego, czy programista pracuje nad kodem dodatku, czy makra, szczegóły dotyczące obsługi zdarzeń opisujemy w roz­ dziale 14. Podstawowe zasady są jednak proste — należy pobrać referencję do potrzebnego obiektu zdarzenia, a następnie napisać metodę obsługi, która reaguje na jedno ze zdarzeń publi­ kowanych przez ten obiekt.

Rozdział 13. Wprowadzenie do obiektów modelu automatyzacji

£

Rysunek 13.10. T .n M t -i/ł-» r7 o ń

DTE Events

^

BuildEvents

) '

4---------- ---------- > OutputWindowEvents

CommandBarE vents 4---------- ---------- ►

SelecttonEvents

CommandEvents

4---------- ---------- »

DebuggerEvents

4---------- ---------- ► SolutionItemsEvents

DocumentEvents

4---------- ---------- ►

TasklrstEvents

DTEEvents

4---------- ---------- »

TaskEditorEvents

FindEvents

4---------- ---------- »

WindowEvents

SolutlonEvents

MiscFilesEvents

Poniższy kod pokazuje przykładową obsługę zdarzenia „zakończenia kompilacji” w dodatku języka Visual Basic: Dim WithEvents bldevents As BuildEvents bldevents = DTE.Events.BuildEvents

Po utworzeniu obiektu BuildEvents trzeba napisać metodę obsługi zdarzenia: Private Sub bldevents OnBuildDone(ByVal Scope As EnvDTE.vsBuildScope, ByVal Action As EnvDTE.vsBuildAction) Handles bldevents.OnBuildDone 1

K o d o b słu gu jący zdarzen ie.

End Sub

Podsumowanie Obiektowy model automatyzacji środowiska Visual Studio to rozbudowany interfejs API umożliwiający obsługę wielu komponentów IDE w kodzie zarządzanym makr lub dodatków. W rozdziale opisaliśmy organizację tego interfejsu API oraz jego możliwości w zakresie kontroli debugera, edytorów, okien, okien narzędzi, rozwiązań i projektów środowiska Visual Studio. Omówiliśmy także model zdarzeń obsługiwany przez interfejs API i przyjrzeliśmy się możliwo­ ściom tego interfejsu w zakresie dostępu do struktury kodu projektu, wywoływania poleceń w IDE i programowego modyfikowania dokumentów tekstowych. Za pomocą metod i właściwości obiektów modelu automatyzacji można zautomatyzować stan­ dardowe zadania wykonywane w IDE i rozbudować Visual Studio w sposób odpowiadający specyficznym potrzebom związanym z używanymi narzędziami programistycznymi. W następnym rozdziale będziemy opierać się na opisanych tu zagadnieniach i przede wszyst­ kim przyjrzymy się procesowi pisania makr związanych z obiektami modelu automatyzacji.

C zę ść IV Wzbogacanie środowiska Visual Studio

Rozdział 14. Tworzenie makr

C zę ść IV Wzbogacanie środowiska Visual Studio W tym rozdziale: •

Rejestrowanie makr

• Korzystanie z okna Macro Explorer •

Pisanie makr za pomocą środowiska IDE Macros

W rozdziale 13., „Wprowadzenie do obiektowego modelu automatyzacji”, opisaliśmy interfejs API umożliwiający programistom dostosowywanie, usprawnianie i kontrolowanie różnych elementów środowiska IDE Visual Studio. Ten rozdział oparty jest na owych informacjach i pokazuje, jak pisać makra wykorzystujące możliwości obiektowego modelu automatyzacji. Makra mają umożliwiać pisanie własnych apletów wykonujących zadania związane z automaty­ zacją. W poprzednich rozdziałach przedstawiliśmy wiele właściwości IDE, które umożliwiają automatyzację powtarzających się zadań. Do tej kategorii należą między innymi: wbudowana obsługa refaktoryzacji, uzupełnianie słów przez mechanizm IntelliSense czy dodawanie fragmen­ tów kodu. W czasie tworzenia rozwiązań w Visual Studio programista może zauważyć, że wciąż wykonuje powtarzające się operacje, które aż proszą się o zautomatyzowanie. Służą do tego makra. Są to procedury języka Visual Basic, które wchodzą w interakcje z obiektowym modelem auto­ matyzacji w celu kontroli różnych aspektów środowiska IDE. Choć oczywiście można pisać skom­ plikowane makra, ich prawdziwa wartość polega na tym, że są to stosunkowo łatwe do napisania procedury, krótkie i szybkie, dzięki którym programista nie musi samodzielnie wykonywać niektórych męczących zadań w procesie tworzenia oprogramowania. Makr rzadziej używa się do dodawania do IDE nowych funkcji, a częściej do łączenia ze sobą wbudowanych operacji IDE i umożliwiania wspólnego ich wywoływania. W przypadku standardowych operacji wykonywanych w czasie tworzenia rozwiązań w Visual Studio wartość makr polega na możliwości zautomatyzowania tych zadań, jeśli jest to sensowne. W rozdziale 13. przedstawiliśmy przykładowe makro, które wstawia szablon komentarza przed funkcją lub procedurą. Celem stosowania tego makra jest skrócenie czasu potrzebnego na napi­ sanie pełnego komentarza procedury. To makro nie jest skomplikowane ani nie rozwiązuje żadnego szczególnie skom plikowanego problemu związanego z inżynierią oprogramowania. Jego zadanie polega na uproszczeniu zadania programistycznego, które zwykle wymaga samo­ dzielnego wykonania przez programistę — komentowania kodu. Proces tworzenia makra rozpo­ czyna się więc od zidentyfikowania możliwości zautomatyzowania zadania. Następny etap polega na zrozumieniu obiektów środowiska IDE, których trzeba użyć do utworzenia rozwiąza­ nia. Ostatni etap polega na połączeniu tych obiektów w kodzie makra (w języku Visual Basic). Opisaliśmy już dwa z trzech elementów, które trzeba znać, aby móc wydajnie tworzyć makra. W poprzednim rozdziale szczegółowo omówiliśmy obiektowy model automatyzacji oraz przed­ stawiliśmy sytuacje, w których makra są szczególnie przydatne. Trzeci i ostatni element to proces pisania makra od początku do końca oraz uruchamianie gotowych makr w IDE. Makra można tworzyć samodzielnie lub generować poprzez rejestrowanie operacji wykonywa­ nych w IDE. Visual Studio udostępnia nawet specjalne środowisko do tworzenia makr, IDE Macros, które pomaga szybko tworzyć rozwiązania zawierające makra.

Rozdział 14. Tworzenie makr

Rejestrowanie makr Najprostszy sposób utworzenia makra to zarejestrowanie go. Wystarczy włączyć rejestrowanie makra w Visual Studio i wykonać serię operacji w IDE. Rejestrator makr przekształci te operacje na kod makra. Aby uruchomić rejestrowanie makra, należy wybrać opcję T o o ls /M a c r o s/R e c o r d T e m p o r a r y M a c r o (lub wybrać kombinację S h if t+ C tr l+ R ). Spow’oduje to automatyczne rozpoczęcie rejestrowania. W tym mom encie pojawi się mały pasek narzędzi umożliwiający kontrolowanie procesu reje­ strowania (zobacz rysunek 14.1). Rysunek 14.1. Pasek narzędzi Macro Recorder

Trzy przyciski tego paska narzędzi umożliwiają wstrzymanie i wznowienie rejestrowania, zatrzymanie go lub anulowanie tej operacji. Wstrzymanie rejestrowania polega na zatrzymaniu zapisywania operacji programisty wykonywanych w IDE przy jednoczesnym zachowaniu aktyw­ ności rejestratora. Ponowne kliknięcie tego samego przycisku powoduje wznowienie zapisywania. Zatrzymanie tego procesu pozwala wygenerować makro i zachować je w celu późniejszego użycia. Anulowanie powoduje zatrzymanie rejestrowania, jednak bez zapisania makra. Wykonajmy kilka operacji w IDE w czasie, kiedy rejestrowanie jest włączone. Załóżmy, że chcemy um ożliwić łatwe rozwijanie wszystkich węzłów’ projektu (i ich węzłów podrzędnych) w oknie S o lu tio n E x p lo re r. Aby zarejestrować tę operację, wystarczy kliknąć każdy element pro­ jektu w oknie S o lu tio n E x p lo rer i rozwinąć ich drzewo. Po otwarciu wszystkich projektów i ich elementów należy kliknąć przycisk S to p R eco rd in g . Środowisko zachowa wledy makro jako „tym­ czasowe”. Nie zostanie ono zapisane na dysku, jednak można natychmiast je uruchomić, wybie­ rając opcję R u n T e m p o r a r y M a c r o z menu T o o ls /M a c r o s.

Uwaga W danym momencie Visual Studio może przechowywać tylko jedno makro tymczasowe. Oznacza to, że zarejestrowanie następnego makra tymczasowego spowoduje zastąpienie bieżącego. Jeśli pro­ gramista chce używać makra przez dłuższy czas, powinien zapisać je na dysku, używając opcji T o o ls /M a c r o s /S a v e T e m p o r a r y M a c r o . Jeśli okno M a c r o E x p lo re r nie jest jeszcze widoczne, wybór tej opcji wyświetli je.

C zę ść IV Wzbogacanie środowiska Visual Studio

Korzystanie z okna Macro Explorer Okno M a c r o E xplorer to kluczowe narzędzie środowiska przeznaczone do zarządzania makrami. Makra są uporządkowane według projektów i modułów. Makro tymczasowe jest widoczne w pro­ jekcie MyMaeros w module RecordingM odule i nosi nazwę TemporaryMacro. Jeśli programista zdecyduje się zapisać dane makro, Visual Studio automatycznie ustawi węzeł T e m p o r a r y N o d e w trybie edycji i wyróżni nazwę makra. Jest to wskazówka, że należy podać nową nazwę. Następnie można zatwierdzić zmianę nazwy za pomocą klawisza E n te r , a środowisko zapisze makro na dysk. Jeśli programista nie zmieni nazwy, makro nie zostanie zapisane. Używając okna M a c r o E x p lo r e r , można zmieniać nazwy' makr, a także usuwać je i uruchamiać.

Rozdział 14. Tworzenie makr

Wskazówka Makra nie mają wbudowanego domyślnego mechanizmu powia­ damiania, który informowałby o zakończeniu działania makra lub wystąpieniu błędu. Jeśli programista chce śledzić postęp działania makra, musi zmodyfikować je tak, aby wyświetlało komunikaty w oknie O u t p u t , w oknach komunikatów lub za pomocą obu tych mechanizmów.

Aby wyświetlić kod makra (w języku Visual Basic), należy kliknąć jego nazwę prawym przyciskiem myszy w oknie M a c r o E x p lo r e r i wybrać opcję E d it. Spowoduje to otwarcie środowiska IDE Macros. Środowisko IDE można także uruchomić za pomocą opcji menu T o o ls /M a c r o s /M a c r o s ID E (lub wybierając kombinację C t r l + F l l ) . Listing 14.1 przedstawia kod wygenerowany w czasie rejestrowania makra. Polecenia służące do usuwania lub zmiany nazwy makr, m odułów lub projektów znajdują się w menu otwieranym przez kliknięcie prawym przyciskiem myszy w oknie M a c r o E x p lo re r.

Listing 14.1. Kod wygenerowany w wyniku zarejestrowania makra

Option Strict Off Option Explicit Off Imports System Imports EnvDTE Imports EnvDTE80 Imports EnvDTE90 Imports EnvDTElOO Imports System.Diagnostics Public Module RecordingModule Sub TemporaryMacro() DTE .ActiveWindow. Object.GetItem("ContosoCommonFramework\Architecture ^►Models").UIHierarchyltems.Expanded = True DTE.ActiveWindow.Object.Getltem("ContosoCommonFramework\Class Libraries"). ■-►UIHierarchyltems. Expanded = True DTE.ActiveWindow.Object.GetItern("ContosoCommonFramework\Class ^►Libraries\Contoso.Fx.Analysis\Properties").UIHierarchyltems.Expanded = True DTE. Act iveWindow. Object .Get Itern ("Con tosoCommonFramework\Class ^►LibrariesXContoso.Fx.AnalysisXReferences").UIHierarchyltems.Expanded = True DTE.ActiveWindow.Object.Get Item("ContosoCommonFrameworkNClass ■-►Libraries\Contoso.Fx.Common\Properties“) .UIHierarchyltems.Expanded = True DTE. Act iveWindow. Object .Get Item ("ContosoCommonFrameworkXClass ■*Libraries\Contoso.Fx.Common\References") .UIHierarchyltems .Expanded = True DTE. Act iveWindow. Object .Get Item ("ContosoCommonFrameworkXClass ^►LibrariesXContoso.Fx.Integration\Properties").UIHierarchyltems.Expanded = True DTE. Act iveWindow. Object .Get Item (" ContosoCommonFramework\Class ^►Libraries\Contoso.Fx.Integration\References").UIHierarchyltems.Expanded = True DTE. ActiveWindow.Object .GetItem("ContosoCommonFramework\Consoles\AdminConsole"). ^►UIHierarchyltems.Expanded = True

C zę ść IV Wzbogacanie środowiska Visual Studio DTE .ActiveWindow.Object .GetItem("ContosoCommonFramework\Consoles\HelloWorld") . ^►UIHierarchyltems.Expanded = True DTE .ActiveWindow.Object .GetItem("ContosoCommonFramework\Consoles"). "-►UIHierarchyltems.Expanded = True DTE .Act iveWindow. Object .Get Item ("ContosoCommonFramework\Consoles\AdminConsole\ ^♦Properties").UIHierarchyltems.Expanded = True DTE .ActiveWindow.Object .GetItem("ContosoComaionFramework\Consoles\AdminConsole\ '-►References") .UIHierarchyltems.Expanded = True DTE.ActiveWindow .Ob je c t .Getltem("ContosoCommonFramework\Consoles\HelloWorld\ ^►Properties").UIHierarchyltems.Expanded = True DTE .Act iveWindow. Ob ject .Get Item ("ContosoCommonFramework\Consoles\HelloWorld\ ^♦References") .UIHierarchyltems.Expanded = True DTE .ActiveWindow.Object .GetItem("ContosoCommonFramework\Consoles\HelloWorld\ '-►XMLSchemal.xsd") .UIHierarchyltems.Expanded = True DTE.ActiveWindow.Object .GetItem("ContosoCommonFramework\Forms").UIHierarchyltems. ^♦Expanded = True DTE .Act iveWindow. Object .Get Itern ("ContosoCommonFramework\Forms\Contoso.UI. '-►WindowsForms .Test Host\P rope rties") .UIHierarchyltems.Expanded = True DTE.ActiveWindow.Object.GetItern("ContosoCommonFramework\Forms\Contoso.UI. '-►WindowsForms .TestHost\References"). UIHierarchyltems.Expanded = True DTE.ActiveWindow.Object.GetItem("ContosoCommonFramework\Forms\Contoso.UI. ^♦WindowsForms .TestHost\Forml.jsl").UIHierarchyltems.Expanded = True DTE.ActiveWindow.Object.GetItern("ContosoCommonFramework\C:\ ...\PortalSite\"). '-►UIHierarchyltems.Expanded = True End Sub End Module

Pisanie makr za pomocą środowiska IDE Macros IDE Macros (zobacz rysunek 14.3) to wyspecjalizowana wersja Visual Studio, której możliwo­ ści są ograniczone i przystosowane do procesu tworzenia makr. Od razu rzuca się w oczy to, że środowisko udostępnia znany interfejs Visual Studio. Wszystko działa tu tak samo. Okna narzędzi można dokować, przenosić, przyczepiać i tak dalej. Okno edytora kodu służące do modyfikowania makr obsługuje mechanizm IntelliSense, tworzenie obszarów kodu i wszystkie inne mechanizmy zwiększające produktywność. Choć IDE Macros działa identycznie, jak pełne IDE Visual Studio, oba środowiska różnią się nieco od siebie. Na przykład IDE Macros udostępnia tylko podzbiór okien narzędzi i dokum entów dostępnych w pełnym IDE. Obsługa języków w edytorze kodu jest ograniczona do języka Visual Basic (ponieważ jest to jedyny język, w którym można pisać makra), a także nie można projektować formularzy ani podobnych obiektów.

Rozdział 14. Tworzenie makr

Projekty makr Okno narzędzi P r o je c t E x p lo re r działa tak samo, jak okno S o lu tio n E x p lo re r — wyświetla drze­ wo z elementami roboczymi. W przypadku makr węzły drzewa są uporządkowane w sposób projekt -» moduł. Pojedyncze makra są wyświetlane w oknie edytora kodu (jest to niemal ten sam widok, co w oknie M a c ro E xplorer, jednak w drzewie okna M a c ro E x p lo re r poszczególne makra są określane za pomocą nazw). Zapisaliśmy makro tymczasowe, które widoczne jest w projekcie MyMacros w module Recording '-••Module. Wróćmy do rysunku 14.3. Widać na nim fragmenty kodu utworzonego w czasie reje­ strowania makra. Cały ten kod został zapisany w procedurze Tempo raryMacro() języka Visual Basic.

Wskazówka Kiedy programista rejestruje makra, generowany kod jest automa­ tycznie zapisywany w projekcie MyMacros. Aby zmienić to ustawie­ nie, wystarczy kliknąć prawym przyciskiem myszy dowolny projekt makr w oknie M a c ro E x p lo re r i wybrać opcję S et as R e c o r d in g P ro je ct.

C zę ść IV Wzbogacanie środowiska Visual Studio Każdemu projektowi makr odpowiada katalog na dysku. Nie są to standardowe projekty Visual Studio. Domyślnie dostępny jest projekt MyMacros (który znajduje się w podkatalogu M y M a c r o s katalogu D o k u m e n t y W i s u a l S tu d io 2 0 1 0 \P r o je c ts \V S M a c r o s 8 0 ) oraz projekt Samples (znajdu­ jący się w podkatalogu S a m p le s wspomnianego wcześniej katalogu). W każdym katalogu projektu makr znajduje się plik o rozszerzeniu . v sm a cro s, którego nazwa jest taka sama, jak nazwa katalogu projektu. Dlatego w katalogu S a m p le s znajduje się plik Sam ples.vsm acros, a w katalogu M y M a c r o s — plik M y M a c r o s .v s m a c r o s . Plik .v s m a c r o zawiera cały kod poszczególnych makr (i modułów) odpowiadającego mu pro­ jektu. Jest to znaczna różnica w porównaniu ze sposobem obsługi plików projektów przez Visual Studio. Pojedynczym makrom nie odpowiadają pliki, inaczej niż na przykład w przypad­ ku projektów bibliotek klas języka Visual Basic.

Współużytkowanie makr Nieco zaskakuje fakt, że natywny format przechowywania makr to format binarny. Technicznie pliki .v s m a c r o s to pliki o strukturze modelu COM. W takich plikach znajduje się kod źródłowy wszystkich makr wchodzących w skład projektu. Aby udostępnić m oduł innym, m ożna wyeksportować go do pliku języka Visual Basic ( .v b ) . W tym celu należy wykonać następujące operacje: 1. Kliknąć prawym przyciskiem myszy m oduł makra w oknie P r o je c t E x p lo rer środowi­ ska 1DH Macros. 2. Wybrać opcję E x p o r t N a z w a M o d u łu . Pojawi się okno dialogowe E x p o r t F ile (zobacz rysunek 14.4). Rysunek 14.4. Eksportowanie modułu makra

3. Wybrać lokalizację i nazwę pliku, a kod makra zostanie zapisany w nim jako zwykły tekst.

Rozdział 14. Tworzenie makr Po wyeksportowaniu modułu makra można fizycznie udostępnić go innym programistom, prze­ kazując wygenerowany plik. Importowanie wyeksportowanego pliku makra jest proste. Należy wybrać w środowisku IDE Macros opcję P r o je c t/A d d E xistin g I te m , a następnie wybrać odp o­ wiedni plik ,v b . Środowisko umieści ten plik w projekcie makr wybranym w oknie P r o je c t E x p lo r e r .

Udostępnienie całego pliku .v sm a c ro s um ożliwia współużytkowanie kompletnych projektów makr. Często przydatna jest wtedy zmiana domyślnego formatu składowania z kodu binarnego na tekst. W podstawowym środowisku Visual Studio należy w tym celu najpierw zaznaczyć projekt makr w oknie M a c r o E x p lo r e r, a następnie w oknie właściwości zmienić wartość opcji S to r a g e F o r m a t z B in a r y na T e x t (zobacz rysunek 14.5). Rysunek 14.5. Zmiana formatu przechowywania projektu makr

Bezpośrednio po zmianie tej wartości Visual Studio przekształci pojedynczy binarny plik z projek­ tem makr na grupę plików ze zwykłym tekstem. Każdy moduł jest reprezentowany na tym etapie przez odrębny plik ,v b . Rysunek 14.6 przedstawia listę tych plików w katalogu M y M a c r o s po przekształceniu projektu o tej samej nazwie na wersję tekstową.

Dodawanie projektów Zaskakujące jest to, że w IDE Macros nie ma możliwości dodania projektu makr. Oznacza to, że nie ma polecenia F ile /O p e n , umożliwiającego otwarcie pliku .v s m a c r o . Taka opcja dostępna jest w IDE Visual Studio — T o o ls /M a c r o s /L o a d M a c ro P r o je c t. Następnie można wyszukać plik .v s m a c r o s zawierający odpowiedni projekt. Jeśli programista chce utworzyć nowy, pusty projekt makr, powinien wybrać opcję T o o ls /M a c r o s /N e w M a c r o P r o je c t. Dodany projekt makr jest natychmiast dostępny w IDE Macros.

C zę ść IV Wzbogacanie środowiska Visual Studio

Pisanie makr Przedstawiony wcześniej listing 14.1 zawiera kod wygenerowany w wyniku zarejestrowania operacji rozwijania węzłów okna S o lu tio n E x p lo r e r . Kod generowany w czasie rejestrowania makra jest prosty i w tym przypadku przedstawia dosłowne powtórzenie ręcznych operacji wykonanych w oknie S o lu tio n E x p lo re r. Makro uzyskuje dostęp do każdego elementu tego okna za pomocą metody ActiveWindow.Obje ct.Getltem, przekazując nazwę obiektu i pobierając referencję typu UIHierarchyltem. Następnie wystarczy ustawić odpowiednią właściwość, tak aby rozwinąć wszystkie elementy podrzędne (UIHiera rchyltems. Expanded = True). Kod jest kompletny i działa, jednak prawdopodobnie nie wygląda dokładnie tak, jak tego ocze­ kuje programista. Na przykład wskazuje projekty i ich elementy przy użyciu ścieżki oraz na­ zwy. Oznacza to, że makro nie jest uniwersalne (będzie działać tylko dla przykładowego rozwiąza­ nia Contoso), a kod jest dość podatny na błędy. Jeśli programista doda lub usunie projekt albo elem ent projektu, makro nie będzie potrafiło tego wykryć i wciąż będzie próbowało ustawić właściwość Expanded niedostępnych elementów. Aby makro było naprawdę przydatne, trzeba zmodyfikować wygenerowany kod. Zaletą rejestrowania jest to, że w wyniku tej operacji zostaje wygenerowany poprawny punkt wyjściowy do tworzenia makra. W tym przypadku w ygene­ rowany kod sugeruje zastosowanie obiektu UIHierarchyltem, którego jeszcze nie om ówili­ śmy. Rzut oka na ogólną strukturę programu pozwala stwierdzić, że powinna istnieć możliwość refaktoryzacji polegającej na umieszczeniu powyższych wierszy kodu w pętli i rekurencyjnym rozwijaniu węzłów drzewa dopóty, dopóki wszystkie nie zostaną rozwinięte. Zamiast po prostu rozwijać lub zwijać węzły, można też spróbować przełączyć właściwość Expanded.

Rozdział 14. Tworzenie makr D o modyfikowania kodu makr służy edytor kodu, podobnie jak do pracy nad innymi doku­ mentami w Visual Studio. Aby zmodyfikować powyższe makro, należy najpierw napisać rekurencyjną procedurę pomocniczą, które ma przyjmować obiekt UIHierarchyltem, przełączać jego właściwość Expanded na True i wywoływać samą siebie dla każdego podrzędnego elementu znalezionego w kolekcji U IH ierarchyltem : For Each subNode As UIHierarchyltem In node.UIHierarchyltems ExpandNodes(subNode) Next node.UIHierarchyltems.Expanded = True

Uwaga W przeciwieństwie do edytorów w głównym IDE Visual Studio edy­ tor tekstu w IDE Macros automaty cznie zapisuje modyfikowany plik w momencie jego zamknięcia. Dzieje się to bez pytania użytkownika o potwierdzenie. Jeśli programista nie anuluje zmian wprowadzo­ nych w czasie modyfikowania pliku, zostaną one zatwierdzone przy zamykaniu edytora niezależnie od tego, czy autor jawnie je zapisał.

Następnie, aby uruchomić kod, trzeba utworzyć nadrzędną procedurę kontrolującą przebieg programu, która ma tworzyć obiekt okna (reprezentujący okno S o lu tio n E x p lo rer) i pobierać główny obiekt UIHierarchy dla tego okna. Teraz można przejść w pętli przez pierwszy poziom węzłów drzewa i wywołać następne za pomocą procedury rekurencyjnej: Oim tree As UIHierarchy Dim explorer As Window2 explorer = DTE .Windows.Item (Constant s .vsWindowKindSolutionExplorer) tree = explorer.Object For Each node As UIHierarchyltem In tree.UIHierarchyltems ExpandNodes(node) Next

Następnie można rozbudować to rozwiązanie. Jeśli programista zmodyfikuje rekurencyjną procedurę tak, aby przyjmowała wartość logiczną, utworzy uniwersalną funkcję, która potrafi rozwijać lub zwijać grupy węzłów. Po połączeniu wszystkich elementów powstaną dwa makra. Jedno będzie rozwijać wszystkie węzły w oknie S o lu tio n E xplorer, a drugie — zwijać wszystkie węzły tego okna. Na listingu 14.2 te dwa makra przedstawione są jako publiczne procedury o na­ zwach ExpandAll i CollapseAll. Z oboma makrami współpracuje prywatna procedura

ExpandCollapseNodes. Aby uruchomić makro w IDE Macros, wystarczy wcisnąć klawisz F5 lub wybrać opcję D e b u g /S ta r t.

C zę ść IV Wzbogacanie środowiska Visual Studio Listing 14.2. Makro służące do zwijania i rozwijania wszystkich węzłów okna Solution Explorer

Imports Imports Imports Imports Imports Imports Imports Imports

EnvDTE EnvDTE80 Microsoft.VisualStudio.CommandBars System System.Collections System.Diagnostics System.Text System.Windows.Forms

Public Module MacroExamples ‘

R ozw ija w szystk ie w ę zły o k n a S olu tion E xplorer.

Public Sub ExpandAllO Dim tree As UIHierarchy Dim explorer As Window2 '

R eferen cja J o o k n a S o lu tio n E xplorer.

explorer = DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer) 1

R eferen cja J o o b ie k tu U IH ierarch y p o b ra n e g o J la

' okna S o lu tio n E xplorer.

tree = explorer.Object 1

P rzech o J zi p o w ę zła c h n a JrzęJn ego p o zio m u , w y w o łu ją c rekurencyjną

' p ro ceJ u rę, k tó ra r o z w ija w szystk ie w ęzły.

For Each node As UIHierarchyltem In tree.UIHierarchyltems ExpandCollapseNodes(node, True) Next End Sub '

Z w ija w szystkie w ę zły o k n a S olu tion E xplorer.

Public Sub CollapseAll() Dim tree As UIHierarchy Dim explorer As Window2 '

R eferen cja J o o k n a S olu tion Explorer.

explorer = DTE.Windows.Itern(Constants.vsWindowKindSolutionExplorer) ‘ 1

R eferen cja J o o b iek tu U IH ierarch y p o b r a n a J la okna S o lu tio n E xplorer.

tree = explorer.Object 1 1

P rzech o J zi p o w ę zła c h n aJrzęJn ego p o zio m u , w y w o łu ją c rekurencyjną p ro ceJ u rę, k tó ra z w ija w szystk ie węzły.

For Each node As UIHierarchyltem In tree.UIHierarchyltems ExpandCollapseNodes(node, False) Next End Sub ’

R ekurencyjną p r o c e J u ra słu żą c a J o ro zw ija n ia lub zw ija n ia w szystkich

1 w ę złó w p o d rz ę d n y c h d a n e g o obiektu U IH ierarch yltem .

Private Sub ExpandCollapseNodes(ByRef node As UIHierarchyltem,

Rozdział 14. Tworzenie makr ByVal expanded As Boolean) For Each subNode As UIHierarchyltem In node.UIHierarchyltems '

P o n o w n e w y w o ła n ie p ro c e d u r y d la n o w e g o w ę zła podrzędn ego.

ExpandCollapseNodes(subNode, expanded) Next 1

Z w ija n ie lu b rozw ijan ie.

node.UIHierarchyltems.Expanded = expanded End Sub End Module

W powyższym kodzie trudno znaleźć podobieństwa do kodu wygenerowanego przez rejestra­ tor makr. Należy jednak zauważyć, że rejestrator był przydatny ze względów edukacyjnych, ponieważ zwrócił uwagę na zastosowane podejście i technikę polegającą na wykorzystaniu obiektów UIHierarchy, UIHierarchyltem i UIHierarchyltems do obsługi rozwijania węzłów.

Diagnozowanie Proces diagnozowania makr przypomina diagnozowanie innych projektów środowiska Visual Studio, co opisaliśmy szczegółow o w rozdziale 11., „Diagnozowanie kodu”. Debuger IDE Macros obsługuje wszystkie standardowe mechanizmy związane z punktami przerwania oraz polecenia S tep I n to i S te p O v e r . Jeśli programista nie jest pewien poprawności działania kodu odpowiedzialnego za rekurencję, może umieścić punkt przerwania w rekurencyjnej procedurze i sprawdzić funkcjonowanie makra. IDE Macros udostępnia także okno E r ro r L is t , które informuje o wszystkich błędach składni. Na rysunku 14.7 widać przykładowy punkt przerwania i okno E r r o r U s t w IDE Macros.

Uwaga Jeśli w IDE Macros ma miejsce diagnozowanie, główne IDE jest niedostępne. Nie można wtedy wykonywać zadań w głównym IDE.

Obsługa zdarzeń W rozdziale 13. opisaliśmy poszczególne klasy zdarzeń. Poprzez te klasy modelu automatyzacji można uzyskać dostęp do wszystkich zdarzeń IDE. Aby obsłużyć zdarzenie w makro, potrzebne są dwa elementy: definicja zdarzenia i metoda jego obsługi. Każdy projekt makr zawiera domyślnie moduł EnvironmentEvents. Ten moduł jest automa­ tycznie tworzony za każdym razem, kiedy programista utworzy nowy projekt makr. W module znajdują się definicje wielu zdarzeń związanych z modelem automatyzacji. Jeśli programista chce dodać obsługę zdarzenia należącego do jednej z poniższych kategorii, może skorzystać z gotowych definicji zdarzeń:

C zę ść IV Wzbogacanie środowiska Visual Studio «✓ > Microsoft Visual Studio Macros File

Edit

View

Project

J a '♦i «t, a* -

^

Debug

Tools

• •& ~ 2 ■_)

Project Explorer

W ndow

H ep

• 3 _ł 23 , □ * 5



3 X

& ___ .V] MyMacrr os 5)

-jd References

' R e k u r e n c y jn a p r o c e d u r a s ł u ż ą c a do r o z w i ja n ia lu b z w i j a n i a w s z y s t k i c h • w ę z łó w p o d rz ę d n y c h daneg o c b ie k t u U I H i e r a r c h y lt e m . P r i v a t e Sub E x p a n d C o lla p s e N c d e s (B y R e f node As U I H i e r a r c h y lt e m , _ B y V a l e xp an d ed A s B o o le a n ) F o r E a c h subNode A s U IH ie r a r c h y lt e m I n n o d e .U IH ie r a r c h y lt e m s 1 Poncwne w y w o ła n ie p r o c e d u ry d la nowego w ę z ł a p o d rz ę d n e g o . .x p a n d C o lla p s e N o d e s (su b N cd e, e xp an d ed . T r u e ) N e xt

EnvironmentEvents MacroEiamples R ecordm gM odule

JJI Samples

s

• Z w i ja n ie lu b r o z w i j a n i e , n o d e . U I H i e r a r c h y lt e m - . Exp anded

expanded

End Sub


m)

♦ DebuggerExpressionEvaluationEvents ♦ DebuggerProcessEvents ♦ Doc umentE vents ♦ DTEEvents & FmdEvents Ś M-scFilesEvents ♦ OutputWmdowEvents ^ ProjectsEvents ♦ SelectionEvents

s

pr

Help

♦ BuildEvents ♦ CodeM odelEvents ♦ DebuggerEvents

-"5 Project Explorer 7 J Class View Propert

Window

1B T

-j| References y

Tools

^

3 3 MyMacros

4.

i i

Debug

ced c o d e , do noc m o d ify * noc m o d ify

, do

ib u t e ( ) >

P u b lic W ith E v e n ts DTEE „

^ SolutionEvents Solutionhem sE vents ^ TaskListEvents ♦ TextDocumentKeyPressEvents

Description

Ready

Rysunek 14.8. Wybór typu zdarzenia makra

File

~ a X

Line

Ln 13

Col 21

Column

Ch21

Project

INS

Rozdział 14. Tworzenie makr Po wybraniu typu przez programistę na liście rozwijanej z deklaracjami (po prawej stronie u góry edytora kodu) pojawią się zdarzenia zdefiniowane dla danego obiektu zdarzenia. Jeśli programista chce na przykład otrzymywać powiadomienia przy każdym otwarciu rozwiązania, powinien wybrać zdarzenie Opened. Bezpośrednio po wybraniu zdarzenia w edytorze kodu zostanie umieszczony kod metody jego obsługi. W tym przypadku będzie to poniższy fragment: Private Sub SolutionEvents Opened() Handles SolutionEvents.Opened End Sub

Można pozostawić kod modułu EnvironmentEvents bez zmian (rozsądne rozwiązanie), a można też wyciąć go i wkleić do innego modułu projektu. Po umieszczeniu metody obsługi zdarzenia w odpowiednim miejscu wystarczy napisać kod obsługujący to zdarzenie. Warto wiedzieć, że za każdym razem, kiedy programista wczyta w Visual Studio projekt makr zawierający obsługę zdarzeń, pojawia się okno dialogowe systemu zabezpieczeń (rysunek 14.9). Rysunek 14.9. Wczytywanie projektu makr z obsługą zdarzeń

f

The macro project 'CAUsersMafsXDocomentsWrsual Studio 10\ProjectsNVSMacros80\MyMacro5\MyMa Struktura Color

private Color GetPointColor(int x, int y)

{ I / Pobiera bitmapę z pola zawierającego rysunek palety.

Bitmap bmp = (Bitmap)pictureBoxPalette.Image; / / Używa metody GetPixel do pobrania struktury / / Color odpowiadającej bieżącej pozycji kursora

Color color = bmp.GetPixel(x, y); / / Zwraca strukturę Color.

return color;

} III III III III III

Wyświetla wartości składowych RGB danego koloru. Ponadto ustawia kolor tta drugiego pola z rysunkiem.

Wyświetlany kolor

private void DisplayColor(Color color)

{ / / Pobiera wartości składowych RGB ze / / struktury Color.

string R = color.R.ToString(); string G = color.G.ToString(); string B = color.B.ToString(); / / Ustawia bieżący kolor w drugim / / polu z rysunkiem.

this.pictureBoxColor.BackColor = color;

C zę ść IV Wzbogacanie środowiska Visual Studio / / Wyświetla wartości składowych RGB na / / etykietach.

this.labelRValue.Text = R; this.labelGValue.Text = G; this.labelBValue.Text = B;

> I I I I I I Generuje łańcuch znaków reprezentujący kod wjęzyku CU lub Visual Basic I I I potrzebny do utworzenia egzemplarza struktury Color odpowiadającej przekazanej I I I strukturze Color. Ten łańcuch znaków zostaje przypisany do pola _code I I I kontrolki użytkownika. / / /

< /su m m a ry >

/ / / Kolor reprezentowany w kodzie. I I I Flaga logiczna określająca używany język: I I I false oznacza język CU. a true — język Visual Basic

private void SetCode(Color color, bool isVB)

{ //

Wczytuje ustawienia dodatku z rejestru.

SetPropFromReg(); string code = if (isVB)

{ code = "Dim color As Color =

} else

{ code = "Color color =

} code = code + @"Color.FromArgb(" + color.R.ToString() + ", " + color.G.ToString() + ", " + color.B.ToString() + code = code; this.labelCode.Text =

code;

} III

< su m m a ry >

I I I Wczytuje wartości z rejestru i w odpowiedni sposób ustawia I I I pole określające używany język. III

< /su m m a ry >

private void SetPropFromReg()

{ RegistryKey regKey = Registry .Cu rrentllser.OpenSubKey(@"Software\Contoso\Addins\ColorPalet te"); string codeVal = (string)regKey.GetValue("Language", "CSharp"); if (codeVal == "CSharp")

{ generateVB = false;

} else

Rozdział 15. Tworzenie dodatków i kreatorów { generateVB = true;

} }

Informowanie o wybranym kolorze Poniew aż kontrolka m usi w jakiś sposób inform ow ać użytkownika o tym , że wybrał kolor (na przykład po kliknięciu palety), w klasie kontrolki użytkownika trzeba także zdefiniować zdarzenie zgłaszane w w yniku wykrycia kliknięcia pola z rysunkiem palety: public event EventHandler ColorSelected; protected virtual void OnColorSelected(EventArgs e)

{ if (ColorSelected != null) ColorSelected(this, e);

} private void pictureBoxPalette ClicMobject sender, EventArgs e)

( OnColorSelected(new EventArgs());

>

Wskazówka A b y w y o d r ęb n ić k o n tr o lk ę u żytk ow n ika i p r z e te sto w a ć ją, w arto d o d a ć d o ro zw ią za n ia p ro jek t typu W in d o w s F o r m s i u m ieścić w n im k on trolk ę w celu p rzeprow adzenia testów . W ystarczy upuścić k o n tr o lk ę na form ularzu i u ru ch om ić projekt zaw ierający ten for­ m u larz.

Po utworzeniu kontrolki m ożna przejść do drugiego etapu rozwijania dodatku — podłączania kontrolki do IDE.

D o p raco w yw an ie k la sy C o nn ect Klasa C onnect zawiera już podstawowy kod dodatku. Teraz w rócim y do niego i dodam y nie­ standardow y kod sterujący kontrolką użytkownika. Dodatek powinien w niezauważalny sposób integrow ać się ze środow iskiem program istycznym , dlatego m o żn a użyć o k n a narzędzi do wyświetlania utworzonej wcześniej kontrolki. W e wcześniejszym opisie obiektow ego m odelu autom atyzacji w sp o m n ieliśm y , że kolekcja W indows2 udostępnia m etodę C reateToolsW indow 2, która um ożliw ia tw orzenie własnych niestandardowych okien narzędzi.

C zę ść IV Wzbogacanie środowiska Visual Studio

Uwaga W starszych wersjach Visual Studio trzeba było utworzyć pod­ kładkę kontrolki (w języku C++) umożliwiającą wyświetlanie kontrolki użytkownika w oknie narzędzi. W takim rozwiązaniu okno narzędzi zawierało podkładkę kontrolki. Od wersji Visual Studio 2005 (dzięki usprawnionej m etodzie Windows2. C reateT ool '-*-Window2) nie jest to już konieczne. Teraz kontrolki użytkow­ nika zawierające kod zarządzany można umieszczać bezpośrednio w oknie narzędzi.

Prototyp tej m etody wygląda następująco: Window CreateToolWindow2 ( Addin Addin, string Assembly, string Class, string Caption, string GuidPosition, [InAttribute] out Object ControlObject

)

Wyświetlanie okna narzędzi i kontrolki użytkownika Ponieważ chcemy, aby po wczytaniu dodatku środowisko tw orzyło i wyświetlało okno narzędzi, wywołanie metody CreateToolWindow2 trzeba umieścić w m etodzie Connect. OnConnection. Najpierw należy przypisać kolekcję DTE. ToolWindows do lokalnego obiektu: //

Kolekcja DTE.ToolWindows.

Windows2 toolWindows = (Windows2) applicationObject.Windows;

Potrzebny jest także obiekt do przechowywania referencji d o tworzonego okna narzędzi: //

Obiekt, w którym zostanie zapisane nowe okno narzędzi.

Window2 toolWindow;

Na zakończenie należy utworzyć param etry przekazywane do m etody CreateToolWindow2: / / Obiekt na dane. Zostanie do niego przypisana kontrolka użytkownika. / / przechowywana w oknie narzędzi.

object paletteObject = nuli; Ten fragment określa ścieżkę do pliku kontrolki użytkownika i nazwę klasy, / / która będzie widoczna w nowym oknie narzędzi. Należy także podać / / nagłówek kontrolki i niepowtarzalny identyfikator GUID. / /

Assembly asm = System.Reflection.Assembly.GetExecutingAssembly(); string assemblyPath = asm.Location; string className = "ColorSelectorAddln.PaletteControl"; String guid = ,,{62175059-FD7E-407a-9EF3-5D07F2B704E8}"; string caption = "Paleta do pobierania kolorów";

Rozdział 15. Tworzenie dodatków i kreatorów W arto zauważyć, że identyfikator GUID przekazywany do metody CreateToolWindow2 zapi­ saliśm y na stałe w aplikacji. Ponieważ kod kontrolki użytkownika jest zarządzany, a ona sama jest częścią kom ponentu COM (wszystkie okna narzędzi w Visual Studio są oparte na modelu C O M ), mechanizmy obsługi dodatku muszą mieć możliwość utworzenia interfejsu do kom uni­ kacji z kontrolką. Służy do tego param etr Guid. M ożna użyć środowiska Visual Studio do w ygenerow ania identyfikatora GUID. W tym celu należy otworzyć m enu Tools/Create GUID i wybrać opcję Registry Format. Następnie można skopiow ać identyfikator bezpośrednio do edytora kodu. Po dodaniu powyższego kodu brakuje jeszcze tylko kilku wierszy p o trzeb n y ch do utw orzenia i wyświetlenia okna narzędzi: //

Tworzy nowe okno narządzi zawierające kontrolką użytkownika

toolWindow = (Window2)toolWindows.CreateToolWindow2( addlnlnstance, assemblyPath, className, caption, guid, ref paletteObject); / / Jeśli udało sią utworzyć okno narządzi, należy je wyświetlić.

if (toolWindow != nuli)

{ toolWindow.Visible = true;

}

Przechwytywanie zdarzeń kontrolki użytkownika D odatkow i brakuje jeszcze jednego, ostatniego elem entu. D odatek pow inien reagować na każde kliknięcie palety przez użytkownika, pobierając w ygenerow any k od (dostępny poprzez właściwość PaletteControl. Code) i wstawiając go do aktywnego dokum entu. Aby to umożliwić, trzeba wykonać dwie operacje. Po pierwsze, trzeba napisać metodę obsługi zdarzenia obsługującą zdarzenie kliknięcia zgłaszane przez obiekt PaletteControl. Jednak d o tego potrzebna jest referencja do kontrolki użytkow nika. Jest ona przekazyw ana jako obiekt paletteObject — ostatni parametr m etody CreateToolWindow2. Ponieważ param etr jest przekazywany przez referencję, po zakończeniu wykonywania metody i zwróceniu przez nią sterowania ten para­ m etr będzie zawierał popraw ny egzemplarz typu PaletteControl. W ted y można zrzutować ten obiekt na typ PaletteControl, przypisać go do pola klasy Connect, a następnie powiązać z m etodą obsługi zdarzenia PaletteCont r o i . Colo rSelected: / / Pobieranie referencji do obiektu reprezentującego kontrolką użytkownika.

PaletteControl = (PaletteControl)paletteObject; / / Podłączanie metody obsługi zdarzenia PaletteControl. ColorSelected.

paletteControl.ColorSelected += new System.EventHandler(paletteControll ColorSelected);

Wstawianie wygenerowanego kodu D odatek reaguje na zgłoszenie zdarzenia ColorSelected, pobierając zawartość właściwości PaletteColor .Code i dodając ją do aktywnego dokumentu. Także do obsługi tej operacji można wykorzystać wiedzę z poprzedniego rozdziału dotyczącą obiektow ego m odelu automatyzacji.

Część IV

Wzbogacanie środowiska Visual Studio

Wskazówka Pobieranie referencji do kontrolki użytkownika może być nieco skomplikowane. Jeśli kontrolka użytkownika nie jest częścią tego samego projektu, co klasa dodatku, metoda CreateToolWindow2 zwróci wartość n u li zamiast poprawnej referencji do kontrolki. Jeśli programista chciałby utworzyć kontrolkę poza projektem dodatku, musiałby się upewnić, że jej atrybuty zapewniają dostęp do niej z poziomu wywołujących ją komponentów COM. Szcze­ gółowe informacje na temat stosowania tej techniki znajdują się w pomocy MSDN w temacie „Exposing .NET Framework Com po­ nents to COM”.

Klasa DTE. ActiveDocument przechowuje referencję do aktywnego dokumentu. Używając punktu edycji, m ożna łatwo dodać tekst bez.pośrednio do dokum entu tekstowego: TextDocument currDoc = •-(TextDocument) applicationObject .ActiveDocument.Object(""); EditPoint2 ep = (EditPoint2) currDoc.Selection.ActivePoint.CreateEditPoint(); ep.Insert( paletteControi.Code); ep.InsertNewLine(1);

U d o stęp n ian ie u sta w ień dodatku Ostatni etap wymaga udostępnienia opcji służącej do w yboru języka dodatku. U żytkow nicy powinni mieć możliwość wyboru, czy dodatek ma generować kod w języku C#, czy w języku Visual Basic. W tym celu trzeba utw orzyć interfejs użytkow nika w postaci stro n y Options (będzie ona widoczna w oknie dialogowym Options) oraz dodać miejsce, w którym dodatek będzie przechowywał informacje o dokonanym wyborze.

Tworzenie interfejsu użytkownika w postaci strony Options W dodatkach m ożna uzyskać dostęp do strony Options widocznej w oknie dialogowym Tools/ Options. Podobnie jak w przypadku niestandardowego okna narzędzi, tak i tu trzeba utworzyć kontrolkę użytkownika zawierającą logikę i interfejs użytkownika potrzebne na stronie Options. Najpierw należy dodać nową kontrolkę użytkownika do istniejącego projektu dodatku. N a­ zwiemy ją PaletteCont rolOptionPage. Należy umieścić na niej etykietę i dwa przyciski opcji, co umożliwi użytkownikom wybór języka kodu generowanego przez dodatek. Rysunek 15.11 przed­ stawia pow ierzchnię projektową strony Options. Kontrolka użytkownika wyświetlana na stronie Options musi dziedziczyć po interfejsie IDTTools

'-OptionsPage: public partial class PaletteControlOptionPage : UserControl, IDTToolsOptionsPage

{

Rozdział 15. Tworzenie dodatków i kreatorów

C zę ść IV Wzbogacanie środowiska Visual Studio Rysunek 15.12. Sekwencja operacji strony Tool Options

i On Help

*- (H e lp )-

Użytkownik kliknął przycisk na stronie

(Cancel) «

OnCancd

(OK)

_Ł_ OnOK

public void OnAfterCreated(DTE DTEObject)

{ / / Wczytuje bieżącą wartość z rejestru. / / TODO: w tym miejscu należałoby umieścić kod uruchamiany / / w nieprzewidzianych sytuacjach, tworzący klucz, jeśli I I jeszcze nie istnieje, obsługujący nieoczekiwane wartości, I I wyjątki itd.

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"; / / Wartość domyślna. if (this.radioButtonVB.Checked)

{ codeValue = "VB";

} / / Aktualizuje rejestr za pomocą nowych ustawień.

RegistryKey regKey = Registry.CurrentUser.OpenSubKey(@"Software\Contoso\Addins\ColorPalette”); regKey.SetValue("Language", codeValue);

}

Rozdział 15. Tworzenie dodatków i kreatorów

Uwaga To programista musi zdecydować, gdzie i jak przechowywać usta­ wienia dodatku. Rejestr to jedno z logicznych miejsc. Można także przechowywać ustawienia w pliku XML udostępnianym wraz z pli­ kami binarnymi.

Rejestrowanie strony Options Rejestrowanie strony Options odbywa się tak sam o, jak w przypadku d o d atk u . Służy do tego plik o rozszerzeniu .addin. Dodając kilka wierszy kodu XML, m ożna poinform ow ać Visual Studio o tym, że dostępna jest strona Options niestandardowego dodatku. M ożna to łatwo zrobić, modyfikując plik .addin bezpośrednio w środow isku Visual Studio (poniew aż jest on autom a­ tycznie tworzony jako elem ent projektu). Aby dołączyć niezbędny kod XML z inform acjam i dotyczącym i rejestracji, należy zm odyfi­ kow ać plik .addin, um ieszczając w nim poniższy kod XML przed zam ykającym znacznikiem < /e x te n s ib ility > :

Korzystanie z pliku szablonu Przypomnijmy, że kreator ma wygenerować kod klasy dla użytkownika. Kod można utworzyć na dwa sposoby: albo wygenerować wszystkie wiersze kodu za pomocą interfejsu API Code DOM lub wymuszając tworzenie i łączenie łańcuchów znaków, albo przy użyciu pliku szablonu. Rozwiązanie oparte na pliku szablonu jest nieco prostsze i prawdopodobnie także bardziej wy­ dajne, dlatego opiszemy właśnie je. Szablon klasy to plik przypominający pliki kontrolek użytkownika. W kodzie wygenerowanym dla klasy kontrolki użytkownika należy podmienić kluczowe obszary na miejsca na łańcuchy znaków. Na przykład w kreatorze określana jest nazwa klasy, dlatego należy umożliwić jej zmianę w szablonie klasy: public class VTemplateClassName% : UserControl, IDTToolsOptionsPage

{ >

Rozdział 15. Tworzenie dodatków i kreatorów W szablonie klasy warto także ująć składowe interfejsu IDTToolsOptionsPage, takie jak OnAfterCreated czy OnOK. W przypadku większości tych metod wystarczy zostawić wywoła­ nie System. NotImplementedException, które przypomina użytkownikom o konieczności uzupełnienia kodu, jeśli jest potrzebny. Jednak w metodach OnAfterCreated i OnOK należy dołączyć wiersz kodu otwierający wpis rejestru o podanym kluczu: public void OnAfterCreated(DTE DTEObject)

{ // //

Wczytuje bieżącą wartość z rejestru. TUDO: dołączyć kod wczytujący wartość z rejestru.

%Sta rtRegist ryCode% RegistryKey regKey = Registry.CurrentUser.OpenSubKey(@"%TemplateRegKey%"); %EndRegistryCode%

} public void OnOK()

{ / / TODO: dołączyć kod zapisujący opcje. / / Aktualizuje rejestr za pomocą nowych ustawień.

%StartRegistryCode% RegistryKey regKey = Registry.CurrentUser.OpenSubKey(@"%TemplateRegKeyV'); %EndRegistryCode%

} Także tu używane są miejsca na dane. %StartRegistryCode% i %EndRegistryCode% ograni­ czają wiersz kodu z instrukcją OpenSubKey. Jeśli użytkownik usunie zaznaczenie pola wyboru R ejestr u ż y tk o w n ik a w kreatorze, należy pominąć kod znajdujący się pomiędzy tymi ograniczni­ kami (włączając w to same ograniczniki). Zmienna %TemplateRegKey% służy jako symbol wartości klucza rejestru. Jest to następny element pobierany od użytkownika w oknie dialogowym kreatora. Uruchamianie kreatora Metoda Execute otwiera formularz kreatora i, jeśli użytkownik nie anuluje działania okna dialo­ gowego, używa właściwości formularza do wywołania kilku wewnętrznych procedur odpowie­ dzialnych za generowanie wyjściowej klasy: public void Execute(object Application, int hwndOwner, ref object!] ContextParams, ref object!] CustomParams, ref wizardResult retval)

{ / / Egzemplarz okna dialogowego kreatora.

WizardDialog dig = new WizardDialog!); //

Wyświetlanie okna.

dlg.Showf); / / Przetwarzanie wyników zwróconych przez kreator.

if (dlg.DialogResult == DialogResult. OK)

{ / / Wczytuje plik szablonu, zamienia symbole, zwraca zawartość / / jako łańcuch znaków.

string classContent = ReplaceTokens(dlg.ClassNaine, dig.Category, dlg.SubCategory, dig.UseRegistry, dig.RegKey);

C zę ść IV Wzbogacanie środowiska Visual Studio / / Umieszcza zawartość zwróconego łańcucha znaków w pliku i I I dodaje ten plik do bieżącego projektu / / (trzeci element tablicy ContextParams to kolekcja / / elementów bieżącego projektu).

Projectltems projltems = (ProjectItems)ContextParams[2]; AddFile(this.ClassName, classContent, projltems); retval = wizardResult.wizardResultSuccess;

} / /

Działanie kreatora zostało anulowane. Nie trzeba wykonywać żadnych operacji.

else { retval = wizardResult.wizardResultCancel;

} > Do obsługi kliknięcia przycisku O K przez użytkownika służą trzy odrębne wewnętrzne proce­ dury. Pierwsza z nich, ReplaceTokens, otwiera plik szablonu klasy i zamienia symbole (ponie­ waż jest to prosty proces podmieniania łańcuchów znaków, pominiemy służący do tego kod). Druga procedura, Add F ile , zapisuje zawartość nowej klasy do nowego pliku i dodaje go do bieżącego projektu. Ponieważ służący do tego kod nie jest oczywisty, przedstawiamy jedno z moż­ liwych rozwiązań: private void AddFilelstring className, string classContent, Projectltems projltems)

{ / / Określa ścieżkę do plików projektu.

string fileName = Path.GetDirectoryNamef projItems.ContainingProject.FileName); //

Używa ścieżki do klasy i je j nazwy do utworzenia nazwy pliku klasy.

fileName = fileName + className + " .cs"; / / Zapisuje plik klasy w katalogu projektu.

using (TextWriter writer = new StreamWriter(fileName, false))

{ writer.Write(classContent); writer.Close();

} //

Dodaje nowy plik do bieżącego projektu.

projltems.AddFromFile(fileName);

} Na zakończenie należy wywołać procedurę UpdateXML. Ta procedura otwiera plik .a d d in i dodaje odpowiedni węzeł do danych XML: private void UpdateXml(ProjectItems projltems, string category, string subCategory)

{ //

Tworzy łańcuch znaków z danymi XML fragmentu kodu.

Rozdział 15. Tworzenie dodatków i kreatorów

/ / Przechodzi po elementach projektu, / / szukając pl iku .addin.

string projName = projItems.ContainingProject.FullName; foreach (Projectltem itm in projltems)

{ if (itm.Name == projName + ".addin”)

{ //

Otwiera obiekt Document dla pliku .addin.

itm.Document.Activate(); TextDocument txtDoc = (TextDocument)itm.D o c u m e n t . O b j e c t ; TextRanges nullObj = null; / / Dodaje do fragmentu kodu dane XMl. dotyczące kategorii i kategorii podrzędnej.

txtDoc.ReplacePattern("", xml, (int)vsFindOptions.vsFindOptionsFromStart, ref nullObj);

} > } Teraz kod kreatora jest już gotowy.

Tworzenie plików .vsz i .vsdir Aby „zarejestrować” kreator, wystarczy utworzyć plik .v s z i dodać wpis do pliku .v s d ir . Zawar­ tość pliku .v s z jest prosta: VSWizard 8.0 Wizard=ContosoWizards.ToolsOptionsPageWizard Param=

Rekord, który trzeba dodać do pliku .v s d ir , wygląda następująco: ToolsOptionsPageWizard.v s z |||1|Tworzy nową klasę kontenerową Contoso| c:\ContosoFramework\Wizards\DataClassWizard.dlll||Contoso Options Page Class

Po dodaniu tych plików kreator jest w pełni funkcjonalny i m ożna wybrać go z okna dialogo­ wego A d d I te m .

C zę ść IV Wzbogacanie środowiska Visual Studio

Podsumowanie W tym rozdziale pokazaliśmy, jak wykorzystać możliwości interfejsu API modelu automatyza­ cji środowiska Visual Studio w celu tworzenia dodatków i kreatorów. Przyjrzeliśmy się niemal nieograniczonym możliwościom rozszerzania Visual Studio za po­ mocą dodatków, które wywołują interfejs API służący do automatyzacji i udostępniają na różne sposoby własne interfejsy, między innymi poprzez niestandardowe okna narzędzi i okna dialo­ gowe. Na zakończenie opisaliśmy jeszcze jeden sposób wykorzystania możliwości wszechobecnego obiek­ towego modelu automatyzacji i wbudowanego silnika kreatorów do tworzenia własnych nie­ standardowych kreatorów służących do dodawania nowych projektów, ich elem entów oraz wykonywania niemal dowolnych wieloetapowych operacji w Visual Studio. W następnym rozdziale przyjrzymy się kolejnemu, ostatniemu już sposobowi rozszerzania środowiska Visual Studio — platformie Managed Extensitiblity Framework (MEF).

Rozdział 16. Rozbudowywanie edytora kodu przy użyciu platformy MEF

C zę ść IV Wzbogacanie środowiska Visual Studio W tym rozdziale: • Problem z rozszerzaniem • Architektura platformy MEF • Edytor środowiska Visual Studio i platforma MEF • Tworzenie rozszerzenia edytora za pomocą platformy MEF W dwóch poprzednich rozdziałach pokazaliśmy, że istnieje wiele możliwości i podejść w za­ kresie wzbogacania funkcji środowiska Visual Studio. Zwłaszcza model dodatków to rozbudowany sposób na budowanie niezawodnych aplikacji działających w IDE Visual Studio. W Visual Studio 2010 pojawiła się zupełnie nowa technologia wzbogacania środowiska — platforma MEF (ang. M a n a g e d E x te n s ib ility F r a m e w o r k ) . MEF to ogólny wzorzec architektoniczny, interfejs API i biblioteka klas .NET. Umożliwia łatwe tworzenie podobnych do „wtyczek” rozszerzeń dla dowolnych aplikacji platformy .NET. W Visual Studio 2010 rozszerzenia oparte na MEF dostępne są w edytorze kodu. Z czasem tech­ nologia ta obejmie prawdopodobnie całe środowisko IDE. W tym rozdziale przedstawiamy platform ę MEF Microsoftu i stosowanie jej do wzbogacania edytora kodu w środowisku Visual Studio.

Problem z rozszerzaniem Zanim przyjrzymy się szczegółom platformy MEF na poziom ie architektury i kodu, warto zrozumieć problem, którego technologia ta ma być rozwiązaniem. Ujmijmy to prosto — w jaki sposób programiści mają um ożliwić łatwe wzbogacanie aplikacji przez innych, a także jak można w prosty sposób rozszerzać istniejące programy? W tym obszarze trzeba przezwyciężyć wiele przeszkód. Jak na przykład sprawić, aby aplikacja umożliwiała wprowadzanie rozszerzeń, nie pozwalając przy tym na zmianę jej głównych funk­ cji niezgodnie z zamierzeniami pierwotnych autorów? Programistom zależy na standardowej technice, która umożliwi tworzenie dynamicznych aplikacji, a także pozwoli innym na wzbo­ gacanie dynamicznych programów za pomocą znanych i zrozumiałych mechanizmów.

Tworzenie dynamicznych aplikacji Przed pojawieniem się platformy MEF tworzenie tak zwanych otwartych aplikacji .NET (czyli programów umożliwiających innym dodawanie kodu i zmienianie lub wzbogacanie funkcji) nie było proste. Główna trudność polega na wykrywaniu kodu i tworzeniu egzemplarzy. Aplikacja nadrzędna (obsługująca rozszerzenia) musi mieć standardowy mechanizm wykrywania i spraw­ dzania poprawności nowego kodu. Potrzebna jest też technika do aktywowania go w czasie wykonywania programu. W jaki sposób należy wykonywać kod dodatku i które części aplikacji nadrzędnej mogą być przez niego modyfikowane?

Rozdział 16. Rozbudowywanie edytora kodu przy użyciu platformy MEF Tego rodzaju problemy ma rozwiązywać platforma MEF. Zapewnia ona wzorzec architekto­ niczny i platformę (interfejs API), które programiści aplikacji nadrzędnych i dodatków mogą wykorzystać do tworzenia dynamicznych programów. Platforma MEF jest bezpośrednio skierowana do programistów, którzy tworzą narzędzia trzech różnych rodzajów'. Są to: • Rozszerzenia — fragmenty skompilowanego kodu wzbogacające funkcje istniejącej aplikacji. Programiści rozszerzeń potrzebują m ożliw ości pisania komponentów bez konieczności dostępu do kodu źródłowego aplikacji nadrzędnej, a nawet bez dokładnej wiedzy na temat takiego kodu. • Rozszerzalne platformy i aplikacje nadrzędne — aplikacje, które mają umożliwiać dynamiczne dodawanie funkcji w postaci rozszerzeń. • M odele programowania — jest to najrzadziej spotykany scenariusz, związany z tym, że programista chce opracować nowy sposób programowania z wykorzystaniem platformy do tworzenia aplikacji. Platforma MEF zapewnia cegiełki, których progra­ miści potrzebują do rozwijania rozszerzalnych platform do tworzenia aplikacji. Visual Studio to jedna z aplikacji nadrzędnych, w której bardzo przydatna jest możliwość obsługi rozbudowanych dodatków wzbogacających podstawowe funkcje udostępniane przez Microsoft.

Architektura platformy MEF Platforma MEF pozwala realizować zadania za pomocą trzech różnych, ale powiązanych me­ chanizmów: • dodawania zależności, • dopasowywania strukturalnego, • określania nazw i aktywowania. Przyjrzyjmy się każdemu z tych obszarów na abstrakcyjnym poziomie. Później pokażemy, jak poszczególne rozwiązania są zaimplementowane w platformie MEF.

Reguły działania platformy MEF Dodawanie zależności (ang. d e p e n d e n c y in je c tio n ) to pojęcie z obszaru architektury oprogra­ mowania dotyczące dodawania zewnętrznych zależności przez platformę lub środowisko uru­ chomieniowe do innego oprogramowania. Obsługa tego procesu jest niezbędna do zbudowa­ nia platformy do tworzenia rozszerzeń.

C zę ść IV Wzbogacanie środowiska Visual Studio Dopasowywanie strukturalne (ang. s tr u c tu r a l m a tc h in g lub d u c k ty p in g ) to sposób wykrywa­ nia funkcji i określania typów. Polega na tym, że host ustala typ obiektu na podstawie udo­ stępnianych właściwości i metod, a nie według rzeczywistego typu w sensie programowania obiektowego. O kreślanie nazw i aktyw ow anie to tunkcja uzupełniająca, która łączy wszystkie elementy i umożliwia aplikacji wczytywanie oraz uruchamianie kodu dodatku w przewidywalny sposób. Jeśli wszystkie trzy mechanizmy są obecne, powstaje solidna platforma do budowania aplikacji, które można dynamicznie łączyć w czasie wykonywania programu. Oznacza to, że platforma do tworzenia rozszerzeń pozwala udostępniać elastyczne aplikacje, w których można wykorzy­ stać nowe funkcje dynamicznie dodawane w różnych momentach. Proces dodawania funkcji nie wymaga całościowej wymiany lub aktualizacji podstawowego monolitycznego pliku wyko­ nywalnego.

Korzystanie z platformy MEF Aplikacje MEF są oparte na małym zestawie podstawowych elementów: kontenerze łączącym, katalogu i częściach. Są to zarówno abstrakcyjne pojęcia, jak i odpowiadające im rzeczywiste interfejsy API, z których można korzystać w kodzie zarządzanym. Wszystkie klasy platformy MEF znajdują się w przestrzeni nazw System.ComponentModel. Composition i w przestrze­ niach podrzędnych, takich jak System. ComponentModel. Composition. Hosting.

Części Część w platformie MEF to podstawowa jednostka funkcjonalna. Części mogą udostępniać zestawy funkcji (tak zwane jednostki eksportowane), a także korzystać z funkcji oferowanych przez inne części (tak zwanych jednostek importowanych). Jednostki eksportowane i importowane są określane za pomocą kontraktów. W kodzie kontrakty zapisuje się przy użyciu atrybutów deklaratywnych odpowiadających importowaniu (System. ^-►ComponentModel.Composition. ImportAttribute) i eksportowaniu (System.Component

■-►Model. Composition. Export At t ribute). Oto przykład klasy w języku C# deklarującej jednostkę eksportowaną: [Export(typeof(IMyExtensionProvider))] internal class TestExtensionProvider

Kontener łączący Kontener łączący to główny elem ent aplikacji MEF wykonujący wszystkie skomplikowane operacje. Przechowuje dostępne części, obsługuje tworzenie ich egzemplarzy, a także pełni funkcję głównego silnika łączenia w MEF. W tym kontekście łączenie to proces dopasowywania potrzebnych usług (jednostek importowanych) do usług publikowanych (jednostek eks­ portowanych).

Rozdział 16. Rozbudowywanie edytora kodu przy użyciu platformy MEF W aplikacji nadrzędnej można utworzyć egzemplarz kontenera za pomocą klasy System.

'-►ComponentModel. Composition. Hosting. CompositionContainer: private CompositionContainer

container;

Katalog Katalog działa jak rejestr i mechanizm wykrywania części. Jest wykorzystywany przez konte­ ner łączący. Platforma MEF udostępnia domyślny zestaw katalogów. Każdy z nich służy do wykrywania części z określonej lokalizacji źródłowej lub docelowej. Istnieje katalog typów (klasa TypeCatalog) do wykrywania części z danego typu platformy .NET, katalog podzespołów (klasa AssemblyCatalog) do wykrywania części z podzespołu i katalog folderów (klasa Di recto ryCatalog) do wykrywania części zapisanych w danym folderze. Czwarta klasa, AggregateCatalog, umożliwia łączenie kilku katalogów, tak aby części z róż­ nych źródeł mogły znaleźć się w jednym katalogu nadrzędnym. Egzemplarz katalogu można przekazać do konstruktora obiektu CompositionContainer. Poniższy kod tworzy nowy kontener łączący i określa katalog części, które można wykryć w danym podzespole: var catalog = new TypeCatalog(typeof(MyExtension)); CompositionContainer container = new CompositionContainer(catalog);

Diagram na rysunku 16.1 przedstawia architekturę platformy MEF w abstrakcyjnej postaci. Rysunek 16.1. Uproszczony obraz architektury platformy MEF

Edytor środowiska Visual Studio i platforma MEF Choć MEF to platforma do tworzenia rozszerzeń do użytku ogólnego, którą można stosować w wielu warunkach, szczególnie dobrze nadaje się do wzbogacania edytora kodu środowiska Visual Studio. Wynika to z prostej przyczyny — sam edytor został opracowany przez Microsoft za pomocą platformy MEF.

C zę ść IV Wzbogacanie środowiska Visual Studio Oznacza to, że edytor kodu składa się z zestawu części platformy MEF. Dodanie nowych części w celu wzbogacenia i zmiany działania edytora wymaga tylko zastosowania wzorców projekto­ wych platformy MEF oraz napisania własnych części, które edytor może wykryć i wykorzystać. W rozdziale 15., „Tworzenie dodatków i kreatorów”, w omówieniu tworzenia dodatków środowiska Visual Studio wspomnieliśmy, że trzeba zrozumieć dwie rzeczy — proces rozwijania dodatków i interfejs API udostępniany dodatkom przez środowisko Visual Studio. W czasie korzystaniu z edytora i platformy MEF obowiązują te same zasady. Jeśli programista chce wzbogacić edytor, musi zrozumieć mechanizm tworzenia rozszerzeń (platformę MEF), a także specyficzne punkty dołączania rozszerzeń (jednostki eksportowane platformy MEF) udostępniane przez edytor. Opisaliśmy już proces korzystania z platformy MEF. Teraz może­ my wyjaśnić, jak w środowisku Visual Studio utworzyć projekt oparty na MEF, i opisać liczne punkty dołączania rozszerzeń dostępne w edytorze. Jeśli programista chce wzbogacić edytor, musi poznać udostępniane przez niego punkty dołą­ czania rozszerzeń. Oznacza to, że trzeba wiedzieć, które obszary działania edytora można ła­ two zastąpić lub wzbogacić za pomocą części platformy MEF.

Punkty dołączania rozszerzeń do edytora Edytor kodu środowiska Visual Studio posiada specyficzny interfejs API udostępniany poprzez platformę MEF. Oznacza to, że istnieje zestaw jednostek eksportowanych edytora, które m oż­ na wykorzystać we własnych częściach MEF do wzbogacania edytora w potencjalnie nieogra­ niczonym zakresie. Obsługiwane są prawie wszystkie funkcje edytora. Poniższe obszary to poprawne punkty dołą­ czania rozszerzeń udostępniane przez edytor środowiska Visual Studio: Rodzaje zawartości. W kontekście edytora kodu środowiska Visual Studio rodzaj zawartości to typ tekstu i składni przetwarzany przez edytor oraz zrozumiały dla nie­ go. Jeśli uwzględnimy języki, rodzaje zawartości w Visual Studio bezpośrednio od­ powiadają różnym składniom i formatowaniu tekstu zrozumiałego w środowisku, na przykład zwykłemu tekstowi, kodowi w językach C#, HTML, XML, XAML i tak dalej. Typy klasyfikacyjne i formatowanie. Typy klasyfikacyjne to pojawiające się w do­ kumencie rodzaje tekstu, które edytor Visual Studio rozumie i wyszukuje. W stan­ dardowym pliku w języku C# edytor rozpoznaje wystąpienia liczb i łańcuchów zna­ ków, ponieważ są to domyślne typy klasyfikacyjne wbudowane w Visual Studio. Dla każdego typu klasyfikacyjnego można zdefiniować formatowanie. Klasycznym przy­ kładem jest wyróżnianie i kolorowanie tekstu stosowane w edytorze na przykład dla literałów łańcuchowych i komentarzy. Marginesy i suwaki. W fizycznym układzie edytora kodu powierzchnia wizualna jest zdominowana przez obszar z tekstem, gdzie znajduje się kod. Wokół znajdują się suw a­ ki i marginesy (zawierające między innymi informacje związane z punktami przerwania). Marginesy i suwaki można dostosować do potrzeb za pomocą części platformy MEF.

Rozdział 16. Rozbudowywanie edytora kodu przy użyciu platformy MEF • T agi. Tagi to obiekty, które umożliwiają powiązanie danych z różnymi rodzajami tekstu w edytorze. Na przykład tag linii falistej, S q u ig g le T a g , służy w środowisku Visual Studio do wiązania błędów składni z nierozpoznanymi fragmentami tekstu. Dane wiązane z linią falistą to błąd składni zgłoszony przez kompilator. Dane poja­ wiają się w podpowiedzi po umieszczeniu kursora myszy nad linią. • Dekoracje. Dekoracje to wizualne obiekty pojawiające się w edytorze. Fizycznie mają one postać obiektów platformy WPF i mogą znajdować się w różnych warstwach w edytorze. Dlatego dekoracja może zajmować ten sam obszar, co tekst lub „unosić się” nad nim. • M echanizm y obsługi myszy. Mechanizmy obsługi myszy to punkty dołączania roz­ szerzeń, które umożliwiają przechwytywanie i obsługę danych wyjściowych przeka­ zywanych za pośrednictwem myszy. • M echanizm y obsługi upuszczania. Mechanizmy obsługi upuszczania umożliwiają reagowanie na różne typy obiektów upuszczane na powierzchnię projektową. Visual Studio posiada bibliotekę rozpoznawanych typów formatów, w tym plików , wpro­ wadzanych za pomocą pióra danych, kodu w XAML-u czy rysunków w formacie TIFF lub bitmap. • Opcje. Za pomocą platformy MEF można definiować, przechowywać i obsługiwać własne zestawy niestandardowych opcji edytora. • IntelliSense. Mechanizm IntelliSense omawiamy szczegółowo w rozdziale 8., „Korzy­ stanie z narzędzi zwiększających produktywność”. Za pomocą platformy MEF można pisać własne funkcje tego mechanizmu.

Korzystanie z pakietu Visual Studio SDK Oprócz zrozumienia punktów' dołączania rozszerzeń edytora trzeba zrobić jeszcze jeden klu­ czowy krok — zainstalować pakiet Visual Studio SDK. Jest to zestaw narzędzi i szablonów projektów, które pomagają programistom w dostosowywaniu środowiska IDE do własnych potrzeb. Pakiet SDK jest szczególnie związany z rozszerzaniem edytora, ponieważ obejmuje zestaw szablonów projektów i przykładów, które pomagają w szybkim rozpoczęciu rozwijania rozszerzeń. Odnośniki umożliwiające pobranie pakietu SDK środowiska Visual Studio 2010 znajdują się w centrum Visual Studio Extensibility w witrynie MSDN — h ttp : //m s d n .m ic r o s o f t.c o m /p l- p l/ v s tu d io /v e x te n d ( e n - u s ) .a s p x .

Po pobraniu i zainstalowaniu pakietu SDK w oknie dialogowym N e w P ro jec t dostępny będzie nowy zestaw szablonów projektów (zobacz rysunek 16.2). Wspomniane szablony znajdują się w kategorii E x te n s ib ility . W tym rozdziale interesują nas cztery szablony związane z edytorem — E d ito r C lassifier, E d ito r M a rg in , E d ito r T e x t A d o r n m e n t i E d ito r V ie w p o r t A d o r n m e n t.

C zę ść IV Wzbogacanie środowiska Visual Studio

Online Templates

Rozdział 16. Rozbudowywanie edytora kodu przy użyciu platformy MEF

Szablon Editor Classifier Szablon Editor Classifier tworzy część MEF, która eksportuje mechanizm klasyfikujący do obsługi wyróżniania składni w edytorze. Za obsługę odpowiada zestaw klas domyślnych, które można dostosować w celu utworzenia własnego mechanizmu klasyfikującego. Stosując oma­ wiany projekt jako punkt wyjścia, można dodać rozpoznawanie określonej składni przez edy­ tor i wyświetlanie pasującego tekstu w podany sposób.

Uwaga W czasie przeglądania plików wygenerowanych przez projekty rozszerzeń warto zauważyć, że kod bezpośrednio odpowiada opi­ sanym wcześniej punktom dołączania rozszerzeń. Na przykład szablon E d it o r C la s s ifie r jest bezpośrednio związany z punktem dotyczącym typów klasyfikacyjnych i formatowania.

Projekt E d i t o r C la s s ifie r eksportuje nowy mechanizm klasyfikacyjny używany przez edytor po wczytaniu projektu w środowisku IDE. Definicja m echanizmu klasyfikacyjnego — czyli ro­ dzaju rozpoznawanego tekstu — znajduje się w klasie E d ito rC lassif ie rl. Klasa ta zawiera implementację interfejsu IC la s s if ie r i właściwość G etC lassificationSpans, która od­ powiada za rozpoznawanie określonego rodzaju tekstu. Domyślnie szablon wykrywa każdy tekst. Programista może dopracować kod, aby wykrywał pożądane wzorce tekstowe.

Uwaga Wszystkie szablony rozszerzeń platform y MEF tworzą klasy i typy 0 nazwach generowanych na podstawie nazwy projektu. Jeśli pro­ gramista zastosuje domyślną nazwę projektu, EditorClassifierl, powstaną klasy EditorClassifierl, EditorClassifierlForm 1 tak dalej. Po nazwaniu projektu w inny sposób nazwy typów będą odmienne.

Mechanizm klasyfikujący nie tylko rozpoznaje klasę tekstu, ale też odpowiada za sposób wy­ świetlania tekstu w edytorze. Przykładowo, słowa kluczowe są wyróżniane innym kolorem, podobnie jak komentarze i inne elem enty. Wszystkie te operacje są wykonywane w klasie EditorClassifierlFormat. W ygenerowany kod ustawia kolor tła na BlueViolet i dodaje podkreślenie tekstu, jednak można zmienić te ustawienia na dowolne inne. // /

I I I Defines the visual formal fo r the “EditorClassifierl" classification type I I I

public EditorClassifierlFormatO { this .DisplayName = "EditorClassifierl"; / / human readable version o f the name this.BackgroundColor = Colors.BlueViolet; this.TextDecorations = System.Windows.TextDeco rat ions.Underline;

>

C zę ść IV Wzbogacanie środowiska Visual Studio

Rozdział 16. Rozbudowywanie edytora kodu przy użyciu platformy MEF

Szablon Editor Text Adornment Dekoracje tekstu są — jak wskazuje na to nazwa — graficznymi wyróżnikami tekstu w oknie edytora. Szablon E d i t o r T e x t A d o r n m e n t tworzy projekt, który ozdabia każde wystąpienie litery A szarym tłem i czerwonym obram owaniem (zobacz rysunek 16.4). W kodzie, podobnie jak w projektach E d i t o r M a r g in , można stosować obiekty platformy WPF. Rysunek 16.4. Tworzenie dekoracji tekstu w edytorze

Dekoracje znajdują się w różnych warstwach edytora. Tu dekoracja jest zaimplem entowana w tej samej warstwie, w której wyświetlany jest tekst (to właśnie sprawia, że jest to dekoracja tekstu). Warto zauważyć, że edytor nie zmienia czcionki liter A w celu zmiany tła. Mechanizm dekorujący korzysta z platformy WPF do wyświetlenia czerwonego bloku za tekstem. Blok jest następnie synchronizowany przy przenoszeniu tekstu w edytorze (odbywa się to przez ponowne generowanie grafiki przy każdej zmianie układu w oknie edytora). public TextAdornmentKIWpfTextView view)

{ view = view; layer = view.GetAdornmentLayer("TextAdornmentl"); / / Listen to any went that changes the layout (text changes, scrolling, etc)

view.LayoutChanged += OnLayoutChanged; / /C reate the pen and brush to color the box behind the a 's

Brush brush = new SolidColorBrush(Color.FromArgb(0x20, 0x00, 0x00, Oxff)); brush.Freeze!); Brush penBrush = new SolidColorBrush(Colors.Red); penBrush.Freeze!); Pen pen = new Pen(penBrush, 0.5); pen.Freeze!); brush = brush; pen = pen;

}

C zę ść IV Wzbogacanie środowiska Visual Studio

Szablon Editor Viewport Adornment Projekt dekoracji okna przypomina projekt dekoracji tekstu, ale dotyczy innej warstwy edytora. Nie jest to warstwa zawierająca tekst, co stanowi niewielką, ale istotną różnicę. Dekorowanie okna umożliwia wprowadzenie elem entów wizualnych, które nie są bezpośrednio powiązane z żadnym konkretnym fragmentem tekstu i mogą znajdować się przed lub za warstwą tekstu. Przykładowy efekt generowany przez szablon polega na umieszczeniu prostego fioletowego pola w prawym górnym rogu edytora (zobacz rysunek 16.5). Rysunek 16.5. Dekoracja okna edytora

Pod względem struktury poniższy kod tylko nieznacznie różni się od kodu dekoracji tekstu. Klasa dekoracji, Viewport Ado rnmentl, używa tych samych obiektów pędzli platformy WPF do rysowania elementów. Kluczowa różnica związana jest z warstwą wizualną używaną przez klasę fabryki, Viewport Ado rnmentl Factory. Aby porównać obie wersje, przyjrzyjmy się najpierw klasie fabryki z poprzedniego projektu. [Export(typeof(IWpfTextViewCreationListener))] [ContentType("text")] [TextViewRole(PredefinedTextViewRoles.Document)] internal sealed class TextAdornmentlFactory : IWpfTextViewCreationListener

{ ///

/ / / Defines the adorn men! layer fo r die adornment. This layer is ordered I I I after the selection layer in the Z-order / / /

[Export(typeof(AdornmentLayerDefinition))] [Name("TextAdornmentl")] [Order(After = PredefinedAdornmentLayers.Selection, Before = PredefinedAdornmentLayers.Text)]

Rozdział 16. Rozbudowywanie edytora kodu przy użyciu platformy MEF [TextViewRole(PredefinedTextViewRoles.Document)] public AdornmentLayerDefinition editorAdornmentLayer = null; /// ///

Instantiates a TextAdornment I manager when a text View is created.

/// III ///

The ł p u b l i c C o d e M e tr i c A d o r n m e n t( I W p f T e x t V l e w v i e w )

na

____________

-

K Task List hem (s) Saved

m

:! ’.r

c r [. pic- rei ^ M acro Explorer

Output C d 17

C h 17

Rysunek 16.8. Tworzenie nowego projektu dekoracji

Teraz otwórzmy klasę CodeMetricAdornment. W klasie należy dodać pole do przechowywa­ nia obiektu kontrolki użytkownika WPF i pozbyć się obecnego pola Image używanego w ko­ dzie szablonu: private CodeMetricDisplayControl displayControl = new CodeMetricDisplayControl();

Do algorytmu obliczającego statystyki przejdziemy za chwilę. Najpierw skoncentrujmy się na utworzeniu prostej kontrolki użytkownika WPF przeznaczonej do wyświetlania danych na temat kodu. Należy dodać do projektu nową kontrolkę użytkownika WPF i nazwać ją CodeM etric '-►DisplayControl. Kontrolka ma wyświetlać trzy wartości i ich etykiety. Dobrze nadaje się do tego tabela. Ponieważ kontrolka Grid jest domyślnie dodawana jako podstawowy element układu kontrolki użytkownika, wystarczy nieco dopracować wygląd tabelki. Dodajmy do niej trzy wiersze i dwie kolumny:

cColumnDefinition Width="auto" /> cColumnDefinition Width="*“ />

Rozdział 16. Rozbudowywanie edytora kodu przy użyciu platformy MEF



W tabelce należy umieścić sześć obiektów T extB lock — trzy na etykiety i trzy na wartości: dextBlock Grid.Column="0" Grid.Row="0" VerticalAlignment="Center" x :Name="TextBlockLOC" Padding="5">Łączna liczba wierszy: Wiersze komentarzy: Puste wiersze: 0 0 0

W klasie C od eM etricD isp layC on trol należy dodać właściwości powiązane z wyświetlanymi liczbami całkowitymi: public partial class CodeMetricDisplayControl : UserControl

i private int _loc = 0; / / Łączna liczba wierszy. private int whitespace = 0; // Wiersze puste. private int comments = 0; // Wiersze z komentarzami. public int LinesOfCode

{ get { return loc; } set { loc = value; RefreshO; }

public int CommentLines

{ get { return comments; } set { comments = value; Refresh!); }

public int WhitespaceLines

{ get { return whitespace; } set { whitespace = value; Refresh!); }

C zę ść IV Wzbogacanie środowiska Visual Studio p u b lic Cod eM etricD isplayCo n tro l() { In itia lize C o m p o n e n tO ; } } W arto zauważyć, że w każdej metodzie Set wywoływana jest procedura Refresh. Napiszmy tę procedurę. Powinna o n a aktualizow ać elem enty TextBlock za pom ocą ak tu aln ej wartości przechowywanej w jednym z pól związanych ze statystykami: p riva te void R e fre sh () { this.TextBlockCom m ents.Text = comments.T o S trin g (); th is.T e xtB lo ckLO C .T e xt = _ lo c .T o S trin g ( ) ; this.TextB lockW hitespace.Text = w h ite sp a ce .T o S trin g () ; > Kontrolka użytkownika WPF jest gotowa do pracy (pomijamy na razie jej wygląd i styl). Wróćmy do klasy dekoracji i napiszm y kod do zliczania wierszy kodu, kom entarzy i pustych. W klasie CodeMetricAdornment należy usunąć z konstruktora cały kod platform y WPF słu­ żący do rysowania. Zamiast niego trzeba wstawić trzy wiersze ustawiające właściwości kontrolki użytkownika na podstaw ie wartości zwróconych przez kilka pryw atnych p ro c e d u r (napi­ szem y je w następnym kroku): p u b lic CodeMetricAdornmenttIWpfTextView view) { view = view; displayControl.LinesO fCode = CountLOC(view); adornmentLayer = view.GetAdornment Layer ( "CodeMet ricAdornment"); view .ViewportHeightChanged += delegate { th is.o n S ize C h a n g e (); } ; view.ViewportWidthChanged += delegate { th is.o n S ize C h a n g e (); } ; } Kod do zliczania wierszy kodu jest prosty. Należy użyć obiektu IWpfTextView udostępnianego przez dekorację i pobrać łańcuch znaków reprezentujący cały tekst w oknie edytora: s trin g code = view .TextSnapshot.G etText(); Teraz można przetworzyć łańcuch i zwrócić różne wartości: private in t CountL0C(IWpfTextView view) { strin g code = view .TextSnapshot.G etText(); in t count = 1; in t sta rt = 0;

Rozdział 16. Rozbudowywanie edytora kodu przy użyciu platformy MEF w h ile ( ( s t a r t = cod e.In dexO f( ' \ n ' , s t a r t ) ) != -1) { count++; s ta rt+ + ; } return count; } p riv a te in t CountW hitespaceLines(IWpfTextView view) { s t r in g code = view .TextSnapshot.G etText(); in t count = 0; using (StringReader reader = new S trin gR e ad e r(co d e )) { s t r in g lin e ; w h ile ( ( lin e = reader. ReadLine()) != n u ll) { i f (lin e .T rim O == "") count++; } return count; } } p riv a te in t CountCommentLines( IWpfTextView view) { s t r in g code = view .TextSnapsh o t.G etText(); in t count = 0; using (StringReader reader = new Strin gR e ad e r(co d e )) { s t r in g lin e ; w h ile ( ( lin e = reader. ReadLine()) != n u ll) { i f ( lin e .T r im S t a r t ( ) .S ta rts W ith (" // " )) count++; > return count; > > To już prawie koniec. Ostatni fragment kodu szablonu, który trzeba zmienić, to m etoda obsługi zdarzenia OnSizeChange. Obecnie jest ona dostosowana do przenoszenia i wyświetlania kontrolki WPF Image, pierw otnie używanej przez szablon. Jednak chcem y, aby kod p rz e n o sił i wy­ świetlał kontrolkę WPF użytkownika. Należy zmienić kod m etody OnSizeChange w n astępu­ jący sposób:

C zę ść IV Wzbogacanie środowiska Visual Studio p u b lic void onSizeChange() { //

Usuwanie wcześniejszych dekoracji z ich warstwy.

adornmentLayer .RemoveAllAdornments() ; //

Umieszczanie rysunku w prawym górnym rogu okna.

Canvas. S e t L e ft ( d isp la yC o n tro l, view .View portRight - d isp la y C o n tro l.ActualW idth); Canvas.SetTop( d isp la yC o n tro l, view.ViewportTop + d isp la yC o n tro l.A ctu alH eigh t); / / Dodawanie rysunku do warstwy dekoracji i określanie jego / / lokalizacji względem okna.

adornmentLayer. AddAdornmert ( Adornm entPositioningBehavior.View portRelative, n u ll, n u ll, d isp la yC o n tro l, n u ll) ; } Teraz kontrolka ma określoną pozycję w warstwie dekoracji okna. Jeśli u ru c h o m im y projekt, a następnie otworzymy plik z kodem w środow isku IDE, w prawym g ó rn y m rogu edytora natychm iast zobaczymy efekty pracy. W im plem entacji nadal występuje pewien problem. Choć statystyki na tem at kodu są wyświe­ tlane popraw nie, nie są aktualizow ane po zmianie tekstu w edytorze. Aby to popraw ić, musimy dodać reakcję na zdarzenie IWpfTextViewLayoutChanged w warstwie dekoracji. To zdarze­ nie m ożna podłączyć w konstruktorze CodeMetricAdornment: vie w .LayoutChanged += this.OnLayoutChanged; N astępnie należy utworzyć m etodę obsługi zdarzenia, aktualizującą liczby: p riva te void OnLayoutChanged(object sender, TextViewLayoutChangedEventArgs e) { d isp la y C o n tro l. LinesOfCode = CountLOCt view ); d isp la y C o n tro l. CommentLines = CountCommentLines( view); d isp la y C o n tro l.WhitespaceLines = CountWhitespaceLines( v ie w ); } M ożna też zwiększyć atrakcyjność wyglądu k o n tro lk i użytkow nika W PF, m odyfikując kod w języku XAML w celu dodania gradientu tła, kolorow ania tekstu i tak dalej. Rysunek 16.9 przedstawia gotowy produkt, a na listingu 16.1 widoczny jest kod klasy dekoracji. Pełny kod źródłowy projektu m ożna pobrać ze strony poświęconej książce. L is tin g 1 6 .1 .

Klasa CodeMetricAdornment

using System.10; using System.Windows.Controls; using System.Windows.Media; using M icro so ft.V isu a lS tu d io .T e x t.E d ito r;

Rozdział 16. Rozbudowywanie edytora kodu przy użyciu platformy MEF

Toolbox

namespace CodeMetricAdornment { I I I I I I Klasa dekoracji wyświetlająca prostokątne pole I I I w prawym górnym rogu okna. I I I

c la s s CodeMetricAdornment { p riv a te IWpfTextView view; p riv a te IAdornmentLayer adornmentLayer; p riv a te CodeM etricDisplayControl d isp la y C o n tro l = new CodeM etricD isplayControl!); p u b lic CodeMetricAdornment(IWpfTextView view) { view = view; d isp la y C o n tro l. LinesOfCode = CountL0C(view); displayControl.Com m entLines = CountCommentLines( vie w ); d isplayControl.W hitespaceLines = CountW hitespaceLines(view ); adornmentLayer = view.GetAdornmentLayer("CodeMetricAdornment"); view.LayoutChanged += this.OnLayoutChanged;

C zę ść IV Wzbogacanie środowiska Visual Studio view.ViewportHeightChanged += delegate { th is.o n Size C h an ge (); } ; view. ViewportWidthChanged += delegate { th is.o n Size C h an ge () ; } ; p u b lic void onSizeChange() { //

Usuniecie wcześniejszych dekoracji z ich warstwy.

adornmentLayer.RemoveAllAdornments(); in t buffer = 50; //

Umieszczanie rysunku w prawym górnym rogu okna.

C a n v a s.S e tLe ft(d is p la y C o n t r o l, view .View portRight - ( d is p la y C o n tro l.ActualWidth + b u ffe r )); Canvas.SetTop( d isp la y C o n tro l, view.ViewportTop + ( d isp layC o n tro l.A ctualH eight + b u ffe r )); adornment La y e r.AddAdornment( Adornm entPositioningBehavior.View portRelative, n u ll, n u ll, _ d isp la y C o n tro l, n u ll) ; p riva te void OnLayoutChanged(object sender, TextViewLayoutChangedEventArgs e) { d isp la y C o n tro l. LinesOfCode = CountL0C( view ); displayControl.Com mentLines = CountCommentLines( view ); displayControl.W hitespaceLines = CountWhitespaceLines( view ); } p riva te Int CountL0C(IWpfTextView view) { strin g code = view .TextSnapshot.G etText(); in t count = 1; in t sta rt = 0; while ((s t a r t = code.IndexOf( * \n ', s t a r t ) ) != -1) { count++; start++; > return count; > p rivate in t CountWhitespaceLines(IWpfTextView view) { strin g code = view .TextSnapshot.G etText( ) ; in t count = 0; using (StringReader reader = new Strin gR ead er(co d e )) { strin g lin e ;

Rozdział 16. Rozbudowywanie edytora kodu przy użyciu platformy MEF w h ile ( ( lin e = re a d e r.ReadLinef)) != n u ll) { i f ( li n e . Trim () == "") count++; } return count; } > p riv a te in t CountCommentLines( IWpfTextView view) { s t r in g code = view .TextSnapshot.G etText( ) ; in t count = 0; u sin g (StringReader reader = new Strin gR ead er( code)) { s t r in g lin e ; w h ile ( ( lin e = reader.R ead Line()) != n u ll) { i f ( lin e .T r im S t a r t ( ) . S ta rtsW ith (" / / " ) ) count++; > return count; } } } >

Podsumowanie W tym rozdziale zbadaliśmy nową bibliotekę platform y .N E T , M anaged Execution Fram e­ work, i sposoby korzystania z niej podczas pisania rozszerzeń edytora środowiska Visual Studio. Omówiliśmy ogólnie architekturę platfo rm y MEF, w tym m echanizm wykrywania rozszerzeń i podstawowe elem enty — części oraz jednostki im portow ane i eksportow ane. Opisaliśmy też wszystkie punkty d o łączan ia rozszerzeń specyficzne dla środowiska Visual Studio 2010. Ponadto podkreśliliśmy w artość pakietu SDK V isual Studio, która w ynika z go­ towego zestawu szablonów rozszerzeń przeznaczonych dla poszczególnych punktów dołącza­ nia rozszerzeń do edytora. W ostatnim fragmencie rozdziału prześledziliśmy tw orzenie ro zszerzen ia edytora, w którym wykorzystano warstwę dekoracji edytora do wyświetlania trz e ch statystyk na temat kodu za pomocą kontrolki użytkownika opartej na platform ie WPF.

CZĘŚĆ V TWORZENIE APLIKACJI DLA PRZEDSIĘBIORSTW

Rozdział 17. Tworzenie aplikacji ASP.NET

713

Rozdział 18. Tworzenie aplikacji opartych na formularzach Windows

821

Rozdział 19. Tworzenie bogatszych i bardziej inteligentnych interfejsów użytkownika Rozdział 20. Tworzenie bogatych aplikacji internetowych 903 Rozdział 21. Praca z bazami danych

941

Rozdział 22. Aplikacje oparte na usługach

1011

Rozdział 23. Dodawanie procesów do aplikacji

1061

Rozdział 24. Tworzenie aplikacji biznesowych opartych na pakiecie Office

1129

Rozdział 25. Aplikacje działające w chmurze i technologia Windows Azure

1157

859

Rozdział 17. Tworzenie aplikacji ASP.NET

Część V

Tworzenie aplikacji dla przedsiębiorstw

W tym rozdziale: •

Podstawy tworzenia witryn ASP.NET



Projektowanie interfejsu użytkownika



Praca z kontrolkami ASP.NET



Tw orzenie aplikacji ASP.NET MVC

Tw orzenie rozwiązań sieciowych to je d n o z zagadnień, którym twórcy najnowszej wersji Visu­ al Studio poświęcili najwięcej uwagi. Podobnie jak w starszych wydaniach, tak i w wersji 2010 zmodyfikowano techniki rozwijania aplikacji sieciowych przy użyciu platformy .NET. W nowej edycji dodatkow o usprawniono obsługę pamięci podręcznej, przechow yw anie stanu sesji, for­ mularze sieciowe, aplikacje oparte na danych, obsługę Ajaksa i scenariuszy wdrażania. Pojawiła się też nowa kontrolka do tworzenia wykresów i mechanizm tworzenia opartych na stan d ard ach witryn w architekturze MVC (ang. model-view-controiler). fen rozdział m a przede wszystkim pom óc programistom rozwiązań sieciowych w wykorzystaniu technologii ASP.NET do tw orzenia aplikacji działających w przeglądarce, których kod jest urucham iany po stronie serwera. Program y tego typu mają największy zasięg, poniew aż dzia­ łają na różnych platformach i w różnych przeglądarkach z obsługą języka HTML. Oczywiście, tworzenie rozwiązań sieciowych nie ogranicza się do aplikacji opartych na przeglądarkach. Więcej informacji o technologiach XBAP, AJAX i Silverlight zawńera rozdział 20., „Tworzenie bogatych aplikacji internetow ych”. Programiści, którzy chcą tworzyć aplikacje o p arte na języ­ ku XAMI. przy użyciu platformy WPE Microsoftu, powinni zapoznać się z rozdziałem 19., „Two­ rzenie bogatszych i bardziej inteligentnych interfejsów użytkow nika”.

Uwaga ASP.NET to rozległy temat. N ie jesteśm y w stanie szczegółow o opisać jego wszystkich aspektów. Zamiast tego skoncentrujem y się na tym, jak za pomocą Visual Studio zwiększyć wydajność tworzenia interfejsów użytkownika opartych na sieci. Jest to te­ mat istotny dla wszystkich program istów aplikacji sieciowy ch. Oczekujemy, że po utworzeniu interfejsu ASP.NET C zytelnik od­ kryje tematy, które wymagają dalszego zgłębienia. Spróbujem y je wskazać w treści tego rozdziału. Niektóre przykłady dotyczą przyna­ leżności, profili użytkowników, zarządzania pam ięcią podręczną, administracji witrynami i komunikacji pomiędzy stronami.

Najpierw om ów im y podstawy definiow ania w Visual Studio projektów sieciowych i tw orzenia prostych form ularzy internetow ych. N astępnie p rzejdziem y do bardziej zaaw ansow anych zagadnień i pokażemy, jak zaprojektować spójny interfejs użytkownika z wykorzystaniem stron

Rozdział 17. Tworzenie aplikacji ASP.NET wzorcowych, kompozycji, elem entów Web Part i w iązania danych. Potem om ów im y podsta­ wowy zestaw kontrolek wbudowanych w ASP.NET. N a końcu opiszemy, jak wdrażać aplikacje ASP.NET.

Podstawy tworzenia witryn w ASP.NET Tworzenie witryn w Visual Studio zaczyna się od projektu. Projekt witryny stanowi powiązanie pom iędzy Visual Studio, roboczą wersją witryny (więcej informacji znajduje się w rozdziale 4., „Rozwiązania i projekty”) i serwerem W WW — lokalnym albo zdalnym. Jednak pojęcie witryny ciągle ew oluuje i rozszerza się. Rzadko już tworzone są proste strony HTML z łączam i i obrazam i. Nie są one określane p o ­ ważnie jako witryny. W rzeczywistości platform a .NET doprowadziła do zm iany definicji, znacznie wykraczając poza oryginalny model ASP obejmujący kod w HTM L-u i skrypty u ru­ cham iane po stronie serwera. Dzisiaj witryna oznacza interaktywne formularze sieciowe, kom ­ pilow any kod, który łączy te formularze z warstwą p o śre d n ią, stro n am i wzorcowymi, kompozy­ cjam i, konfiguracją zabezpieczeń, przynależności i pam ięci podręcznej, bazam i danych, wiązaniem danych i tak dalej. W Visual Studio 2010 połączono te mechanizmy i umożliwiono tworzenie bogatych, nowoczesnych witryn, które zapewniają interakcję na niespotykanym dotąd poziomie. W następnych podrozdziałach będziemy rozważać konstruowanie nowoczesnych wi­ tryn oraz sposób ich tworzenia i konfigurowania.

Tworzenie nowego projektu witryny lub aplikacji sieciowej Środowisko Visual Studio umożliwia tworzenie projektów witryn i aplikacji sieciowych. Oba rodzaje projektów są reprezentow ane przez szablony wyznaczające dom yślne katalogi, konfi­ gurację, formularze sieciowe i inne pliki oraz ustaw ienia. W itryna to uproszczony szablon projektu służący do tworzenia serwisów, które są zwykle w drażane jako zestaw plików. Projekt aplikacji sieciowej ma standardow ą strukturę rozw iązania i projektu znaną z Visual Studio. Obejm uje plik projektu definiujący zawartość i stru k tu rę witryny (projekt witryny nie obej­ muje takiego pliku). Projekty aplikacji sieciowych są przydatne, jeśli program ista potrzebuje precyzyjnej kontroli nad kompilacją, podzespołami wyjściowymi i referencjami do stron w klasach. Dla większości program istów wygodniejsze jest stosow anie projektów witryn. W tym rozdziale koncentrujem y się na szablonach witryny. Aby utw orzyć nową w itrynę, należy użyć okna dialogow ego New Web Site (opcja File/New/ Web Site). Okno dialogowa New Web Site nieco różni się od standardow ego okna służącego do tworzenia nowych projektów. Przedstawiono to na rysunku 17.1. Warto zauważyć, że po lewej stronie okna dialogowego najpierw trzeba wybrać dom yślny język w itryny (Visual Basic lub Visual C#). Można też określić szablon, wersję platform y .NET, lokalizację i nazwę witryny.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Wybieranie szablonu witryny Visual Studio Visual Studio instaluje domyślnie przynajmniej dziewięć szablonów ASP.NET. Można wybrać jeden z nich zgodnie ze swoimi potrzebami, jednak większość witryn opartych jest na standardowym sza­ blonie A S P .N E T W e b Site. Poniżej przedstawiamy omówienie licznych szablonów ASP.NET: • ASP.N ET Web Site — reprezentuje standardow ą w itrynę ASP.NET z katalogiem App_Data , formularzem sieciowym Default.aspx, plikiem web.config, stroną wzorcową (Site.master), arkuszem stylów (Site.css) i plikiem Global.asax. Obejmuje też katalog Ac­ count przechowujący strony do zarządzania procesem logowania i kontami użytkowni­ ków. W szablonie domyślnie dostępne są również skrypty JQuery (w katalogu Scripts). Oczywiście, w czasie rozwijania witryny program ista może dodać dalsze katalogi i pliki. Jest to najczęściej używany szablon do tworzenia nowych witryn. • ASP .N ET Web Service — reprezentuje witrynę działającą jako usługa sieciowa oparta na języku XMI, (więcej informacji na ten temat znajduje się w rozdziale 22., „Aplikacje oparte na usługach ”). Ten szablon zawiera usługę Service.asmx (obejm uje ona kod podstawowej usługi sieciow ej), katalog App_Code przechowujący pliki klas usługi, katalog App_Data na dane dostępne w technologii ASP.NET i plik web.config prze­ znaczony do zarządzania konfiguracją witryny. • Em pty Web Site — reprezentuje projekt witryny pozbaw iony w szystkich katalogów i plików (wyjątkiem jest plik web.config). Można użyć tego k ontenera p ro jek tu jako punktu wyjścia Nie wykorzystuje on plików ani katalogów. Zam iast tego należy jawnie dodać te elementy zgodnie ze swoimi wymaganiami.

Rozdział 17. Tworzenie aplikacji ASP.NET •

WCF Service — służy do tworzenia witryn obejmujących usługi W CF (więcej szcze­ gółów na ten tem at znajduje się w rozdziale 22.). Szablon ten, podobnie jak Web Se­ rvice, zawiera standardow e katalogi App_Code i App_Datc oraz plik Web.config, jednak plik usługi ma tu nazwę Service.svc. Zawiera on szkielet klasy reprezentującej usługę opartą na WCF (nie na języku XML), którą m ożna odpowiednio skonfigurować.

• ASP.NET Reports Web Site — tworzy w itrynę do generowania raportów sieciowych za pomocą narzędzi M icrosoft Report Viewer. Tworzenie takiej strony ma na celu nie tylko przeciągnięcie raportu do projektu i dodanie referencji do odpowiednich bibliotek, ale także uruchomienie kreatora przeprowadzającego przez konfigurację raportu. Proces ten obejmuje nawiązanie połączenia ze źródłem danych, pobranie danych i ustawienie opcji wyświetlania. N astępnie można wyświetlić raporty w przeglądarce internetowej. Narzędzie Report Viewer umożliwia też wyeksportowanie raportów do form atu Excel lub PDF. • Dynamie Data Liną to SQL Web Site — tw orzy witrynę do rozwijania aplikacji sie­ ciowych korzystających z danych. W itryna zawiera szablony stron umożliwiających użytkownikom wyświetlanie, dodawanie, usuw anie i modyfikowanie danych. Szablo­ ny sprawiają, że praca w większości scenariuszy związanych z dostępem do danych przez sieć W W W jest prosta. Oczywiście, dostęp do danych obsługiw any w tych sza­ blonach oparty jest na technologii LINQ to SQL. • Dynamie Data Entities Web Site — przypom ina szablon D ynam ie D ata Linq to SQL W eb Site, jednak dostęp do danych jest tu oparty na platform ie Entity.

Wskazówka D ostęp ne są pakiety Starter Kit, które można wykorzystać jako punkt wyjścia w czasie tworzenia witryny. Nie są one udostępniane wraz z Visual Studio — trzeba je sam odzielnie pobrać. Dostępne są szablony do tworzenia blogów , portali, sklepów internetowych, aplikacji dla małych firm, klubów, Wiki i innych witryn. Informacje o różnych pakietach znajdują się na stronie http://wwyv.asp.net/ community /projects. Z rozdziału 7., „Społeczność .NET — inte­ rakcje w internecie”, m ożna dow iedzieć się więcej o zasobach udostępnianych przez społeczność.

Wybieranie położenia witryny W starszych wersjach Visual Studio (przed wydaniem 2005) program ista był w istotny sposób ograniczony podczas umieszczania tw orzonej w itryny. T rzeba było lokalnie u ru ch o m ić I IS, a aplikacja sieciowa musiała być przechowywana w strukturze katalogu wwwroot. Model ten powodował liczne problemy. Po pierwsze, typowo aplikacja była ro zp rzestrzen ian a po całym komputerze. Plik rozwiązania oraz projekty .illl znajdowały się w jednym z katalogów, a aplikacja sieciowa była zapisana w specjalnym katalogu w napędzie C. Po drugie, ten m odel wymuszał na

C zę ść V Tworzenie aplikacji dla przedsiębiorstw menedżerach zezwolenie na działanie serwerów I IS na każdym komputerze program isty (inaczej praca nie mogłaby być wykonana). Zwykle łamało to standardow ą politykę bezpieczeństwa. Po­ nadto występowały liczne inne problemy związane z wersjami serwerów IIS, instalowaniem roz­ wiązań i innymi zagadnieniami. W Visual Studio 2005 rozwiązano wszystkie te problemy. Opcje połączenia z roboczą wersją aplikacji został)' znacznie rozszerzone. Teraz można pracować z aplikacją bez konieczności (ale z możliwością) korzystania z lokalnego serwera IIS. Zam iast z lokalnego egzem plarza IIS pro­ gramiści mogą korzystać z system u plików i lokalnego serwera sieciowego używ anego do pro­ gramowania. M ożna więc pracować na zdalnym serwerze i łączyć się z nim przez FTP lub HTTP. Przyjrzyjmy się konfiguracji tych różnych opcji umieszczania witryny w Visual Studio 2010. Położenie witryny definiuje się podczas jej tworzenia lub przyłączania się do niej. Przyjrzyjm y się znow u rysunkowi 17.1. W jego lewym dolnym rogu obok opcji Location znajduje się roz­ wijana lista lokalizacji. Zawiera ona w artości File System, FITTPorai FTP. Każda z tych lokali­ zacji wymaga przejścia do odpow iedniego miejsca i dostarczenia odpowiednich poświadczeń wymaganych do utworzenia (lub otwarcia) strony. M ożna też kliknąć przycisk Browse (na prawo od pola tekstowego z nazwą aplikacji na rysunku 17.1) i przejść do każdego miejsca. Kliknięcie tego przycisku uruchamia okno dialogowe Choose Location. W następnych punktach przyjrzymy się wielu jego opcjom.

File system Pierwsza od góry opcja okna Choose Location to File System. Pozwala ona w ybrać dowolny katalog na swoim komputerze w celu przechowania zawartości witryny. O kno dialogow e Cho­ ose Location pozwala na nawigację w systemie plików i wybór lub utworzenie folderu. Rysunek 17.2 przedstawia to okno dialogowe. Przycisk Create New Folder znajduje się w praw ym gór­ nym rogu okna (obok przycisku Delete). Rysunek 17.2. Okna dialogowego Choose Location można użyć do wybrania w systemie plików lokalizacji, w której ma znaleźć się zawartość witryny

Rozdział 17. Tworzenie aplikacji ASP.NET Jeśli do utworzenia witryny wybierze się opcję File System, nie trzeba m ieć na komputerze serw era IIS. Zamiast tego Visual Studio rozpoznaje zawartość katalogu jak o w itrynę sieciową i uruchamia lokalny egzemplarz ASP.NET Development Server. Serwer ten naśladuje IIS i może być urucham iany oraz wyłączany na żądanie. O trzy m u jem y egzem plarz dla każdej witryny, która jest aktualnie uruchamiana, diagnozowana lub nawet kompilowana za pom ocą Visual Studio. Odwołanie do każdego egzemplarza serwera roboczego jest wymieniane w zasobniku systemowym. M ożna kliknąć je prawym przyciskiem myszy i przejść do obsługiw anej w itryny za pom ocą przeglądarki internetow ej, zatrzym ać serwer lub wyświetlić szczegóły. Przykładow e okno szczegółów serwera roboczego ukazuje rysunek 17.3. W idoczne są tu ścieżki w irtualne i fizyczne serwera, num er portu i główny adres URL. Program ista może też zatrzym ać działający serwer przy użyciu przycisku Stop. Rysunek 17.3. Za pomocą zasobnika systemowego można wyświetlić szczegóły każdego egzemplarza serwera roboczego ASP.NET

ASP NET D ev elo p m en t S e ^ e r - Port 1?95



ASP NET Development Server Runs ASP NET Appbcdbora locdiy

Root URL

htto -’localh w t 1Ttt/Contooo

Poet

[V795

\Atual Path

j/Contoso

Physical Path

|C:'Code\W ebS«e*'Corto*o\

ASP.NET Ueeson

|4 0^1008 T

*

7

Stop .

_

^

Wskazówka Dom yślnie serwer roboczy działa na dynamicznie określanym por­ cie. Jednak można wymusić dla niego konkretny port. W tym celu należy wybrać witrynę w oknie Solution Explorer i wyświetlić jej właściwości. Można ustawić właściwość Use dynamie ports na False, a następnie wymusić num er portu, korzystając z właściwości Port

number. Rysunek 17.4 ukazuje przykład. Local IIS Visual Studio 2010 nadal pozwala na skonfigurowanie aplikacji sieciowej do korzystania z lokalne­ go egzemplarza IIS. Zaletą tej właściwości jest działanie serwera poza czasem programowania. Pozwala to także na większą kontrolę nad konfiguracją witry ny za pomocą narzędzi administra­ cyjnych IIS. Jednak w większości sytuacji urucham ianie lokalnego egzemplarza serwera IIS na kom puterze programisty jest niewskazane. Powoduje to zajęcie cennych zasobów systemowych i często narusza wewnętrzne zasady przez w prow adzenie do sieci dodatkow ego serwera.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw co

o O C ontoso * M icrosoft V isual Studio (A dministrator) File

Edit

J

V iew

W eb site

Build

Debug

Data

Too ls

I; ►

S l Cl

Test

Window

*e

A

©

S

Help

Debug



* 3 z

A ny CPU

Ho -♦ 3 • .

4

Solution Explorer

8

- i1 7 ] $j ' £

~ 9 X

* 3 Solution Contoso (1 project)

f

j

|

S # ■ *

0 C:\~\Contoio\ Account

U j App_Dot« j

Scripts

> Cal Styles

^

Properties

* ł X

C:\Code\WebSites\Contoso\ Web Site Properties H r ii



n

Always Start When Debuggir True Full Path

C;\Code\WebSrtes\Contoso

Opened URL

fite7//C:/Code/Web$:tes/Contoso,

Port number

1795

Use dynamic ports

False

Virtual path

/Contoso

Port number Set the port numberthat the ASP.NET Development Server should use. K

Error list V : Breakpoints

Ready

Rysunek 17.4. Wymuszanie numeru portu na serwerze używanym do programowania

W celu zdefiniowania witryny na lokalnym serwerze należy wybrać opcję Local IIS w oknie dialogowym Choose Location. Rysunek 17.5 pokazuje przykładow e okno. W arto zauważyć, że serwer IIS (ASP.NKT) nie jest tu jeszcze zainstalowany na kom puterze lokalnym. Program iści korzystający z Visual Studio w systemie W indows 7 lub Vista muszą wykonać dodatkow e operacje i zainstalować wszystkie kom ponenty serwera I IS. N astępnie aby wybrać serw er 11S, trzeba uruchom ić Visual Studio z upraw nieniam i adm inistratora. Rysunek 17.5. Aby zastosować serwer IIS, trzeba najpierw skonfigurować lokalny komputer i uruchomić serwer IIS z uprawnieniami administratora

Rozdział 17. Tworzenie aplikacji ASP.NET Aby w systemie W indows 7 lub Vista zainstalować potrzebne funkcje lokalnie, należy użyć

Panelu sterowania i wybrać opcję Odinstaluj program w kategorii Programy. Po lewej stronie okna należy kliknąć opcję Włącz lub wyłącz funkcje systemu Windows. Po w ybraniu tej opcji program ista zobaczy okno Funkcje systemu Windows widoczne na rysunku 17.6. Należy znaleźć węzeł Internet Information Services i upewnić się, że zainstalowana jest obsługa technologii ASP.NET, filtry ISAPI oraz rozszerzenia. Rysunek 17.6. W oknie dialogowym Funkcje systemu W indows można zainstalować serwer I1S lokalnie

Po w ykonaniu tych operacji pojawi się więcej opcji w węźle Local IIS w oknie dialogowym w idocznym przy tworzeniu witryny (zobacz rysunek 17.7). Początkowo w' prawym górnym rogu znajdują się trzy przyciski. Przyciski te pozwalają na utw orzenie nowej aplikacji sieciowej, n o ­ wego katalogu wirtualnego oraz usunięcie wybranego elem entu. Po w ybraniu opcji tworzenia now ego katalogu w irtualnego użytkow nik zostanie poproszony o o kreślenie nazw y katalogu i położenia folderu, w którym ma być przechowywana witryna. Nie ma ograniczenia do wwwroot. Zamiast tego można utw orzyć witrynę w dowolnym folderze. Można także wybrać łączenie się z w itryną za pomocą SSL (ang. Secure Sockets Layer). Możliwość ta jest użyteczna, gdy trzeba szyfrować poufne informacje pomiędzy kom puterem program isty a serw erem .

Jeśli programista używa system u W indows 7 lub Vista, musi uru­ chom ić Visual Studio z uprawnieniam i adm inistratora, aby móc nawiązać połączenie z serwerem IIS. W tym celu należy kliknąć prawym przyciskiem myszy skrót uruchamiający Visual Studio i wy­ brać opcję Uruchom jako administrator.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Rysunek 17.7. Po zainstalowaniu serwera IIS można wybrać przechowywaną na nim witrynę jako podstawę projektu

FTP Site Inna możliwość polega na udostępnianiu witryny przy użyciu protokołu FTP (ang. File Trans­ fer Protocol). O kno dialogowe New Website umożliwia programiście określenie, na jakim ser­ werze FTP chce umieścić witrynę (lub gdzie już się ona znajduje). W tym celu należy wprowa­ dzić adres serwera oraz port i dostarczyć odpow iednie poświadczenia. Trzeba uwzględnić wszystkie ograniczenia serwerów FTP (na przykład hasła nie są bezpieczne). Rysunek 17.8 ilu­ struje ustawienia witryny FTP. Należy zauważyć, że strony tworzone na serwerze FTP są urucha­ miane za pomocą lokalnego serwera ASP.NET Development Server. Protokół FTP służy do pozy­ skiwania i przechowywania plików. Oczywiście, można utworzyć serwer W W W , który udostępnia pliki z serw era FTP. Taki serw er jest niezależny i niew idoczny w Visual Studio. Rysunek 17.8. Za pomocą protokołu F TP można podłączyć Visual Studio do witryny zapisanej na zdalnym serwerze

Rozdział 17. Tworzenie aplikacji ASP.NET Remote HTTP Site O statnia możliwość to kom unikow anie się z serw erem sieciowym przy użyciu protokołu H TTP. Zwykle programiści używają do tego zdalnego współużytkowanego serwera sieciowego służącego do rozwijania aplikacji. Na tym serwerze trzeba zainstalować rozszerzenia FrontPage Server Extensions, aby um ożliwić obsługę połączeń z Visual Studio. R ysunek 17.9 ilustruje przykładow ą konfigurację położenia witryny na zdalnym serwerze I IS. R y su n e k 17.9.

Visual Studio można podłączyć do zdalnego serwera za pomocą protokołu HTTP

Wybór domyślnego języka programowania Visual Studio 2010 pozwala na łączenie języków używanych do tw orzenia elem entów witryny. Gdy tw orzy się formularz sieciowy lub plik klasy, to określa się język, w którym każdy z tych poszczególnych elementów jest zapisany. Jednak gdy tworzy się nową witrynę, to należy podać dla niej domyślny język. Jest on wprowadzany w oknie dialogowym New Web Site (zobacz lewy dolny narożnik na rysunku 17.1). Podanie tej wartości inform uje Visual Studio, w jaki sposób generować szablon. Dodatkowo określa początkową wartość dla ustawień, które k o n tro lu ją domyślny język nowych elementów dodaw anych do witryny. Rysunek 17.10 ilustruje w itrynę z mieszanym kodem . W idoczne są dw a pliki sieciowe: jeden z kodem pisanym w języku Visual Basic, a drugi w C#. Jest to dozw olone. Jednak w poszcze­ gólnych katalogach z kodem m ożna umieszczać tylko pliki klas podobne do siebie. W arto też zauważyć, że katalog App_Code zawiera plik klasy języka C#. Nie m ożna dodać do tego katalogu plików klas w języku Visual Basic. Jeśli programista chce przechowywać w jednym miejscu pliki klas w obu językach, może zastosować jedną z dwóch technik. Po pierwsze, m ożna umieścić kod w języku Visual Basic w jednym projekcie biblioteki klas, a kod w języku C# — w drugim. N a­ stępnie można dodać w witrynie referencje do bibliotek z kodem. Jednak wielu programistów

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Struktura witryny Typowa witryna składa się z wielu różnych plików, w tym formularzy sieciowych, plików z kodem, arkuszy stylów, plików konfiguracyjnych, rysunków, kontrolek, plików JavaScript i innych. U porządkow anie i pogrupow anie licznych plików pom aga wyszukiwać elem enty składające się na w itrynę oraz zarządzać nimi. Visual Studio 2010 udostępnia pewną liczbę dodatkow ych „specjalnych” katalogów. Poniższe punkty zawierają opis wielu katalogów i plików, które defi­ niują w itrynę .NET. Katalogi ASP.NET definiuje pewną liczbę folderów używ anych d o porządkow ania i ro zp o zn aw an ia różnych plików, które wchodzą w skład aplikacji. Te katalogi mają zarezerwowane nazwy, spe­ cyficzne dla ASP.NET. Dlatego pow inny być odpow iednio używane.

Rozdział 17. Tworzenie aplikacji ASP.NET Aby dodać do aplikacji katalog specjalny ASP.NET, należy użyć menu kontekstow ego witryny (otw ieranego za pom ocą kliknięcia prawym przyciskiem myszy), a następnie wybrać opcję Add ASP.NET Folder. Rysunek 17.11 przedstawia aplikację sieciową z kilkoma katalogami specjalnymi. W arto zauważyć, że specjalne katalogi ASP.NET oprócz symbolu folderu m ają też dodatkową ikonę. O pisy wszystkich folderów znajdują się w tabeli 17.1. Rysunek 17.11. Można wykorzystać katalogi specjalne ASP.NET do uporządkowania licznych plików składających się na witrynę

Solution Explorer

•D X

7 3 Solution 'Contoso' (1 project) -

C:\~\Contoso\ t> L J Account App Browsers -Ji App_Code App_D»ta - j App_GlobalResources J App LocalResources J App MoreCode i i App.Themes ^ App.WebReferences

m

- * Bin

s

: A Scripts Styles About asp* iS] Default.asp> a I Global.asax 3 ) MyVbPage.asp* i*n Site.master i i Web.config

Tabela 17.1. Katalogi AStP.NET

[ K a ta lo g

]\ Opis

Bin

Zawiera skompilowany kod (pliki .dli), z którego korzysta aplikacja. Kod ten może obejmować zewnętrzne biblioteki klas lub kontrolki używane w aplikacji bez dołączania kodu źródłowego.

App_Code

Przechowuje pliki klas pomocne do definiowania aplikacji. Przykładowo, w tym katalogu można umieszczać klasy obiektów biznesowych lub dostępu do danych. Kod w tym katalogu jest kompilowany łącznie z podkatalogami do jednej biblioteki. Z tego powodu cały kod w katalogu musi być napisany w tym samym języku.

App_Data

Zawiera pliki danych używane w aplikacji. Mogą to być pliki .mdf (SQL Express), dane XML, arkusze programu Excel i tak dalej.

App_GlobalResources

Zawiera pliki zasobów (.resx oraz .resources), które wchodzą w skład aplikacji. Te pliki służą do przechowywania tekstu i obrazów używanych w programie. W ten sposób aplikacja może wczytywać dane z plików zasobów, a programista nie musi zapisywać informacji na stałe w kodzie. Pomaga to w tworzeniu interfejsów z obsługą wielu języków, wprowadzaniu zmian na etapie programowania i wykonywaniu innych podobnych operacji.

App_LocalResources

Także zawiera pliki zasobów. Jednak dotyczą one konkretnej strony lub kontrolki i nie są globalne dla aplikacji.

j

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Tabela 17.1. Katalogi ASP.NET — ciąg dalszy

K atalo g

j Opis

App_WebReferences

Jest używany do przechowywania odnośników do usług sieciowych. Zawiera kontrakty usług sieciowych (.wsdl), schematy (.xsd) i inne pliki.

App_Browsers

Zawiera pliki definicji przeglądarek (.browser). Pliki te są najczęściej używane z aplikacjami mobilnymi. Definiują one różnorodne możliwości danej przeglądarki. Pliki te pomagają w prawidłowym wyświetlaniu interfejsu użytkownika w danym urządzeniu.

App_ Themes

Zawiera podfoldery dla każdej kompozycji (określającej wygląd i styl) w aplikacji. Foldery kompozycji zawierają skórki (.skin), style (.css) i obrazy. Więcej informacji o kompozycjach zawiera punkt „Tworzenie jednolitego wyglądu i zachowania" w dalszej części rozdziału.

Pliki Wiele plików i typów plików definiuje typową w itrynę ASP.NET. Oczywiście, istnieją pliki, które są często używane, takie jak form ularz sieciowy, kontrolka użytkownika, klasa i konfi­ guracja. Są też pliki używane rzadziej — jak skórki, stro n y wzorcowe, zasoby i m apy witryny. Tabela 17.2 zawiera niektóre częściej spotykane pliki w wielu aplikacjach sieciowych ASP.NET. Tabela 17.2. Pliki ASP.NET

Szablon elem entu

I R ozszerzenie pliku

Opis

Web Form

.aspx

Definiuje formularz sieciowy ASP.NET. Jest to najczęściej spotykany plik ASP.NET. Patrz punkt „Tworzenie stron internetowych" dalej w tym rozdziale.

Web Service

.asmx

Definiuje usługę sieciową ASP.NET opartą na języku XML. Patrz rozdział 22.

Web User Control, Dynamie Data Field

.ascx

Reprezentuje kontrolkę użytkownika ASP.NET. Takie kontrolki umożliwiają tworzenie niestandardowych wersji komponentów i ich kombinacji, a programiści mogą wielokrotnie korzystać z nich w witrynie. Dynamie Data Field to inna wersja kontrolek użytkownika, służąca do tworzenia niestandardowych widoków danych.

Brak szablonu

.asax

Tworzy globalną klasę aplikacji. Umożliwia ona dodanie kodu obsługi zdarzeń wykonywanego przy uruchamianiu i zatrzymywaniu aplikacji przez serwer IIS, wystąpieniu błędu lub zainicjowaniu albo zakończeniu sesji przez użytkownika.

Generic Handler

,ashx

Służy do tworzenia ogólnej metody obsługi dla protokołu HTTP. Ogólną metodę obsługi można wykorzystać do odbierania żądań HTTP, przetwarzania ich i odsyłania odpowiedzi.

Class

.cs lub.W?

Definiuje plik klasy. Rozszerzenie .cs oznacza plik klasy C#. Rozszerzenie .yó oznacza klasę napisaną w języku Visual Basic.

Master Page, AJAX Master .master Page

Reprezentuje stronę wzorcową. Strona wzorcowa służy do definiowania standardowych elementów pojawiających się na wielu stronach witryny. Te elementy to na przykład opcje menu, nawigacja, nagłówki i stopki. Patrz podpunkt „Strony wzorcowe" w dalszej części rozdziału.

Rozdział 17. Tworzenie aplikacji ASP.NET Tabela 17.2. Pliki ASP.NET — ciąg dalszy

I Szab lo n elem entu

R ozszerzenie pliku | Op*s

Web Configuration File

.config

Reprezentuje plik konfiguracyjny aplikacji sieciowej. Można go użyć do zarządzania ustawieniami diagnozowania oraz przechowywania danych specyficznych dla aplikacji (takich jak zaszyfrowany łańcuch połączenia z bazą danych).

Style Sheet

.css

Reprezentuje arkusz stylów kaskadowych. Przechowuje style dla aplikacji lub kompozycji. Patrz podpunkt „Arkusze stylów" dalej w tym rozdziale.

LINQ to SQL Classes

.dbml

Plik klasy technologii LINQ to SQL. Pliki tego rodzaju zawierają zapytania LINQ do określonej bazy SQL.

Report, Report Wizard

Mc

Umożliwia tworzenie raportów sieciowych przy użyciu technologii generowania raportów Microsoftu.

Site Map

.sitemap

Plik zawierający mapę witryny. Mapy te są używane w wielu kontrolkach nawigacyjnych technologii ASP.NET.

WCF Service, AD0.NET Data Service,AJAX-enabled

.SVC

Reprezentuje usługę WCF. Element AD 0.NETData Service to wersja usług przeznaczona do pracy z danymi. Więcej informacji o usługach znajduje się w rozdziale 22.

Skin File

.skin

Reprezentuje skórkę dla jednej lub wielu kontrolek w aplikacji. Skórka jest definiowana dla kompozycji aplikacji. Patrz podpunkt „Kompozycje i skórki" dalej w tym rozdziale.

JScript File, AJAX Client Library, AJAX Control Library, AJAX Client Behavior

•Vs

Służy do tworzenia plików z kodem w języku JavaScript. Istnieje wiele specjalnych szablonów związanych z bibliotekami Ajaksa (zobacz rozdział 20.).

HTML Page

.htm

Prosta strona HTML (bez przetwarzania kodu po stronie serwera).

Resource File

.resx

Służy do tworzenia pliku zasobów do przechowywania łańcuchów znaków dla różnych kultur i języków.

WCF Service

Nowy plik ASP.NET dodaje się do aplikacji za pom ocą m enu kontekstowego witryny (klikając prawym przyciskiem myszy i wybierając Add New Item). Rysunek 17.12 pokazuje okno dialo­ gowe Add New Item. W arto zauważyć, że najpierw należy wybrać język (lewa strona okna). Wiele plików, które są dostępne dla witryny, jest wymienionych jako szablony elem entów w środkowej części ekranu. Jeśli plik danego typu powinien znaleźć się w specjalnym katalogu, Visual Studio wyświetli pytanie, czy ma go tam zapisać.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Add New hem • C ' Code WebSites1Cor.tOicN Installed Templates

Son by: Default Weto Form



]

I Seerth Installed Template.

-

Q Browser File

Master Page

Online Templates

Sdverlight Application

1

AOO.NET Oata Service

si

Ted File

a

AJAX Client Behavior

&

XSLT File

a

AJAX Client Control

*

Weto Configuration File



AJAX Client Library

Web Service

Ji

Preprocessed Ted Template

Web User Control

6

AJAX Web Form

*>

%

WCF Service

A

j

XML Schema

A

ADO.NET Entity Data Model Dynamic Data Field

a

Ted Template

a

*

JScnpt File

i

CataSet

a

Class

St

Report

a

Class Diagram

Resource File

n

Sdveriight I jO JScnpt Page

Sim File

A

A

A form for Weto Applications

AOO.NET EntityObject Generator

Generic Handler



N am e

Style Sheet

Type: Visual Basic

Silverlight-enabled WCF Service *

4 A

HTML Page

Crystal Report Report Wizard XML To Schema

UNQ to SQL Classes AJAX-enabled WCF Service

Site Map

tl

SQL Server Database

XML File

a

AJAX Master Page

D efault?.j;p «

Place cede in separate file Select master page

Rysunek 17.12. Do witryn platformy .NET można dodać pliki wielu typów

Kontrolowanie właściwości i opcji projektu Aplikacje ASP.NKT mają w łasny zbiór właściwości i opcji konfiguracyjnych. K ontrolują one sposób działania aplikacji, ich kompilację, diagnozow anie i tak dalej. Dostęp do tych właściwo­ ści dla swojej witryny jest możliwy za pomocą okna dialogowego Property Pages. Aby je otworzyć, należy kliknąć witrynę prawym przyciskiem myszy i wybrać opcję Property Pages. W następnych podpunktach opisujemy liczne opcje tego okna.

Referencje Referencje w aplikacji definiują należący do innej aplikacji kod, który jest używany za ich p o ­ mocą. Referencje mogą prowadzić do innych projektów z danego rozwiązania, odmiennych przestrzeni nazw platformy .NET, kontrolek niezależnych producentów i różnych bibliotek .NET. Środowisko kompiluje dołączony kod do niezależnego pliku .dli, który m ożna zainstalować w repozytorium GAC (nie jest to konieczne). Rysunek 17.13 pokazuje część References okna dialogowego Property Pages.

Rozdział 17. Tworzenie aplikacji ASP.NET

Każda bieżąca referencja dla w itryny jest wymieniona wraz z jej powiązanym typem. Rysunek 17.13 przedstawia referencje do dwóch projektów — BusinessDotnain i DataServices. Referencje te prowadzą do projektów zapisanych w tym samym rozwiązaniu, co witryna, i są automatycznie aktualizowane w wyniku kompilacji rozwiązania. Oczywiście, można dodać referencje do specy­ ficznych plików .dli Jeśli są to pliki lokalne aplikacji, znajdują się w katalogu bin. Jeżeli są to globalne pliki .dli używane także poza daną aplikacją, przechowuje się je w repozytorium GAC. Na rysunku 17.13 widoczne są dwie przykładowe referencje do elementów z repozytorium GAC (informuje o tym wartość w kolum nie Type). Można też sprawdzić wersję dołączanych elem en­ tów — tu jest to wydanie 4. Z tego okna dialogowego m ożna dodać now ą referencję, usunąć istniejącą lub ją odświeżyć (uaktualnić). Dodawanie nowej referencji W aplikacjach ASP.NET m ożna dodawać referencje, na co wskazuje przycisk Add na rysunku 17.13. Kliknięcie przycisku powoduje wyświetlenie trzech opcji dotyczących referencji, co pokazano na rysunku 17.14. Opcje te to: standardow e referencje do bibliotek klas .NET (opcja Add Reference), do usług sieciowych XML (opcja A dd Web Reference) i do usług VVCF (opcja Add Service Reference). Referencje związane z usługam i om ów iono w rozdziale 22.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Rysunek 17.14. Można wybrać typ referencji dodawanej do aplikacji

Add...

Standardow e referencje m ogą prow adzić do plików .dli z innych aplikacji i projektów . Utwo­ rzenie takiej referencji pow oduje umieszczenie kopii skompilowanego pliku .dli w katalogu bin aplikacji, a programista uzyskuje dzięki temu dostęp do przestrzeni nazw, klas i m etod z tego pliku. Ponadto kompilator kontroluje wszystkie dołączone pliki .dli, aby sprawdzić, czy progra­ mista nie narusza ograniczeń typów, sygnatur metod i innych zasad.

W skazówka Elementy w zakładce Projects to referencje do kodu z bieżącego rozwiązania. Referencje te działają prawie tak sam o jak wszystkie pozostałe. Jedyny wyjątek polega na tym, że dla w ygody progra­ mistów elementy oznaczone jako referencje projektowe są automa­ tycznie aktualizow ane po ponownej kompilacji danego projektu. Gwarantuje to spójne sprawdzanie typów w czasie kom pilowania aplikacji.

Po w ybraniu standardowej opcji A dd Reference Visual Studio wyświetla okno dialogowe Add Reference widoczne na rysunku 17.15. Można używać zakładek u góry okna dialogow ego w celu znalezienia określonego elem entu, do którego m a się odnosić referencja. Jeśli poszukuje się na przykład referencji do przestrzeni nazw z platformy .NET, należy wybrać zakładkę .NET. Ta zakładka wyświetla elementy zainstalowane w repozytorium GAC, na przykład jednostki z prze­ strzeni nazw System i M ic ro so ft. Można także ustanawiać referencje do kom ponentów COM, dodawać referencje do innych projektów, przeglądać w poszukiw aniu plików .dli o raz w ybierać z dodanych ostatnio referencji.

Kompilacja Strona Build w oknie dialogowym Property Pages um ożliw ia kontrolowanie sposobu kom pila­ cji za pom ocą Visual Studio 2010. Rysunek 17.16 przedstaw ia dostępne opcje. Dalej opisujem y każdą z nich. Start action Część Start action strony Build pozwala na definiowanie sposobu kompilacji aplikacji, gdy u ru ­ cham iana jest ona z poziomu IDE. Istnieją trzy opcje w tej liście rozwijanej: No Build, Build Page oraz Build Web Site (dom yślna). Przyjrzyjmy się każdej z nich.

Rozdział 17. Tworzenie aplikacji ASP.NET Rysunek 17.15. Okna dialogowego Add Reference można użyć do wskazania kodu spoza witryny

o© Add Reference NET

COM

Projects

Browse

Pe:ent

Component Name

Version

Runtime

System. Web .ApplicationServices

4.0.0.0

v4021006

#

System.Web.DataVisualcat ion. Design

4.0.0.0

v4.021006

System.Web.Dat aVtswalcation

400.0

'.*4021006

System.Web

4.0.0.0

.4021006

System Web DynamicData.Design

j : oo

.4621006

System.Web.Dynamic Data

4 .0 .0 0

v4 0 .2 1 0 0 6

System.Web.Entity Design

4.0.0.0

A021006

System.WebEntity

4 .0 .0 0

v40.21006

System.Web. ExtenwonsDesign

4.00.0

v4.0.21006

System. Web.E»1 ensions

4000

.40-21006

System.WebMobile

iJlJO O

v4 0 21006

System.Web.Regular£jpres5ions PI

4.0.0-0

v4 021006 t

4

OK

D C Cancel

CAUsers\m.;nelf\Desktop\CODE\Unleashed\Cootoso\Contoso\ContosoWeb\ Property Pages

References Build

Accessibility Start Options

Start action (F5) Before running startup page: Build Web Site

MSBuild Options Sitverfight Applications

Target Framework .MET Framework. 4

-

noilSo

c fc o d y

< f o r m * fo r m l>





Output

left 592px. top: 38px, width: 135px, height 71px

Rysunek 17.29. Można zaznaczyć element ustawiony na pozycjonowanie bezwzględne i przenosić go po stronie za pomocą myszy lub klawiszy ze strzałkami

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Jeśli program ista planuje zastosować pozycjonowanie bezwzględne na całej stronie, p raw d o ­ podobnie nie chce ręcznie zaznaczać każdego elementu i wybierać opcji Position z m enu For­ mat, co jest żm udnym rozwiązaniem. Inne podejście to zmiana domyślnego sposobu dodawania kontrolek do strony przez Visual Studio. Aby ustawić tę opcję, należy użyć okna dialogowego Options ( Tools/Options), a następnie przejść do węzła HTML Designer/CSS Styling. N a ry ­ sunku 17.30 przedstawiono przykładowe ustawienia. Zaznaczenie ostatniego pola (Change positio­ ning to absolute...) spow oduje, że Visual Studio będzie dodaw ać wszystkie kon tro lk i przy użyciu pozycjonow ania bezwzględnego. CptłOrtS Envtfooment

Style Application Mode.

Projects end Solutions Source Control Ted Editor Debugging Database Tools F* Tools HTML Designer General CSS CSS Styling

• Manual Style Application

Auto Style Application

Only reuse classes with the prefu 'style Use width and height attributes for image instead of CSS •/ Use . N a­ stępnie wystarczy zastosować styl do sam ego znacznika < d iv /> . Poniżej znajduje się przykład hierarchicznej definicji stylów: .userForm

{ font-family: Arial; /* Sty! domyślny. font-size: 10pt;

*/

} .userForm input /* Sty! elementu input.

*/

{ border-style: solid; border-width: lpt; border-color: Gray; margin: 5px Opx 5px Opx;

} .userForm span /* Styl etykiety. * /

{ font-weight: bold; padding: 5px 5px 5px 5px;

} Teraz można zastosować styl do form ularza, tak jak w poniższym kodzie. Warto zauważyć, że definicję stylu zawiera tylko zewnętrzny znacznik < d iv /> .




Rozdział 17. Tworzenie aplikacji ASP.NET

Efekt pokazano na rysunku 17.34. Widać tu, że elem enty ze znacznika < d iv /> przyjęły style. Techniki tej można używać dla różnych elementów języka HTML stosowanych na stronie. Jednak przy korzystaniu z kontrolek ASP.NET trzeba wiedzieć, w jaki sposób są one generowane w kodzie w HTML-u, i na tej podsta­ wie zdefiniować odpowiednie style. Inne rozwiązanie to zastoso­ wanie kompozycji dla elementów ASP.NET (więcej na ten temat w dalszej części rozdziału).

Rysunek 17.34. Za pomocą stylów hierarchicznych można uprościć dodawanie stylów

Tworzenie arkusza stylów M ożna dodać jeden lub więcej arkuszy stylów do aplikacji za pom ocą okna dialogowego Add New Item (zobacz rysunek 17.12). M ożna otworzyć arkusz stylów w edytorze. W tedy Visual Studio wyświetli pasek narzędzi Style Sheet, menu Styles i właściwą zawartość arkusza stylów'. Ele­ m enty te znajdują się na rysunku 17.35. Środkowy panel rysunku 17.35 przedstaw ia zawartość arkusza stylów, która może być ręcznie edytowana. Oczywiście, edycja wymaga dobrej praktycznej znajomości CSS. Program ista może w czasie edycji korzystać z m echanizmu IntelliSense. Jak w przypadku każdej nauki — im więcej pracy nad stylami, tym lepsza ich znajom ość. Panel CSS Outline (widoczny po praw ej stronie rysunku 17.35) jest wyświetlany dom yślnie w czasie otw ierania arkusza stylów'. W panelu m ożna szybko znaleźć style elem entów i nie­ standardow e klasy. Jest to prosty w idok przydatny przy stosow aniu nieskom plikow anych arkuszy stylów'. Do zarządzania bardziej złożonymi rozwiązaniami służy okno Manage Styles (wię­ cej na ten tem at za chwilę). Pasek narzędzi Style Sheet ma niewiele opcji. Pierwsza z lewej urucham ia okno dialogowe Add Style Rule. Druga ( Build Style) otw iera okno dialogowe Modify Style. Aby je otworzyć w celu edycji stylu, można też kliknąć styl prawym przyciskiem myszy w edytorze, co dokładnie opisujemy dalej. Następny przycisk pozwala na wyświetlenie w y n ik ó w w oknie przeglądarki. W końcu rozwijana lista pozwala na określenie używanego standardu CSS (1.0, 2.0, 2.1).

C zę ść V Tworzenie aplikacji dla przedsiębiorstw L s L -a ifla r

o f l C o n to s o * M ic ro so ft V is u a l S t u d io

File

Edit

View

Website

Build

Debug

Data

Tools

Test

Styles ►

>

*y

window

Debug

Help

-

M ixed P la tfo rm s

He» -o Z * B u ild

Style...

C SS 2 1

CSSOutfine - C:\Useis\ML.

Style s. S ite .css*

j)

S ty le S h e e t E le m e n ts

.b u tto n

C lasses

b o r d e r : t h in s o l i d #00©0d0; b a c k g r o u n d - c o lo r : # FP FF FF ; fo n t - fa m ily :

^ont - f a r i l y

.■nrrrrr F9R



textBo
Data

: Validation

Monitorowanie klientów

N a .ig a t - c a

Login

a ,\efc■•

Sta tvstvki

r w i , , A . Uon« Name

Poirter

Ar

C lo s e d

Strefa katalogu t w o ■ o do kSwft i

Doda) |

Zamkmj

AppearanceEditorPart ('o nto so 2 0 1 0

6ef> io crtd:tcrPart

CatalogZone

«

mectionsZone

tffl V

DeclarativeCatalogPart Editor Zone

‘♦j

Im pcrtCatalogPart



La/cutEditorPart

[jj|j

PageCatalogPart

m

Pi o peityOf idEditorPart ProxvV/ebPartManager Web^artManager

Jj j

WebPaitZore

Dynamic Data

t AJAX Extensions AJAX Toolkit

MBOIWI

■4 Design

□ Split

a; Source

4

< div

*

i«td>

able> 1



Warto zauważyć, że w kodzie metody Edit (st ring id) do wyszukania danego klienta w obiekcie encji służy technologia LINQ. Następnie metoda przekazuje egzemplarz klasy Customer do metody ViewResult izwraca wynik tego wywołania.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Teraz trzeba dodać wersję metody Edit, która umożliwia użytkownikom przesyłanie zmian do zapisania w bazie danych. Modyfikacje trafiają do kontrolera jako egzemplarz klasy Customer. Następnie należy połączyć się z modelem w celu przeprowadzenia aktualizacji. W poniższym kodzie pokazano, jak zrobić to za pomocą platformy Entity: [AcceptVerbs(HttpVerbs.Post)] public ActionResult Edit(string id, Customer customer)

{ / / Pobieranie obiektu Customer, który należy zaktualizować.

Customer custToChange = (from c in nwdEntities.Customers where c.CustomerlD == id select c).First(); / / Aktualizowanie wartości.

custToChange.Address = customer.Address; custToChange.City = customer.City; custToChange.CompanyName = customer.CompanyName; custToChange.ContactName = customer.ContactName; custToChange.ContactTitle = customer.ContactTitle; custToChange.Country = customer.Country; custToChange.Fax = customer.Fax; custToChange.Phone = customer.Phone; custToChange.PostalCode = customer.PostalCode; custToChange.Region = customer.Region; / / Zapisywanie zmian.

nwdEntities.SaveChangesf); return RedirectToAction("Index");

} Na tym etapie m a m y model umożliwiający pracę z danymi klientów. Ponadto istnieją metody kontrolera do wyświetlania klientów na liście (Index), dodawania nowego klienta (Create) i aktualizowania danych istniejących klientów (Edit). Następny krok polega na zdefiniowaniu widoków dla każdego scenariusza.

Tworzenie widoku Istnieją dwa podstawowe sposoby tworzenia widoków. Po pierwsze, można utworzyć widok bez korzystania z pomocy ze strony środowiska Visual Studio. W tym celu należy kliknąć pra­ w y m przyciskiem myszy katalog V ie w s (lub jeden z podkatalogów) i wybrać opcję A d d /N e w I te m . Następnie można wybrać szablon widoku i rozpocząć ręczną edycję. Jednak użytkownicy platformy ASP.NET M V C częściej korzystają ze środowiska Visual Studio do generowania widoku o ściśle określonym typie dla jednej z metod kontrolera. Ta technika pozwala zaoszczędzić wiele czasu potrzebnego na napisanie kodu. Pierwszy widok w przykładzie służy do wyświetlania danych klientów na liście. Widok ten znajduje się w podkatalogu V ie w s \C A is to m e r . Można kliknąć katalog prawym przyciskiem myszy iwybrać opcję A d d W i e w . Można też kliknąć prawym przyciskiem myszy metodę Index

Rozdział 17. Tworzenie aplikacji ASP.NET w klasie C u s to m e r C o n tr o lle r .e s i wybrać opcję A d d V ie w (jest to skrót, ponieważ powoduje uzupełnienie parametrów z okna dialogowego A d d V ie w ). W obu scenariuszach pojawi się okno dialogowe A d d V ie w pokazane na rysunku 17.77. Rysunek 17.77. D ° wygenerowania kodu widoku można użyć okna dialogowego Add View

A dd V « w

View nam e Index Create a partial view (.asc*) |$ Create a strongty-typed view

View data class: ContosoM vc.M odels Customer

View content: List L“ J

Select master page -/Views/Shared/Site.Master



ContentPlaceHolder ID: MainContent Add

3

Cancel

Okno dialogowe A d d V ie w służy do ustawiania wartości parametrów potrzebnych przy gene­ rowaniu kodu widoku na podstawie modelu ikontrolera. Nazwa widoku zwykle oparta jest na działaniach użytkownika. Strony do wyświetlania danych na liście (i umożliwiające zaznacze­ nie elementu za pomocą indeksu) powinny nosić nazwę I n d e x .a s p x . Można utworzyć widok o ściśle określonym typie, aby zagwarantować, że widok będzie pasował do elementu modelu. Zaznaczenie związanej z tym opcji (C r e a te a s tr o n g l y - t y p e d v ie w ) umożliwia podanie klasy danych. W tym przykładzie jest to klasa Customer. Następna opcja, V ie w c o n t e n t , umożliwia określenie rodzaju widoku, jaki Visual Studio ma wygenerować. Dostępne opcje to: C re a te , D e ta ils , E d it, E m p ty i L ist. Tu wyświetlamy klientów na liście, dlatego należy wybrać opcję L ist. Warto zauważyć, że okno dialogowe A d d N e w umożliwia wskazanie strony wzorcowej. Po jej wybraniu można też określić obszar z treścią, w którym znaleźć się m a dany widok. Kod wygenerowany w tym przykładzie przez okno dialogowe A d d V ie w to HTML-owa tabela, w której wewnątrzwierszowo (znaczniki ) zapisywane są informacje z modelu wyświe­ tlane w przeglądarce. Należy powtórzyć ten proces, aby utworzyć widoki dla stron E d it.a s p x i C r e a te .a s p x . Poniżej pokazano fragment widoku E d it.a s p x . Warto zauważyć, że — ponieważ struktura kodu jest powtarzalna — wiele pól pominięto, co pozwoliło skrócić przykład:

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Wskazówka Podział pionowy jest szczególnie wartościowy dla szczęśliwców, którzy korzystają z kilku monitorów, ponieważ umożliwia wyświe­ tlenie edytora kodu w XAML-u na jednym ekranie, a powierzchni projektowej — na drugim.

Z omawianego okna projektowego można korzystać tak samo jak z innych powierzchni pro­ jektowych i edytorów kodu. Programiści mogą przeciągać na obszar projektowy kontrolki z okna narzędzi, a następnie manipulować nim i. Natomiast panel z kodem w X A M L-u pozwala na dopracowanie lub zmodyfikowanie znaczników , przy czym dostępna jest pełna obsługa me­ chanizmu IntelliSense i formatowania. Rozmieszczanie kontrolek przebiega zazwyczaj tak samo jak w oknie projektowym formula­ rzy Windows. Jest jednak kilka drobnych wyjątków. Okno projektowe W PF udostępnia wyjąt­ kowe mechanizmy graficzne do wyświetlania linii do określania pozycji i kontroli rozmiaru (zobacz rysunek 19.6). R y su n e k 1 9 .6 .

Wskaźniki do określania rozmiaru i pozycji

o O WpfApplication 1 • M icrosoft Visual Studio File Edit View Project Build : > . I

J

T

A

A

,

*

Debug Data Format Tools Test W indow Help

o MamWi ndowr j wnl . es

• * J*

»

Dtb u9 •

Ą

Okno właściwości Zgodnie z oczekiwaniami po zaznaczeniu kontrolki w oknie projektowym można manipulo­ wać jej atrybutami przy użyciu okna Properties. Okno to w technologii W PF zostało nieco zmodyfikowane. Dla początkujących wyświetla miniaturową ikonę wybranej kontrolki. Ponadto udostępnia dwa specjalne sposoby wyszukiwania właściwości kontrolki. Obok trybów kategorii i alfabetycznego można grupować oraz sortować właściwości na podstawie ich pochodzenia. Jest to

Rozdział 19. Tworzenie bogatszych i bardziej inteligentnych interfejsów użytkownika doskonały sposób na szybkie znalezienie na przykład tych właściwości, których wartości pochodzą bezpośrednio z kodu w XAM L-u lub ze stylu. Okno Properties w W PF umożliwia też znajdowanie właściwości kontrolki przez wpisanie ich nazwy w polu wyszukiwania. W trakcie wpisywania okno automatycznie filtruje listę właściwości i pozostawia tylko te, które pasują do kryteriów wyszuki­ wania. Omawiane okno przedstawia rysunek 19.7. R y su n e k 19.7.

Okno właściwości w narzędziu projektowym WPF

Properties

* D X

Button Button ' j f Properties

:

1

i\

Events

& "

P

a Local. Bindings and Resources

Background



*** System.Windows.Media.Linear! w Button

Width



Height



75 40

HorizontalAlignment



Lett

0-5.0.5

RenderTransformOrigin



VerticalAlignment



Top

kilarnm

A

« 7 i7 i a n n

Kontrolka przybliżania W oknie projektowym W P F dostępny jest dodatkowy element — suwak przybliżania. Znajduje się on w lewym górnym rogu panelu projektowego i można go używać do przybliżania oraz oddalania okna w zakresie od 10% do 2000% jego wyjściowego rozmiaru. Ciemniejszy element kontrolki oznacza 100% pierwotnej wielkości obrazu, a programista może szybko zmienić przy­ bliżenie ze 100% na 120% przez kliknięcie prostokątnego przycisku (obszaru) w dolnej części suwaka. Rysunek 19.8 przedstawia tę kontrolkę, a na rysunku 19.9 znajduje się czterokrotnie powiększony przycisk Kliknij mnie (i okno kontenera).

Wskazówka Kontrolka przybliżania jest szczególnie przydatna, jeśli programista utworzy formularz o złożonym układzie z wieloma liniami wyrów­ nania oraz dużą liczbą zagnieżdżonych i warstwowo rozmieszczo­ nych kontrolek. Przez przybliżenie odpowiedniego fragmentu można dokładnie zobaczyć, jak położone są elementy. Ponadto zbliżenie znacznie ułatwia zaznaczanie i przenoszenie odpowiednich kontro­ lek (a nie sąsiadujących obiektów). Po oddaleniu widoku można uzy­ skać ogólny obraz okna, aby ocenić jego całościowy wygląd i styl.

Panel z kodem w X A M L-u też udostępnia kontrolkę przybliżania. W lewym dolnym rogu edytora znajduje się pole rozwijane, które umożliwia wybór powiększenia — od 20% do 400%.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw R y su n e k 19.8

Suwak przybliżania

W pfA pplicatton4 - M icro so ft V isu al Stu d io filc

fd it

\ie w

i jD * d J ’

:!

R roject

g u ild

J A J

fie b u q

A ^

i-i Team

*0 -

* ,A. - iifE * I - 2 |

Data ■

-3 J

F o rm at

£1* ^

r

Tools

Test

W indow

fjelp

I D eb u g

* *1

£ ; 4 . h M ikUl

MamWindowjcaml.es

UlainWindow

--- ^

Kliknij mnie

H Design

0 XAM L

Q J B u tto n (b u tto n l) W indow /G

f i T ask List Ready

R y su n e k 19.9.

Przycisk po czterokrotnym przybliżeniu

'//pf A p p lic a tio n - M icrosoft V isu a l Studio File fa rt Project g u ild Q e b u g Team

*■ j 11



. . r< * '

-

'

Data Form at Io o ls

■* * •-=

*

-

Test W indow

. ► io«^jL

3 *



L



J ■-

fci«lp

i i

J

1 V

J

M ainW m doiv.xam P X

Kliknij mnie

CJ Design K

T ask List

E) XA M L

TO B u tto n (b u tto n l) W indow /G

□EE

;g |

Rozdział 19. Tworzenie bogatszych i bardziej inteligentnych interfejsów użytkownika

Programowanie z wykorzystaniem WPF Po opisaniu podstaw pora przedstawić bardziej szczegółowe omówienie różnych kontrolek i tech­ nologii używanych przy tworzeniu aplikacji za pomocą platformy W PF. Po tych zagadnieniach przejdziemy do opisu tworzenia prostej kompletnej aplikacji przy użyciu okna projektowego W PF.

Układ Ponieważ oprogramowanie musi wyświetlać na ekranie kontrolki i dane użytkownikom, two­ rzenie układu — czyli rozmieszczenia elementów na stronie — jest ważnym zagadnieniem projektowym. Dobre systemy do projektowania układu nie tylko umożliwiają programistom utworzenie spójnej struktury kontrolek, ale ponadto muszą być niezawodne ze względu na obsługę zmiany wielkości i rozmieszczenia okien. W W PF układ opiera się na zestawie kontrolek kontenerowych — paneli. Każdy panel jest dosto­ sowany do konkretnego scenariusza tworzenia układu, a możliwość łączenia wielu kontrolek tego typu powoduje, że system tworzenia układu w W PF obsługuje wiele różnych sposobów rozmieszczania kontrolek. Najważniejszą cechą paneli jest to, że — jako kontenery — odpo­ wiadają za określanie pozycji (a czasem także rozmiaru) wszystkich umieszczonych w nich kon­ trolek. Oznacza to, że poszczególne kontrolki podrzędne nie muszą mieć informacji o użytym ukła­ dzie, co znacznie upraszcza tworzenie kodu i architektury. Dostępne panele przedstawia tabela 19.1. T a b ela 19.1. Panele do tworzenia układu w W P F

Klasa

Opis

Canvas

Kontener bez wbudowanej obsługi układu.

DockPanel

Panel umożliwiający dokowanie elementów podrzędnych.

G rid

Kontener, który umożliwia rozmieszczanie obiektów podrzędnych w kolumnach i wierszach.

S ta c k P a n e l

Kontener z obsługą rozmieszczania kontrolek podrzędnych obok siebie w poziomie i pionie.

W rapPanel

Panel, który w razie potrzeby automatycznie zawija wiersze.

Kontrolka Canvas Kontrolka Canvas jest wyjątkowa, ponieważ jako jedyna nie narzuca żadnego układu. Funk­ cjonuje podobnie jak kontrolka GroupBox, której można używać w projektach opartych na for­ mularzach Windows. Obiekty podrzędne w kontrolce Canvas są rozmieszczane przy użyciu współrzędnych podawanych względem panelu. Nie ma tu automatycznej zmiany wielkości, układu płynnego czy zmiany pozycji kontrolek podrzędnych przez kontrolkę Canvas. Jeśli takie operacje są potrzebne, programista m usi samodzielnie napisać kod do ich obsługi. Dlatego panele tego rodzaju mają ściśle określone przeznaczenie — zapewniają programistom całkowitą kontrolę nad rozmieszczaniem elementów.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Na rysunku 19.10 widoczna jest kontrolka Canvas z czterema przyciskami w specyficznym układzie. Są one rozmieszczone względem krawędzi kontenera i tworzą figurę przypominającą diament. R y su n e k 1 9 .1 0 .

Przyciski umieszczone w kontrolce Canvas

Poniżej znajduje się kod tego układu w X A M L-u :

Button Button Button Buttonl

Lewy l. Lewy 2. Lewy 3. Górny l. Górny 2. Górny 3.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Rozm iar wszystkich elementów w kontenerze DockPanel jest automatycznie zmieniany, aby przyczepione kontrolki zawsze całkowicie zapełniały krawędź okna użytą do dokowania.

Kontrolka Grid Panel G rid obsługuje układ oparty na wierszach i kolumnach, podobnie jak HTM L-owe tabele

i kontrolka TableLayout Panel formularzy Windows. Standardowym zastosowaniem kontenera G r id jest tworzenie okien dialogowych i formularzy do wpisywania danych, w których etykiety i pola na wartości znajdują się obok siebie i jedno pod drugim. Kolumn kontenera można użyć do wyrównania kontrolek w pionie, a wierszy — do uporządkowania elementów w poziomie. D o tworzenia kolumn kontenera Grid służy element Grid.ColumnDefinitions. Poniższy fragment kodu w X A M L -u tworzy kontener o trzech kolumnach:

cColumnDef initionx/ColumnDef inition> cColumnDef initionx/ColumnDef inition> cColumnDefinition>

Natomiast do tworzenia wierszy służy element Grid.RowDef initions:

cRowDefinition> cRowDef initionx/RowDefinition> cRowDef initionx/RowDefinition>

O kno projektowe technologii W P F ma też funkcje interaktywne, które umożliwiają d o ­ dawanie, usuwanie i określanie rozmiaru wierszy oraz kolumn. Rysunek 19.12 przedstawia dwukolumnową i sześciowierszową siatkę umieszczoną w oknie. W arto zauważyć, że okno projektowe wyświetla linie siatki rozdzielające wiersze i kolumny, a przy górnej i lewej krawędzi kontrolki G rid widoczny jest zacieniony obszar. Nie tylko przedstawia on aktualny rozmiar komó­ rek (szerokość i wysokość), ale też umożliwia tworzenie nowych wńerszy i kolumn przez kliknię­ cie miejsca, w którym ma się znaleźć dodawana jednostka. Programista może też przesuwać linie wierszy i kolumn, aby zwiększyć lub zmniejszyć ich rozmiar. O kno dialogowe widoczne na rysunku 19.13 można łatwo utworzyć za pomocą panelu Grid (kod w XAM L-u tego okna przedstawia listing 19.1). Zdaniem niektórych osób w prawie wszystkich scenariuszach tworzenia układu kontrolka Grid jest najbardziej elastyczna i odpo­ wiednia spośród dostępnych paneli. Dlatego kiedy programista dodaje nowe okno w projekcie W P F, domyślnie zawiera ono kontrolkę Grid.

Rozdział 19. Tworzenie bogatszych i bardziej inteligentnych interfejsów użytkownika Rysunek 19.12. Używanie kontrolki Grid w oknie projektowym

Rysunek 19.13. Tworzenie okna dialogowego przy użyciu wierszy i kolumn kontrolki Grid

Listing 19.1. Tworzenie okna dialogowego przy użyciu panelu Grid 0K Anuluj

W przedstawionym kodzie w X A M L-u warto zwrócić uwagę na trzy zagadnienia: • Do uporządkowania kontrolek w pożądany sposób posłużyło scalanie kolumn. •

Aby zapewmić miejsce etykietom, polom tekstowym i innym kontrolkom podrzęd­ nym, użyto właściwości Margin. Bez niej każda kontrolka automatycznie zapełni całą zajmowaną komórkę, a między elementami nie będzie wtedy żadnych odstępów ani obramowań i to zarówno w poziomie, jak i w pionie.



W definicjach kolumn kontrolki Grid znalazła się gwiazdka, które określa, że rozmiar ma być ustalany proporcjonalnie. Oznacza to, że druga i trzecia kolumna będą zajmować po połowie miejsca dostępnego po wyświetleniu kolumny pierwszej. Można dostosować współczynnik proporcji przez podanie liczby, na przykład ColumnDef inition.

'-►Width="2*". Określanie rozmiarów tabeli omawiamy szczegółowo w dalszej części rozdziału, w opisie tworzenia przykładowej aplikacji.

Kontrolka StackPanel Kontrolki StackPanel pozwalają rozmieszczać elementy podrzędne obok siebie w pionie i pozio­ mie. W porównaniu z kontrolką G rid jest to prosty panel, który ma niew ielkie możliwości w zakresie konfigurowania. Przy użyciu właściwości Orientation można określić, czy elementy podrzędne mają być rozmieszczone w poziomie, czy w pionie, a panel wykonuje wszystkie pozo­ stałe operacje. Rozmieszczenie i wielkość każdego elementu kontrolki StackPanel są dopaso­ wywane do wysokości (przy warstwach pionowych) lub szerokości (przy układzie poziomym)

Rozdział 19. Tworzenie bogatszych i bardziej inteligentnych interfejsów użytkownika panelu. Z uwagi na prostotę kontrolki nieskomplikowany jest też kod w XAM L-u potrzebny do jej użycia. Poniższy fragment rozmieszcza w pionie kilka pól wyboru, etykiet, przycisk i pole tekstowe (rysunek 19.14 przedstawia efekt działania tego kodu):

Opcje formatowania: 5zybkie formatowanie

Można też dodać atrakcyjne elementy graficzne, na przykład wypełnienie gradientem:





C zę ść V Tworzenie aplikacji dla przedsiębiorstw

W skazówka Aby przetestować przygotowany wygląd i styl, należy zapisać w edy­ torze XAML-a kod kształtu i dostosować go do własnych potrzeb. Po uzyskaniu zadowalającego efektu można skopiować i wkleić kod w XAML-u do szablonu. Lepszym narzędziem do projektowania interfejsów użytkownika jest Microsoft Expression Blend, jednak w prostych szablonach powinno wystarczyć ręczne dostosowywanie kodu w XAML-u lub użycie okna projektowego Visual Studio.

Tekst przycisku można łatwo wyświetlić przy użyciu obiektu Tex tB lo ck :



Rozdział 19. Tworzenie bogatszych i bardziej inteligentnych interfejsów użytkownika



OK





•cColumnDefinition Width=,,*,‘ />

Do rozmywania rysunku służy inny mechanizm zwany efektem bitmapowym. Należy utwo­ rzyć egzemplarz klasy BlurBitmapEf fect i przypisać go do kontrolki Image, a W P F zastosuje odpowiedni algorytm i zmniejszy ostrość rysunku: imagel.BitmapEffeet = new BlurBitmapEffect();

W ybór k atalo g u przy u życiu stan d ard o w eg o okna d ia lo g o w e g o Ostatnie zadanie polega na umożliwieniu użytkownikom określenia ścieżki prowadzącej do plików z rysunkami. Sama platforma W P F nie ma wbudowanych klas okien dialogowych do obsługi tej operacji, jednak w przestrzeni nazw' System .Windows .Forms znajduje się potrzebny typ — FolderBrowserDialog. Jego egzemplarz twrorzy metoda obsługi zdarzenia kliknięcia elementu FolderOpenMenuItem. private void FolderOpenMenuItem Click(object sender, RoutedEventArgs e) { SetPath(); }

C zę ść V Tworzenie aplikacji dla przedsiębiorstw private void SetPath()

{ FolderBrowserDialog dig = new FolderBrowserDialog(); dlg.ShowDialog(); _path = dlg.SelectedPath; ResetList();

} Kiedy użytkownik zaznaczy katalog, należy odpowiednio zaktualizować wewnętrzne pole, ponownie wczytać klasę Di recto rylmageList z nową ścieżką, a następnie ustawić właściwość DataContext, aby odzwierciedlić wprowadzone zmiany. Jest to doskonały przykład płynnej współpracy technologii .NET i bibliotek klas WPF. Po dodaniu do projektu odpowiednich prze­ strzeni nazw i referencji można tworzyć egzemplarze potrzebnej klasy w taki sam sposób jak obiekty wszystkich innych klas rozwiązania.

Wskazówka P on iew aż w W PF i form ularzach W indow s jest w iele kontrolek o tej sam ej nazw ie (na przykład ListBox), przy korzystaniu z klas z p rze­ strzen i nazw System.Windows.Controls i System.Windows.Forms n iezb ęd n e jest p o d a n ie pełnej nazwy n ie k tó r y c h o b ie k tó w , aby uniknąć użycia n ie o d p o w ie d n ie g o typu.

Po wykonaniu ostatnich zadań aplikacja ma już wszystkie funkcje. Na listingach 19.3 i 19.4 przedstawiliśmy odpow iednio obecną wersję znaczników w XAML-u i kodu działającego na zapleczu. Jeśli jednak Czytelnik chce przeprowadzić szczegółową analizę aplikacji, powinien pobrać jej kod źródłowy ze strony poświęconej książce. Pozwoli to zobaczyć usprawnienia w zaso­ bach graficznych oraz ogólnym wyglądzie i stylu, które doprowadził)' do utworzenia ostatecznej dopracowanej wersji widocznej na rysunku 19.28. Rysunek 19.28. Aplikacja po ostatecznym dopracowaniu

Rozdział 19. Tworzenie bogatszych i bardziej inteligentnych interfejsów użytkownika Listing 19.3. Kod przeglądarki obrazów w XAML-u









VerticalAlignment="Center">

Wyszukiwanie klientów



Rozdział 20. Tworzenie bogatych aplikacji internetowych Wpisz fragment nazwiska klienta i wciśnij przycisk Znajdź.
< a s p : TextBox ID="TextBoxCustomer" runat="server">

Wyniki wyszukiwania:





8. Należy dodać do projektu plik N o r th w in d .m d f Można go pobrać wraz z pakietem kodu z książki lub znaleźć w witrynie Microsoft.com. Plik należy umieścić w katalogu A p p _ D a ta .

Następny etap wymaga powiązania kontrolki GridView ze źródłem danych. W oknie projektowym należy wybrać inteligentny znacznik (strzałkę w prawym górnym rogu) kontrolki GridView. Trzeba użyć opcji C h o o se D a ta Source i określić nowe źródło da­ nych, a następnie przejść przez kolejne strony kreatora. Na stronie C h o o s e D a ta S ou rce T y p e należy wybrać opcję S Q L D a ta b a s e . Jako identyfikatora źródła danych można użyć wartości SqlDataSou rceNwd. Na stronie C h o o s e Y o u r D a ta C o n n e c tio n należy wybrać z listy rozwijanej opcję n o r th w n d .m d f . Następnie można kliknąć przycisk N e x t i zapisać połączenie jako ConnectionStringNwd. Po dojściu do opcji C o n fig u r e th e Select S ta te m e n t należy wybrać przycisk opcji o na­ zwie S p e c ify a C u s to m S Q L S ta te m e n t o r S to r e d P r o c e d u r e , a następnie kliknąć przycisk N e x t. Do utworzenia instrukcji SLQ złączającej tabele Customers i Orders można użyć narzędzia Query Builder. Przykładowy kod znajduje się poniżej. Warto zauważyć, że w klauzuli WHERE użyto parametru @cust i słowa kluczowego LIKE, aby zdefiniować spe­ cyficzne dla użytkownika atrybuty wyszukiwania. 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.CustomerlD = Customers.CustomerlD WHERE (Customers.ContactName LIKE @cust + '%') ORDER BY Customers.ContactName, Orders.OrderDate

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Po zdefiniowaniu zapytania należy kliknąć przycisk N e x t w kreatorze. Powinna pojawić się strona D efin e P a r a m e te r s . W tym miejscu można podać źródło parametrów z wcze­ śniejszej instrukcji SQL. 'fu wartość parametru jest ustawiana w pliku z kodem. Rozwią­ zuje to znany problem związany z korzystaniem ze stron wzorcowych. Gdybyśmy ich nie użyli, moglibyśmy jako źródło podać formularz (F o r m ), a jako pole formularza ( F o r tn F ie ld ) — pole tekstowe używane do wpisywania danych (TextBoxCustomer). Jednak korzystamy ze strony wzorcowej, dlatego jako parametr należy wybrać war­ tość n o n e . Rysunek 20.3 przedstawia przykładowe ustawienia.

9. Teraz należy dwukrotnie kliknąć przycisk Z n a j d ź , aby wygenerować m etodę obsługi zdarzenia w pliku z kodem. Trzeba dodać kod ustawiający właściwość Def a u ltV a lu e w parametrach źródła danych na wpisane przez użytkownika dane wejściowe z pola tekstowego. Oto przykładowy kod: protected void ButtonFind Click(object sender, EventArgs e)

{ SqlDataSourceNwd.SelectParameters["cust"].DefaultValue = TextBoxCustomer.Text;

}

Rozdział 20. Tworzenie bogatych aplikacji internetowych 10. Następny krok polega na skonfigurowaniu stronicowania w kontrolce GridView. Można to zrobić przy użyciu następnego znacznika inteligentnego z menu szybkiego dostępu. Tym razem należy zaznaczyć opcję E n a b le P a g in g . 11. Opcjonalnie można dopracować wygląd kontrolki GridView. Przy użyciu inteligent­ nego znacznika szybkiego dostępu należy wybrać opcję A u to E o r m a t, aby włączyć for­ matowanie tabeli. M ożna też użyć odnośnika E d it C o lu m n s i uruchomić edytor kolumn. W tym miejscu można zmienić tekst nagłówka każdej kolumny, kolejność ko­ lumn i ustawić opcje formatowania związane z datami i walutą. Dostępna jest strona wyszukiwania klientów, która wyświetla ich nazwiska i zamówienia na podstawie podanych danych. Kiedy użytkownik kliknie jeden z przycisków stronicowania, nastąpi częściowa aktualizacja strony. Jest to efekt umieszczenia kontrolki GridView w kontenerze Update '-►Panel. Należy uruchomić aplikację i wpisać kilka liter w polu na nazwisko klienta, a następnie kliknąć przycisk Z n a j d ź . Rysunek 20.4 przedstawia efekt tej operacji. Kliknięcie widocznego w dolnej części ekranu odnośnika z numerem strony powoduje aktualizację tabeli w ramach częściowego odświeżenia strony. '

Home Page - Windows Internet Explorer i* * ‘ http localhost- l'S «i4xt*tens»onsSjte default .asp* Ulubione 4* Home Page

- Q

rS n rfe a ] P - t y | x !*=> Bing »> • ' m t * Strona » Bezpieczeństwo ^ Nł/zedzia ▼ *

A plikacja ASP.NET W

y s z u k iw a n ie k l ie n t ó w

W pisz fragm ent nazwiska Wierna i wciśnij przycisk Znajdź. zna** W y n ik i w y s z u k iw a n ia ; ContactN am e John Steeł John Steel Jonas Bergulfsen Jonas Bergulfsen Jo nas Bergulfsen Jonas Bergulfsen Jonas Bergulfsen Jonas 8ergułfsen M Jose,, oPavarotti

Com panyNam e Lazy K (Country Store Lazy K (Country Store Santć Gourmet Sam e Gourmet Sam e Gourmet Sam e Gourmet Sam e Gourmet Sant* Gourmet

Save-a-lot Markets . Saw -a-lot 1 Jose Pavarotti Markets 1 2 3 4 5 ______

4

Phone (509) 5557969 (509) 555 7969 07-96 92 35 07 -98 92 35 07-98 92 35 07-98 92 35 07-98 92 35 07-98 92 35 (208) 5558097 (206) 5558097 ..

O rd erO atc 1997-03-21 00:0000

1997-05-22

00:00:00

1996 12-18

001) 0:00

1997-04-29 00:0000

1997-08-20 0000:00

1998-O r 14 0000:00

1998-02-26 oooo-oo 1998-04-10 ooo ooo 1996-10-08 0000:00

1996-12-25 ooo o o o

RequiredOate 1997-04 18 oooooo 1997-06 19 oooooo 1997-01-15 oooooo 1997 05-27 OOOOOO 199709-17 OOOOOO 199802 11 OOOOOO 199803-26 OOOOOO 199804 24 OOOOOO 1996-11-05 OOOOOO 199701-22 OOOOOO

Sh ip p e d O ate 1997-04-10 OOOOOO 199706-26 OOOOOO 1996-12-20 OOOOOO 1997-0501 OOOOOO 199706-27 OOOOOO 1 9 9801-23 OOOOOO 1 9 9803-10 OOOOOO 19 9 80 4 -20 OOOOOO 1996 10-10 OOOOOO 19970103 OOOOOO

Sh ip A d d rcss 12 Orchestra Terrace 12 Orchestra Terrace Erlmg Skakkes gate 78 Erlmg Skakkes gate 78 Erlmg Skakkes gate 78 Erting Skakkes gate 78 Erting Skakkes gate 78 Erting Skakkes gate 78

ShipCity Sh ip V ia Freigh t O rderlO Waha 7.4800 10482 3 Walla Walla 11.9200 10545 2 Walia Stavern

2

93,6300 10387

Stavern

Xi

13.3700 10520

Stavern

3

386400 10639

Stavern

2

72.1900 10831

Stavern

2

530500 10909

Stavern

2

4.6200

187 Suffolk in .

Boise

1

214.2700 10324

187 Suffolk Ln.

Boise

3

126 5600 10393

-■

11015

!

,



m m m m m

-

.

.

i ir - -r-t------- - ------ , ---------y Zaufane witryny | Tryb chroniony: wleczony Ml

.

Rysunek 20.4. Kiedy użytkownik wyświetla strony z danymi, ma miejsce częściowe odświeżanie

■ MMMM - — *1 » +,10014

. *

J

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Warto zauważyć, że po uruchomieniu strony kliknięcie przycisku Z n a jd ź powoduje pełne odświeżenie strony, a w czasie stronicowania ma miejsce tylko odświeżenie częściowe. Także operację wyszukiwania można obsługiwać za pomocą częściowego odświeżania strony. W tym celu należy wykonać następujące kroki: 1. Przenieść kontrolki TextBox i Button do obszaru ContentTemplate kontrolki UpdatePanel. Kod znaczników obszaru Content powinien wyglądać tak:

Find Customer



Proszę czekać...



4. Ten krok jest opcjonalny. Jeśli programista uruchamia stronę lokalnie, prawdopodob­ nie nie zobaczy powiadomienia. Dlatego trzeba wydłużyć oczekiwanie, aby spraw­ dzić, czy kod działa. Oczywiście, nigdy nie wolno stosować tej techniki w wersji pro­ dukcyjnej. Aby wprowadzić opóźnienie, należy dodać odpowiedni kod do metody obsługi zdarzenia PagelndexChanged kontrolki GridView. Ten kod ma wstrzymy­ wać wątek wykonawczy. Poniższy fragment wprowadza cztery sekundy opóźnienia: protected void GridViewl PageIndexChanged(object sender, EventArgs e) { System.Th reading.Thread.Sleep(4000);

} Teraz można uruchomić aplikację. Jeśli kontrolki związane z operacją wyszukiwania znajdują się w kontrolce UpdatePanel, powiadomienie pojawi się dwukrotnie — po kliknięciu przycisku Z n a jd ź i przy przechodzeniu między stronami danych. Na rysunku 20.6 pokazano działanie strony. f i Hom e P jg e - W in d o w s Internet Explorer

© U - '* ^

U lubione

_____

http. k>c«lhost 49175. ĄdAL^entior Site/Default asp» g

H o m e Page

^

_____________ ___

*

g j

Id E i fi -

____ _______

*

*t

*



X ▼

Strona ▼

Bezpieczeństwo »

N arzędzia ▼ & *

Aplikacja ASP.N ET W y s z u k iw a n ie

kuentów

W pisz fragm ent nazwiska klienta i wołni) przycisk Znajdź. W y n ik i w y s z u k iw a n ia C on U ctN am e C om p an yN am e la z y K Kountry Store la z y K Kountry John Steel Store Jonas Sante Gourmet Sergulfsen >onas Sante Gourmet Bergutfsen Jonas Sante Gourmet Bergułfsen

John Steel

Phone (509) 555­ 7969 (509) 555­ 7969 07 98 92 35 07-98 92 35 07-98 92 35

O rdcrO et* 1997-03-21 00 XX) 0 0 1997-05-22 00 XX) 0 0 1996 12 18 0 0 0 0 OO 1997-04-29 000000

1997-08-20 000000

R eq u ired Date 1997-04-18 OOOOOO 1997-06 19 OOOOOO 1997-01-15 0000.00

1997-05-27 OOOOOO 1997-09-17 OOOOOO

ShippedD ate 1997-04-10 OOOOOO 1997-06-26 OOOOOO 1996 12-20 OOOOOO 199705-01 OOOOOO 1997-08-27 OOOOOO

Sh ip A d d re ss 12 Orchestra Terrace 12 Orchestra Terrace Eriing Skakkes gate 78 Eriing Skakkes gate 78 Erhng Skakkes gate 78

Sh ip C ity Sh ip V ia F re ig h t Order! Walla 7.4800 10482 3 walla Walla 2 11.9200 10545 Walla Stavern

2

93,6300 10387

Slavern

1

13.3700 10520

Stavern

3

38.6400 10639

1J3456Z3912

.....

''

i ' Proszę czekac

1avas c n p t _ d o P o stB a c k(*ct 100$ M amC ontentSGndV icwl ', 'Pa ---

v ' Zaufane witryny | Tryb ch ron io ny: w łą czo n y

*

-

+ ,1 0 0 %

*

-

Rysunek 20.6. Można użyć kontrolki UpdateProgress, aby wyświetlać użytkownikowi informacje w czasie oczekiwania na zakończenie częściowej aktualizacji strony

Rozdział 20. Tworzenie bogatych aplikacji internetowych

ASP.NET Ajax Library i Ajax Control Toolkit Microsoft współpracował ze społecznością programistów nad wprowadzeniem pierwszych wersji Ajaksa w wersjach 2003 i 2005 środowiska Visual Studio. Rozwiązanie to nosiło nazwę ATLAS. Te wczesne próby doprowadziły do powstania biblioteki Ajax Control Toolkit. Zdaniem niektórych ten pakiet to jeden z najbardziej udanych projektów o otwartym dostępie do kodu źródłowego przeprowadzonych wspólnie przez dużą firmę i społeczność programistów. Opi­ sywany pakiet wciąż się zmienia. Najnowsza wersja została rozbudowana i obecnie nosi nazwę ASP.NET Ajax Library. Biblioteka umożliwia programistom budowanie kontrolek ajaksowych i wiązanie danych oraz współdziała z narzędziem JQuery. Obejmuje też nowe wersje kontrolek pakietu. Pakiet Ajax Control Toolkit obejmuje zestaw niestandardowych kontrolek ajaksowych, które udostępniają wiele dynamicznych operacji. Znajdują się w nim także kontrolki obsługujące różne funkcje, w tym automatyczne uzupełnianie tekstu w czasie wpisywania go przez użyt­ kownika, pola tekstowe z maską, sprawdzanie poziomu trudności hasła i modalne wyskakujące okna dialogowe. Tę kolekcję kontrolek można pobrać albo w formie kodu źródłowego, albo w wersji binarnej. Następnie można korzystać z nich przy tworzeniu aplikacji. Pakiety ASP.NET Ajax Library i Ajax Control Toolkit współdziałają ze wszystkimi współcze­ snymi przeglądarkami. Są to między innymi: Internet Explorer 6, 7 i 8, Firefox 3 i 3.5, Safari 4, Opera 10 oraz Chrome 3.

Uwaga B ib lio te k ę A SP .N E T A jax L ib rary i C o n tr o l T o o lk it o m a w ia m y w ty m m ie js c u , poniew aż jest elem en tem świata użytk ow n ików V i­ sual S tu dio. Sam ouczki i dyskusje na jej tem at znajdują się w witrynie

http://www.asp.net/ajaxlibrary/ M icrosoftu . Kod ź r ó d ło w y k on tro­ lek m o ż n a pobrać z w itryny http://ajaxcontroltoolkit.codeplex.com/.

Początki W tym miejscu omawiamy przede wszystkim kontrolki z biblioteki ASP.NEL Ajax Library. Warto jednak wiedzieć, że biblioteka zapewnia programistom dużą pomoc w zakresie tworze­ nia własnych mechanizmów ajaksowych. Najnowszy pakiet kontrolek jest przeznaczony dla platformy .NET 3.5 SP1 oraz nowszych wersji. Planowane jest udostępnienie pakietu dla śro­ dowiska Visual Studio 2010 i platformy .NET 4.0. Programiści mogą pobrać kod źródłowy lub wersję binarną. Załóżmy, że Czytelnik pobrał tę ostatnią, ponieważ nie omawiamy tu kodu źródłowego biblioteki. Pierwszy krok polega na pobraniu pliku .z ip z biblioteką i rozpakowaniu go. Plik zawiera kilka elementów. Katalog S c rip ts obejmuje pliki skryptów biblioteki ajaksowej. Przykłady z katalogu A s p N e tA ja x B e ta S a m p le s pokazują, jak korzystać z biblioteki. Folder W e b F o r m s zawiera podze­ społy, które składają się na pakiet kontrolek — to na nich się skoncentrujemy.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Pakiet kontrolek składa się z dwóch podzespołów': S y s te m .W e b .A ja x .d ll i A ja x C o n tro lT o o lk it.d ll. Zobaczmy, jak m ożna korzystać z kontrolek w' środowisku Visual Studio. W poniższych punktach opisano, jak zacząć stosować pakiet ASP.NET Ajax Control Toolkit: 1. Należy utworzyć witrynę ASP.NET. Jeśli Czytelnik zbudował już przykładową witry­ nę w poprzednich punktach, m oże jej użyć. 2. Należy dodać kontrolki do okna T o o lb o x , aby można ich używać w witrynie. Naj­ pierw jednak trzeba kliknąć to okno prawym przyciskiem myszy i wybrać opcję A d d T a b . Spowoduje to utworzenie w oknie T o o lb o x nowego panelu, w którym można umieścić kontrolki biblioteki Ajax Control Toolkit. Tę nową zakładkę należy nazwać A ja x C o n tr o l T o o lk it lub w podobny sposób. 3. Następnie należy kliknąć prawym przyciskiem myszy obszar nowego panelu i wybrać opcję C h o o s e Item s. Pozwala to wybrać kontrolki dodawane do zakładki. W oknie C h o o se T o o lb o x I te m s należy kliknąć przycisk B row se, a następnie użyć okna dialogowego O p en i przejść do katalogu z rozpakowanym pakietem narzędzi. Potrzebny jest katalog W e b F o r m s \R e le a s e . Należy zaznaczyć plik A ja x C o n tr o T T o o lk it.d ll, aby zaimportować kontrolki do okna T o o lb o x . Teraz można już używać kontrolek z pakietu. Rysunek 20.7 przedstawia ich listę w oknie T o o lb o x . Warto zauważyć, że jest ich wiele. Większość kontrolek udostępnia na tyle specyficzne funkcje, że można je określić na podstawie nazwy. Rysunek 20.7. Można dodać ajaksowe kontrolki do okna Toolbox, a następnie stosować w formularzach sieciowych

Toolbox a AJAX Control Toolkit ^ Pointer . ^ UpdatePanełAnim ationErtender frtfr Rating J i M ultiHandleSUderLxt coder jjfl Com boBox AmmationEvtender ••> Skder Extender PassvvordStrength o ® MaskedEditValidator

•O X

3?

Accordion

§0

AotoCom pleteExtender AsyncFtleUpload ToolkitScriptM anagcr M ut ualfyExclirt iv eCheckBox Extender Editor Dynam icPopviateExtender DropDownExteoder C ascadmgDr opDown ToggleBottonExtender ResJzableControJExteoder F dteredT extBoxfxtender DragPanełEwtender ColorPickerExt coder PopupControlExt coder M odalPopupExtendcr ShdeShowExtender PagrngBuHctcdLrstExtcodcr ConFirmButtonExt coder TextBoxW atermarkExteoder

33 ^ ^ .Q Si? -? 3J

5!

©j

*

^

Rozdział 20. Tworzenie bogatych aplikacji internetowych

Wskazówka A jaksow e kontrolki A SP.NET w spółdziałają z aplikacjam i A SP.N ET M V C (z o b a c z rozd ział 17.). A b y w ykorzystać k o n tr o lk i w tego rod zaju aplikacjach, n a leż y u tw o r z y ć ich e g z e m p la r z e w k o d zie w JavaS cripcie za p om ocą m e to d y S y s .create. W c z a s ie tw o rze­ n ia n o w e g o egzem plarza k o n tr o lk i w zbogacającej trzeb a jak o p a­ ra m etr p rzek azać nazw ę k o n tr o lk i. Ilustruje to p o n iż s z y kod:

W a r to z w r ó c ić u w agę na z a s to s o w a n ie m e to d y S y s .Require, która in fo r m u je , że w szy stk ie skrypty p o trzeb n e k o n tr o lc e k alen ­ darza m ają z o sta ć w czytan e za p o m o c ą n arzęd zia S crip t Loader.

Kontrolki biblioteki Ajax Control Toolkit Kontrolki z biblioteki Ajax Control Toolkit są w pełni obsługiwane na etapie projektowania. Można je umieścić w oknie T o o lb o x , a następnie przeciągać na formularz. Oczywiście, progra­ mista musi wiedzieć, jak wykorzystać daną kontrolkę do osiągnięcia konkretnego celu. Tabela 20.2 przedstawia ogólny przegląd wybranych kontrolek z biblioteki Toolkit. Warto pamiętać, że większość operacji kontrolki wykonują po stronie klienta. Usprawnia to interak­ cję użytkownika z witryną. Tabeli 20.2 można używać jako źródła wiedzy i punktu wyjścia przy stosowaniu poszczególnych technik w aplikacji. Tabela 20.2.

K o n tr o lk i b ib li o t e k i A j a x C o n t r o l T o o lk it d o s tę p n e

Kontrolka A c c o rd io n

w A S P .N E T

Opis Kontrolka A c c o rd io n wyświetla informacje podzielone na panele z tytułami i zawartością. W danym momencie otwarty może być tylko jeden panel. Wyświetlenie następnego powoduje zamknięcie obecnie widocznego panelu, co daje efekt przypominający działanie akordeonu.

A lw a y s V is ib le ^•C o nt ro lE x te n d e r

Kontrolka A lw a y s V is ib le C o n t r o lE x te n d e r służy do wyświetlania w górnej części strony informacji, które powinny być zawsze widoczne dla użytkowników. Jeśli użytkownik przewinie stronę, zawartość kontrolki pozostanie u góry ekranu i nadal będzie widoczna.

A u to C o m p le te E xte n d e r

Kontrolka A u to C o m p le te E x te n d e r pomaga użytkownikom wprowadzać dane z list. Kiedy użytkownik wpisuje litery, rozpoczynające się od nich elementy są pokazywane w polu wyskakującym nad polem tekstowym. Użytkownik może wtedy wybrać element.

C o lla p s ib le P a n e l ^ •E x te n d e r

Kontrolka C o lla p s ib le P a n e lE x te n d e r ułatwia tworzenie paneli, które użytkownicy mogą otwierać i zamykać. Taki panel ma pasek tytułu z przyciskiem służącym do wyświetlania i ukrywania danych.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Tabela 20.2.

K o n t r o l k i b i b l i o t e k i A j a x C o n tr o l T o o lk i t d o s t ę p n e w A S P .N E T

— c ią g

d a ls z y

Kontrolka

Opis

C a le n d a rE x te n d e r

Ta kontrolka umożliwia wybór daty w dowolnym polu tekstowym ASP.NET. Użytkownik może

5

przejrzeć kalendarz i wybrać datę, aby zapisać ją w takim polu. Kontrolka kalendarza jest wyświetlana, kiedy użytkownik umieści kursor w polu tekstowym lub kliknie przycisk. Po wyborze daty kalendarz znika. C ascadingD ropD ow n

Kontrolka C a sc a d in g D ropDown umożliwia zapełnienie grupy kontrolek D ropDown L i s t na podstawie wyboru dokonanego przez użytkownika.

C o n firm B u tto n ^♦ E xtender

To następna kontrolka wyskakująca. Można jej używać przy tworzeniu przycisków, których działanie zależy od zatwierdzenia operacji przez użytkownika (zobacz przykład w dalszej części rozdziału).

F ilt e r e d T e x t B o x

Ta kontrolka określa rodzaj danych, które użytkownik może wpisać w danym polu

'■ ♦Extender

tekstowym. Można na przykład ograniczyć dane do cyfr, liter, małych liter i tak dalej.

H o ve rM e n u E xte n d e r

Ta kontrolka udostępnia małe menu z operacjami dostosowane do miejsca, w którym użytkownik umieści kursor myszy. Na przykład po wyborze danego elementu z listy można udostępnić menu z opcjami wpisywania, usuwania i modyfikowania danych. Kontrolkę Hove rM en u E xte n d e r należy dołączyć do określonego obiektu. Pozwala to określić kontekst, w którym znajdował się kursor, kiedy użytkownik wybrał operację.

L is tS e a rc h E x te n d e r

Ta kontrolka pozwala wpisać literę na liście L is tB o x lub D ro p D o w n L is t, po czym natychmiast zaznacza pierwszy element tej listy rozpoczynający się od danego znaku.

M a s k e d E d itE x te n d e r

Tę kontrolkę można dołączyć do pola tekstowego ASP.NET. Wspomaga ona wpisywanie danych i ogranicza ich typ. Na przykład program może wymuszać wpisywanie numeru telefonu w określonym formacie, takim jak (num er kierunkow yj-num er-w laściw y. Kontrolka M a ske d E d it E x te n d e r gwarantuje podanie wartości w odpowiednim formacie.

M o d a lP o p u p E xte n d e r

Ta kontrolka umożliwia tworzenie okien wyskakujących wyświetlanych w wyniku działań użytkowników. Takie okno jest modalne względem strony. Oznacza to, że ze strony nie można korzystać do czasu wykonania operacji w oknie dialogowym. Jest to doskonała kontrolka do potwierdzania żądań użytkowników, umożliwiająca ponadto obsługę złożonych operacji wpisywania danych, kiedy potrzebny jest dodatkowy formularz.

P a s s w o rd S tre n g th

Tę kontrolkę można dołączyć do pola tekstowego. Informuje ona wizualnie o poziomie trudności hasła wpisanego przez użytkownika. Można jej używać do określania minimalnej długości hasła, wymuszania stosowania znaków niealfanumerycznych i tak dalej.

P o p u p C o n tro lE x te n d e r

Ta kontrolka służy do otwierania i zamykania okna wyskakującego z dodatkowymi informacjami dla użytkownika.

R e o rd e rL is t

Ta kontrolka tworzy powiązaną z danymi listę elementów, którą użytkownik może uporządkować w przeglądarce. Można zaznaczyć element i umieścić go za lub przed innymi pozycjami — oczywiście bez konieczności komunikowania się z serwerem. Ponadto użytkownik może dodawać do listy nowe elementy.

S lid e rE x te n d e r

Ta kontrolka współdziała z polem tekstowym ASP.NET przy pobieraniu danych od użytkownika. Internauta może przesunąć element graficzny w górę, w dół, w lewo lub prawo w określonym zakresie, co powoduje automatyczną aktualizację pola tekstowego.

Rozdział 20. Tworzenie bogatych aplikacji internetowych Tabela 20.2.

K o n t r o l k i b ib lio te k i A j a x C o n t r o l T o o lk it d o s tę p n e

Kontrolka

u>A S P .N E T — c ią g

d a lszy

j Opis

S lid e S h o w E x te n d e r

]

Ta kontrolka obejmuje grupę przycisków, które umożliwiają użytkownikom przechodzenie po zbiorze rysunków z formularza. Można ustawić ją tak, aby automatycznie przechodziła między obrazami w określonych odstępach czasu.

T a b C o n ta in e r

Ta kontrolka umożliwia połączenie grup funkcji strony w logiczne zakładki. Użytkownik może następnie kliknąć zakładkę i wyświetlić dostępne w niej funkcje bez konieczności odświeżania strony przez serwer. Każda kontrolka T a b C o n ta in e r zawiera obiekt T ab P an el, w którym należy umieszczać kontrolki ASP.NET.

T e x tB o x W a te rm a rk ^ E x te n d e r

T e x tB o x W a te rm a rk wzbogaca kontrolkę T e x tB o x o komunikat wyświetlany, jeśli kontrolka jest pusta. Kiedy użytkownik umieśd kursor w kontrolce, komunikat zniknie.

Używanie kontrolek biblioteki Toolkit na stronie Warto ponownie zajrzeć do tabeli 20.2. Większość opisanych w niej kontrolek ma w nazwie przyrostek E x te n d e r. Oznacza to, że dana kontrolka wzbogaca istniejącą kontrolkę ASP.NET. Można ująć to bardziej precyzyjnie — dana kontrolka udostępnia swe funkcje dzięki współ­ działaniu z innym obiektem. Na przykład kontrolka C a le n d a rE x te n d e r opiera się na obiekcie T e x tB o x . Kontrolki biblioteki pozbawione przyrostka E x te n d e r działają samodzielnie. Biblioteka Ajax Toolkit ułatwia korzystanie z opisanych kontrolek. Jeszcze łatwiejsze jest uży­ wanie kontrolek wzbogacających. Aby dodać jedną z nich do kontrolki ASP.NET, wystarczy użyć inteligentnego znacznika tej ostatniej. Poniższe punkty opisują dodawanie do przycisku podstawowego okna wyskakującego z potwierdzeniem: 1. Utwórzmy na potrzeby przykładu nową stronę ,a s p x . 2. Teraz dodajmy do strony kontrolkę T o o lk it S c r ip t M a n a g e r z biblioteki kontrolek ajaksowych. Kontrolka ta współdziała z kontrolką S c rip tM a n a g e r i udostępnia bi­ blioteki potrzebne do działania kontrolek ajaksowych. Po dodaniu kontrolki do stro­ ny można otworzyć katalog B in . Warto zwrócić uwagę na to, że do witryny zostały dodane pliki .d li biblioteki ajaksowej i powiązane z nimi pliki zasobów. 3. Następnie należy dodać do strony przycisk. Ustawmy jego właściwość ID na Button '-►Save, a właściwość T e x t — na Z a p is z . 4. T eraz należy dwukrotnie kliknąć przycisk, aby dodać metodę obsługi zdarzenia w pliku z kodem. W tej metodzie trzeba ustawić właściwość T ext przycisku na nową wartość, aby potwierdzić, że działania użytkownika odniosły efekt. Kod metody może wyglądać następująco: protected void ButtonSave ClicMobject sender, EventArgs e) { ButtonSave.Text = "Zapisano";

} 5. W widoku projektowym należy wybrać przycisk i jego inteligentny znacznik. Do­ stępna jest tu opcja A d d E x te n d e r dodana do środowiska Visual Studio przez biblio­ tekę Ajax Control Toolkit (zobacz rysunek 20.8). Należy wybrać tę opcję.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Rozdział 20. Tworzenie bogatych aplikacji internetowych 8. Teraz można uruchomić aplikację. Powinien pojawić się oczekiwany formularz. Na­ leży kliknąć przycisk Z a p i s z , a aplikacja wyświetli okno dialogowe z prośbą o zatwier­ dzenie, co przedstawia rysunek 20.10. Kliknięcie przycisku A n u lu j spowoduje anulo­ wanie przesyłania danych, a przycisk OK prowadzi do wysłania ich na serwer. Rysunek 20.10. Działanie kontrolki ConfirmButtonExtender

Omówiliśmy podstawowe mechanizmy Ajaksa wbudowane w środowisko Visual Studio 2010 oraz dostępne przy użyciu biblioteki Ajax Library i pakietu Control Toolkit współdziałających z ASP.NET. Ma to pomóc Czytelnikom w wykorzystaniu kontrolek ajaksowych do tworzenia lepszej interakcji użytkownika z witryną. Oczywiście, nie jest to koniec nauki dla osób, które chcą samodzielnie rozwijać takie kontrolki. Służą do tego narzędzia Microsoft Ajax Library i ASP.NET Ajax Library. Obie biblioteki ułatwiają tworzenie ajaksowych rozszerzeń kontrolek. Biblioteka Microsoft Ajax udostępnia strukturę obiektową dla osób, które chcą dodać więcej kodu w JavaScripcie do kontrolek i stron. Ponadto Visual Studio 2010 zapewnia doskonałą obsługę diagnozowania skryptów uruchamianych po stronie klienta.

Tworzenie wyjątkowych, bogatych interakcji opartych na przeglądarkach w systemie Windows W rozdziale 19., „Tworzenie bogatszych i bardziej inteligentnych interfejsów użytkownika”, opisaliśmy proces tworzenia aplikacji WPF przy użyciu Visual Studio 2010. Te aplikacje są oparte na znacznikach XAML-a interpretowanych przez podsystem WPF platformy .NET, a na­ stępnie wyświetlanych na ekranie. WPF umożliwia tworzenie interfejsów użytkownika z wyko­ rzystaniem grafiki wektorowej, skalowania i efektów trójwymiarowych, co pozwala zapewnić użytkownikom wyjątkowe wrażenia w systemie Windows. Aplikacje omówione w rozdziale 19. to niezależne programy uruchamiane w tym systemie operacyjnym. Jednak podobne aplikacje WPF można uruchamiać w przeglądarce.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Aplikacje WPF przeznaczone do uruchamiania w przeglądarkach są nazywane XBAP (ang. X A M L b r o w s e r a p p lic a tio n , czyli aplikacja XAML-owa dla przeglądarki). Aplikacje XBAP można instalować przy użyciu prostego adresu URL w technologii ClickOnce, a następnie uruchamiać w przeglądarce (aplikacja nie wykracza poza przeglądarkę). Z tej przyczyny aplikacje XBAP działają w zabezpieczonym obszarze bez pełnego zaufania. Nie mają na przykład dostępu do syste­ mu plików użytkownika.

Uwaga Aplikacje XBAP oparte na WPF można uruchamiać w przeglądar­ kach Internet Explorer i Firefox. Zapewnia to duży zasięg aplikacji, ponieważ większość użytkowników korzysta z jednej z nich. Jednak po stronie klienta aplikacje XBAP wymagają zainstalowanego sys­ temu Windows i platformy .NET. Jeśli rozwiązanie ma działać w róż­ nych systemach operacyjnych, trzeba utworzyć aplikację ASP.NET lub Silverlight.

Niezależne aplikacje WPF a programy XBAP WPF W niektórych scenariuszach warto utworzyć aplikacją XBAP zamiast rozwiązania opartego na ASP.NET, formularzach Windows lub WPF. XBAP umożliwia łatwe budowanie interakcji zwykle niedostępnych w przeglądarce. Obejmują one menu znane z systemu Windows, menu kontekstowe (otwierane przez kliknięcie prawym przyciskiem myszy), interaktywne przeszukiwanie danych, sprawdzanie pisowni w czasie rzeczywistym, kontrolki do edycji z maskowaniem, przewijanie list z danymi, klawisze skrótu, zarządzanie kursorem i wiele innych funkcji. Tego typu bogata inte­ rakcja jest zwykle dostępna tylko w niezależnych programach klienckich systemu Windows. Jednak w aplikacjach XBAP można udostępnić te funkcje w klientach uruchamianych bezpośrednio w przeglądarce. W ten sposób dostępne są korzyści związane z łatwą instalacją i aktualizacją, zabez­ pieczonym obszarem przeglądarki i komunikacją z serwerem oraz usługami sieciowymi opartymi na protokole HTTP. Ponadto jeśli jest to potrzebne, aplikacja XBAP zapewnia dostęp do izolo­ wanej pamięci, w której można bezpiecznie zapisywać i pobierać dane na maszynie użytkowmika. Aplikacje XBAP to odmiana programów' WPF. Projekty obu rodzajów są oparte na tym sa­ mym kodzie platformy .NET. Jednak obok podobieństw' występują też różnice. Warto je po­ znać przed wyborem technologii następnego interfejsu użytkownika. Tabela 20.3 porównuje możliwości obu podejść.

Tworzenie aplikacji WPF uruchamianych w przeglądarce Tworzenie aplikacji WPF uruchamianych w przeglądarce przebiega niemal tak samo jak budo­ wanie niezależnych programów WPF. Oczywiście, trzeba uwzględnić kilka zagadnień, aby się upewmić, że aplikacja jest prawidłowo skonfigurowana pod kątem instalowania i uruchamiania

Rozdział 20. Tworzenie bogatych aplikacji internetowych Tabela 20.3.

T e c h n o lo g ie W P F i X B A P

Funkcja

WPF

Instalacja

Aplikacje zwykle są instalowane na maszynie

1XBAP

1

Aplikacje instalowane są w pamięci podręcznej

użytkownika przy użyciu pakietu ms/ lub

przeglądarki (nie są instalowane bezpośrednio

technologii ClickOnce.

na komputerze).

Aby odinstalować aplikację, należy użyć opcji

Instalacja odbywa się przy użyciu adresu URL

Dodaj/usuń program y.

w technologii ClickOnce.

Dostęp przez

Użytkownik może uruchomić aplikację z menu

Dostęp z poziomu skrótów przeglądarki

użytkownika

Start, przy użyciu skrótu z pulpitu i tak dalej.

(odnośników do ulubionych stron) przy użyciu

Plik .exejest instalowany w katalogu Program Files.

protokołu HTTP. Plik .exe jest przechowywany przez przeglądarkę.

Proces nadrzędny

Aplikacja działa we własnym procesie

Aplikacja działa w procesie przeglądarki.

w systemie Windows. Zabezpieczenia

Program zwykle ma pełne uprawnienia na

Aplikacja działa w obszarze z niepełnymi

maszynie użytkownika. Oznacza to dostęp

uprawnieniami. Domyślnie nie ma dostępu

do rejestru, systemu plików i urządzeń

do zdalnej komunikacji, refleksji, systemu

(na przykład drukarek).

plików, drukarek, usług WCF, rejestru i innych mechanizmów.

Obsługa WCF

Możliwość pełnej komunikacji z usługami WCF.

Nie można wywoływać usług WCF w aplikacjach uruchamianych w przeglądarce.

Nowe okna

Tworzy nowe okna potomne, podobnie jak

Aplikacja przechodzi do nowych okien

dowolna aplikacja systemu Windows.

w przeglądarce, a nie otwiera ich jak programy systemu Windows.

Aktualizacja

Wymaga strategii udostępniania aktualizacji

Łatwa aktualizacja w wyniku komunikacji

klientom lub pobierania ich przez użytkowników.

z serwerem. Nową wersję wystarczy zainstalować jeden raz na serwerze, a wszystkie klienty zostaną zaktualizowane.

Tryb offline

Użytkownik zwykle może uruchomić aplikację,

Działa tylko w trybie online. Wymaga połączenia

jeśli nie ma połączenia z serwerem (w trybie

z serwerem.

offline).

jej w przeglądarce. W tym punkcie opisujemy podstawowe etapy tworzenia, konfigurowania i dia­ gnozowania aplikacji XBAP. Następnie omawiamy kwestie związane z zabezpieczeniami i in­ stalacją. Punktem wyjścia będzie prosta aplikacja WPF uruchamiana w przeglądarce. Nie omawiamy w tym miejscu podstaw związanych z projektowaniem interfejsu użytkownika, tworzeniem układu kontrolek i pisaniem kodu, ponieważ przedstawiliśmy je już w rozdziale 19. Pierwszy etap polega na utworzeniu projektu WPF. W Visual Studio 2010 znajduje się specjalny szablon do tworzenia aplikacji XBAP. Jego nazwa to W P F B r o w s e r A p p lic a tio n . Szablon ten umożliwia szybkie skonfigurowanie aplikacji, tak aby działała w przeglądarce. Rysunek 20.11 przedstawia okno dialogowe N e w P ro je c t z zaznaczonym odpowiednim szablonem.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Każdy typ pliku jest oparty' na innej klasie bazowej. Na przykład pliki okien dziedziczą po klasie System .Windows .Window, a pliki stron — po klasie System .Windows . Cont rols . Page. Plik konfiguracyjny a p p .x a m l to dobre miejsce na określenie strony wyświetlanej przy pierwszym uruchomieniu aplikacji przez użytkownika. Służy do tego atrybut StartupUri, który można określić w węźle A p p lic a tio n . Do tego atrybutu należy przypisać nazwę formularza uruchomie­ niowego aplikacji, jak w poniższym znaczniku z pliku A p p .x a m l: Application x :Class="WpfBrowserWorkQueue.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentat ion" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="Main.xaml">

Następny krok polega na utworzeniu aplikacji WPF w standardowy sposób. Warto jednak poświęcić szczególną uwagę ograniczeniom związanym z zabezpieczeniami, w których ramach działa aplikacja (zobacz omówienie w dalszej części rozdziału). Ponadto przy tworzeniu interfejsu użytkownika można korzystać z licznych kontrolek WPF. Są to między innymi menu, menu kontekstowe, klawisze skrótów i tak dalej.

Rozdział 20. Tworzenie bogatych aplikacji internetowych Uruchamianie i diagnozowanie aplikacji XBAP odbywa się tak samo jak pozostałych progra­ mów .NET. Wystarczy dodać punkty przerwania i kliknąć przycisk S ta rt D eb u g g in g (lub R u n ). Spo­ woduje to uruchomienie aplikacji w przeglądarce. Rysunek 20.12 przedstawia zalążki systemu kontroli pracowników pomocy technicznej działa­ jącego jako aplikacja XBAP. Program ten działa w przeglądarce Internet Explorer. Warto zwrócić uwagę na obecność paska menu, paska statusu, paska narzędzi, menu kontekstowych i innych mechanizmów znanych z systemu Windows. C:\Users\Tomelc\Documents\Visual Studio 2010\Projects\WPF Browser Work Queue Example\WpfBrowserW - Windows Int... j

U lu b io n e Plik

Edycja

* C :\U se rs\T o m e k\D o cu m e n tsW isu al Stu d io 2010\Proje< ▼ 46

- 0

W pfBrcw serW orkQ ueue.ifbap

Widok



|X *:

fc > ▼

p

B in g

Stron a ^

-

B e zp ie cze ń stw o w N arzędzia ▼

Pomoc

D LI ^ Elementy robocze Krytyczne (1)

Pomoc techniczna (4)

Z a b e zp ie cze n ia (3) Z a d a n ia fu n kcji (8) Z a m kn ię te (11) N o w e (2) * Pracow n icy M ana (2) Ja n (0) Julia (0)

R y sza rd (5) A n d rze j (1) ^ Baza w ie d zy FAQ P o d rę czn iki W skazó w ki In n e zg ło sze n ia

'-ki Nieprzypisane problemy (4) U żytkow nik

jsm rth B łch u g h e s Ipow ers m snęli

Telefon

123-123*1234 1 2 3 -1 2 3 -1 2 3 4 1 2 3 -1 2 3 -1 2 3 4 1 2 3 -1 2 3 -1 2 3 4

Adres e m ail

Data

jsm ith © co n to so .co m 6/18/2008 kh u g h e j P rzyp isz p ro b le m Ipow ers W yślij e -m a il ^ m sneli^ Z am kn ij p ro b le m

T y tu ł A plikacja m e re agu je

PS51 p on ito r m ru ga plysz d zia ła za w o ln o

U w agi Z m ie ń ka te g o rię i.. ■ K o m p u te r za w ie sił się, kiedy próbow ałem za lo g o w a ć się n a ko n to pocztow e.

G otow e i% K o m p u te r | T ry b ch ro n io n y w y łą czo n y

-

Rysunek 20.12. Aplikacja XBAP działająca w przeglądarce zapewnia interakcję i funkcje podobne do tych z aplikacji WPF

Po utworzeniu aplikacji XBAP w zadowalającym kształcie należy zainstalować ją na serwerze WWW i udostępnić użytkownikom. Proces ten opiszem y nieco dalej, po przedstawieniu za­ bezpieczeń związanych z każdą aplikacją XBAP.

Wskazówka A p lik a c je X B A P m o ż n a te ż u r u c h a m ia ć w ra m ce p rzeg lą d a rk i. W ty m scen ariu szu aplikacja m o ż e k om u n ik ow ać się ze stron ą nad­ rzędną za p o m o c ą o b iek tu B row serlnteropH elper. H ostS crip t.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Zagadnienia związane z zabezpieczeniami Aplikacje XBAP są instalowane z poziomu serwera WWW. Domyślnie aplikacje pochodzące z serwerów nie mają (i nie pow inny mieć) statusu programów zaufanych. Zaufanie polega tu na udostępnieniu danej aplikacji zasobów komputera i urządzeń użytkownika. Programy działające w internecie zwykle nie pow inny mieć dostępu do systemu plików. Dlatego aplikacje XBAP działają w tak zwanych obszarach zabezpieczonych. Obszar zabezpieczony jest kontrolowany przez zabezpieczenia przeglądarki. Domyślnie apli­ kacje XBAP działają w strefie Internet. Poziom zaufania do programów z tej strefy jest niski, a zabezpieczenia obowiązujące przy ich działaniu — wysokie. Rysunek 20.13 przedstawia opis strefy Internet w przeglądarce Internet Explorer. Aplikacje XBAP mają podobne uprawnienia jak inne aplikacje uruchamiane z poziom u internetu (i dlatego ich działanie jest równie zabezpieczone). Rysunek 20.13. Zabezpieczeniami można zarządzać w zakładce Zabezpieczenia strony Opcje internetowe przeglądarki Internet Explorer

Kliknięcie przycisku P o z io m n ie s ta n d a r d o w y , widocznego na rysunku 20.13, spowoduje wy­ świetlenie okna U s ta w ie n ia z a b e z p ie c z e ń dla danej strefy. Aplikacje XBAP mają specyficzne ustawienia podstawowe. Są one wyróżnione na rysunku 20.14. Można wyłączyć obsługę aplika­ cji XBAP lub prosić użytkowników o zezwolenie na ich uruchomienie. D om yślnie w przeglą­ darce Internet Explorer aplikacje XBAP są uruchamiane jako programy ze strefy Internet. Jeśli aplikacja XBAP w czasie działania (lub diagnozowania) spróbuje naruszyć zabezpieczenia, system zgłosi wyjątek zabezpieczeń. Możliwości aplikacji XBAP są wyznaczane przez jej strefę.

Rozdział 20. Tworzenie bogatych aplikacji internetowych Rysunek 20.14. Można wybrać poziom niestandardowy, aby kontrolować ustawienia zabezpieczeń aplikacji XBAP uruchamianych w przeglądarce

Jeśli taki program ma działać w zabezpieczonej strefie Internet, programista powinien unikać następujących operacji: • zdalnej komunikacji, • prywatnej refleksji, • dostępu do sterowników urządzeń (na przykład drukarek), • dostępu do rejestru, • współdziałania z innym kodem (nie z platformy .NET), • wywołań usług WCF (dozwolone są wywołania HTTP i usług sieciowych), • dostępu do systemu plików (można stosować bezpieczne przesyłanie, podobne do prze­ syłania danych przy użyciu stron internetowych; ponadto dostępna jest izolowana pamięć po stronie klienta). Jeśli programista potrzebuje dostępu do tych elementów, powinien rozważyć inną strategię udostępniania oprogramowania. Na przykład można użyć wtedy aplikacji WPF przesyłanej przy użyciu przeglądarki (i technologii ClickOnce), ale instalowanej na maszynie użytkownika, a nie uruchamianej w przeglądarce. Pozwala to skopiować plik ,e x e na komputer użytkownika i zainstalować jako zaufaną aplikację z dostępem do wymienionych wcześniej mechanizmów. Warto jednak zauważyć, że możliwe jest uruchomienie aplikacji XBAP w przeglądarce jako zaufanego programu. Wymaga to przyznania aplikacji uprawnień ze strefy L o k a ln y in tra n et. Środowisko wyświetli ostrzeżenie, ale użytkownik będzie mógł potwierdzić uprawnienia pro­ gramu, który następnie uzyska pełny dostęp do maszyny użytkownika z poziomu przeglądarki. Zgodnie z najlepszymi praktykami z obszaru zabezpieczeń należy unikać takiego rozwiąza­ nia, a jeśli firma zdecyduje się na jego zastosowanie, powinna używać go tylko do uruchamiania aplikacji intranetowych.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Rozdział 20. Tworzenie bogatych aplikacji internetowych Kod tego rodzaju może reagować na działania użytkowników, na przykład zaznaczenie ele­ mentu menu lub kliknięcie przycisku. Można też użyć elementu Hyperlink, aby przechodze­ nie między stronami aplikacji przypominało korzystanie z witryny. Potrzebny znacznik może wyglądać następująco:

Calendar

53

Auto

Min Height

AutoComp leteBcx

®



Mm Width

Pointer

Border

(Collection) j _

HoruontalAlig.

w

a All SiKeHight Controls

O

J (Collection):

a Layout

RadioButton Rectangle

Q Reseller □

©

£0

Binding..

DataContext

' t . le

*3

O

tv e rts Search

Vf

CJ

y Properties

PoKar slajdów

M a rg in

KMfeai

%

Data C onnections appserver.Contose.dbo Database Diagram s f J T ables > ^ Views Z j Stored Procedures :» Fu nction s u J Syn on ym s > C l Types » 1_! Assem blies Servers

U 0 SharePomt Con n ectio n s ------------ ------

» □ X

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Dodawanie istniejącej bazy danych Oczywiście, można także ustanowić połączenie z istniejącą bazą danych. Aby to zrobić, należy kliknąć prawym przyciskiem myszy węzeł D a ta C o n n ec tio n s. Tym razem jednak należy wybrać opcję A d d C o n n e c tio n . Okno dialogowe A d d C o n n e c tio n (rysunek 21.3) jest podobne do okna dialogowego nowej bazy danych. Należy określić źródło danych, nazwę serwera, poświadczenia logowania oraz nazwę bazy danych lub jej pliku. Rysunek 21.3. Łączenie z istniejącą bazą danych

'aI*** i

Add C o n n e c tio n

Enter inform ation to connect to the selected date source or click 'C h an ge' to choose a different data source and/or provider. Data source: M icrosoft SQ L Server (SqlCkent)

Change...

Serv er name: Refresh

APPSERVER

Log on to the server • U se W in d o * : A u th ę n t c a tio n

Use SQ L Server Authentication

Save m y password Connect to a database * select or enter a database nam e Attach a database file

Hd.anced

Test Connection

. MKC

Pod węzłem każdego z połączeń znajdują się folder)' dla następujących klas obiektów baz danych: • diagramów bazy danych, • tabel, • widoków, • procedur składowanych, • funkcji, • synonimów, • typów, • podzespołów. Te foldery są punktem wyjścia w tworzeniu odpowiadających im obiektów wewnątrz bazy danych.

Rozdział 21. Praca z bazami danych

Czę ś ć V

Tworzenie aplikacji dla przedsiębiorstw

T w o r z e n ie in d e k s ó w , k l u c z y o b c y c h i o g r a n ic z e ń

Indeksy, klucze obce i ograniczenia są tworzone przy użyciu tego samego interfejsu i procesu — należy wybrać odpowiednie działanie z menu T a b le D esig n er. Następnie użyć okna dialogo­ wego ustawień w celu początkowego dodania indeksu, klucza lub ograniczenia. Później należy skonfigurować ich właściwości. Przykładowo, aby utworzyć indeks dla jednej lub wielu kolumn w tabeli, należy wybrać elementy I n d e x e s /K e y s z menu T a b le D e s ig n e r . W oknie dialogowym In d e x e s/K e y s (rysunek 21.5) można dodać nowe indeksy iokreślić ich właściwości. Rysunek 21.5. Tworzenie indeksu

r

x— '

Indent:,'Keys Selected Prim ary /Unique Key or Index: Editing properties for new unique key or index. K.C o u rse* PK_Course

(General) class.code (A SO Colum ns No b Unique Index T/p» s Identity ^ IX .Course) (Nam e) Description 4 Table [>esigner No Create As Clustered PRIMARY Date Space Specification ;> Fill Spectfrcation l -- -- — — — d

[ Isz:

DC

Delete

|

Ciotę

Kolumny w indeksie są kontrolowane za pomocą właściwości indeksu C o lu m n s . Oddzielne okno dialogowe In d e x C o lu m n s (rysunek 21.6) pozwala na zmianę udziału iokreślenie porządku sortowania dla każdej kolumny. Rysunek 21.6. Udział kolumn w indeksie

Index Colum ns Specify the co lu m n s and sort order for this Indoc C olu m n N am e

Sort Order ~ Ascending

Cancel

Rozdział 21. Praca z bazami danych

Korzystanie z Database Diagram Designer Opisane wcześniej narzędzie T a b le D e sig n e r iokna dialogowe pozwalają na definiowanie tabel i związanych z nimi konstrukcji tabela po tabeli. D a ta b a s e D ia g ra m D e s ig n e r udostępnia te same funkcje w bardziej wizualnym tormacie. Pozwala na budowanie diagramu ukazującego wszystkie tabele bazy danych, ich kolumny, klucze izwiązki, a także pozwala na tworzenie tych elementów. Podobnie jak T a b le D esig n er, okno D a ta b a se D ia g ra m D e sig n e r jest wyświetlane w panelu do­ kumentu IDE. M a własne menu i pasek narzędzi. Wiele poleceń z menu i paska narzędzi może być dostępnych z menu skrótów przez kliknięcie prawym przyciskiem myszy w dowolnym miejscu okna projektowego.

Wskazówka W e w n ą tr z d ia g ra m u m o ż n a z m ie n ić styl w id o k u na o p a r ty na tabelach. N ależy kliknąć praw ym przyciskiem m yszy na tabeli i wy­

Standard (pokazujący nazwę k olu m n y, typ danych i zezw olen ie na wartości null), Column Nantes, Keys, Name Only oraz Custom (p ozw alający na d o w o ln y w ybór d a n y c h , k tó r e ch ce się w y ś w ie tlić ). W id o k Name Only je st szcze­ brać jed en z dostępnych w id ok ów tabel:

g ó ln ie użyteczny, jeśli chce się zobaczyć cały diagram bazy danych bez k o n iecz n o ści zw racania u w a g i na jej szczeg ó ły .

Tworzenie diagramu bazy danych Aby utworzyć diagram bazy danych, należy kliknąć prawym przyciskiem myszy węzeł D a ta b a ­ se D ia g r a m s w oknie S erver E x p lo re r oraz wybrać opcję A d d N e w D ia g ra m . Pusty diagram zostanie otwarty, a widok projektów)' automatycznie wyświetli okno dialogowe służące do umieszczania tabel na diagramie (rysunek 21.7). Rysunek 21.7. Dodawanie tabel do diagramu

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Po dodaniu kilku tabel diagram ukazuje graficzną reprezentację kolumn tabel ijej związków. Diagram jest w pełni interaktywny. Można w nim bezpośrednio edytować definicje kolumn, klucze, związki itd.

W skazówka I s t n ie j e s z y b k i sp o só b d o d a w a n ia gru p y p o w ią z a n y c h ta b e l — n ależy d o d a ć tabelę do d iagram u , zaznaczyć ją i kliknąć przycisk A dd Related Tables na pasku n arzęd zi w oknie projektow ym . A u to m a ­ ty c z n ie d o d a to d o diagram u w szystkie tabele w b a zie danych, które są a k tu a ln ie zw iązan e z w y b ra n ą tabelą.

Modyfikowanie definicji tabel Tabele mogą być definiowane bezpośrednio na diagramie. Aby zmienić szczegóły kolumn, należy kliknąć wewnątrz tabeli, a następnie wprowadzić informacje o nazwie kolumn lub zmienić typ danych izasady korzystania z wartości nuli. Aby dodać kolumnę, należy po prostu wypełnić nowy wiersz wewmątrz reprezentacji tabeli na diagramie.

Budowanie związków tabel Związki tabel są łatwe do definiowania wewnątrz diagramu — wystarczy po prostu przecią­ gnąć kolumnę klucza głównego z jednej tabeli do kolumny klucza obcego innej. Automa­ tycznie otworzy to okno dialogowe F oreign K e y R e la tio n s h ip s (zobacz rysunek 21.8). Okno zawiera ogólne informacje o związkach. Warto zauważyć, że tekst w oknie dialogowym wyraźnie informuje, iż programista tworzy nowy związek. Dlatego trzeba zdefiniować kolumny tabeli uwzględniane w związku. Rysunek 21.8. Tworzenie klucza obcego

Selected Relationship:

B

Editing properties for new relationship. The 'Tables A n d C olu m n s Specification' property needs to be filled m before the new relationship w ill be accepted. (G eneral) Check Existing Data On Creati Tables A n d C o lu m n s Specific a D atabase D e sig n e r Enforce For Replication Enforce Foreign Key Constrair b IN SERT A n d U PD A TE Specific, a Id e n tity (Nam e) Desc option s

Yes

Yes Yes FK_Product_ProductCategory

OK

1.g g g j

Rozdział 21. Praca z bazami danych Kliknięcie właściwości T a b le s a m i C o lu m n s S p e c if ic a tio n powoduje wyświetlenie drugiego okna dialogowego (zobacz rysunek 21.9). Tu można utworzyć standardowy związek jeden do wielu między tabelą kategorii a tabelą produktów. Tabela produktów ma kolumnę identyfika­ cyjną kategorii, która będzie kluczem obcym dla klucza głównego tabeli kategorii. Po zatwier­ dzeniu powiązań pomiędzy kolumnami należy ukończyć definiowanie związku, zmieniając jego właściwości (wg potrzeby) w oknie dialogowym Foreign K e y R elationships. Następnie można kliknąć przycisk O K . Rysunek 21.9. Określanie kolumn klucza obcego

Tables and C olum ns Relationship n am e

Primary key table: ProductCategory (Production;

Foreign key table: *

ProductCategoryH)

ProductSubcategory (Production) Product Category ID

Cancel

Związki są ilustrowane na diagramie jako linie pomiędzy dwoma tabelami. Linia wskazuje kierunek związku, ukazując klucz po stronie klucza głównego i symbol nieskończoności po stronie klucza obcego (stronie „wielu ). Rysunek 21.10 ilustruje tabele pozostające w związku jeden do wielu w oknie D a t a b a s e D ia g r a m D e sig n er. P ro d u c t ( P r o d u c tio n )

Produc® •i

*

ag

1r M .

R : ::

: :•

SafttyStoctt*v«i P r o d u c t C a t e g o r y (P ro d u c tio n ) •

-

.a ? : :

M .

ProAicrSubcitagory©

' . i na

MM Modif^dDate

3

-

MMII

M M DH

WtmI •

-•* :s m uM Lst*nca

:

B U te a :.'* I :

'*

RtaMHMPIMR *-: :* MM DsysToManufactura

mmm * -

-• *

IM M M * ENoduoMedHD SafStartData • Ew

:

• .r

■lpm '

Rysunek 21.10. Związki między tabelami w oknie Database Diagram Designer

: : fedDaca

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Uwaga D o m y ś ln ie zw iązk i w ym u szają in tegraln ość referen cy jn ą . O z n a ­ cza to , ż e zapobiegają d ziałan iom (w staw iania, u a k tu a ln ia n ia , u s u w a n ia ), k tó r e m o g ły b y sk u tk o w a ć n ie d o p a s o w a n ie m k lu c z y p o m ięd zy d w om a p ow iązan ym i tabelam i. O bejm uje to w staw ianie w artości k lu cza ob cego (ang. foreign

key — FK), gdy nie istnieje on jak o k lu cz g łó w n y (ang. primary key — PK) w p o w ią za n ej tab eli, z m ie n ia n ie w artości PK, która jest wskazywana jako w artość FK, itp. M ożn a k on trolow ać, czy zw iązek wym usza in tegraln ość referencyj­ ną, za p o m o c ą u sta w ien ia Enforce Foreign Key Constraint w o k n ie

Foreign Key Relationship. Z w iązki n iew y m u sz a ją c e in te g r a ln o śc i referencyjnej są przedstaw iane w o k n ie Diagram De­ signer ja k o lin ie p rzeryw an e za m ia st ciągłych . M o ż n a tak że za ­ u w ażyć, ż e Diagram Designer p o k a zu je tylko zw ią zk i, k tó r e zo sta ły d ia lo g o w y m

ja w n ie z d e fin io w a n e za p o m o c ą procesu o p isa n eg o w pow yższych a k a p ita c h . S a m o u tw o r z e n ie p o d o b n ie nazw anych k lu c z y ob cy ch i g łó w n y ch n ie utw orzy a u to m a ty c z n ie zw iązku.

Poza związkami jeden do wielu można modelować także związki jeden do jednego i wiele do wielu oraz związki zwrotne, korzystając z D a ta b a s e D ia g r a m D esig n er. Związki jeden do jednego

Związki jeden do jednego tworzy się w ten sam sposób, co związki jeden do wielu. Różnica polega na tym, że związek jeden do jednego jest związkiem pomiędzy dwoma kluczami głównymi, a nie pomiędzy kluczem głównym iobcym. Jeśli przeciągnie się kolumnę klucza głównego jednej tabeli do kolumny klucza głównego innej tabeli, to automatycznie zostanie utworzone powią­ zanie jeden do jednego. Te związki są symbolizowane przez ikony klucza na obu końcach linii. Związki wiele do wielu

Związki wiele do wielu tworzy się za pomocą tabeli połączeń. Jeśli trzeba zamodelować powią­ zanie wiele do wielu pomiędzy tabelami zamówień ielementów, to należy najpierw dodać trzecią tabelę do bazy danych, aby przetrzymywać klucze obce tego związku. Dzieje się tak, ponieważ zamówienie może mieć wiele elementów, a element może wchodzić w skład wielu zamówień. Po dodaniu tabeli połączeń należy ustanowić związki jeden do wielu pomiędzy tabelami zamó­ wienia i elementu zamówienia. Ostatnim krokiem jest zdefiniowanie wielokolumnowego klucza głównego na tabeli połączeń. Rysunek 21.11 ukazuje w formie diagramu efekt tych operacji. Związki zwrotne

Związek zwrotny to związek pomiędzy tabelą a nią samą. Typowym przykładem takiego związku jest tabela części, która wskazuje na siebie, reprezentując fakt, że część może składać się z innych części. W omawianym przykładzie tabela części może zawierać pole pa rent pa rt id, które służy jako klucz obcy związany z kluczem głównym tabeli.

Rozdział 21. Praca z bazami danych Rysunek 21.11. Związek wiele do wielu

Aby utworzyć związek zwrotny, należy wybrać kolumnę klucza głównego i przeciągnąć ją z po­ wrotem do tej samej tabeli. Konfiguracja powiązań kluczy iwartości związków jest taka sama jak dla innych związków. Rysunek 21.12 ukazuje diagram związku zwrotnego. Rysunek 21.12. Związek zwrotny

-O*

Part

Finish

|

Cancel

Rysunek 21.24. Określanie właściwości projektu bazy danych

Aby porównać różne sposoby organizowania projektów, warto przyjrzeć się rysunkom 21.25 i 21.26. Pierwszy pokazuje organizację opartą na schemacie. Na drugim ta sama baza AdventureWorks uporządkowana jest według typów obiektów.

Database Options Na następnej stronie kreatora należy podać sposób scalania oraz wybrać różne ustawienia scalania i przechowywania danych. Standardowo można przyjąć ustawienia domyślne. Na kolejnej stronie kreatora można zaimportować ustawienia z aktywnej bazy danych (a nie tylko z jej schematu).

Rozdział 21. Praca z bazami danych Rysunek 21.25. Projekt bazy danych uporządkowany według schematów

A d vertureW orksD o - Microsoft Visual Studio £ile £dit yi«w £roject guild £ e b jg D jta J o ® 1* Te$t Window y e lp

'jO

:

J

A



J

Debug Schema

-u

"D -71 -3 Solution AdventureW orlsDB (4 projects)

Vic a

j 3 -l ./ ] AdventureWorfr sOB

^ 5 AdventureWorks " j AdventureWorksDE

Assem blies j

a

Properties References

M

_ j Database Level Objects -

Schemas

■ic* i

Hum anResources Person Production P u rc h a sin g

Sales J AdventureW orksDB.extendedproperties.sq Scripts

J

AdventureWorksDB2

. j f AdventureW orksW eb

Rysunek 21.26. Projekt bazy danych uporządkowany według typów obiektów

db°

i ii H um anResources Person

Data Generation Plans

. J Schema com parisons Schema Objects

Schem as

Ja Production

Purchasing iV Sales _ j Database Triggers Security

M M CC Broker Storage Orphaned Objects T j AdventureW orksDB2 J

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Import Database Scheme Na tej stronie projekt bazy danych zaczyna umożliwiać rozwijanie bazy. Choć wybraliśmy pusty projekt bazy danych, większość programistów tworzy początkowy projekt na podstawie istniejącej bazy. Pozwala to zachować zgodność z podejściem, że produkcyjna baza danych to „jedyna wersja prawdy”. Uwzględniane jest przy tym to, że chcemy, aby środowisko testowej i rozwojowej bazy danych odzwierciedlało ze względu na strukturę środowisko wersji produk­ cyjnej. Przez określenie składników' bazy danych za pomocą inżynierii odwrotnej Visual Studio umożliwia tworzenie kopii bazy danych, a to z kolei pozwala programistom pracować w pry­ watnych bezpiecznych obszarach bez obaw o uszkodzenie produkcyjnego magazynu danych. Na rysunku 21.27 pokazano stronę do importowania schematu.

Im port D jt r b r » S d w iiu

W elcom e Project Properties Set Database Options Database Schema Configure Build/Deploy

J

Im port existing schema

Source database connection a ppserver. Ad v enture Works.dbo fcdit Connection...

Ne^j Connection...

im port options J Script the colum n foliation only if it is different from the database collation J Im port emended properties Im port log and filegroup file sues Im porj perm issions Ą dd im p o rted permissions to th e pi eject m odel

Qvem de configuration with imported schem a settings W hen you im port a database, each database object (such as a table or a view) is stored »n a separate file on the disk. You can m ake the project load more quickly by o ig a n c m g these files m separate directories. T o m axim ee performance, you should not set this value higher than 1000. M aximum files per directory:

E 3

A .sql file is created for each database object that you im port into the project.

< Previous

Rysunek 21.27. Wybieranie bazy danych służącej jako podstawa do prac programistycznych

Ostatni krok polega na skonfigurowaniu opcji kompilacji i instalacji. Potrzebne ustawienia znajdują się na końcowej stronie kreatora (zobacz rysunek 21.28). Ponieważ projekt bazy danych ma przede wszystkim umożliwiać programistom wprowadzanie zmian w bazie, uzasadnione jest, że chcemy je wdrożyć. Musimy określić sposób wdrażania modyfikacji (można utworzyć skrypt lub utworzyć go i uruchomić) oraz miejsce wprowadzania zmian. To ostatnia strona kreatora. Na tym etapie Visual Studio ma wszystkie informacje potrzebne do utworzenia początkowej wersji projektu. Kliknięcie przycisku F in ish powoduje rozpoczęcie generowania projektu przez Visual Studio. Na rysunku 21.25 przedstawiono efekt końcowy tego procesu — uzupełniony projekt bazy danych w środowisku Visual Studio.

Rozdział 21. Praca z bazami danych New Project W •]!



Target database name Databasel Default deployment collation: Use the collation of the serwer

*

Always re-create database V Block incremental deployment if data loss might occur L

Back up database befort deployment

us |

|

1.»■

mm

11

Finish

_I

] [ . Cancel ■

1

I■

j

|

.j

Rysunek 21.28. Ustawianie opcji wdrażania

Warto zauważyć, że każdy obiekt w bazie danych — tabela, procedura składowana, indeks, klucz lub ograniczenie — jest reprezentowany przez pojedynczy plik .są l. Obok plików sche­ matu istnieją katalogi na plany generowania danych (więcej na ten temat już za chwilę) oraz skrypty uruchamiane przed wdrożeniem i po nim. Skrypty umieszczone w odpowiednich katalogach są wykonywane bezpośrednio przed procesem wdrażania i zaraz po nim.

Wskazówka Skrypty uruchamiane przed wdrażaniem i po nim są przydatne przy instalowaniu bazy w środowisku testowym. Pierwsze można wykorzystać do zainicjowania środowiska, a drugie — do uporząd­ kowania systemu po zakończeniu wdrażania.

Okno Schema View Oprócz znanego okna S o lu tio n E x p lo re r w projektach baz danych dostępne jest też okno S c h e m a V ie w (zobacz rysunek 21.29). Okno to ma układ podobny do okna S o lu tio n E x p lo r e r (zwłaszcza jeśli programista uporząd­ kował projekt bazy danych według typów obiektów, a nie według schematów), jednak pomaga programistom baz SQL Server poczuć się swobodniej w IDE. Okno S c h e m a V ie w zaprojekto­ wano tak, aby ściśle odzwierciedlało wygląd i działanie narzędzia SQL Management Studio. Podobne są nawet ikony poszczególnych elem entów projektu.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Rysunek 21.29. Okno Schema View

Schema V ie*

j * J

* O X

3 y -

B

AckentureW oricsDfi

*

r j | Assem blies

s i j | Schem as dbo j

HumanResouices 4

Tables t S I Department {• £ 3 Employee r £ 3 Em ployeeAddress t 3

EmpłoyeeOepartmentHtstory

H3 EmpłoyeePayHrstory { C 3 JobCandidate r [3

Shift

u i View s t> ^ Program m ability r>

Queues

\iA Synonym s t> Ą

Person

t>

Production

p j | Purchasing

i- a *«j« Database Tnggers

Ponieważ okno S c h e m a V ie w dotyczy wyłącznie obiektów bazodanowych, nie widać w nim planów generowania danych lub skryptów wykonywanych przed wdrażaniem i po nim.

Uwaga Choć S c h e m a V iew to wartościowe narzędzie do zarządzania obiek­ tami baz danych, ma pewną irytującą cechę — nie udostępnia pozio­ mego suwaka, który znajduje się na przykład w oknie S o lu tio n E xplo ­ rer. Oznacza to, że przy zarządzaniu obiektami o długich nazwach trzeba poszerzyć okno, aby zobaczyć pełny tekst. Na szczęście problem ten ma zostać rozwiązany w przyszłych pakietach poprawek.

Kompilowanie i wdrażanie Ostatnie zagadnienie, którego nie opisaliśmy, to aktualizowanie schematu bazy danych za pomocą schematu z projektu bazy. Służy do tego znany mechanizm kompilacji i wdrażania stosowany w innych typach projektów w Visual Studio. W kontekście projektów' baz danych proces kompilacji polega na przetworzeniu wszystkich plików SQL i wykryciu w nich błędów składni języka SQL. Jeśli błędów nie ma, proces wdrażania zaktualizuje docelową bazę danych przy użyciu schematu (lub utworzy nową bazę, jeżeli docelowa nie istnieje). Domyślną docelową bazę danych określiliśmy w kreatorze do tworzenia wyjściowego projektu. Bazę można w dowolnym momencie zmienić, klikając prawym przyciskiem myszy projekt w' oknie S o lu tio n E x p lo re r i wybierając opcję P roperties, aby otworzyć okno właściwości. Zakładka D e p lo y (zobacz rysunek 21.30) zawiera ustawienia, które określają sposób wdrażania zmian wrprojekcie.

Rozdział 21. Praca z bazami danych

Uwaga D o wdrażania schematu nie trzeba stosować środowiska Visual Studio. W czasie kompilacji projektu bazy danych generowane są SQL-owe skrypty z wszystkimi potrzebnymi poleceniami w języku SQL. Plik skryptu można uruchomić w dowolnym narzędziu ob­ sługującym język T-SQL (w tym w programie SQL Enterprise Mana­ ger). Jest to przydatne, jeśli zmiany w schemacie wprowadził ad­ ministrator, który nie ma zainstalowanego środowiska Visual Studio lub korzysta ze specyficznego narzędzia potrzebnego do wdrażania modyfikacji w schemacie.

Uwagi na temat mechanizmu DAC Innym sposobem na zarządzanie projektami baz danych w Visual Studio jest nowy mechanizm wprowadzony w SQL Server 2008 R2 — Data Tier Applications (inaczej DAC). Mechanizm DAC działa podobnie jak opisane projekty baz danych. Ma udostępniać wszystkie obiekty z danej bazy w trybie offline, tak aby programiści i administratorzy mogli wprowadzać oraz testować zmiany bezpośrednio w IDE. Kluczowa różnica polega na tym, że projekty DAC są kompilowane do plików .d a c p a c . Jest to jednostka wdrażania zawierająca wszystkie obiekty

C zę ść V Tworzenie aplikacji dla przedsiębiorstw bazodanowe potrzebne w danej aplikacji: procedury składowane, tabele, obiekty serwerowe, reguły zarządzania, a nawet poświadczenia użytkowników. DAC nie zawiera jednak żadnych danych. M echanizm ten ma um ożliwiać programistom pracę w środowisku deklaratywnym (gdzie można wprowadzić zmiany w bazie danych powiązanej z aplikacją), a nie w świecie procedu­ ralnym (gdzie najpierw trzeba uruchomić polecenia i skrypty w bazie, aby można było uru­ chomić aplikację). Visual Studio 2010 udostępnia nowy typ projektu, D a t a - ti e r A p p lic a tio n , który znajduje się obok innych projektów baz SQL Server. Typ ten współdziała tylko z bazą SQL Server 2008 R2 (która w czasie powstawania książki była jeszcze niedostępna) i nie jest zgodny z żadną inną wersją bazy SQL Server. Z uwagi na niedostępność technologii nie omawiamy szczegółowo tego mechanizmu. Warto jednak wiedzieć, że projekt D a t a - ti e r A p p lic a tio n w środowisku IDE wygląda i działa identycznie jak inne projekty baz danych.

Tworzenie obiektów bazy danych w kodzie zarządzanym Obiekty bazy danych są często implementowane z wykorzystaniem pewnego dialektu języka SQL. Odnosi się to także do baz SQL Server. Jednak w SQL Server 2005 wprowadzono możliwość tworzenia obiektów SQL-owych w kodzie zarządzanym. Dlatego zamiast używać języka Transact SQL, można teraz pisać procedury składowane, zapytania, widoki itp., używając preferowanego języka .NET. Tym, czemu zawdzięczamy tę możliwość w Visual Studio, jest szablon S Q L S e r v e r P ro jec t. Nie należy mylić go z poprzednio omawianym D a ta b a s e P ro je c t. SQ L S e rv er P r o je c t jest typem pro­ jektu dla konkretnego języka, który udostępnia szablony klas do implementacji metod bazy danych za pomocą kodu zarządzanego.

Rozpoczynanie projektu SQL Server CLR W oknie dialogowym A d d N e w P ro je c t projekty SQL Server CLR są umieszczane w kategorii D a ta b a s e . Tworzenie nowego projektu SQL Serwer CLR wywołuje to sam o okno dialogowe A d d D a ta b a s e R eferen ce, które było już widziane w S e r v e r E x p lo re r i D a ta b a s e P ro je c t. Struktura nowego projektu tworzona przez kreator projektu jest pokazana na rysunku 21.31. Projekt SQL Server CLR bezpośrednio obsługuje tworzenie następujących obiektów bazy danych: procedur składowanych, wyzwalaczy,

Rozdział 21. Praca z bazami danych Rysunek 21.31. Projekt SQL Server CLR

S o lu tio n E x p lo it!

-*1

’ O X

H •:$< S o lu tio n A dventurtW orksO B' (4 p rojects) j j , Solution hems AdventureWorks .“ 3 AdventureWorksOB

^

^

A d v e n tu re W o rk sW e b

. J j Sq lServerPro jectl 4

^

Properties AssemblyInfo.es

4

References >U System *C3 System.Data SystemJ(Ml

^

ć j f Test Scripts J j Test.sql J j PostDeployScript.sql J j PreDeployScnpt.sql

• funkcji agregujących, • funkcji definiowanych przez użytkownika, • typów definiowanych przez użytkownika. W następnych punktach pokazany jest sposób tworzenia prostej procedury składowanej.

Tworzenie procedury składowanej w C# Najpierw należy dodać element procedury składowanej do projektu, korzystając z menu P r o ­ j e c t i wybierając opcję A d d S to r e d P ro c e d u re. Nowa klasa zostanie dodana do projektu. Listing 21.1 pokazuje podstawowy kod, który zawarty jest w nowym pliku klasy. Można dodać własny kod do statycznej metody typu void o nazwie UpdateEmployeeLogin. Listing 21.1. Początek procedury składowanej w kodzie zarządzanym

using using using using using

System; System.Data; System.Data.SqlClient; System.Data.SqlTypes; Microsoft.SqlServer.Server;

public partial class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static void UpdateEmployeeLogin()

{ //

Tu wstaw własny kod.

} >; Działanie obiektów kodu zarządzanego w SQL Server opiera się na klasach .NET Framework (czyli ADO .NET). Oznacza to, że procedury składowane będą inicjowały takie klasy jak sql '■♦Connection lub SqlCommand i korzystały z nich. Pisany kod jest identyczny z kodem dostępu

C zę ść V Tworzenie aplikacji dla przedsiębiorstw do danych, który pisze się dla innych typów projektów .NET — bibliotek klas, witryn sieciowych oraz formularzy Windows. Ponieważ używanie klas ADO .NET przebiega tak samo we wszystkich projektach, programista nie musi uczyć się innych języków (takich jak T-SQL), aby wykonać pracę na bazie danych.

Uwaga O p isan ie za let i wad pisania o b ie k tó w bazy danych w k o d z ie zarzą­ d za n y m z a m ia s t w języ k u T -S Q L w ykracza p o za z a k r e s teg o r o z d z ia łu . W ięcej in form acji m o ż n a znaleźć w d o k u m e n c ie Using

CLR Integration in SQL Server M icro so ftu . C hociaż jest d o ś ć stary (n a p isa n o g o w listop ad zie 2 0 0 4 ), stanow i doskon ały o p is tego te­ m atu. G o r ą co zachęcam y d o zap ozn an ia się z nim .

Listing 21.2 ukazuje metodę języka C#, która uaktualnia tabelę Employee bazy AdventureWorks za pomocą informacji podawanych podczas logowania. Kod ten nie jest skomplikowa­ ny i może być łatwo zrozumiany (oraz napisany) przez każdego programistę znającego funkcje dostępu do danych w C#. Listing 21.2. Kod zarządzany do uaktualniania poświadczeń pracowników

using using using using using

System; System.Data; System.D a ta .S q lC lie n t; System.Data.SqlTypes; M icro so ft. S q lS e rv e r.Server;

p u b lic p a r tia l c la ss StoredProcedures { [M icro so ft.SqlServe r . Se r v e r . SqlProcedu re] p u b lic s t a t ic void UpdateEm ployeeLogin(SqlInt32 employeeld, Sq lln t3 2 managerld, S q lS trin g lo g in ld , S q lS tr in g t i t l e , SqlDateTime hireD ate, SqlBoolean c u rre n tF la g ) { using (SqlConnection conn = new SqlConnection("context connection=true") ) { SqlCommand UpdateEmployeeLoginCommand = new SqlCommand( ); UpdateEmployeeLoginCommand. CommandText = "update HumanResources.Employee SET Managerld = " + m an agerld .ToString() + ", Loginld = + lo g in ld .T o S t r in g () + ..... + ", T it le = ' " + t it le .T o S t r in g ( ) + ..... + ", HireDate = '" + h ire D a te .T o S trin g () + .... + ", CurrentFlag = " + c u rre n tF la g .T o S trin g () + "WHERE Employeeld = " + em p lo yee ld .T o Strin g(); UpdateEmployeeLoginCommand.Connection = conn;

Rozdział 21. Praca z bazami danych conn.0pen(); UpdateEmployeeLoginCommand.ExecuteNonQuery(); conn.Closef);

} } }; Jeden z wierszy kodu wymaga bardziej szczegółowego wyjaśnienia. Obiekt S q lC on n ection jest tworzony w następujący sposób: SqlConnection conn = new SqlConnection("context connection=true")

Łańcuch połączenia "context connection^rue" powiadania mechanizm dostawcy danych, że połączenie pow inno być utworzone w tym .samym kontekście, co wywołująca je aplikacja. Ponieważ metoda jest wykonywana na bazie danych, oznacza to, że będzie się łączyć z bazą i dzia­ łać, wykorzystując kontekst (transakcyjny lub nie) aplikacji wywołującej. Ponieważ korzysta się tu z kontekstu bazy danych, w którymi uruchomiona jest metoda, nie trzeba na stałe zapisywać w kodzie pełnego łańcucha połączenia. W celu porównania na listingu 21.3 pokazane jest to samo zapytanie zaimplementowane wrjęzyku T-SQL. Listing 21.3. Kod w języku T-SQL uaktualniający poświadczenia pracowników

ALTER PROCEDURE [HumanResources].[uspUpdateEmployeeLogin] @EmployeeID [int], @ManagerID [int], @LoginID [nvarchar](256), @Title [nvarchar](50), @HireDate [datetime], @CurrentFlag [dbo].[Flag] WITH EXECUTE AS CALLER AS BEGIN SET N0C0UNT 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;

Część V

Tworzenie aplikacji dla przedsiębiorstw

Kompilacja i wdrażanie procedur składowanych Podczas budowania projektu SQL Server ma miejsce typowy proces kompilacji. Załóżmy, że kod będzie skompilowany, można więc wdrożyć wynikowy podzespół do bazy danych. Należy użyć menu B u il d w celu uzyskania dostępu do polecenia D e p lo y . Po wdrożeniu podzespołu można go testować, wywołując z aplikacji lub okna zapytań. Szcze­ gółowe informacje na temat wywoływania zarządzanych podzespołów i pisania ich można zna­ leźć w SQL Server Books Online.

Wiązanie kontrolek z danymi Przyjrzeliśmy się już wszystkim różnorodnym sposobom używania Visual Studio do tworzenia baz danych i zarządzania nimi. W poniższych punktach przyjrzymy się narzędziom klienckim dla aplikacji Windows Forms, WPF i sieciowych.

Wprowadzenie do wiązania danych Istnieje pewien problem dotyczący aplikacji bazodanowych oraz wzorzec jego rozwiązywania. Zwykle dane muszą być pobierane z bazy danych do aplikacji i wyświetlane w odpowiednio uaktualnianym interfejsie użytkownika. Dla dużych zbiorów' danych pomocna jest koncepcja stronicowania. Ponieważ załadowanie, powiedzmy, 100 megabajtów danych jest mało wydajne, mechanizm stronicowania musi być użyty’ w celu pozwolenia użytkownikowi na przechodzenie tam i z powrotem przez „strumień” danych. Po bezpiecznym umieszczeniu danych w interfejsie użytkownika należy zapewnić obsługę przepływu danych z aplikacji do bazy. Dla każdego zmodyfi­ kowanego fragmentu danych zmiany powinny być sprawdzane, a następnie zatwierdzane w' bazie. Wiązanie danych to termin oznaczający implementację wzorca projektowego, który obsługuje wszystkie aspekty przekazywania danych ze struktury danych do kontrolek aplikacji i z po­ wrotem (zobacz rysunek 21.32). Chociaż struktura danych jest najczęściej bazą danych, może być dowolnym typem kontenera przechowującego dane, takiego jak tablica lub kolekcja. W .NET wią­ zanie danych można podzielić na proste i złożone. Oba terminy dotyczą wewnętrznych możli­ wości kontrolki w szerszym kontekście procesu wiązania danych.

Proste wiązanie danych Proste wiązanie danych to funkcja kontrolki do wiązania i wyświetlania pojedynczego ele­ mentu danych z większego zbioru. Kontrolka T ext Box jest doskonałym przykładem kon­ trolki zwykle używanej w prostych scenariuszach wiązania danych. Można użyć kontrolki TextBox na przykład w celu wyświetlenia nazwiska zatrudnionego tak, jak jest ono przecho­ wywane w tabeli Employee w bazie danych.

Rozdział 21. Praca z bazami danych Rysunek 21.32. Proces wiązania danych

Baza danych

Obsługa prostego wiązania danych jest powszechna zarówno dla kontrolek formularzy W in­ dows, jak i formularzy sieciowych. Jeśli używa się wbudowanych możliwości okna projektowe­ go formularzy Windows i sieciowych, to dodanie grupy kontrolek do formularza i proste zwią­ zanie ich ze zbiorem danych jest niezwykle łatwe (więcej na ten temat za chwilę).

Złożone wiązanie danych Termin złożone wiązanie danych odnosi się do możliwości kontrolowania wyświetlania wielu elementów danych jednocześnie. Można o tym myśleć jako o mechanizmie „wielowierszowym” — jeśli kontrolka może być użyta do wyświetlania wielu wierszy danych jednocześnie, to obsługuje złożone wiązanie danych. DataGridView (dla formularzy Windows) i D ataG rid (dla formularzy sieciowych) są głównymi kontrolkami przeznaczonymi do obsługi tabelarycznych (wielowierszowych i wielokolumnowych) danych. Chociaż wewnętrznie mechanizm wiązania danych jest zawiły, złożony i trudny do zrozum ie­ nia, to narzędzia Visual Studio przesłaniają trudności implementacyjne dzięki wykorzystaniu wygodnego i łatwego modelu typu „przeciągnij i upuść”. Teraz przyjrzyjmy się temu szybkiemu sposobowi wiązania danych.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Automatyczne generowanie związanych kontrolek Windows Forms Chociaż w Visual Studio istnieje wiele sposobów implementacji kontrolek związanych z da­ nymi, wszystkie składają się z tych samych dwóch podstawowych kroków. Trzeba: 1. Określić źródło danych. 2. Powiązać elementy składowe źródła danych z kontrolkami lub właściwościami kon­ trolek. Po wykonaniu tych czynności okna projektowe środowiska Visual Studio są zdolne do genero­ wania właściwych kontrolek i umieszczania ich na formularzu. Cały kod wiązania danych po­ wstaje automatycznie; trzeba tylko zadbać o układ, pozycję i aspekty interfejsu użytkownika kontrolek. Jak można sobie wyobrazić, formularz może zawierać kontrolki używające prostego lub złożo­ nego wiązania danych albo kontrolki obu rodzajów. Teraz jesteśmy gotowi do przyjrzenia się etapom związanym z tworzeniem zestawu kontrolek służących do wyświetlania informacji z tabeli Employee bazy AdventureWorks, które wykorzystują zarówno proste, jak i złożone wiązanie danych. W tym przykładzie będziemy pracować z edytorem formularzy Windows. Okno pro­ jektowe dla formularzy sieciowych ASP.NET działa w podobny sposób i za chwilę będziemy mieli okazję przyjrzeć się wiązaniu danych w środowisku sieciowym metodą przeciągnij i upuść. Jak już ustaliliśmy, pierwszym krokiem jest wybór źródła danych.

Wybór źródła danych Upewnijmy się, że w Visual Studio otwarty jest projekt W in d o w s A p p lic a tio n , i użyjmy okna D a ta S o u r c e s do wyboru źródła danych. Jeśli okno nie jest jeszcze widoczne, wybierzmy opcję S h o w D a ta S o u rc e s z menu D a ta w IDE. Jeżeli bieżący projekt nie ma zdefiniowanych źródeł danych, to należy utworzyć jedno. Aby otworzyć kreator D a ta S o u rce C o n fig u r a tio n W iz a r d , należy kliknąć przycisk A d d N e w D a t a S o u r c e w pasku narzędzi okna. Na pierwszej stronie kreatora (zobacz rysunek 21.33) wybierzmy typ źródła danych. Znajdują się tutaj trzy opcje: • Database — źródło danych w formie tabeli w relacyjnej bazie danych. • Web Service — źródłem danych jest usługa sieciowa, która zwraca dane do powiązania z kontrolkami formularza. • Object — źródło danych jest obiektem, który udostępnia dane (jest użyteczny w scena­ riuszach, w których obiekty biznesowe innej warstwy aplikacji są odpowiedzialne za dostarczanie danych do formularza). • SharePoint — źródło danych to obiekt działający w witrynie SharePoint. Ponieważ koncepcja wiązania danych jest najłatwiej zrozumiała w kontekście bazy danych, użyjemy typu źródła danych D a t a b a s e jako podstawy przykładów w tym rozdziale.

Rozdział 21. Praca z bazami danych Rysunek 21.33. Wybieranie typu źródła danych

Jeśli wybrano źródło danych typu D a ta b a s e , druga strona kreatora dotyczyć będzie wyboru połączenia dla bazy danych. We wcześniejszych wersjach środowiska Visual Studio można było utworzyć model danych na podstawie zbioru danych. Visual Studio 2010 pozwala na zbudowanie modelu EDM i wykorzystanie go jako źródła danych w czasie wiązania. Model EDM to element platformy Entity opisanej w dalszej części rozdziału. Niezależnie od wybranego modelu trzeba określić, skąd system ma pobierać dane (za pom ocą łańcucha połączenia i tak dalej), a także jakie dane ze źródłowej bazy należy umieścić w modelu. Na końcowej stronie kreatora, pokazanej na rysunku 21.34, wskazuje się, które z obiektów bazy danych powinny być używane dla źródła danych. Można wybrać dowolne elementy danych dostępne w różnych tabelach, widokach, procedurach składowanych lub definiowanych przez użytkownika funkcjach z bazy danych. W tym przykładzie zastosowaliśmy model DataSet, który pobierze dane z bazy AdventureWorks. Należy wybrać kilka kolumn danych z tabeli zatrud­ nionych (Employee): EmployeelD, LoginID, HireDate. rowguid, BirthDate, Salaried ^Flag.VacationHours, SickLeaveHours i CurrentFlag. W efekcie zakończenia pracy kreatora wybrane źródło danych pojawi się w oknie D a ta S o u r c e s (rysunek 21.35).

Uwaga Jeśli programista wybrał model danych DataSet, Visual Studio na zapleczu używa informacji o źródle danych pobranych przez D a ta Source C o n fig u r a tio n W iz a r d do tworzenia zbioru danych o ści­ śle określonym typie. Ten zbiór danych jest przechowywany jako element w bieżącym projekcie.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Odwzorowywanie źródeł danych na kontrolki Szybkim i prostym sposobem tworzenia kontrolek powiązanych z danymi jest pozwolenie na wykonanie tego przez Visual Studio. W oknie D a ta S o u r c e s należy kliknąć przycisk przy nazwie źródła danych w celu wyświetlenia menu (rysunek 21.36). To menu pozwala na kontrolę generowania parametrów i określenie, które kontrolki mają być wygenerowane na podstawie tabeli w źródle danych. Wybierając D a ta G r id V ie w , można wygene­ rować kontrolkę DataGridView w celu wyświetlania i edycji źródła danych. Opcja D eta ils pozwala na wygenerowanie zestawu prostych, powiązanych z danymi kontrolek w celu wy­ świetlania lub edycji danych w źródle. Przykładowo, wybierzmy D e ta ils , a następnie przecią­ gnijmy i upuśćmy źródło danych z okna D a ta S o u r c e s na pusty formularz.

Rozdział 21. Praca z bazami danych

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Rozdział 21. Praca z bazami danych Poza możliwością indywidualnego zmieniania kontrolki powiązanej z typem danych istnieje też możliwość wpływania na ogólne odwzorowanie — przez wybranie opcji C u s to m iz e z e wspom nianego wcześniej menu rozwijanego. Wywoła to okno dialogowe O p tio n s środowiska Visual Studio z wybraną stroną okna projektowego formularzy Windows. Korzystając z tych ustawień (rysunek 21.39), można określić domyślny typ kontrolki, którą chcemy zastosować dla każdego rozpoznanego typu danych. Rysunek 21.39. Dostosowywanie reprezentacji poszczególnych typów danych w interfejsie użytkownika

Modyfikowanie zbiorów danych o określonym typie Programiści mogą korzystać w Visual Studio z narzędzia projektowego przeznaczonego wyłącznie do modyfikowania i tworzenia zbiorów danych o określonym typie. Jest to okno D a ta S e t D esign er. Środowisko uruchamia je automatycznie po otwarciu w projekcie zbioru danych, na przykład pliku A d v e n t u r e W o r k s E m p l o y e e D a t a S e t.x s d utworzonego przy omawianiu wiązania danych.

Uwaga Zbiory danych o określonym typie mogą znacznie poprawić pro­ duktywność w porównaniu ze standardowymi zbiorami danych. Zamiast używać indeksów kolekcji, programista może wskazywać tabele i kolumny za pomocą ich nazw. Ponadto mechanizm IntelliSense obsługuje składowe typizowanych zbiorów danych, co znacz­ nie ułatwia pisanie kodu do obsługi rozbudowanych hierarchii danych.

Narzędzia DataSet Designer można używać do wygodnego dopracowywania zbiorów danych przez zmianę ich dowolnych elementów, w tym zapytań służących do zapełniania zbiorów danymi. Rysunek 21.40 przedstawia utworzony wcześniej obiekt AdventureWorksEmployee '-►DataSet otwarty w oknie D a ta S e t D e s ig n e r.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

W omawianym scenariuszu bezpośrednio powiązaliśmy zbiór danych z wynikami SQL-owego zapytania. Jednak narzędzia DataSet Designer można używać także do tworzenia „niepowiąza­ nych”, nowych zbiorów danych. Dołączenie elementu D ataS et do obiektu umożliwia rozpo­ częcie pracy od początku. Programista m oże dodać do zbioru danych tabele, zapytania i inne elementy, aby zaspokoić wymogi aplikacji związane z przechowywaniem i pobieraniem danych. Technika ta jest szczególnie przydatna przy tworzeniu aplikacji, które wczytują i zapisują dane, ale nie komunikują się z bazą. Plików ze zbiorami danych można wtedy używać jako prostej pamięci plikowej, którą wrprzyszłości można łatwo powiązać z relacyjną bazą danych.

Ręczne wiązanie kontrolek formularzy Windows W wielu sytuacjach nie chcemy, aby Visual Studio samo tworzyło powiązane z danymi kon­ trolki lub też potrzebujemy powiązać istniejące kontrolki ze źródłem danych. Wiązanie danych w tych przypadkach jest proste i zaczyna się od tego samego kroku — tworzenia lub wybierania źródła danych. Niektóre kontrolki, takie jak DataGridView, mają opcje znaczników inteligent­ nych służących do wybierania źródła danych. Inne nie mają powiązanych ze sobą okien dialo­ gowych, ale mogą być równie łatwo wiązane z danymi za pomocą okna D a ta S o u rc e s.

Rozdział 21. Praca z bazami danych

Wiązanie kontrolki DataGridView Należy przeciągnąć kontrolkę DataGridView z panelu T o o lb o x i umieścić ją na formularzu. Po utworzeniu kontrolki należy skorzystać ze znaczników inteligentnych i użyć pola rozwijanego na górze listy zadań w celu wybrania źródła danych do powiązania (zobacz rysunek 21.41).

Rysunek 21.41. Wybieranie źródła danych kontrolki DataGridView

Po wybraniu źródła danych należy ponownie zaangażować się w tworzenie w pełni funkcjonal­ nej aplikacji z dwustronnym dostępem do bazy danych. Cały kod potrzebny do obsługi w ypeł­ niania wizualnej tabeli oraz zatwierdzania zmian z powrotem w bazie danych zostanie w ygene­ rowany automatycznie. Dostosowanie edycji komórek Zaletą kontrolki DataGridView jest możliwość szybkiego wiązania i wyświetlania danych w for­ macie tabelarycznym, a także różnorodne opcje edycji. Przyjrzyjmy się możliwościom edycji komórek na prostym przykładzie tabeli Employee. Po automatycznym wygenerowaniu kontro­ lek formularza w celu obsługi edycji tabeli Employee otrzymamy kontrolki DateTimePicker do obsługi danych daty i czasu w tabeli. W kontrolce DataGridView edycja komórek jest rów­ nie prosta, jak edycja pól tekstowych — każda z komórek zawiera tekst, który można edyto­ wać i zapisać w bazie danych. Ale można zastosować bardziej odpowiedni sposób edycji. Można użyć różnorodnych kontrolek (takich jak DataGridViewButtonColumn, DataGridViewCombo ^BoxColumn oraz innych, które dziedziczą po klasie DataGridViewColumn (patrz rozdział 18., „Tworzenie aplikacji opartych na formularzach W indows”), aby wyświetlić dane wewnątrz kolumn wizualnej tabeli.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Przykładowo, można użyć klasy DataGridViewComboBoxColumn w celu dostarczenia roz­ wijanej listy do edycji kolumny G e n d e r (płeć) w tabeli. W tym celu należy najpierw zmienić domyślny typ kolumny. Wybierzmy kontrolkę tabeli, otwórzmy menu znaczników inteligentnych i wybierzmy operację E dit C o lu m n s. W oknie dialogowym E d it C o lu m n s znajdźmy kolumnę danych o płci zatrudnionego i zmieńmy typ kolumny na DataGridViewComboBoxColumn (rysunek 21.42). Rysunek 21.42. Zmiana typu kolumny

Po zmianie typu kolumny należy określić sposób pobierania listy potrzebnych wartości do wyświetlania na liście rozwijanej. Tabela jest wystarczająco „inteligentna”, aby wybrać jedną z dostępnych wartości do wyświetlenia. Aby obsłużyć listę potrzebnych wartości, należy zapi­ sać je na stałe w kolumnie (patrz właściwość Items na rysunku 21.42) lub wykonać oddzielne zapytanie — na przykład SELECT DISTINCT(Gender) FROM Employees — które dostarczy listę potrzebnych wartości. Ponieważ konstruowanie innego zapytania lub źródła danych jest proste i nie prowadzi do zapisania wartości na stałe w kodzie, w tym miejscu zastosujemy to rozwiązanie. Aby utworzyć zapytanie wypełniające kolumnę pola wyboru, należy skorzystać z okna D a t a S o u r c e s , wybrać polecenie A d d N e w D a ta S o u r c e oraz wykonać te same kroki co w czasie dodawania źródła danych E m p lo yee. Tym razem jednak wybierzemy tylko kolumnę G e n d e r. Po utworzeniu źródła danych należy kliknąć na nim prawym przyciskiem myszy i wybrać opcję E d it D a ta S e t w ith D esign er. Uruchomione zostanie okno D a ta S e t D esig n er. W oknie pro­ jektowym (rysunek 21.43) można zobaczyć zapytanie F i l i i kontrolkę Ta bleAd a p t er. Elementy te służą do wypełniania źródła danych. Jeśli kliknie się zapytanie (co oznacza kliknięcie ostatniego wiersza w tabeli pokazanej w oknie projektowym), można użyć okna P ro p e r tie s w' celu bezpo­ średniej edycji kodu w SQL-u tego zapytania. Modyfikując je w celu zastosowania składni SELECT DISTINCT, można zwrócić prawidłowe wartości płci w celu uzupełnienia tabeli. Rysunek 21.44 ukazuje efekty pracy. Jeśli potrzebna jest nieistniejąca kontrolka do edycji komórki, można utworzyć własną kontrolkę, dziedziczącą po klasie bazowej DataGridViewColumn. Tabela pracowników może korzystać z kontrolki DateTimePicker dla danych dotyczących daty i czasu, takich jak data urodzenia i zatrudnienia.

Rozdział 21. Praca z bazami danych

* * X

I M .S o u k c s

............... '

...... •J V I "

••

i rA r n i a n n M n 1! r •

1 *

a C< FiW .lethodM odifier

Public

FiHMethodName

F il

GenerateMethods

Both

GetMeth odMod if ier

Public

GetMethodName

G et Data | SELECT DISTTNCTtGender)(V„

§t

CommandType

Text

ExecuteMode

Reader

Parameters

(Collection)

Error List

Ready

--------- T J Ir o i

a .! Form 2 jl M



4

4

2

ID tue-works ture-works ture works ture-works ture-works ture-works ture-works Jure-works tureworks

of 290



M

Tde Production Tech Marketing /3as»start Enyeerm g Mar Sereor Tod Oesi Tool Designer Marketng Manager Production Super Production Tech De»gr Engneer in

•r* x u BrthDele 5/15/1572 6/V1977 12/13/1964 1/23/1965 8/29/1949 4/19/1965 2/16/1946 7/6/1946 10/29/1942

MaKSSOtus M S M

s M

s S M M

Gender M M M M M M F F F

* * * *

H« * 7/31 2-26 12/1

1/5/ 1/11 1/20

1/26 2/ 6/

26- . ♦

j

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Wiązanie innych kontrolek Dla innych kontrolek, które nie mają odpowiedniego dostępu do wiązania za pomocą znaczni­ ków inteligentnych, można skorzystać z okna D a ta Sources. Należy przeciągnąć źródło danych z okna D a ta S o u rc e s i umieścić je na istniejącej kontrolce. Okno projektowe utworzy nowe źródło wiązania, odpowiednio je skonfiguruje, a następnie utworzy wpis w kolekcji D a ta B in d in g kontrolki. Jeśli programista spróbuje przenieść element danych na kontrolkę, która nie pasuje (na przykład pole znakowe na pole wyboru), operacja się nie powiedzie.

Wiązanie danych w aplikacjach WPF W Visual Studio 2010 dodano obsługę wiązania danych metodą „przeciągnij i upuść” w pro­ jektach WPF. Proces przebiega identycznie jak przy wiązaniu kontrolek formularzy Windows. Najpierw trzeba dodać do projektu źródło danych. Aby zmienić scenariusz, utwórzmy formu­ larz wyświetlający zamówienia i składające się na nie elementy. Najpierw należy utworzyć nowy projekt WPF. Informacje na temat typów projektów WPF i po­ wiązanych z nimi okien projektowych oraz edytorów można znaleźć w rozdziale 19. Dodajmy źródła danych w taki sam sposób, jak wcześniej, korzystając z kreatora źródeł danych. Z bazy AdventureWorks należy wybrać tabele PurchaseOrderHeader i PurchaseOrderDetail, aby umieścić je w źródle danych. Nazwijmy źródło AdventureWorksPurchasingDataSet.

Rozdział 21. Praca z bazami danych Teraz przeciągnijmy pole PurchaseOrderlD ze źródła danych PurchaseOrderHeader do kon­ trolki L istB ox. Choć w wyglądzie okna nic się nie zmieniło, kontrolka L istB ox została pow ią­ zana z kilkoma wierszami kodu w XAML-u: • Po pierwsze, źródło danych zostało określone jako zasób o kluczu AdventureWorks '-♦PurchasingDataSet (klucz oparty jest na nazwie zbioru danych określonej w kre­ atorze). • Ponadto do zbioru danych dodano źródło CollectionViewSource z odpowiednią ścieżką wiązania, co umożliwia pobranie danych z tabeli Department. • Dodatkowo ustawiono właściwości DisplayMemberPath, ItemsSource i Selected

^♦ValuePath kontrolki ListBox. Oprócz wprowadzonych przez nas modyfikacji w XAML-owych znacznikach środowisko dodało zestaw instrukcji do zdarzenia Window Loaded w pliku z kodem. Polecenia te odp o­ wiadają za wczytywanie danych z bazy za pośrednictwem obiektu TableAdapter. Na listingu 21.4 pokazano obecny stan kodu w XAML-u. Listing 21.4. Kod w XAML-u z wygenerowanym przez Visual Studio wiązaniem danych



Jeśli uruchomimy aplikację na tym etapie, w kontrolce L istBox zobaczymy listę wszystkich identyfikatorów zamówień (zobacz rysunek 21.46).

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Rozdział 21. Praca z bazami danych w oknie projektowym WPF i edytorze do utworzenia odpowiedniego kodu do reagowania na zaznaczenie elem entów w kontrolce ListBox oraz wyświetlania powiązanych rekordów w kontrolce DataGrid. Na rysunku 21.48 pokazano kompletną aplikację przygotowaną w całości bez pisania kodu! Rysunek 21.48. Formularz z powiązanymi danymi ogólnymi i s7.czegółowymi w projekcie WPF

Wiązanie danych z kontrolkami sieciowymi Chociaż ogólna koncepcja pozostaje taka sama, wiązanie danych z kontrolkami sieciowymi różni się nieco od znanego ze świata formularzy Windows lub WPF. Pierwszą oczywistą różni­ cą jest to, że źródła danych dla kontrolek sieciowych są implementowane przez kontrolki źródeł danych w przestrzeni nazw System.Web. Ul .WebControls. N ie ma odpowiednika okna D a t a S o u rc e s w aplikacji sieciowej. Z tego powodu, zamiast zaczynać od źródła danych, należy rozpocząć od kontrolki danych, a następnie przyłączyć ją do źródła.

Wybieranie kontrolki danych Istnieje pięć podstawowych kontrolek, które umożliwiają wiązanie danych w aplikacjach sie­ ciowych:

• GridView — udostępnia tabelaryczną prezentację podobną do kontrolki DataGridView. • DetailsView — wyświetla pojedynczy rekord ze źródła danych. Wszystkie kolumny źródła danych zostaną wyświetlone w tej kontrolce jako wiersze. • FormView — działa w ten sam sposób jak kontrolka DetailsView, z jednym wyjąt­ kiem — nie ma wbudowanego „dom yślnego” sposobu, w jaki dane są wyświetlane. Zamiast tego należy udostępnić wzorzec informujący kontrolkę, w jaki sposób chce­ my wyświetlać dane na stronie internetowej. • Repeater — generuje listę poszczególnych elem entów pobranych z przyłączonego źródła danych. Wygląd wygenerowanych danych jest kontrolowany przez szablony.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw • DataList — wyświetla wiersze informacji ze źródła danych wraz z nagłówkiem i stopką. Sposób wyświetlania można w pełni dostosować do potrzeb. W celach demonstracyjnych kontynuujmy pracę z tabelą Employee bazy AdventureWorks i zo­ baczmy, w jaki sposób można zaimplementować powiązaną z danymi stronę internetową w y­ świetlającą rekordy zatrudnionych. Korzystanie z kontrolki GridView Najpierw, mając otwarty projekt sieciowy, należy przeciągnąć kontrolkę GridView z panelu T o o lb o x na pustą stronę internetową. Pierwszą sprawą, którą należy wziąć pod uwagę, jest to, że menu znaczników inteligentnych GridView jest równie przydatne jak menu kontrolki Data '-►GridView. Programista jest bezpośrednio proszony o wybranie (lub utworzenie, a potem wybra­ nie) źródła danych zaraz po przeciągnięciu kontrolki na powierzchnię strony internetowej (zo ­ bacz rysunek 21.49). AdventureWoricsDB - M icrosoft Visual Studio

oO

Fk

tm View Project Build Debug Data Format Table Tools Test Window Help

: J]-

* -Ul

^ A J

(New Inline Style

- 1



(None)

► (Default Font)

Debug -



Mixed Platforms

(Default -

Default. aip»' Standard

asp : G ndVi ew * G rvcf/ewl {

Data

1^

Pointer

^

AccesvDataSource

||

Chart

Databound Data bo ami Databound i o!0 Coll Col2 I'drt Drktr abc

£3

DataList

Edit Delete abc

«?►

DataPage'

Edit Delete abc

[jJ ^ ‘r J

Details View EntityOataSource FormView GridView ImqDataSource listView

y. n

abc

GridView Tasks A u tc F e r m a t ...

Choose Data Source:

Edit Lclu m n s.. . Add New Colum n...

SglDataSourcel (None) New data source...>

Edit Templates

Edit Delete abc f* C Simple

Autum

Oce anica Brown Sugar Siatę Sand &Sky Rany Day Snowy Pne Liacsn Mst aack& Bbe 1 Stack&Blue2 Clover Reki Apple Orchard Mocha

b & im

l

Preview: w

i

Employee ID Title BirtbDate Geoder HireDate SalariedFlag YacationHonrs Si

1010010 Edit Delete 0

abc

120000

1O 1O 0 10 abc

1010010 Edrt Delete 1

abc

120000

abc

AM

abc

12.0000 AM

Edit Delete 3

abc

120000 AM

* Lł

abc

1/210010 120000 «« • 1»1

1O 1O 0 10 1200.00 AM

abc

120000 AM

abc

120000

0

p

i

i

r

n

2

p

3

3

r

4

4

AM

abc

1/21 2010 120000

i [

Rysunek 21.51. Opcje autoformatowania kontrolki GridView

0

10 12 0 1 0

10 10 0 10

Edit Delete 4

r

1 0 10 0 10

1/210010 Edit Delete 2

120000 AM

AM

OK



Cmol ~~) [_

K lęli

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Uaktualnianie danych w kontrolce GridView Tw orzenie tabeli w witrynie jest proste i nie wymaga pisania kodu dostępu do danych. Element GridView rzeczywiście doskonale nadaje się do statycznego raportow ania. Co należy jednak zrobić, aby edytować dane w tabeli, tak jak wcześniej robiliśmy to w aplikacjach z formularzami W indow s? Kluczową sprawą jest tu zbiór właściwości kontrolki GridView — AutoGenerate '-►EditButton oraz AutoGenerateDeleteButton. Gdy ustawimy te właściwości na True, kontrolka GridView będzie automatycznie zawierała łącza Edit i Delete widoczne na wcześniej­ szych rysunkach. Łącze Edit powiązane jest z kompletnym kodem, dlatego po kliknięciu o d p o ­ w iedniego wiersza w tabeli m ożna rozpocząć jego edycję. Po zmodyfikowaniu danych w jednej lub wielu kolum nach można kliknąć łącze Update w celu przesłania danych z pow rotem do bazy danych. Aby uaktualnienie zadziałało, trzeba jednak jaw nie podać kontrolce źródła danych (w tym przypadku SqlDataSource) informację, jakiego zapytania ma użyć do przetwarzania uaktualnień. Służy do tego właściwość SqlDataSource. '-►UpdateQuery. Określając sparametryzowane zapytanie UPDATE dla tej właściwości, m ożna poinformować źródło danych o sposobie obsługi aktualizacji. Można wykorzystać okno Query Builder do wygenerowania zapytania — należy przenieść kontrolkę źródła danych na formularz sieciowy i w oknie Properties wybrać właściwość UpdateQuery. U ruchom i to okno Query Builder i pozwoli na zbudowanie sparametryzowanego polecenia aktualizacji (zobacz rysunek 21.52). Rysunek 21.52. Określanie właściwości UpdateQuery za pomocą okna dialogowego Query Builder

Po dodaniu ostatniego elem entu układanki m am y w pełni zaim plem entow aną i powiązaną kontrolkę tabeli, która zawiera strony danych z bazy i wprowadza zm iany z pow rotem do bazy.

Uwaga Aby zaimplementować możliwość usuwania rekordu, należy wyko­ nać te same kroki, korzystając z właściwości DeleteQuery i usta­ wiając właściwość AutoGenerateDeleteButton na True.

Rozdział 21. Praca z bazami danych

Kontrolki źródła danych Jak w spom nieliśmy, źródła danych są udostępniane za pośrednictw em jednej lub wielu k on­ trolek źródła danych umieszczanych na form ularzu sieciowym. W przykładzie dotyczącym kontrolki GridView kontrolka SqlDataSource została dodana do formularza (na podstaw ie nowego źródła danych opartego na bazie danych). Ale nic nie przeszkadza w dodaniu jednej lub kilku kontrolek źródła danych bezpośrednio na stronę internetow ą. Wystarczy przeciągnąć kontrolkę z panelu Toolbox na pow ierzchnię formularza. Tabela 21.2 przedstawia dostępne kontrolki źródła danych. Tabela 21.2. Kontrolki źródła danych

Kontrolka źródła danych

Opis

ObjectDataSource

Udostępnia inne klasyjakoźródła danych.

SqlDataSource

Udostępnia relacyjną bazędanychjakoźródłodanych. Natywniedostępnesą bazydanych Microsoft SQLServer oraz Oracle. Obsługiwanyjest takżedostępdoODBCi OLE DB.

AccessDataSou rce

Udostępnia bazędanych MicrosoftAccessjakoźródłodanych.

XMLDataSource

Udostępnia plikXMLjakoźródłodanych.

SiteMapDataSource

Źródłodanych specjalnego przeznaczenia, które udostępnia mapę witryny ASP.NET jakoźródłodanych.

Po skonfigurowaniu źródła danych m ożna użyć dowolnej kontrolki korzystającej z danych i powią­ zać ją ze źródłem .

Odwzorowania obiektowo-relacyjne Większość rozdziału poświęciliśmy na omówienie „standardowego” procesu tworzenia aplikacji .NET, które wczytują i zapisują dane przechow yw ane w bazie. C hoć Visual Studio i biblioteki ADO.NET obsługują większość skom plikow anych elem entów tego procesu, wciąż pozostaje do rozwiązania kilka problemów. Jeden z nich szczególnie często utrudnia pracę program istom aplikacji bazodanowych. Polega on na niezgodności standardow ego obiektowego m odelu tw o­ rzenia aplikacji obecnego w językach C# i Visual Basic oraz m odelu relacyjnego stosow anego w bazach i zbiorach danych. Ten ostatni model jest obsługiwany głównie przy użyciu języka SQL. W świecie obiektow ym programiści m anipulują obiektam i przy użyciu m etod i właściwości, a każdy obiekt może być (i często jest) kontenerem dla innych obiektów. Relacyjne bazy danych są dużo prostsze. Jednostki to tabele składające się z wierszy i k o lu m n , a każda „k om órka” tabeli przechowuje proste wartości skalarne. Podstawowy problem polega na tym, że program ista musi zmieniać modele program ow ania przy tw orzeniu w ewnętrznej platform y aplikacji i relacyjnej bazy danych używanej jako magazyn danych. Przekształcanie jednostek między obom a modelami nie jest prostym zadaniem.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Na przykład wiersze z tabeli przechowującej faktury można łatwo pobrać do obiektu bazy danych przy użyciu om ów ionych wcześniej różnych narzędzi i klas d o wiązania danych. Jed­ nak pobranie „macierzystego” obiektu I n v o ic e ze zbioru danych wymaga dwustronnego ręcz­ nego przekształcenia danych i manipulowania nim i w celu pobrania kluczowych wartości i prze­ kroczenia obiektowo-relacyjnej bariery. Związanych jest z tym kilka zagadnień. Czy programista m a zrezygnować ze zbiorów danych i wczytywać dane bezpośrednio z bazy do obiektów aplikacji? Czy lepiej zarzucić podejście obiektowe i używać kom ponentu DataSet we wszystkich w ar­ stw ach aplikacji? A m oże najlepsze okaże się rozwiązanie hybrydowe polegające na przecho­ w yw aniu kolekcji obiektów określonego typu obok zbiorów danych? W idealnych w arunkach programiści mogliby swobodnie manipulować obiektami w ram ach m odelu obiektowego, a zm iany byłyby autom atycznie zapisywane w bazie danych przy nie­ wielkich lub zerowych nakładach pracy. Nie tylko pozwoliłoby to skoncentrować się na podstawo­ wych, dobrze znanych wzorcach projektowania obiektowego, ale też umożliwiłoby poszczególnym programistom wykorzystanie umiejętności z obszaru najlepiej znanego języka bez konieczności poznaw ania języka SQL i opanowywania go na poziomie eksperckim. Takie idealne w arunki wymagają standardow ego podejścia i odpow iednich narzędzi do przekształcania obiektów na ich odpow iedniki w relacyjnej bazie danych i w drugą stronę. Do tego właśnie służą narzędzia do odwzorowywania obiektowo-relacyjnego. Pojęcie „odwzorowywanie obiektow o-relacyjne” (odwzorowywanie O /R ) określa cały proces przekształcania obiektów na dane w bazie i na odw rót. Narzędzia do odwzorowywania O /R są dostępne już od lat, a na szczęście Microsoft w reszcie bezpośrednio w budow ał je w platform ę .NET i środowisko Visual Studio. Służą do tego dwie odrębne, choć podobne technologie: LINQ to SQL i platforma Entity. Omówmy pokrótce obie technologie i związane z nimi narzędzia śro­ dowiska Visual Studio. Zacznijmy od LINQ to SQL.

Przegląd technologii LINQ Nazwa L1NQ to akronim od zwrotu „Language Integrated Q uery” (czyli zapytania zintegro­ wane z językiem). LINQ to komponent platformy .NET 3.5, który umożliwia kierow anie zapytań w stylu SQL-a do obiektów .NET. Technologia ta wzbogaca języki p latform y .NET (Visual Basic i C#) oraz środowisko uruchomieniowe i ma likwidować barierę między obiektam i a bazami d a­ nych. Języki Visual Basic i C# obsługują nowe operatory zapytań, które umożliwiają manipulowa­ nie obiektami w podobny sposób, jak język SQL pozwala przetwarzać tabele w bazach danych. M ożna na przykład użyć zapytania o w-szystkie obiekty reprezentujące zatw ierdzone faktury: var approved = from in v o ice in in voices where (invoice.Approved) == true se le ct in v o ic e ; foreach (In v o ice in v o ice in approved) { / / Tu operacje.

}

Rozdział 21. Praca z bazami danych Środowisko uruchom ieniow e fizycznie przekształca obiekty oraz m etody na ich odpow iedniki w bazie danych i na odwrót. Służą do tego przede wszystkim om ówione dalej atrybuty kodu. Po­ niższy kod odw zorow uje metodę klasy na procedurę składowaną w SQL Server: [ Function ( Name="HR. uspDeleteEmployee'') ] p u b lic in t uspDeleteEmployee( [ Parameter(Name="EmployeeID", DbType="Int") ] System .Nullable employeelD) { IE xe cu te R e su lt re su lt = this.ExecuteM etho d C all(this, ( (Methodlnfo)(MethodInfo.GetCurrentMethod() ) ), employeelD); return ( ( i n t ) ( r e s u lt .Retu rn V alue)) ; } Technologia LINQ ma kilka podsystemów. Każdy z nich rozwiązuje określony problem z o d ­ wzorowywaniem:

• LINQ to SQL umożliwia odwzorowywanie obiektów na jednostki bazy danych. • LINQ to XML służy do kierow ania zapytań do dokum entów XML i odw zorow yw a­ nia obiektów na elementy dokum entów XML. • LINQ to Objects związany jest ze składnią języków .N ET, która um ożliw ia pisanie zapytań do kolekcji obiektów1 (na przykład zatwierdzonych faktur we wcześniejszym kodzie). Warto wiedzieć o pewnej ważnej rzeczy dotyczącej technologii LINQ to SQL — choć jest w pełni obsługiwana przez Microsoft, została uznana za przestarzałą z uwragi na pojawienie się plat­ formy Entity. N iektórzy programiści nadal mogą preferować technologię LINQ to SQL, p o ­ nieważ jest m niej rozbudow anym i prostszym sposobem im plem entacji odwzorowań O/R.

Uwaga W 2007 roku Microsoft udostępnił wstępną wersję technologii LINQ zaprojektowaną na potrzeby przetwarzania równoległego. Technologia ta, PLINQ (od nazw)' P a r a lle l L IN Q ), została oficjalnie udostępniona w .NET 4.0. PLINQ jest oparta na rozwiązaniach z technologii LINQ. Obsługuje zapytania LINQ to XML i LINQ to Object oraz wykonuje je po zoptymalizowaniu pod kątem wielu procesorów lub rdzeni.

Dla osób zainteresow anych technologią PL1NQ i — ogólnie — program ow aniem równoległym doskonałym punktem wyjścia jest centrum Parallel Computing w witrynie MSDN: http://msdn. '-t-microsoft.com/en-us/concurrencyfdefault.aspx. LINQ to stosunkow o rozległy i skom plikow any zbiór podsystem ów , a szczegółowe om aw ianie każdego z nich wykracza poza zakres tej książki. Omówimy jed n ak O/R Desinger — podsta­ wowe narzędzie Visual Studio przeznaczone do tworzenia aplikacji opartych na podsystemie LINQ to SQL.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Odwzorowywanie przy użyciu narzędzia O/R Designer Pierwszy etap w tw orzeniu aplikacji LINQ to SQL polega zwykle na przygotowaniu m odelu obiektowego opartego na używanej bazie danych. Jest to podstawowa funkcja narzędzia O /R Designer. Umożliwia ono wybór bazy danych i wygenerowanie modelu obiektowego, który o d p o ­ wiada strukturze tej bazy. Tabela 21.3 przedstawia odwzorowanie kom ponentów bazy danych na kom ponenty obiektowe. Tabela 21.3. Domyślne odwzorowania jednostek bazy danych na obiekty

Baza danych

Obiekt w aplikacji

Tabela

Klasa

Kolumna tabeli

Właściwość klasy

Związek oparty na kluczuobcym

Asocjacja

Procedura lubfunkcjaskładowana

Metoda klasy

Dodawanie jednostek bazy danych O /R Designer to obszar projektow y na elementy zwane klasami LINQ to SQL, dlatego pierw ­ szy krok w korzystaniu z tego narzędzia polega na dodaniu do projektu nowego elem entu typu LINQ to SQL Classes. Rysunek 21.53 pokazuje, w którym miejscu okna dialogowego Add New Item znajduje się ten projekt. ~:-3 jwifcbj

A d d New Item - AdventureW orksL2$

Installed Tem plates l

Sort by: Default

-

t ? ....... I Search Installed Tem plates

I

a Visual C* '• ]

C ode

XM L File

Visual C*

Type: Visual C* LINQ to SQL classes m apped to relational

Data

objects.

General

XSLT File

Visual C*

L o o t Database Cache

Visual C*

AD O .N ET Entity Data Model

Visual C*

Local Database

Visual C*

U NQ to SQL Claeses

Visual C*

Service-based Database

Visual C’

Web W indows Forms WPF Reporting

a j[f.

Workflow O nline Templates

p j/ L

Name:

D ataClassesl.dbm l Add

Rysunek 21.53. Dodawanie elementu LINQ to SQL Classes do istniejącego projektu

Po w ybraniu elem entu LINQ to SQL Classes i dodaniu go do projektu środowisko autom atycznie otw orzy narzędzie O/R D esigner (zobacz rysunek 21.54).

Rozdział 21. Praca z bazami danych

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Rozdział 21. Praca z bazami danych p u b lic EmployeeO { th is.E m p lo y e e s = new EntitySet (new Action(t h i s . attach Employees) , new Action(this. detach Employees)); t h is . Employeel = d e fa u lt( EntityRef); OnCreated(); }

Uwaga Narzędzie O /R D esigner autom atycznie usuwa liczbę m nogą z nazw jednostek. W wielu bazach używanych w działach kadr zn ajd u ją się tabele pracowników nazwane „em ployees”, ponieważ przechow ują rekordy opisujące wiele osób. Aby dodatkow o ułatwić przechodzenie m iędzy m odelem obiektow ym a m odelem bazy danych, n arzęd zie O /R Designer tworzy klasę Employee, a nie Employees. Ta pierwsza nazw a d u ż o h a rd z iej o d p o w iad a p rzezn aczen iu klasy, k tó ra m a zawierać jed en w iersz tabeli, a nie jej całość.

Technologia LINQ dodaje w modelu obiektowym atrybuty, które odpowiadają za powiązanie obiektów z bazą danych. Atrybut Table pozwala zidentyfikować klasę jako bezpośrednie odwzo­ rowanie tabeli HumanResources. Employee. Każda kolum na tabeli Employee to właściwość w klasie Employee. Poniższy fragm ent przed­ stawia kod właściwości EmployeelD: [Column(Storage=" EmployeelD", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrim aryKey=tru e, IsDbGenerated=true)1 public in t Employeeld { get { return t h is . Employeeld; } set { i f ( (this._Em ployeeID != v a lu e )) { this.O nEm ployeelDChanging(value); this.Send P rop ertyC hangin g(); th is.E m p lo y e e lD = value; this.SendPropertyChanged("Em ployeelD"); t h i s . OnEmployeelDChanged( ) ; } } } Obok kodu obiektu Employee generow any jest też kod k o n tek stu danych. N astępny fragment to automatycznie utworzona definicja klasy:

C zę ść V Tworzenie aplikacji dla przedsiębiorstw [System. Dat a . Lin q .Mapping. DatabaseAtt r i butę (Name=" Advent u rew orks")) p u b lic p a r t ia l c la s s D ataClasseslD ataCo n text : System .Data. L in q . DataContext { p riva te s t a t ic System .Data.Linq.M apping.M appingSource mappingSource = new A ttributeM appingSource() ; #region D e fin ic je metod związanych z p a r tia l void O nCreatedO ; p a r tia l void InsertEm ployee(Em ployee p a r tia l void UpdateEmployee(Employee p a r tia l void DeleteEmployee(Employee #endregion

rozszerzaniem in sta n c e ); in sta n ce ); in sta n ce );

pub lic D a ta C la sse slD a ta C o n te xt(strin g connection) : base(connection, mappingSource) { OnCreatedO ; > pub lic System .Data.Linq.Table Employees { get { return this.G etTable(); } } > O biekt DataContext m ożna traktować jak m enedżera technologii LINQ. O bsługuje połącze­ nia kierowane do bazy danych, zarządza jednostkam i zapisanymi w pam ięci i przekazuje wy­ w ołania potrzebne przy aktualizow aniu danych oraz operacjach zw iązanych z równoległością i blokadam i. Aby um ożliw ić wykonywanie tych zadań, technologia LINQ wygenerowała p o ­ nad 500 wierszy kodu. Jak m ożna używać obiektów LINQ w aplikacji? O tym w następnym podpunkcie.

Korzystanie z obiektów LINQ T echnologia LINQ m a przede wszystkim upraszczać pracę. Klasy LIN Q wyglądają i działają jak wszystkie inne klasy w modelu obiektow ym . Program ista może utw orzyć nowy obiekt

Employee i ustawić jego właściwości w następujący sposób; Employee emp = new EmployeeO; emp.BirthDate = new DateTime(1965, 4, 4 ); emp.Gender = ' F ' ; emp.LoginID = "templogin"; em p.M artialStatus = ’ M' ; emp.T it le = "P ro je ct Resource Manager";

Rozdział 21. Praca z bazami danych Aby zapisać now y obiekt Em ployee w tabeli o tej samej nazwie, trzeba dodać go do kolekcji Employees przechowywanej wr kontekście danych, a następnie wywołać metodę Subm itChanges. W arto pam iętać, że typ to po prostu nazwa domyślna nadana kontekstowi danych przez narzę­ dzie O /R D esigner. Programista m oże ją zmienić w dowolnym momencie. DataClasseslDataContext db = new DataClasseslDataContext(); db.Employees.InsertOnSubmit(emp); db.SubmitChanges();

W podobny sposób można usuwać pracowników z kolekcji, a następnie z bazy danych: d b .Employees.DeleteOnSubmit(emp); db.SubmitChanges();

W tym m iejscu zaledwńe poruszyliśmy złożone zagadnienia zwńązane z tw orzeniem aplikacji obiektow o-relacyjnych przy użyciu technologii LINQ. M am y jednak nadzieję, że przegląd możliwości narzędzia O/R Designer posłuży jako punkt wyjścia do samodzielnego poznaw ania świata obiektowo-relacyjnego wr Visual Studio. Przejdźmy teraz do platformy Entity.

Korzystanie z platformy Entity Platforma E ntity (ang. Entity Framework — EF) to — podobnie jak LINQ to SQL — technolo­ gia umożliwiająca pisanie kodu z wykorzystaniem obiektów opartych na tabelach relacyjnych baz danych. Ponieważ obie technologie mają tę samą funkcję, większość zagadnień opisanych w części dotyczącej LINQ to SQL dotyczy także aplikacji opartych na platform ie EF. Istotną różnicą w platform ie EF jest poziom abstrakcji. W LINQ to SQL obowiązuje bezpośrednie odwzorowanie obiektów na tabele bazy danych, natomiast w EF tabele bazy odwzorowywane są na model EDM (ang. Entity Data Model), po czym można odw zorow ać obiekty na ten model. W modelu EDM platformy EF istnieją dwa odrębne modele obsługiw ane przez Visual Studio. Są to: model pojęciowy (obiekty aplikacji) i model Fizyczny (baza danych przechow ująca obiekty aplikacji). W Visual Studio modeli platformy EF można używać po dodaniu do projektu elem entu ADO.NET Entity Data Model. Podobnie jak elem ent projektu LINQ to SQL Data Classes, w spom niany element platform y EF znajduje się w kategorii Data okna dialogowego Add New Item (zobacz rysunek 21.57). Po dodaniu m odelu jednostki do projektu środowisko u ru ch o m i kreator. Program ista może określić, czy chce rozpocząć od pustego modelu pojęci o w-ego i fizycznego, czy utworzyć model na podstawie istniejącej bazy danych (zobacz rysunek 21.58). Ponownie zastosujmy bazę danych A dventureW orks.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Rozdział 21. Praca z bazami danych

Okno projektowe Okno projektow e zawiera znany graficzny widok m odelu pojęciowego. Przedstaw iony jest tu każdy obiekt wraz z właściwościami, polam i i związkami. Na rysunku 21.60 pokazano znane już związki między tabelami Employee, EmployeeDepartment i Department. Związki sko­ piowano bezpośrednio z opartych na kluczu obcym związków z bazy danych. W oknie p ro­ jektowym bezpośrednio pod pionow ym suwakiem widoczny jest mały zestaw przycisków nawigacyjnych, które w yróżniono na rysunku 21.60. Ponieważ w' oknie projektowym używane są czasem setki, a nawet tysiące obiektów', potrzebny jest sposób na przybliżenie i oddalenie powierzchni projektowej. Przyciski — wymienione od góry do dołu — umożliwiają: przybliże­ nie obrazu, ustawienie przybliżenia na 100%, oddalenie obrazu i ustawienie diagram u tak, aby widoczne były jednocześnie wszystkie obiekty.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw M c d e ll.e d rm *

x I

0..1 Employee

a Properties y

EmpłoyeelD

^3* N ationdiID N um ...

® Properties

CcotactID 13* LogmIO ^

y

'3 * Titie r3 * Birth Date

y

H.reDate Salan ed Flag

EndOate r f ModifiedOate ‘ Navigation Properties '• %

-»7r'~.... ..... — D epartm ent

-

Shift®

t y StartDate

M antalStatus Gender

Employee® Department®

M anagerlO

Department

VacationHours

Employee

SickteaveHours

Shift

e Properties DepartmentlD 3 * Name "fG ro u p N a m e 3 * ModifiedOate ' Navigation Properties EmployeeDepart..

CurrentFlag rowguid Modified Date - Navigation Properties ^

Contact

% Em p loyed ^

Employ ee2 EmployeeAddre...

■%

Em ployee Depart..

•%

EmployeePayHis...

■%

iobCandidates

D..r/'H*

. r Z aufane w itry n y | Tryb chro niony: wtoczony

/ft " M00% -

Rysunek 22.8. Do sprawdzenia usługi sieciowej można wykorzystać formularz wygenerowany przez ASP.NET

G órna część formularza pozwala na wprowadzanie param etrów dla m etod sieciowych, a następ­ nie wywoływanie metody sieciowej przy wykorzystaniu protokołu H TTP POST. Protokół ten jest jeszcze jednym sposobem na wywołanie m eto d y sieciowej. Przypomnijmy, że jest tu także używany protokół SOAP. Strona pokazuje rzeczywiste przykłady żądań i odpowiedzi w proto­ kołach SOAP oraz HTTP. Te przykłady mogą być użyteczne, gdy chce się zobaczyć, w jaki sposób należy tworzyć kom unikaty dla tych protokołów . Przykładowo, poniższy kod przedstawia żądanie kom unikatu SOAP 1.2 dla m etody sieciowej. Zauważmy, że komunikat zawiera element < c u sto m e rId > , który ma być przekazany do metody. Jest on typu prostego i n t . POST / C u s t o m e r S e r v i c e s / C u s t o m e r P r o f i l e . asm x H T T P / 1 .1 H o st: lo c a lh o s t C o n te n t-T yp e :

a p p lic a tio n / s o a p + x m l;

C o n te n t-Le n g th :

le n g th

c h a r s e t = u t f -8

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

x m l n s : x s i = " h t t p :/ / w w w .w 3 .o rg / 2 0 0 1 / X M L S c h e m a - i n s t a n c e "

x m l n s : x s d = “ h t t p : //w ww . w 3 . o r g / 2 0 0 1 / X M L S c h e m a " x m l n s : s o a p l 2 = " h t t p :/ / w w w . w 3 . o r g / 2 0 0 3 / 0 5 / s o a p - e n v e l o p e "> < s o a p l2 : Body> < G e t C u s t o m e r x m l n s = " h t t p : / / c o n t o s o . c o m / "> < c u s to m e rId > s trin g < / c u sto m e rId >

< / s o a p l2 : Body> < / s o a p l2 : E n v e lo p e >

Poniższy fragment to odpowiedź SOAP na to żądanie. Zauważmy tutaj, że wynikowe dane SOAP są zawarte w elemencie . H T T P / 1 . 1 2 0 0 OK C o n te n t-T y p e : a p p lic a tio n / s o a p + x m l; C o n te n t-Le n g th :

c h a r s e t = u t f -8

le n g th

Kod na stronie EditCustomer.xaml przyjmuje wartość identyfikatora klienta i za pom ocą p o ­ średnika przekazuje ją do usługi CustomerProf ile . Zw racany w ynik to obiekt Customer wiązany z wszystkimi kontrolkam i formularza. Na listingu 22.4 pokazano kod tych operacji. Listing 22.4. Kod z pliku EditCustomer.xaml.cs wczytujący dane klienta w celu ich edycji u s in g

System ;

u s in g

S y s t e m . W in d o w s;

u s in g

C u sto m e rM a n a g e r.C u sto m e rP ro fi l e S e r v i c e ;

nam espace C u sto m erM a n a g er

{ p u b lic

p a r tia l

c la s s

E d itC u s to m e r

: W indow

{ p r iv a t e C u s to m e r P r o file S o a p C lie n t new C u s t o m e r P r o f i l e S o a p C l i e n t ( ) ; p u b lic

E d itC u s to m e r(s tr in g

c u s tP ro file

=

c u s to m e rld )

{ In itia liz e C o m p o n e n t( ) ;

/ / Do zrobienia: sprawdzanie poprawności parametru customerld. / / Pobieranie obiektu Customer i wczytywanie kontrolek umożliwiających edycji;. L o a d C o n tro ls(G e tC u s to m e r(c u s to m e rId )) ;

> p r iv a te

C ustom er G e tC u s to m e r(s tr in g

c u sto m e rld )

{ re tu rn

c u s tP ro file .G e tC u s to m e r(c u s to m e rld );

} p r iv a te

v o id

Lo a d C o n tro ls(C u sto m e r

cu sto m er)

{ te x tB o x A d d r e s s .T e x t

= c u s to m e r.A d d ress;

t e x t B o x C i t y .T e x t = c u s t o m e r .C it y ; t e x t B o x C o m p a n y . T e x t = c u sto m e r.C o m p a n y N a m e ; te x tB o x F a x .T e x t = cu sto m er. Fax; te x tB o x Id .T e x t

= c u sto m e r.Id ;

t e x t B o x N a m e . T e x t = c u s t o m e r . N am e ; te x tB o x P h o n e .T e x t = c u s to m e r. Phone;

Rozdział 22. Aplikacje oparte na usługach t e x t B o x P o s t a lC o d e .T e x t = c u s t o m e r .P o s ta lC o d e ; t e x t B o x R e g io n .T e x t = c u s to m e r. R e g io n ; te x tB o x T itle .T e x t

= c u s to m e r.T itle ;

} p riv a te

v o id

b u tto n l C lic k fo b je c t

sender,

R outedEventA rgs

e)

{ t h i s . C l o s e ( );

} > }

Uwaga Przykładowe rozwiązanie można przygotować także za pomocą wiązania danych, a nawet automatycznie generując duże frag­ menty formularzy.

W ywoływanie metod CreateCustomer, UpdateCustomer i DeleteCustomer przebiega b a r­ dzo podobnie. Aby się im przyjrzeć, należy pobrać kod ze strony poświęconej książce. W arto zauważyć, że jest to prosty przykład. W celu uzupełnienia go m ożna dołączyć sprawdzanie poprawności danych i kilka innych dodatków. Kod ilustruje kierowanie wywołań do pośrednika CustomerProfileSoapClient w celu wywołania odpow iednich m etod sieciowych. Rysunek 22.15 przedstaw ia efekt działania kodu. W idoczne jest tu okno dialogowe Customer wyświetlane po kliknięciu przycisku Edycja przez użytkownika. Jeśli użytkow nik kliknie przy­ cisk Zapisz , aplikacja wywoła metodę sieciową UpdateCustomer i odświeży listę klientów.

Uwaga Diagnozowanie usług sieciowych ASP.NET z poziomu aplikacji klienckich wymaga albo uruchomienia usługi w rozwiązaniu z pro­ gramem głównym, albo dołączenia procesu roboczego ASP.NET z usługą. Więcej informacji na ten temat znajduje się w rozdziale 11., „Diagnozowanie kodu”.

Wyjątki w usługach sieciowych ASP.NET Stosując .NET, łatwo zapomnieć, że wywołało się usługę sieciową. Gdy ma się do czynienia z kla­ sami pośredniczącymi, często przywyka się do pracy z usługami sieciowymi — tak jakby nie było żadnej różnicy w porówmaniu z dowolnymi innym i metodami. Jednak może to być niebezpieczne. M etody sieciowe są inne. O grom ną różnicą jest sposób wywoływania wyjątków z usługi sie­ ciowej. W poniższych punktach znajduje się objaśnienie sposobu wywoływania wyjątków'.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

.NET udostępnia obiekt SoapException do opakowywania wyjątków dla transmisji SOAP. Klasa ta ma wiele param etrów , które mogą być nowością dla program isty. Te param etry i w ła­ ściwości to:

• Message — służy do definiowania opisow ego kom unikatu dla wyjątku. Jeśli przesyła się standardowy' wyjątek .NET za pośrednictw em SOAP, m ożna przypisać w łaściw o­ ści Message w artość właściwości Message standardowego w yjątku.

• Code — służy do wskazania, czy błąd jest związany z klientem , czy serwerem. Należy nadać tej w łaściwości wartość ServerFaultCode, jeśli k lien t wysłał praw idłow y komunikat, ale serwer nie przetworzył tego żądania (był w yłączony lub uszkodzony). Należy nadać tej właściwości wartość ClientFaultCode, jeżeli to klient przesłał n ie­ właściwy kom unikat lub błędne wartości parametrów.

Rozdział 22. Aplikacje oparte na usługach • Actor — służy do podania URI usługi sieciowej. Param etr Actor wskazuje na kod, który spow odow ał wyjątek.

• Detail (opcjonalny) — służy do przesyłania większej ilości informacji na temat danego błędu. W łaściwość Detail może być pusta lub zawierać tyle szczegółów, ile progra­ mista chce przekazać na temat wyjątku. Listing 22.5 przedstawia now ą wersję metody sieciowej GetCustomer. W ersja ta sprawdza, czy istnieje klient. Jeśli nie, wywołuje wyjątek SoapException z właściwością Code ustawioną na ClientFaultCode. W arto zauważyć, że kod wymaga zastosowania instrukcji using (imports w języku Visual Basic) dołączającej przestrzeń System. Web. S ervices. Protocols. Listing 22.5. Tworzenie wyjątku SOAP [ W e b M e t h o d ( D e s c r ip t io n = "Zw raca p r o f i l k l i e n t a . " ) ] p u b l i c C u sto m e r G e t C u s t o m e r l s t r i n g c u s t o m e r l d )

{ C u sto m e r c u s t = c u s tP ro file .G e tC u s to m e r(c u s to m e rld ); i f (cu st == n u l i)

{ S o a p E x c e p t i o n s o a p E x = new S o a p E x c e p t i o n ( " N ie mogę z n a l e ź ć k l i e n t a . " , S o a p E x c e p t i o n . C l i e n t F a u l t C o d e , C o n t e x t . R e q u e s t . U r i . A b s o l u t e U r i . T o St r i n g ( ) ) ; th ro w s o a p E x ;

} retu rn custom er;

}

Aplikacje oparte na usługach WCF Usługi WCF, podobnie jak usługi sieciowe, są związane ze specyficznym słownictwem. W ażne jest, aby zrozumieć podstaw ow e pojęcia przed zapoznaniem się z kluczow ym i zagadnieniam i z obszaru usług WCF. Poniższa lista zawiera opis najważniejszych nazw z tej dziedziny.

Uwaga Aby korzystać z WCF, nie trzeba rozumieć wszystkich podanych pojęć. Jednak warto mieć choć podstawową wiedzę przy tworzeniu i konfigurowaniu usług.

• Usługa WCF — jest to zbiór logiki biznesow ej udostępniany w formie usługi wielu klientom. U sługa może mieć jedną lub kilka operacji (czyli m etod). Usługi WCF są udostępniane klientom przez definiowane przez programistę punkty końcowe. Każdy taki punkt ma wiązania i działania (zobacz opis punktów końcowych w dalszej części listy).

C zę ść V Tworzenie aplikacji dla przedsiębiorstw To rozw iązanie pozwala utworzyć jedną usługę i skonfigurować ją, tak aby efektywnie w spółdziałała z wieloma klientam i (na przykład przez protokoły HTTP, TCP i potoki nazwane).

• Klient WCF — jest to wygenerowana przez Visual Studio aplikacja, która m oże w y­ woływać usługi WCF. Aby utworzyć klienta WCF, należy dodać w aplikacji klienckiej referencję do usługi. Aplikacja kliencka konsumuje wyniki zwracane przez usługę WCF. Klienta W CF można traktować jak pośrednika, który7łączy kod kliencki z usługą WCF. • Host — jest to proces, w którym działa usługa WCF. Ten proces kontroluje czas życia usługi. Przypom ina to obsługę usług sieciowych w technologii ASP.NET. Program ista może napisać kod hosta lub utworzyć niezależną usługę. • Kontrakt — definiuje usługę WCF. Jest to publiczny kontrakt między usługą a klientami. Kontrakt usługi określa jej zawartość (na przykład operacje). Ponadto każda operacja usługi ma odrębny kontrakt, który' wyznacza parametry i typ zwracanej wartości poszcze­ gólnych m etod. Są też kontrakty opisujące komunikaty, dan e i błędy. • Punkt końcowy — każda operacja usługi ma skonfigurow ane punkty tego typu. To w nich zachodzi wysyłanie i odbieranie kom unikatów przez usługę. Każdy p u n k t końcowy wyznacza adres i wiązanie używane do kom unikacji z usługą. Na przykład jeden punkt końcowy może korzystać z SOAP i HTTP, a drugi — z MSMQ. W ten sposób m ożna dodaw ać i konfigurow ać punkty końcow e usługi niezależnie o d jej kodu. G w arantuje to, że usługę m ożna skonfigurować p od kątem wydajnego w sp ó ł­ działania z istniejącymi i przyszłymi klientami. • Adres — jest to niepow tarzalny identyfikator URI danej usługi. Klienty w yw ołujące usługę używają adresu do jej zlokalizowania. URI określa też protokół (na przykład H TTP lub TCP) potrzebny do uzyskania dostępu do usługi p od danym adresem . Każdy punkt końcow y usługi ma inny adres. • Działania — określają działanie całej usługi, konkretnego punktu końcowego lub d a ­ nej operacji. Działania mogą dotyczyć na przykład danych uwierzytelniających lub u d o ­ stępniania usługi. • Wiązanie, elementy wiązania i kanały — punkty końcowe mają wiązania, które o k re ­ ślają sposób komunikacji. Wiązanie obejmuje informacje o metodzie przesyłu danych, kodowaniu i zabezpieczeniach. Na przykład można skonfigurować wiązanie punktu k o ń ­ cowego przy użyciu HTTP jako m etody transportu i zwykłego tekstu jako kodow ania. W iązanie składa się z elem entów wiązania. Każdy taki elem ent reprezentuje je d n ą część wiązania. Można na przykład utworzyć dwa elementy wiązania: jeden określający kodowanie i drugi wyznaczający m etodę transportu. Elem enty wiązania i ich k o n fig u ­ racja są im plem entow ane w formie kanałów, które składają się ze zbioru takich ele­ mentów. Kanał stanowi więc im plem entację wiązania. Visual Studio udostępnia różne narzędzia ułatwiające tworzenie usług WCF. Jeśli program ista wie, że chce umieścić usługę WCF w witrynie na serwerze IIS, m oże dodać usługę do w itryny za pomocą szablonów elementów. Jeżeli jednak zamierza przechowywać usługę poza serwerem

Rozdział 22. Aplikacje oparte na usługach I IS lub nie podjął jeszcze decyzji, może utworzyć projekt WCF. W obu scenariuszach należy zaim plem entow ać ko n trak t usługi, a następnie skonfigurować jej punkty końcowe używane do kom unikacji. Na zakończenie należy wybrać model hosta usługi i w drożyć go. Od tego m o ­ m entu klienty mogą korzystać z usługi. W następnych punktach opisujem y wszystkie te etapy.

Szablon projektu WCF Środowisko Visual Studio umożliwia utw orzenie usługi WCF w podobny sposób jak innych projektów. Należy wybrać opcję File/New/Project, co spowoduje otwarcie okna Add New Project. W tym miejscu trzeba kliknąć węzeł WCF w grupie projektów języka C# lub Visual Basic, a następnie można wybrać szablon usługi WCF. Rysunek 22.16 przedstawia w spom niane okno dialogowe. New Project Recent Tem plates

: .NET Fram ework 4



S o rtb

In stalled Tem p lates j

W C F Service Library

Visual C *

Visual C *

T y p e : Visual C * A project for creating W CF services

Windows W CF Service Application

Web

Visual C *

Cloud cjjjgijj

Reporting

W C F Workflow Service A p plicatio n

Visual C *

Siherhght Test

Syndication Service Library

Visual C »

WCF W orkflow O ther Languages O ther Project Types Database Test Projects O nline Tem plates

Name Location: Solution name

Custcm erSerx ices . C:\C od e\C o nto so \W C F Services Example Custcm erServ ices

Brow se... 4 Create directory fe r solution

A dd to source control OK

1

c :: " i

Rysunek 22.16. Do tworzenia usług WCF służą szablony projektów WCF

W arto zauważyć, że jest kilka szablonów usług WCF. Szablony te umożliwiają tworzenie usług WCF dostosowanych do potrzeb programisty. Istnieje szablon WCF Workflow Service Applica­ tion służący do obsługi procesów w system ie Windows. Szablon Syndication Service Library umożliwia tworzenie usług do rozpowszechniania inform acji podobnych do źródeł RSS. Sza­ blon WCF Service Library służy do rozw ijania prostych usług W CF i późniejszego wdrażania ich w hoście (zobacz punkt „Hosting i instalow anie usług W CF” w dalszej części rozdziału). O statni szablon, WCF Service Application, pozw ala utworzyć w itrynę ASP.NET i usługę WCF. Szablon ten udostępnia dom yślnego hosta usługi (serw er IIS). W om aw ianym przykładzie zastosujemy ten ostatni szablon.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Uwaga Można też utworzyć witrynę ASP.NET i dodać do niej usługi WCF Wtedy host usługi jest narzucony, a jednostki wywołujące komuni kują się z usługą za pomocą serwera IIS i technologii ASP.NET.

Pliki usług WCF Projekt WCF Service Application tw orzony za pomocą szablonu środowiska Visual Studio zawiera interfejs do definiowania kontraktu usługi (lServicel.cs), plik reprezentujący identyfikator URI usługi (Servicel.svc) i powiązany plik klasy do implementacji kodu usługi (Servicel.svc.cs). Szablon projektu obejm uje też plik Web.conjig służący do konfigurow ania usługi, a także o d ­ powiednie referencje platform y .NET. Na ry su n k u 22.17 pokazano nowy projekt o p arty na szablonie. W oknie z kodem znajduje się wygenerowany kod, który stanowi punkt wyjścia do prac nad interfejsem C u s to m e r P r o f ile S e r v ic e r

itglhrffrwl

o o Cuitom erServrces - M icrosoft Visual Studio File

Ed«t

J ’

View

Project

’ J A 4

B uild

Team

Data

A -J

j Publish: Create Publish Settings

KmIMMHM ::

Debug

Took

Test

W indow

►rr^ Debug

Help

-1 3 Z 3 , •

* Solution Explorer

C usto m erP ro ftk.svc.es'

CustcmerServices.ICustomerPfohle

J

• ♦ GetDatafmt vaioej

using System. ServiceModel using System. ServiceModel. Web; using System.Text;

^1

*

.*3 Solution CustomerServices (1 project) a

Ą C u s to m e rS e rv k e s :4. Properties

References

namespace C u sto rre rS e rv ie e s

- . App uata Ay Custom erProfile.svc

-

[ServiceContractJ public in te rfa ce ICustcraerproflie

'♦J Custom erProfile.svc.es D

lCustom erProfrle.es W eb.conftg

[Ooerat ionContrac t J string GetOata(int valu e); [OperatlonContract] CompositeType GetDataUsingDataContract(Cc :,>ositeType composite); / / TOOO: Add you r s e r v ic e o p e ra tio n s here

// Use a data co ntract as illu s tra te d in the sample below to add comp [DataCont-act] public c la s s Compos iteTypeTTT

WBfWOB IC ustom erP rorile.es File Properties

But d Action

Compile

Cops to Output D Do not copy

Custom Tool A d vanced

Rysunek 22.17. Szablon WCF Service Application tworzy usługę przechowywaną w w itrynie Klasa interfejsu usługi (na rysunku jest to plik ICustomerProfileService.cs) to interfejs służący do definiowania kontraktu usługi. Kontrakt związany jest z operacjami usługi i danymi. Podział interfejsu na kilka odrębnych plików pomaga oddzielić wszystkie atrybuty WCF i elementy k o n ­ traktu od kodu logiki biznesowej usługi.

Rozdział 22. Aplikacje oparte na usługach Omawiana klasa jest zdefiniowana jako usługa WCF, na co wskazuje atry b u t ServiceContract w początkowej części kodu. Ponadto operacje (metody) usługi są oznaczone atrybutem Operation '-►Contract (na rysunku przy metodzie GetData). Klasa usługi (w ok n ie Solution Explorer o d p o w iad a jej plik CustomerProfile.svc.cs) zaw iera im plem entację interfejsu usługi: nam espace C u s t o m e r S e r v ic e s

{ p u b lic

c la s s

C u sto m e rP ro fi l e

:

IC u sto m e rP ro file

{ Logikę działania usługi należy umieścić w klasie implementującej interfejs usługi. Kod logiki biznesowej można umieścić w samej klasie lub kierować wywołania do innej biblioteki zaw ie­ rającej kod implementacji. Przyjrzyjmy się przykładowi.

Tworzenie usług WCF Po przedstawieniu standardow ego szablonu projektów usług WCF pora omówić krok po k ro ­ ku tw orzenie usługi W CF w Visual Studio 2010. W tym punkcie utw orzym y wersję W CF usługi CustomerProf i l e zbudowanej wcześniej jako usługa sieciowa ASP.NET. Nowa usługa, podobnie jak jej odpowiedniczka, korzysta z obiektu Customer z biblioteki BusinessEntities (listing 22.1) i kodu z biblioteki EntityServices (listing 22.2). Ta ostatnia udostępnia m etody służące do pobierania inform acji o klientach ze źródła danych i zapisywania zmian. Poniższe punkty opisują proces udostępniania tej funkcji w form ie usługi WCF: 1. Najpierw należy utworzyć nowy projekt WCF Service Application. Nadajmy projek­ towi nazwę CustomerServices. 2. Należy użyć opcji Refactor/Rename do zm iany nazw plików interfejsu i usługi na lCustomerProfile.es i CustomerProfile.svc. 3. Teraz trzeba skopiow ać utw orzone w poprzednim podrozdziale projekty Entity ’-►Services i BusinessEntities d o katalogu nowego projektu. Należy kliknąć rozwiązanie praw ym przyciskiem m yszy i wybrać opcję Add/Existing Project w celu dołączenia obu projektów do now ego rozwiązania. 4. Otwórzmy klasę EntityServices. CustomerServices i zm odyfikujm y w razie p o ­ trzeby łańcuch połączenia z bazą danych. 5. Teraz należy kliknąć prawym przyciskiem myszy projekt CustomerServices, wybrać opcję A dd Reference oraz d o d ać referencje do p ro jek tó w EntityServices i BusinessEntities. 6. Następnie należy otworzyć plik ICustomerProfile, usunąć przykładowy kod i zamiast niego umieścić definicje metod GetCustomer, GetActiveCustomers, CreateCustomer, UpdateCustomer i DeleteCustomer. Każdą definicję m etody należy oznaczyć a try ­ butem [ Ope rat ionCont ract ] . Kod w pliku powinien wyglądać tak jak na listingu 22.6.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Listing 22.6. Interfejs ICustomerProfile u s in g u s in g

System ; S y ste m .C o lle c t io n s .G e n e ric ;

u s in g

S y s t e m .L in q ;

u s in g

Sy ste m .R u n tim e .S e ria liza tio n ;

u s in g

S y s t e m . S e rv ic e M o d e l;

u s in g

S y s t e m . S e r v i c e M o d e l .W e b ;

u s in g

S y ste m .T e x t;

u sin g u sin g

B u s in e s s E n titie s ; S y ste m .D a ta ;

nam espace

C u s to m e rS e rv ic e s

{ [S e rv ic e C o n tra c t] p u b lic

in te rfa c e

IC u sto m e rP ro file

{ [O p e ra tio n C o n tra c t] Custom er

G e tC u s to m e rls trin g

cu s to m e rld );

[O p e ra tio n C o n tra c t] D ataSe t

G e tA c tiv e C u s to m e rs ();

[O p e ra tio n C o n tra c t] v o id

D e le te C u s to m e r(s trin g

c u s to m e rld );

[O p e ra tio n C o n tra c t] v o id

C re a te C u sto m e r(C u sto m e r cu sto m e r);

[O p e ra tio n C o n tra c t] v o id

U p d a te C u sto m e r(C u sto m e r c u s to m e r);

} } 7. Teraz m ożna otworzyć plik klasy CustonicrProfileService.cs. W tym miejscu należy zaim plem entować kod interfejsu zdefiniowanego w poprzednim kroku. Najpierw trze­ ba usunąć kod definicji klasy, a następnie umieścić kursor w wierszu deklaracji klasy implementującej interfejs ICustomerProfile. Przy nazwie ICustomerProfile po­ jawi się m ały inteligentny znacznik. Należy go kliknąć i w ybrać opcję Im plem ent In­ terface ICustomerProfileService'. Opcję pokazano na rysunku 22.18. Spow oduje to wygenerowanie szkieletów m etod usługi. Rysunek 22.18. Należy użyć inteligentnego znacznika w edytorze kodu, aby zaimplementować interfejs usługi

- namespace C ustom erServices j{ - p u b lic c la s s C u sto m erP ro file {

IC u sto m e rP ro file |2 il Implement interface ‘JCustomerPrcfile’

S l>>

Explicitly implement interface ICustomerPrc^^

8. N astępny krok polega na napisaniu kodu łączącego m etody usługi z kodem biblioteki klas EntityServices. W arto pam iętać, że projekt CustomerServices to o p arty na

Rozdział 22. Aplikacje oparte na usługach usłudze pośrednik metod biblioteki E n tity S e r v ic e s . Na listingu 22.7 przedstaw iono przykładów}' kod. Listing 22.7. Kod implementacji z pliku CustomerProfile.svc.cs u s in g

System ;

u s in g u s in g

S y s te m .C o lle c t io n s .G e n e r ic ; S y s te m .L in q ;

u s in g

S y s te m .R u n tim e .S e ria liz a tio n ;

u s in g u s in g

S y s te m .S e rv ic e M o d e l; S y ste m .S e rv ic e M o d e l.W e b ;

u s in g u s in g

S y ste m .T e x t; B u s in e s s E n titie s ;

nam espace

C u s to m e rS e rv ic e s

{ p u b lic

c la s s

C u s to m e r P r o file

: IC u sto m e rP ro file

{ E n tity S e rv ic e s .C u s to m e rP ro file

c u s tP ro file

=

new E n t i t y S e r v i c e s . C u s t o m e r P r o f i l e ! ) ; p u b lic

C ustom er G e t C u s t o m e r P r o f ile ( s t r in g

c u s to m e rld )

{ re tu rn

c u s tP ro file .G e tC u s to m e r(c u s to m e rld );

> p u b lic

S y s te m .D a ta .D a ta S e t G e tA c tiv e C u s to m e rs ()

{ retu rn

c u s tP ro file .G e tA c tiv e C u s to m e rs l) ;

} p u b lic

v o id

D e le te C u s to m e r(s trin g

c u s to m e rld )

{ c u s t P r o f i l e . D e le te C u s to m e r(c u s to m e rId );

} p u b lic

v o id

C re a teC u sto m e r(C u sto m er cu sto m er)

{ c u s tP ro file .S a v e C u s to m e r(c u s to m e r,

tru e );

> p u b lic

v o id

U p d a te C u sto m e r(C u sto m e r c u s to m e r)

{ c u s t P r o f i l e . S a v e C u sto m e r(c u sto m e rId ,

fa ls e );

} } } ______________________________________________________ _

_______________________________________ ____

9. Ostatni krok polega na dodaniu oznaczenia serializacji do obiektu Customer z pierw ­ szej wersji usługi. Potrzebna klasa znajduje się w bibliotece BusinessEntities. Oznaczenie jej informuje platformę W CF o tym, że można serializować dane tej klasy, aby przekazywać je między klientem i usługą. Do oznaczenia należy użyć atrybutu DataContract z przestrzeni nazw System.Runtim e.Serialization (konieczne

C zę ść V Tworzenie aplikacji dla przedsiębiorstw może być dodanie referencji do tej przestrzeni). Klasę należy opatrzyć atry b u tem D a ta C o n tra c t, a jej właściwości — atrybutem DataMember. Potrzebny kod p rzed ­ stawia listing 22.8. Listing 22.8. Oznaczanie klasy Customer atrybutem DataContract u s in g

System ;

u s in g u s in g

S y s te m .C o lle c t io n s .G e n e r ic ; S y s te m .L in q ;

u s in g

S y ste m .T e x t;

u sin g

S y s te m .R u n tim e . S e r i a l i z a t i o n ;

nam espace

B u s in e s s E n titie s

{ [D ataC o n tract] p u b lic

c la s s

Cu sto m er

{ [D ataM em ber] p u b lic

s trin g

Id

{ get;

set;

}

[D ataM em ber] p u b lic

s trin g

C o m p an y N am e

{

get;

Name { g e t ;

set;

set;

}

[D ataM em ber] p u b lic

s trin g

}

[D ataM em ber] p u b lic

s trin g

T itle

{ get;

set;

}

[D ataM em ber] p u b lic

s trin g

A ddress

{ get;

set;

}

[D ataM em ber] p u b lic

s trin g

C ity

{ get;

set;

}

[D ataM em ber] p u b lic

s trin g

R e g io n

{ get;

set;

}

[D ataM em ber] p u b lic

s trin g

P o s ta lC o d e

{

get;

set;

}

[D ataM em ber] p u b lic

s trin g

Cou ntry

{ get;

set;

}

[D a ta M e m b e r] p u b lic

s trin g

[D a ta M e m b e r] p u b lic s t r in g

Phone { g e t ;

Fax

{ get;

set;

set;

}

}

) } I to już wszystko. Utworzyliśmy prostą usługę WCF przechow yw aną na serwerze W W W . Teraz pokażemy, jak użyć środowiska Visual Studio do przetestow ania usługi WCF.

Rozdział 22. Aplikacje oparte na usługach

Uruchamianie i testowanie usług WCF Niezależnie od tego, czy program ista utw orzył projekt WCF Service Application (przechow y­ wany w witrynie), czy WCF Service Library (przechowywany niezależnie od definicji usługi), Visual Studio udostępnia m echanizm do urucham iania i diagnozow ania usług bez konieczno­ ści ich wcześniejszego w drażania lub pisania klienta usługi. Visual Studio udostępnia hosta, którego można używać do przechowywania, uruchamiania i te­ stow ania usług. Aby użyć hosta usług W CF i klienta testowego W CF w Visual Studio, najpierw' należy ustawić w środow isku usługę jako projekt uruchomieniowy (kliknąć prawym przyci­ skiem myszy projekt w oknie Solution Explorer i wybrać opcję Set as Startup Project). To sam o dotyczy projektów' bibliotek i aplikacji usługow ych. N astępnie m ożna u ruchom ić aplikację w trybie diagnostycznym . Spowoduje to włączenie hosta usługi W CF w Visual Studio (zm inim alizow anego w zasobniku system ow ym ), a także utw orzenie klienta W CF na potrzeby testów usługi. Rysunek 22.19 przedstawia host usługi WCF. Rysunek 22.19. Dostęp do aplikacji WCF Service Host można uzyskać za pomocą zasobnika systemowego

- 1

W C F S e rv ice H o jt

File

*ii

Help

Services Service Custom erProfleSvcLb GatoroerProfie

Status

Metadata Address tip //*>cdhost 8732

A d d tw n a l Inform ation S e rv ic e sta rted

R ea d y

Klient testowy W CF wyświetla usługę i jej operacje. Rysunek 22.20 przedstaw ia opisaną wcze­ śniej usługę C u s to m e r P r o f ile w formie biblioteki usług W CF uruchom ioną w kliencie te ­ stowym. Należy zwrócić uwagę na interfejs IC u sto m e rP ro f i l e . M ożna rozwinąć usługę, aby zobaczyć jej operacje. Jeśli użytkownik kliknie dwoikrotme daną usługę, po prawej stronie poja­ wi się klient testowy. W tym miejscu wybraliśmy operację G etC u sto m er, wpisaliśmy wartość c u sto m e rld i kliknęliśm y przycisk Invoke. W arto zauważyć, że w dolnej części form ularza m ożna przełączyć zw rócone dane z widoku

Formatted na widok XMl.-a. Ten ostatni bywa przydatny w czasie diagnozow ania. W celu zakończenia testów należy wybrać opcję File/Exit\v kliencie testowym WCF.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

i 3 Corśg R e

Service invocation completed.

Rysunek 22.20. Można użyć klienta testowego VVCF do wybrania biblioteki usług WCF, wywołania jej i wyświetlenia wyników

Konfigurowanie usług WCF Przedstawiliśmy już podstawy tworzenia usług WCF. Po zbudow aniu usługi można ją sk o n fi­ gurować pod kątem obsługi różnych klientów. Oznacza to dodanie punktów końcowych i o d p o ­ wiednich informacji konfiguracyjnych. W arto pamiętać, że technologia WCF ma um ożliw iać tw'orzenie jednej usługi i jej optymalizację, tak aby współdziałała z wieloma klientami. Jeden z nich może korzystać z usługi przez protokół HTTP, inny przy użyciu TCP, jeszcze następny — za pomocą potoków nazwanych. W konfiguracji można zapewnić obsługę tych i innych klientów. Wróćmy do szablonu WCF Service Library, który obejmuje plik App.cortfig. Projekty WCF Service Application zawierają plik web.conftg. Oba wymienione pliki zawierają konfigurację usługi. Do edytowania pliku web.config w środowisku Visual Studio służy edytor XML-a. Jednak przy korzystaniu z projektów bibliotek usług i wielu punktów końcowych czasem łatwiej jest edytować inform acje za pomocą narzędzia Service C onfiguration Editor. Aby je otworzyć, należy kliknąć prawym przyciskiem myszy plik konfiguracyjny i wybrać opcję Edit WCF Confi­ guration. Na rysunku 22.21 pokazano projekt WCF Service Library z usługą C u sto m erP ro f i l e otwarty w om aw ianym narzędziu.

Rozdział 22. Aplikacje oparte na usługach c:\users\mAeSdesktop\c 3 de\unleeshed\contosoVcHepter 22 W cf services exampłe\cjstomerproftesvcig - Microsoft .. Filc

^

! ^ "5 ^

Help

Configuration

Services

fc . J E 3 E 3 * CmtomerProMeSvcljb CustomerPrcrt - O Host J Eodports (Empty Name) (Empty Name)

Service: CustomerProfileSvcLib.CustomerProfile Crw te a N o . Service Erd p o irt..

U O ert • Metadata 1 Endports

E n d p o in t:

i. 1 Bndmęs 1 Standard Endports .-) Oagnosbcs •• H 3 Message Loggmg - J End To End Tracing 1 Lateness Sources fcł fid v anced Endport Behaxtors l* _ J Service Behaviors

Survnary Create a New Service..

(E m p ty N t P ie )

Address Bndng Bnrtng configuration Contract E n d p o in t:



~

(E m p ty

Address Binding Bndino corAjureticr Contract

D elete

weHttpBndng LQgfoA} CM s A CfMfc CustomerProWeSvclib ICustomerProłile

.Kernel

D elete

me* mexHttp6 »n6 ng fDdaultl Click to C tM It iMetadata&change

MU i io Create a New Service •

Create a New Chert

Rysunek 22.21. Narzędzie WCF Configuration Editor służy do zarządzania punktami końcowymi służącymi do wywoływania usługi

Tego samego edytora można używać do edycji plików konfigura­ cyjnych WCF poza środowiskiem Visual Studio. Jest to przydatne przy wprowadzaniu zmian po zakończeniu programowania. Aby otworzyć omawiane narzędzie, należy uruchomić program S vcC ottfig E d ito r.e x e .

Edytora Service C onfiguration Editor m ożna użyć do ustawienia konkretnych opcji konfigura­ cyjnych, jednak najbardziej przydatny jest jako kreator. Dostępny jest na przykład kreator do definiowania nowych punktów końcowych. Poniższe kroki opisują tworzenie punktu końco­ wego TCP dla wersji WCF Service Library usługi C u s to m e rP ro fi l e S e r v i c e . 1. Najpierw należy otworzyć w usłudze CustomerProfileSvcLib.CustomerProfile katalog Endpoints i wybrać opcję Create a New Service Endpoint w panelu Tasks (prawy dolny róg okna). Spowoduje to wyświetlenie okna dialogowego New Service Endpoint Ele­ ment Wizard , które pokazano na rysunku 22.22. 2. Pierwsza strona kreatora wymaga wybrania usługi, do której m a należeć nowy punkt końcowy. Rysunek 22.22 przedstawia tę operację. Należy wybrać utw orzoną wcześniej usługę I C u s to m e rP ro f ile .

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

| l052 |

Rozdział 22. Aplikacje oparte na usługach

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Rysunek 22.26. Aby dodać wiązanie dla protokołu TCP, należy uż.yć okna dialogowego Create a New Binding

cAuie'sVmfceSdtiktopVo'toVunleashcd'vcontosoVhaptcf 2 2 W f j*w*cej «i«mpte\cuitofnerproAl*svchb\appxonfi- 1 Ne

1

j

Help

Configuration

• C reate a N e * Bind ing

i_ J Service*

-

CuPonterfScMeSvcLb CuPomerP

■a hm

1

pa>c KtpCorteud Bmdng cutom Bndng

■nexHtpBmong

TcpEnoport

♦ _J CWt » J

Please se le ct a brndmg type

Daac^toftndng

| Endport*

BrxSrgj

_ J Standard Endport s • _ J Diagnoses J Advanced

'r exNamedPpeBndrg | mamoIrtegrabonBndng j netM wwqttndrg net NamedPbeBm dng

natPeerTcpBn^ng

i \\ -

wdm

netTcpContad&ndng

weŁHOpBndnę

frs2007FederatonbłtpBndr>g «*«2007bNpBndng

«a[X>aibttoBr>drg »v»Federate ? HRpBndng

wsRlpB^idcig

wfHOpCortea: Bndrg New Binding Configurabon C reate a New Sam oa C reate a New C lient

——

7. W oknie właściwości Binding należy znaleźć właściwość P o rtS h a rin g E n a b le d i usta­ wić jej w artość na T rue (zobacz rysunek 22.27). Należy też zm ienić nazwę konfigura­ cji wiązania na Port Sharing Binding. Rysunek 22.27. Należy się upewnić, że właściwość PortSharingKnabled wiązania netTcpBinding jest ustawiona na True

c\users\m < ke\desktop\code\unleashed\cootoso\chapter 2 2 >wcf services exdm ple\custornerproftesvclibVapp co File

Help

Configuration CualomerProlieSvcUbCuetomerPidile c J Host

HoetNameCompansonMode

_ J Endporti

bater Back log

T T

HttpEndport

MaxBu'ferPootSze

mexEndport

Max BufferSt2 e

Tcp Endport

Dent

S3­ __

netTcpBinding: PortSharingBinding

I Ekndnęs PortShamgBndng IratTcpEkndng)

Strong W ad card

524288 b5536

Ma>Connect! om MaxRecer/edMesaageStze

65536

OpenTimeout

D001 00

r 1 'i "i

True

Stenood Endports

ReceiveTtmeout

Dagnostics

SendTimeoot Transaction? k**

i nowy element < e n d p o in t> . Skonfigurowaną właśnie usługę można uruchom ić za pomocą hosta środowiska Visual Studio. Wcześniej jednak praw dopodobnie trzeba będzie włączyć na k o m p u te rz e w spółużytkow anie portów protokołu TCP. Służy do tego w iersz poleceń. Należy uruchom ić go za pomocą opcji

Rozdział 22. Aplikacje oparte na usługach c :\u se rs\m ik e \d e slrto p \co d e \u n le ssh e d \c o n to jo \c h sp te r 22\w cf services exam ple\custom erprofilesvd{t> \»pp.con***'

U*1 t i

Art A w fn

•y

lnvo**M*tHed



W m eiate

OutputMvj

Search

• ’PodMWlKZba * &

Num berTę | ,

Dnptaył«ame

.■Tu n k M"

s frtor Hendtmę ^

Point**

Argum ent type

S

(Ułhrow

\

Throw

^

TryCatch

utputMs^

Oetau t value

łnU 2

fntr* o

Stnng

D rfo u e natur r o t tupportrd

ra m iro n

1**Ł hufcapu Właściwości i operacje procesu

Maraton • W*toParttPioi*K f i

T a ilc lin I

Ready

I

Zmienne, argum enty i zaim portowany kod

T

Przybliżenie, dopasowanie i w id o k ogólny

Rysunek 23.3. Liczne elementy okna projektowego procesów w środowisku Visual Studio

Najpierw należy zwrócić uwagę na środkową część ekranu. Jest to powierzchnia projektowa procesu. Na rysunku powstaje podstawowa czynność procesu. Istnieje zewnętrzna czynność typu Sequence, która obejmuje kroki procesu (czynności typu I f i A ssig n ). W dolnej prawej części okna projektowego znajdują się trzy narzędzia, które pozwalają przybliżyć proces, dopaso­ wać go do ekranu i wyświetlić w całości. Funkcje te są przydatne, ponieważ procesy bywają duże, dlatego czasem trzeba znaleźć i przybliżyć ich konkretne fragmenty. Programista może przeciągać czynności z okna Toolbox procesów (lewa część ekranu) na powierzchnię projektową. W arto zauważyć, że lista czynności procesu jest długa. Opisujemy je w dalszej części rozdziału.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw W dolnej prawej części rysunku 23.3 znajduje się okno Properties z właściwościami zaznaczo­ nej czynności procesu (tu jest to I f ) . To okno służy do nazywania czynności, otwierania edytora wyrażeń w celu zdefiniowania warunku, wiązania z kodem i ustawiania licznych opcji konfigura­ cyjnych dostępnych w wybranej czynności. Obszar w dolnej środkowej części ekranu służy do definiowania zmiennych, argumentów i instruk­ cji importowania. Panel Imports umożliwia określenie przestrzeni nazw używanych lub importo­ wanych przez proces. Zmienne — podobnie jak w zwykłym kodzie — służą do przechowywa­ nia danych procesu. Argumenty pozwalają przekazywać dane do procesu i poza niego. Więcej 0 tych elementach piszemy już za chwilę.

Szablony elementów procesów Do procesów można dodawać elementy w taki sam sposób, jak do innych projektów — przez klik­ nięcie pliku projektu prawym przyciskiem m yszy i wybór opcji A d d /N ew Item. Powoduje to wyświetlenie okna dialogowego A dd New Item (zobacz rysunek 23.4). W oknie można dodać do projektu jeden z czterech szablonów elementów: Activity, A ctivity Designer, Code A ctivity 1 WCF Workflow Service. fjL i

Add New Item • S«mpleWofkfłow£x«mp'e Instilled Templates i

Sort b..

I e 'a u lt

'

I Seaich lost ailed Templates

V isu a l C — Ite m s Code

A c tiv ity

Visual C * Hems

Activity Designer

V isu a l C * h e m s

Code Activity

V isu a l C * H em s

W C F W o rk flo w S e rv ic e

V isu a l C * h e m s

P

T y p e : V is u a l C * h e m s

An activity composed of other activities

Data G eneral W eb

Windows Forms V.PF R ep o rtin g



Workflow

Online Templates

N am e;

PurchaseApproval.Kdm J

Rysunek 23.4. Szablony elementów procesu umożliwiają dodawanie nowych czynności do projektów procesów

Rozdział 23. Dodawanie procesów do aplikacji Poniżej znajduje się opis wszystkich szablonów elementów widocznych na rysunku 23.4: • A c tiv ity — za pomocą szablonu Activity można utworzyć proces w oknie projekto­ wym lub edytorze X A M L-a. Szablon A ctivity tworzy zewnętrzny kontener na inne czynności opisujące proces biznesowy. •

Activity Designer — służy do określania wyglądu niestandardowych czynności na etapie projektowania. Jest to przydatne, jeśli programista chce spakować czynność i udostęp­ nić ją innym. Można opracować graficzną reprezentację czynności na powierzchni projektowej i zapewnić obsługę techniki „przeciągnij i upuść” oraz ustawiania konfi­ guracji i właściwości. Przy tworzeniu procesów do użytku wyłącznie w swojej aplika­ cji nie trzeba korzystać z tego szablonu.



Code Activity — służy do przedstawiania czynności lub całego procesu w formie kodu rozwijanego w edytorze (w języku Visual Basic lub C#). Ten szablon nie jest powią­ zany z oknem projektowym. Proces należy utworzyć jako zestaw' obiektów A c t i v i t y za pomocą kodu.



WCF W orkflow Service — służy do tworzenia procesu udostępnianego jako usługa W C F (szczegółowe omówienie technologii W C F zawdera rozdział 22., „Aplikacje oparte na usługach”). Szablon tworzy plik .xam lx i domyślnie generuje czynność Sequence zawierającą czynność R e ce iv e R e q u e st, która służy do odbierania wywo­ łań od klientów usługi. Szablon obejmuje też czynność SendRequest, która wysyła wyniki z powrotem do klienta usługi.

Dwa najczęściej stosowane szablony elementów to A ctivity i CodeActivity. Zobaczmy, jak wy­ korzystać każdy z nich do przedstawienia prostego procesu.

Podstawy tworzenia procesów Aby rozpocząć korzystanie z platformy W F, często łatwiej jest utworzyć prosty proces, aby lepiej zrozumieć podstawowe zagadnienia. W tym punkcie utworzymy projekt procesu, który przyjmuje liczbę, sprawdza, czy jest parzysta, a następnie zwraca odpowiedni komunikat. Oczywiście, kod wykonujący to zadanie można zapisać w kilku wierszach. Do wyrażania tak nieskomplikowanej operacji nie potrzebujemy procesu. Jednak prostota przykładu pomaga zilustrować tworzenie, przechowywanie i wykonywanie procesów. W dalszej części rozdziału omawiamy bardziej praktyczny przykład.

Tworzenie podstawowego procesu opartego na XAML-u W tym podpunkcie utworzymy pojedynczy projekt, który posłuży jako biblioteka, host i klient procesu. Przykładowy kod znajduje się w materiałach do pobrania na stronie poświęconej książce. 1. Otwórzmy Visual Studio i utwórzmy nowy projekt (opcja File/New/Project). 2. Teraz należy wybrać szablon Workflow Console Application i nazwać projekt Even '-O ddW fH ostAndClient. Projekt będzie biblioteką procesu. U żyjem y też aplikacji konsolowej do przechowywania procesu i komunikowania się z nim.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw 3. Zm ieńmy nazwę procesu przez zmodyfikowanie nazwy pliku i klasy. Następnie nale­ ży otworzyć w oknie projektowym plik Work.jlowl.xaml. 4. Aby zmienić nazwę klasy procesu, należy go zaznaczyć i wyświetlić jego właściwości. Zmodyfikujmy wartość właściwości Name na EvenOddWf H o stA n d C lie n t. EvenOddWf. 5. W celu zmiany nazwy należy kliknąć plik prawym przyciskiem myszy w oknie Solution

Explorer i wybrać opcję Rename. Nadajmy plikowi nazwę EvenOddW f.xaml. Na rysunku 23.5 pokazano przykładowy proces w środowisku Visual Studio. Fragmenty procesu ze zmienionymi nazwami zostały wyróżnione. o o Eve n O d d W fH o stA n d C h e n t - M ic ro s o ft V isu a l S tu d io F ile

E d it

View

P ro je ct

fcuild

D eb u g

: J * lA- J A Teraz można skompilować projekt i zmodyfikować proces bez konieczności ponownej kom ­ pilacji. W tym celu należy wykonać następujące operacje: 1. Otworzyć katalog przykładowego projektu. Wymaga to zaznaczenia projektu w oknie

Solution Explorer i wybrania opcji Project/Open Folder in W indows Explorer. 2. Przejść do katalogu bin\Debug. 3. Otworzyć plik EvenO ddW f.xaml w edytorze tekstu (na przykład w Notatniku). 4. Zmodyfikować ostatni argument InArgument w dolnej części pliku (w operacji sca­ lania wyniku). W scalanym łańcuchu powinno znaleźć się słowo „dynamicznie”. 5. Zapisać i zamknąć plik. 6. Uruchomić aplikację (plik .exe) z katalogu bin\Debug , aby zobaczyć zmodyfikowany proces działający bez ponownej kompilacji.

Wskazówka P ro c esy u m ożliw iają s to so w a n ie k o m p letn y ch te stó w jed n o stek . W y sta rczy dodać p rojek t testó w i u staw ić w n im referencje d o przestrzeni nazw procesu. N astępnie m ożna w yw ołać proces w s p o ­ sób o p isa n y w p rzyk ład ach i napisać asercje o p a r te na w ynikach. W ię cej inform acji o p isa n iu testów je d n o ste k za w iera rozd ział 9 ., „ T esto w a n ie k o d u ”.

Korzystanie z wbudowanych czynności procesów Przydatne jest traktowanie procesu jak odwzorowania etapów procesu biznesowego na zestaw czynności. Czynności mogą wywoływać wewnętrzny kod do sprawdzania poprawności zam ó­ wień, korzystać z usług sieciowych do określania cen lub kierować wywołania do zapisanego w referencji podzespołu w celu obliczenia podatków. Czynności mogą rozgałęziać się na pod­ stawie progów określonych w dolarach. Ponadto czynności można wykorzystać do równoległego zatwierdzania danych.

Rozdział 23. Dodawanie procesów do aplikacji Czynności w platformie W F to bogaty zestaw narzędzi zaprojektowanych do obsługi tych i innych operacji biznesowych. W tym punkcie opisujemy, jak działają kontrolki czynności dostępne w oknie Toolbox.

Sterowanie przepływem Czynności z panelu Control Flow umożliwiają zarządzanie wykonywaniem czynności w proce­ sie. Jeśli potraktujemy proces jak drzewo czynności, te przeznaczone do sterowania przepływem zawierają instrukcje poruszania się po drzewie. Na rysunku 23.10 pokazano przykładowe czynności do sterowania przepływem. R ysu n ek 23.10 .

Elementy z panelu Control Flow okna Toolbox służą do sterowania wykonywaniem czynności procesu; umożliwiają między innymi tworzenie sekwencji, rozgałęzień i pętli

Toolbox

»

n

X

* Control Flow ^

P o in to

f]

DoWhile For£ach

rt H 44

Parallel

**J

PirallelFofEach

&

PkkBranch

Pick

9

Sequence Switch

t]

W hile

Flowchart Messaging r Runtime Primitives

> Transaction r>Collection > Error Handling & General

Istnieją na przykład czynności Sequence, While, DoWhile i ForEach przeznaczone do zarzą­ dzania kolejnością operacji i rozgałęzianiem. Panel Control Flow obejmuje też czynności I f ,

PickBranch i Switch przeznaczone do obsługi logiki rozgałęzienia. W tabeli 23.1 wymieniono i opisano wszystkie czynności z omawianej grupy.

Uwaga C z y n n o śc i r ó w n o le g łe (Parallel i ParallelForEach) u m o ż li­ w iają z d e fin io w a n ie c z y n n o ś c i w y k o n yw an ych r ó w n o le g le . Jednak — p o d o b n ie jak w starszych w ersja ch p latform y W F — d o w yk o­ n yw ania p r o c e su słu ż y ty lk o je d e n w ątek. D la teg o z a d a n ia są uru­ ch am ian e sekw encyjnie w sp o só b cykliczny. Jeśli jedna z czynności z o sta n ie z a b lo k o w a n a w o c z e k iw a n iu na d an e w ejściow e, d o czasu z a k o ń c z e n ia p racy (o d b lo k o w a n ia ) u n ie m o ż liw i d z ia ła n ie in n ym c z y n n o ś c io m .

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

D o W h ile

W czynności D oW hile można umieszczać inne czynności. Czynności wewnętrzne najpierw S3 wykonywane jeden raz. Potem są uruchamiane wielokrotnie dopóty, dopóki warunek jest spełniony.

F o rE a c h

W ciele czynności F o rE a c h znajdują się inne czynności. Są wykonywane jeden raz dla każdego elementu kolekcji. Kolekcją może być zmienna, argument lub inne dane pobrane przez proces.

If

Warunek I f umożliwia wykonywanie innych czynności w zależności od wartości warunku (t r u e lub fa ls e ). Oczywiście, czynności I f można zagnieżdżać w taki sam sposób jak w kodzie.

Pa rai l e i

Czynność P a r a l l e l zawiera zbiory czynności, które można wykonywać równolegle (niewymagające określonej kolejności uruchamiania). Zobacz uwagę za tabelą.

ParallelForEach

Czynność ParallelForEach wykonuje wewnętrzne czynności dla każdego elementu z kolekcji. Czynności w ciele czynności Pa rallelForEach nie są wykonywane sekwencyjnie. Środowisko planuje ich równoległe i asynchroniczne wykonanie. Zobacz uwagę za tabelą.

P ic k

Czynność P ic k udostępnia oparty na zdarzeniach model sterowania przepływem procesu. Czynność P ic k zawiera grupę wyzwalaczy i powiązanych operacji. Zakończenie pracy wyzwalacza powoduje wykonanie powiązanej operacji, a działanie innych uruchomionych lub oczekujących wyzwalaczy zostaje anulowane.

Se q u e n ce

Czynność Seq u en ce służy do wykonywania zestawów czynności w określonym porządku (od góry do dołu).

S w it c h

Czynność S w itc h działa tak jak instrukcja S w itc h (S e le c t...C a s e ) w kodzie. Należy zdefiniować typ instrukcji S w itc h , ustawić sprawdzane wyrażenie, a następnie zdefiniować przypadki. W każdym przypadku można umieścić czynności wykonywane, kiedy wyrażenie ma wartość powiązaną z danym przypadkiem.

W h ile

Czynność Wh i le uruchamia zawarte w niej czynności, jeśli warunek ma wartość tru e . Wykonywanie czynności jest powtarzane, dopóki warunek nie przyjmie wartości f a ls e .

Czynności Runtime i Primitives Czynności z panelu R untim e okna Toolbox umożliwiają komunikowanie się z silnikiem uru­ chomieniowym platformy W F w celu poinformowania o konieczności utrwalenia stanu lub zakończenia pracy procesu. Czynności z grupy Primitives obsługują podstawowe zadania, takie jak przypisywanie wartości do zmiennych i wyświetlanie tekstu. Na rysunku 23.11 pokazano te elementy w oknie Toolbox. W arto zwrócić uwagę na czynność

P e r s i s t . Służy do utrwalania stanu procesu w pamięci

Fizycznej, co pozwala zwolnić pamięć roboczą. Stan można później odtworzyć. Procesy można skonfigurować, tak aby były utrwalane w razie potrzeby. Inne podejście to bezpośrednie utrwalanie za pomocą wspomnianej czynności. Procesy są utrwalane w pamięci egzemplarza

Rozdział 23. Dodawanie procesów do aplikacji Rysunek 2 3 .11. Czynności z panelu Primitives umożliwiają wykonywanie podstawowych zadań w procesie

Toolbox

♦ n X

t Control Flow . h Flow chart M essaging a Runtim e ^

Pointer

■*)

Persist

Q

TerminateWortcflow

a Primitives 1^

Pointer

/VG

A ssign

tfjp

InvokeM ethod

X i

W riteLine

Delay

> Transaction

V C ollection t> Error H andling General

procesu za pomocą klasy WorkfIowApplication lub WorkflowServiceHost. Platforma .N ET udostępnia klasę SqlWorkfIowInstanceStore służącą do utrwalania procesów na serwerze SQL. Oczywiście, trzeba włączyć utrwalanie w procesie i hoście procesu (szczegółowe omó­ wienie tego tematu zawiera artykuł How to: Enable Persistance fo r Workflows and Workflow

Services w witrynie MSDN). W tabeli 23.2 wymieniono oraz opisano wszystkie czynności z obszarów R untim e i Primitives okna Toolbox. Tabela 23.2.

C z y n n o ś c i z g r u p R u n t im e i P r i m i t i v e s

Czynność

Opis

Persist

Określa, że silnik uruchomieniowy procesu powinien utrwalić stan procesu po dojściu do tej czynności. Utrwalenie procesu powoduje zwolnienie go z pamięci roboczej i umożliwia odtworzenie go przy ponownym wczytywaniu. Proces jest utrwalany w pamięci egzemplarza, na przykład w bazie SQL Server.

TerminateWorkflow

Czynność T e rm inateW o r k f Io w informuje środowisko uruchomieniowe procesu, że po dojściu do niej proces należy zakończyć.

Assign

Służy do przypisywania wartości do zmiennych procesu.

D e la y

Określa obiekt Tim eSpan, który wstrzymuje proces. Czynności D e la y można użyć do wstrzymania pracy w pętli. Po określonym czasie można sprawdzić, czy operacja, na którą proces oczekuje, zakończyła się.

InvokeMethod

Służy do wykonania metody określonego obiektu. Aby wskazać obiekt i metodę, należy ustawić właściwości Ta rgetO b j e c t i MethodName.

WriteLine

Służy do dodania wiersza tekstu w określonym obiekcie T e x t W r it e r .

1

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Czynności Error Handling Czynności

z panelu Error H andling umożliwiają zaprojektowanie bloku T ry ...C a tc h do obsługi

błędów procesu używanego w kodzie. Na rysunku 23.12 pokazano czynności z tej grupy w oknie

Toolbox. Tabela 23.3 zawiera opis czynności przedstawionych na rysunku 23.12. Rysunek 23.12. Czynności z panelu Error Handling umożliwiają zaimplementowanie w procesie obsługi błędów za pomocą bloków T ry.. .Catch

Toolbo*

~ G X

9 Control Flow Flo.vc hart Messaging > Runtime D Primitives ^ Transaction C Collection

d Error Handling 1^

Pointer Rethrow

* ^

Throw

^

TryCatch

b General

Tabela 23.3.

C z y n n o ś c i z g ru p y E r r o r H a n d lin g

Czynność

Opis

R e th ro w

Czynność R e t h row umożliwia ponowne zgłoszenie przechwyconego wyjątku po zakończeniu jego obsługi (na przykład w celu zarejestrowania błędu).

Throw

Czynność Th row pozwala zgłosić wyjątek w procesie. Aby określić typ zgłaszanego wyjątku, należy ustawić właściwość E x c e p tio n .

T ry C a tch

Czyn n ośćTryCatch dodaje do procesu trzy obszary: T r y , C a tch i F i n a l l y . W sekcji T r y należy umieścić czynności, z których błędy mają być obsługiwane. Blok C a tc h służy do przechwytywania (i obsługi) błędów określonych typów.

Czynności Collection Na panelu

C o l l e c t i o n znajdują się podstawowe czynności potrzebne do dodawania i usuwa­

nia elementów w kolekcjach oraz opróżniania kolekcji. Można też sprawdzić, czy kolekcja zawiera określony element. Kolekcją jest na przykład zmienna typu

L i s t . M ożna przekazać do

procesu kolekcję wartości lub pobrać kolekcję, wywołując określony kod. Następnie można dodać czynność sterowania przepływem w pętli, na przykład

F o r E a c h , aby przejść po kolekcji,

sprawdzić jej zawartość i zdecydować o usunięciu lub dodaniu elementów. Na rysunku 23.13 pokazano czynności z panelu Collection w oknie Toolbox.

Rozdział 23. Dodawanie procesów do aplikacji Ry.sunck 23.13. Czynności z grupy Collection umożliwiają korzystanie w procesie z kolekcji danych (obiektów ICollection)

w □ x

Toolbox ó Control Flow Flowchart

>Messaging > Runtime > Primitives t» Transaction a Collection 1^

Pointer

(ft

AddToCollection

^

ClearCollection ExistsInCollection* T> RemoveFromCollection

t>Error Handling {>General

Czynność ExistsInCollection umożliwia zwrócenie wartości logicznej określającej, czy w ko­ lekcji znajduje się dana wartość. Aby zdefiniować czynność tego rodzaju, należy ustawić właściwość

Type (czynność jest ogólna), referencję do sprawdzanej kolekcji i właściwość Item określającą szukany element. Czynności ExistsInCollection m ożna użyć jako wartości właściwości Condition w czynności If. Tabela 23.4 zawiera pełną listę czynności z grupy Collection wraz z opisem ich stosowania. Tabela 23.4.

C z y n n o ś c i z g r u p y C o lle c t io n

Czynność

| Opis

AddToCollection

Umożliwia dodawanie elementów do kolekcji przez ustawienie właściwości Collection i Item.

ClearCollection

Służy do usuwania wszystkich elementów z kolekcji. Aby wskazać opróżnianą kolekcję, należy ustawić właściwość C le a r.

ExistsInCollection

Umożliwia określenie, czy dany element istnieje w kolekcji przypisanej do czynności. Wynik to wartość logiczna, którą można wykorzystać w warunku.

RemoveF romCollection

Umożliwia usunięcie określonego elementu z kolekcji przypisanej do czynności.

Obsługa transakcji Czynności z panelu Transaction okna Toolbox umożliwiają grupowanie czynności wykonywanych jako transakcje. Do czynności sekwencyjnych w ykonyw anych bez opóźnień można zasto­ sować czynność TransactionScope, która działa podobnie jak klasy z przestrzeni nazw System.

'-►Transaction. Do długich transakcji trzeba zastosować czynność CompensableActivity (więcej na ten temat już za chw ilę). Na rysunku 23.14 pokazano wszystkie czynności z grupy

Transaction w oknie Toolbox.

1

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Rysunek 23.14. Czynności z grupy Transaction służą do określania sposobu przetwarzania transakcji w procesie

Toolbox

v □ X

• Control Flow Flowchart

5Messaging > Runtime t> Primitives a Transaction 1^

Pointer CancellationScope CompensableActivity

[5

Compensate

^

Confirm TransactionScope

t>Collection

5Error Handling :* General

C zynność C o m p en sab leA ctivity umożliwia obsługę długich transakcji. Możliwe, że program zatw ierdził fragmenty transakcji w pamięci na dane, a następnie w strzym ał część procesu. Jeśli za kilka dni lub tygodni wystąpi błąd lub użytkow nik anuluje żądanie, trzeba będzie wycofać wcześniejsze operacje. Czynność Com pensableActivity umożliwia realizację takiego scenariusza w procesie. Czynności długiego procesu należy umieścić w ciele czynności Compensable '-► A ctivity. N astępnie należy dodać czynności do m etody CompensationHandler, aby okre­ ślić, co pow inno się zdarzyć, kiedy proces będzie wymagał kompensacji. Przykładową czyn­ ność tego typu pokazano na rysunku 23.15. Rysunek 23.15. Czynność CompensableActivity umożliwia definiowanie transakcji w długich procesach

Czynności reprezentujące długą transakcję, która może wymagać kompensacji, należy dodać do sekcji Body

CompensationHandler

Drop activity here

Tu należy dodać czynności kompensacyjne, które określają, jak cofnąć czynności z sekcji Body, jeśli przed ich zatwierdzeniem wystąpi błąd lub nadejdzie polecenie anulowania

ConfirmationHandler

Drop activity here

Opcjonalnie można zdefiniować czynności uruchamiane po udanym wykonaniu czynności z sekcji Body

CancellaticnHandler

Drop activity here

Tu należy umieścić czynności wykonywane, jeśli długi proces otrzyma polecenie anulowania

Rozdział 23. Dodawanie procesów do aplikacji W tabeli 23.5 opisano wszystkie czynności z grupy Transaction. Służą one do definiowania transakcji i zarządzania nimi w procesach. Tabela 23.5. Czynności w transakcjach

Czynność

Opis

C a n c e lla t io n S c o p e

Umożliwia zdefiniowanie zestawu czynnośd (procesu), który można anulować. W ciele można określić zakres anulowanych czynności. Następnie trzeba zapisać w metodzie C a n c e lla t io n H a n d le r czynności związane z anulowaniem operacji z danego zakresu.

C o m p e n s a b le A c t iv it y

Służy do definiowania czynności, które należy wykonać, kiedy wykonywanie długiej transakcji zakończy się niepowodzeniem. Czynność C o m p e n s a b le A c t iv it y można dodać do bloku C a t ch w procesie, aby wycofać operacje po wystąpieniu błędu.

Com pensate

Służy do bezpośredniego określania na podstawie kodu, że proces powinien przeprowadzić kompensację (wywołać metodę C o m p en sateH an d ler).

C o n firm

Służy do informowania, że proces zakończył działanie, dlatego można go zatwierdzić, wywołując metodę C o n firm a t io n H a n d le r.

T r a n s a c t io n S c o p e

Umożliwia zdefiniowanie zestawu czynności, które należy wykonywać razem w ramach transakcji. Podobnie działają transakcje z przestrzeni nazw S y ste m . T r a n s a c t io n .

Zarządzanie komunikatami Platforma W F udostępnia zestaw czynności związanych z komunikatami, umożliwiających udo­ stępnianie procesu jako usługi WCF, a także poprzez wywołania do innych usług. Istnieje wiele czynności opartych na komunikatach. Każda z nich ma umożliwiać konfigurowanie różnych wzor­ ców wymiany komunikatów, w tym wzorca żądanie - odpowiedź. Czynności obsługują też korelo­ wanie, co pozwala zagwarantować, że odpowiedni egzemplarz procesu otrzyma właściwy kom uni­ kat. Na rysunku 23.16 pokazano czynności z grupy Messaging w oknie Toolbox. Rysunek 23.16. Czynności z grupy Messaging służą do definiowania mechanizmów związanych z wysyłaniem i odbieraniem komunikatów w procesie

Toolbox

• □ X

Control Flow > Flowchart a Messaging 1^

Pointer Cor relationSc ope ImtialireCorreiation

Hi

Receive

**►

RecetveAndSendRepfy Send SendAndRecerveReply

SC

TransactedRec erveSc ope

t>Runtime >

Primitives

> Transaction > Collection > Error Handling General

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Najlepszy sposób na zro zu m ien ie czynności związanych z komunikatami polega na utworze­ niu procesu opartego na kom unikatach, co wkrótce zrobimy. Najpierw jednak warto poświęcić chw ilę na zapoznanie się z czynnościam i tego rodzaju opisanymi w tabeli 23.6. Tabela 23.6. Czynności związane z kom unikatam i

Czynność ...................■ Co r r e la t io n S c o p e

In it ia liz e C o r r e la t io n

R e c e iv e

R e c e iv e A n d S e n d R e p ly

Tworzy czynność Seq u en ce zawierającą czynności R e c e iv e i S e n d R e p ly . Zapewnia obsługę standardowego wzorca odbierania komunikatów i wysyłania odpowiedzi po otrzymaniu wiadomości. Właściwość Req u est czynnośa SendReply należy ustawić na nazwę czynności R e c e iv e , której dotyczy odpowiedź.

Send

Służy do wysyłania komunikatów z procesu. Właściwość E n d p o in t informuje jednostkę docelową o wiązaniu (TCP, HTTP itd.) i adresie. Wysyłać można: komunikaty o ściśle określonym typie, komunikaty o typie Xm lSe r i a l i z a b l e lub komunikaty bez określonego typu.

S e n d A n d R e ce iv e R e p ly

Tworzy czynność Seq u en ce zawierającą czynność Se n d , po której następuje czynność R e ce iv e R e p ly. Zapewnia to obsługę wysyłania komunikatów i oczekiwania na skorelowaną odpowiedź.

T r a n s a c te d R e c e iv e S c o p e

Umożliwia przekazywanie transakcji do procesu w ramach odbierania komunikatu. Zwykle do części R e q u e st czynności T r a n s a c te d R e c e iv e S c o p e dodawana jest czynność R e c e iv e . Następnie można wykonać inne czynności w ciele, a także użyć czynności Send do wysłania odpowiedzi.

Tworzenie procesu opartego na komunikatach W cześniej opisaliśmy proces EvenOdd. Tu utworzymy jego wersję, w której kom unikaty posłużą do udostępnienia procesu jako usługi WCF. Poniżej wym ieniono kroki potrzebne do utw orze­ nia procesu (kod można pobrać ze strony poświęconej książce):

Rozdział 23. Dodawanie procesów do aplikacji 1. Zacznijmy od utworzenia nowego projektu procesu typu WCF Workflow Service Applica­ tion (opcja File/New/Project). Nazwijmy projekt EvenOddMessagingLib. 2. Należy zmienić nazwę usługi procesu na EvenO ddServi.ce w nazwie pliku i w oknie dialogowym Properties procesu (tu należy zm ienić nazwę klasy). 3. U suńm y czynność S e q u e n tia l S e rv ic e zdefiniow aną domyślnie w procesie. 4. T eraz należy otworzyć panel Messaging w oknie Toolbox i dodać do okna projekto­ w ego czynność R eceiveA ndS endR eply. 5. K liknijm y zakładkę Variable w dolnej części okna projektowego. Należy zdefiniować zm ienną na liczbę przesyłaną d o usługi w celu spraw dzenia, czy jest parzysta. N a­ zwijmy zmienną numToCheck i wybierzmy typ In t3 2 . Trzeba też dodać drugą zmienną, w której znajdzie się odpow iedź wysyłana w kom unikacie zwrotnym. Pow inna to być zm ienna r e s u l t typu s t r i n g .

U iO td x ) M A > ^

Proces powinien wyglądać teraz tak jak na rysunku 23.17.

6. Następnie należy skonfigurować czynność R eceiv e. Po pierwsze, ustawmy właściwość D isplayN am ena P o b ie rz l i c z b ę do s p ra w d z e n ia . Po drugie, należy ustawić właściwość O p eratio n N am e na IsEvenOrOdd. Właściwość O perationN am e określa nazwę m etody usługi.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Po trzecie, w oknie Properties trzeba ustawić zm ienną C a n C re a te ln sta n ce na True, zaznaczając pole w yboru. Teraz kliknijmy napis Define... (lub View message...) w polu Content czynności Receive. Spowoduje to wyświetlenie okna Content Definition, w którym można zdefiniować ko­ munikat i określić param etry. U tw órzm y now y param etr o nazwie NumberToCheck typu In t32 . Param etr będzie przekazywany do używanej w procesie m etody usługi, IsEvenOdd. Za pom ocą kolum ny Assign To m ożna przypisać p a ra m etr do zmiennej numToCheck. Przykładow e ustawienia pokazano na rysunku 23.18. Rysunek 23.18. Zmienną numToCheck należy odwzorować na parametr NumberToCheck komunikatu z czynności Receive

7. T eraz należy w ykonać podobne operacje dla czynności SendReply. Kliknijmy pole Content czynności i zdefiniujm y nowy p aram etr OutputMsg typu s t r in g . Parametr posłuży na dane wyjściowe procesu i należy go odwzorować na zm ien n ą r e s u lt , co pokazano na rysunku 23.19. 8. Następnie dodajm y czynność I f między czynnościam i R eceive i SendReply. Należy skonfigurować tę czynność w opisany wcześniej sposób, definiując warunek, który spraw­ dza, czy liczba jest podzielna przez dwa, a następnie przypisuje odpow iedni wynik. Na rysunku 23.20 pokazano ostateczny wygląd procesu w oknie projektow ym . 9. Kolejny krok polega na napisaniu klienta W CF do przekazywania odpowiedniego komunikatu i odbierania wyniku (szczegółowe informacje zawiera rozdział 22.). Przypo­ mnijmy, że technologia W CF potrafi generow ać domyślne usługi, a także autom a­ tycznie umieszcza je w wńtrynach ASP.NET. Dlatego aby przetestow ać usługę, m oż­ na kliknąć plik EvenOddService.xamlx w ok n ie Solution Explorer i wybrać opcję Set as Start Page.

Rozdział 23. Dodawanie procesów do aplikacji

^093

C zę ść V Tworzenie aplikacji dla przedsiębiorstw W obszarze Request należy podać wartość param etru NumberToCheck, a następnie kliknąć przycisk Invoke. Zwróćmy uwagę na w yniki w polu Response. Przykładowe dane przedstaw iono na ry­ sunku 23.21.

Tworzenie procesów typu Flowchart Czynności z grupy Flowchart umożliwiają tworzenie procesów za pomocą znanego modelu schem atów blokowych. Przetw arzanie rozpoczyna się od góry i przechodzi w dół. Po drodze podejm ow ane są różne decyzje, a proces się rozgałęzia. Proces może działać w pętli, jednak ostatecznie się kończy. Procesy typu Flowchart składają się z wielu pól i strzałek, dlatego b ar­ dzo przypom inają diagram y rysow ane na tablicy w celu opisania procesu biznesowego. Na rysunku 23.22 pokazano przykładow e czynności z grupy Flowchart w oknie Toolbox. Rysunek 23.22. Czynności z grupy Flowchart służą do tworzenia procesów opartych na znanym modelu schematów blokowych

Toclboi

- □ X

^ Control Flow * Flowchart ^

Pointer

I

Flowchart

^

FlowDectsion

♦)»

FlowSwitch

M essaging y Runtime v1 Primitives P

Transaction

Is Collection P

Error Handling

& General

Rozdział 23. Dodawanie procesów do aplikacji

^095

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Tworzenie aplikacji do zarządzania procesem O m ów iliśm y już wszystkie w budow ane czynności procesów. Pokazaliśmy też liczne proste przykłady. Pora wykorzystać te inform acje w większym przykładzie, gdzie dokładniej opisze­ my przechowywanie, kom unikaty, utrwalanie i korelowanie w procesach. Zaczynajm y.

Wskazówka Przykładowa aplikacja jest duża. W dalszych punktach om aw iam y jej najw ażn iejsze punkty. Jeśli śledzenie p rz y k ła d u o k aże się trudne, m ożna otworzyć rozw iązanie dostępne w m ateriałach z w i­ tryny poświęconej książce. Aby popraw nie sk o n fig u ro w ać p ro je k t, należy zapoznać się z plikiem ReadMe.

Scenariusz — zgłoszenia dotyczące podróży W yobraźm y sobie, że program ista pracuje dla firm y C ontoso i musi zautom atyzow ać oraz śledzić proces obsługi zgłoszeń związanych z podróżam i biznesowymi. Poniżej w ymieniono kroki procesu. 1. Użytkownik inicjuje zgłoszenie przez wypełnienie formularza, który może znajdować się w witrynie, opierać się na form ularzu InfoPath, być dostępny w aplikacji klienckiej, przez telefon komórkowy lub w aplikacji z innym interfejsem. Form ularz jest powiązany z biuram i podróży i wewnętrznym kodem , który oblicza łączny koszt wyjazdu obejmujący opłaty za przelot, wypożyczenie sam ochodu, diety, bi­ lety parkingowe i benzynę. Biuro udostępnia identyfikator rezerw acji do śledzenia zgłoszeń przed zamówieniem biletów. Użytkownicy muszą też podać uzasadnienie podróży. 2. Reguły zatwierdzania oparte są na progu. Jeśli koszty nie przekraczają 1000 złotych, a pracownik jest przynajm niej menedżerem , zgłoszenie jest automatycznie zatwierdza­ ne i proces przechodzi do kroku 5. 3. Jeśli jednak limit 1000 złotych został przekroczony lub dana osoba nie jest menedżerem, wyjazd musi zostać zaakceptowanych przez wyższego stopniem pracownika. W takiej sytuacji powiadomienie o zgłoszeniu trafia d o bezpośredniego przełożonego, który może sprawdzić kolejkę zgłoszeń w witrynie (oprócz tw orzenia rejestru m ożna też przesłać e-mail do menedżera). 4. M enedżer może wtedy zalogować się do system u, przejrzeć dane na tem at podróży i zaakceptować ją lub odrzucić. Uwaga — w tym przykładzie p o m ijam y kod zabez­ pieczeń i do zarządzania użytkownikami. W blogu poświęconym książce można znaleźć aktualizacje przykładowego rozwiązania.

Rozdział 23. Dodawanie procesów do aplikacji 5. Po zatwierdzeniu system dokonuje rezerwacji przy użyciu identyfikatora udostępnionego przez biuro podróży. Do obsługi rezerwacji służy usługa sieciowa. N astępnie zgłosze­ nie jest oznaczane jako zatw ierdzone i zamknięte. O drzucone zdarzenia są oznaczane jedynie jako zamknięte.

Szablony projektów aplikacji Pierwszy krok w scenariuszu wymaga przemyślenia procesu i ustalenia jego ogólnej struktury. M ożna użyć do tego prostego diagram u. Na rysunku 23.24 pokazano podstaw ow ą strukturę kom unikatów , niektóre decyzje podejm ow ane w procesie i projekty służące do zbudowania rozwiązania Witryna do zarządzania podróżami

Wysyłanie

zgłoszenia

Proces zgłaszania podróży

Odbieranie zgłoszenia

Requires approval? Nowe zgłoszenie podróży

Powiadamianie menedżera

Wysyłanie

zatwierdzenia

Wymaga zatwierdzenia?

Wyświetlanie zgłoszeń oraz opcji zatwierdzania i odrzucania

Usługa rejestracji w biurze podróży

f ZatwierdzonoN lub czy zatwierdzenie nie kiest konieczne?/ O * - Zarezerwuj podróż —

Powiadamianie zgłoszeniodawcy

Biblioteka do obsługi danych na temat podróży

Baza danych ze zgłoszeniami podróży

Rysunek 23.24. Proces zgłaszania podróży ma wiele powiązanych części, dlatego diagram jest niezbędny

W arto zauważyć, że zgodnie z rysunkiem 23.24 w gotow ym rozwiązaniu pow inny znaleźć się cztery odrębne projekty. W ostatecznej wersji jest ich pięć (dochodzi niestandardow a biblioteka czynności). Poniżej w ymieniono wszystkie projekty, ich typy i nazwy.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Tworzenie projektów Zacznijmy od pustego rozwiązania ( File/New/Project/Other Project Types/Visual Studio Solutions/Blank Solution) i nazwijmy je Travel ReąuestSolution. Teraz należy dodać projekty wy­ m ienione w tabeli 23.8, zachowując nazw)'. O kno Solution Explorer pow inno wyglądać podob­ nie jak okno z rysunku 23.25, gdzie widoczny jest dodatkow y projekt testowy. Tabela 23.8.

P r o je k ty r o z w ią z a n ia

Projekt

Szablon

T r a v e lD a t a L ib

W in d o w s\(la ss Library

I ©pis Biblioteka do obsługi danych na temat podróży. Biblioteka klas służy do komunikowania się z bazą danych ze zgłoszeniami podróży w celu zapisywania zgłoszeń i ich stanu.

T ravelM anagerW eb

W eb \W eb site

Witryna do zarządzania podróżami. Interfejs użytkownika aplikacji. Obejmuje stronę główną {D efault.aspx), stronę do zgłaszania podróży (,N ew Request.aspx ) i stronę do wyświetlania oczekujących zgłoszeń oraz operacji (PendingRequests.aspx ).

T r a v e lR e q u e s t ^ S e r v ic e

W orkflow \W CF Workflow Service Application

U se rLo o k u p ^ ♦ A c t iv it y L ib

W orkflow \A ctivity Library

V e n d o r R e s e rv a tio n '-► S e r v ic e

W (F\W C F Service Application

Rysunek 23.25. Szablony projektów w oknie Solution Explorer

Proces do zgłaszania podróży. Proces z definicją procedury zgłaszania podróży. Jest dostępny jako usługa WCF. Brak na rysunku. Niestandardowa czynność procesu wyszukująca informacje o użytkowniku (na przykład o jego menedżerze). Czynność ta jest używana przez główny proces zgłaszania podróży. Usługa rezerwowania biletów w biurze podróży. Symuluje działanie systemu biura podróży służącego do obsługi rezerwacji.

Rozdział 23. Dodawanie procesów do aplikacji

Tworzenie bazy danych i biblioteki dostępu do danych W rozw iązaniu trzeba zapisać szczegóły zgłoszenia. M ożna zaimplementować system oparty na e-m ailach, który wysyła inform acje w w iadom ościach i umożliwia zatw ierdzanie zgłoszeń w kliencie pocztowym. Tu jednak utworzymy prostą tabelę do zapisywania zgłoszeń podróży w kolejce w celu ich zatwierdzenia i śledzenia (niezależnie od usługi śledzącej w procesie).

Poniżej opisano szczegółowo wszystkie kolum ny tabeli Request: • K olum na id — jest to klucz główny zgłoszeń z procesu zapisywany jako identyfikator GUID. Identyfikator zgłoszenia służy do korelow ania kom unikatów w procesie (łą­ czenia komunikatów z odpow iednim egzem plarzem procesu). • Kolumna w o rk f lo w ln s t a n c e ld — zawiera identyfikator G U ID procesu. Zapisujemy go, aby w razie potrzeby był dostępny, jednak w przykładzie nie korzystamy z niego.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw •

K olum na r e q u e s t e r lD — zawiera nazwę użytkownika osoby zgłaszającej podróż.

• K olum na v e n d o r R e s e r v a t io n ld — zawiera identyfikator G U I!) udostępniany przez fikcyjny system biura podróży w celu umożliwienia rezerwacji biletów po za­ tw ierdzeniu wyjazdu. •

K olum na c r e a t io n D a t e — zawiera datę przesłania zgłoszenia.

• K olum na t r a v e l E s t im a t e — zawiera szacunkowy koszt wyjazdu przesłany z fikcyj­ nego systemu biura podróży. • Kolumna name — zawiera nazwę lub tytuł zgłoszenia, na przykład Podróż służbowa do Warszawy. • K olum na j u s t i f i c a t io n — zawiera powód zgłoszenia podróży przez użytkownika. • K olum na is A p p r o v e d — flaga informująca, czy podróż została zatw ierdzona. W arto zauważyć, że jeśli kolumna is A p p ro v e d zawiera wartość f a ls e , a kolumna is C o m p le te — wartość t ru e, proces został odrzucony i nie oczekuje już na zatwierdzenie. •

K olum na a p p r o v a lM a n a g e r ld — zawiera nazwę użytkownika m enedżera odpow ie­ dzialnego za zatwierdzanie. Nazwa jest bardziej przydatna w późniejszych wersjach (po dołączeniu systemu logowania do witryny).

• K olum na is C o m p le t e — flaga inform ująca, czy proces zakończył działanie (nie oczekuje już na zatwierdzenie). Po zakończeniu działania proces jest ostatecznie za­ m ykany.

Tworzenie biblioteki dostępu do danych Biblioteka dostępu do danych jest używana przez proces zgłaszania podróży do kolejkowania próśb o zatwierdzenie i oznaczania zgłoszeń jako zaakceptowanych lub odrzuconych. Ponieważ biblioteka jest używana w procesie, korzysta z łańcuchów połączeń zdefiniowanych w używających jej aplikacjach. Poniżej opisano tw orzenie klas w projekcie T r a v e lD a t a L ib . 1. U suńm y plik Classl.es i dodajm y do rozwiązania nowy plik — TravelRequestMsg.cs. 2. D odajm y referencję do przestrzeni nazw S y s t e m .R u n t i m e . S e r i a l i z a t i o n . U m oż­ liwi to zdefiniowanie klasy z atrybutem D a ta C o n t r a c t . Należy też dodać referencję do przestrzeni nazw S y s t e m .C o n f ig u r a t io n , co po­ zwoli pobierać inform acje o łańcuchach połączeń z pliku konfiguracyjnego aplikacji urucham iającej om aw iany kod. 3. Teraz otwórzmy klasę T r a v e lR e q u e s t M s g . Należy dodać instrukcję u s in g dotyczącą przestrzeni nazw S y s t e m . R u n tim e . S e r i a l i z a t i o n . 4. U tw órzm y klasę kontraktu (czyli klasę z atrybutem

D a ta C o n t r a c t ) . O biekt tej klasy

posłuży do przekazywania zgłoszeń podróży do procesu. Kontrakt pow inien odzwier­ ciedlać strukturę utworzonej wcześniej bazy danych. Przykładowy kod pokazano na li­ stingu 23.5.

Rozdział 23. Dodawanie procesów do aplikacji Listing 23.5. Przekazywana do procesu klasa TravelRequestMsg z atrybutem DataContract

u sin g u sin g u sin g u sin g u sin g

System; System .C o lle ctio n s.G e n e ric ; System .Linq; System .Text; Syste m .R u n tim e .Se ria liza tio n ;

namespace TravelD ataLib { //

Definiuje zgłoszenie podróży.

[DataContract] p u b lic c la s s TravelRequestMsg { [DataMember] p u b lic strin g Id { get; se t; } [DataMember] p u b lic strin g W orkflow lnstanceld { get; se t; } [DataMember] p u b lic s trin g VendorReservationld { get; s e t; } [DataMember] p u b lic strin g Requesterld { get; se t; } [DataMember] p u b lic DateTime CreationDate { get; se t; } [DataMember] p u b lic double T rave lEstim ate { get; se t; > [DataMember] p u b lic s trin g Name { g e t; se t; } [DataMember] p u b lic s trin g J u s t if ic a t io n { get; se t; } [DataMember] p u b lic bool IsApproved { g e t; se t; } [DataMember] p u b lic strin g ApprovalManagerld { g e t; s e t; } } }

5. W klasie T r a v e lR e q u e s t D a t a A c c e s s należy zdefiniow ać dwie m etody do przetwa­ rzania tabeli R e q u e s t. Pierwsza, S a v e , dodaje rek o rd do tabeli R e q u e s t i jest wywo­ ływana w procesie w celu zapisania zgłoszenia, które ma zostać ocenione i zamknięte

C zę ść V Tworzenie aplikacji dla przedsiębiorstw D ruga, C o m p le te , służy do oznaczania procesu jako zakończonego (i zatw ierdzonego lub odrzuconego). Obie m etody przyjmują egzemplarz klasy T r a v e lR e q u e s t M s g n a­ pisanej w poprzednim kroku. Na listingu 23.6 pokazano kod metod. Listing 23.6. Metody Save i Complete używane do pracy z danymi zgłoszenia

using using using using using using using using

System; System; System.C o lle ctio n s.G e n e ric ; System.Linq; System .Text; System .Configuration; System.Data; System.Data.S q lC lie n t ;

namespace TravelD ataLib { p u b lic cla ss TravelRequestDataAccess { //

Dodawanie zgłoszenia podróży do kolejki (zapisywanie w bazie danych).

p u b lic s t a t ic void Save(TravelRequestMsg request) { s t r in g con nectionstrin g = ConfigurationM anager.ConnectionStrings[ "TravelRequest"] .C o n n e ctio n strin g ; S trin g B u ild e r sq l = new S trin g B u ild e r ( " in s e rt into request ( id , " ); sql.Append("w orkflow InstanceId, req u e sterld , "); sql.Append!"vendorReservationld, cre a tio n D a te , tra ve lE stim a te , name, " ); s q l.A p p e n d (" ju s tific a tio n , isApproved, approvalManagerld) " ); sql.Appendf"values ((aid, (aworkflowlnstanceld, ^ re q u e ste rld , " ); s q l. Append!"@vendorReservationId, @creationDate, (atravelEstim ate, " ) ; s q l .Append!"@name, ^ ju s t if ic a t io n , @isApproved, @approvalManagerId) " ); using (SqlConnection connection = new Sq lCo n n ectio n (co nn ectio nStrin g)) { connection.Open(); SqlCommand command = connection.CreateCommand!) ; command.CommandType = CommandType.Text; command.CommandText = s q l.T o S t rin g ( ) ; command.Parameters.Add(new SqlParam eter("@ id", request. I d ) ) ; command. Param eters.Add(new SqlParam eter( "(aworkflowlnstanceld", request.W orkflow lnstanceld)) ; command. Param eters.Add(new SqlParam eter( " } Biblioteka dostępu do danych jest już gotowa. W arto zw rócić uwagę na zastosowanie łańcucha połączenia T rav e lR eq u e st. Jest on ustawiany w plikach konfiguracyjnych korzystających z bi­ blioteki.

Wskazówka W dodatkow ym kroku m ożna d o d a ć do rozw iązania p ro je k t te­ stowy i utw orzyć testy jed n o stek pow iązane z o p isan y m i m eto ­ dam i. W aplikacjach tego ro d z a ju tru d n o śc i m oże spraw iać na przykład zn alezien ie lite ró w k i w k o d z ie w SQL-u. Aby sk o n fig u ­ rować łańcuch połączenia z b azą d a n y ch w klasie testow ej, trzeba utw orzyć p lik app.config.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Tworzenie usługi do obsługi rezerwacji w biurze podróży O pisana usługa do obsługi rezerwacji w biurze podróży to symulowana niezależna usługa wywoływana w procesie. Usługa ma uzupełniać przykład, a także ilustrować przydatną funkcję okna projektow ego procesów (więcej na ten tem at w punkcie „Projektowanie procesu”). Po­ nieważ działanie usługi jest sym ulow ane, nie d o d am y do niej wiele kodu. Należy wykonać poniższe operacje, aby zdefiniow ać prostą makietę obiektu: 1. Zacznijmy od projektu W CF V end o rR eservatio nServi.ee. N ajpierw należy zm ie­ nić w oknie Solution Explorer nazwę usługi na TravelBooking.svc. Trzeba otworzyć plik klasy i zmodyfikować także nazwę samej klasy. W arto zastosować inteligentny znacznik i uruchom ić refaktoryzację Rename. W przeciwnym razie trzeba otworzyć plik ze znacznikami (wymaga to kliknięcia pliku TravelBooking.svc prawym przyciskiem myszy i wybrania opcji View Markup ), a następnie zmienić w nich nazw ę usługi. 2. Teraz zmieńmy nazwę interfejsu usługi z I S e r v i c e l .c s na IT ra v e lB o o k in g . Nale­ ży to zrobić w nazwie pliku i w kodzie. Z m iana nazwy w oknie Solution Explorer p o ­ zwala wprowadzić modyfikacje w obu miejscach. Należy jednak otw orzyć plik inter­ fejsu i uważnie spraw dzić kod. 3. W klasie IT ra v e lB o o k in g .c s należy usunąć klasę CompositeType. Następnie moż­ na usunąć kod z definicji interfejsu. Teraz dodajm y definicję m eto d y BookTravel przyjmującej łańcuch znaków re se rv a tio n ld . Interfejs powinien wyglądać tak: [ServiceCon tract] p u b lic in te rfa c e ITravelBooking { [OperationCont r a c t 1 void B o o kT rave l(strin g re se rv a tio n ld ); > 4. N astępnie otwórzm y klasę usługi przez dw u k ro tn e kliknięcie pliku TravelBooking.svc. Należy podać nową nazwę interfejsu w definicji klasy — p u b lic c la s s T ravelBooking : IT ra v e lB o o k in g . 5. U suńm y kod z klasy T ra v e lB o o k in g .s v c (m etody GetData i G etD atallsingD ata '-►Contract). 6. Teraz należy zaim plem entow ać kod interfejsu IT ra v e lB o o k in g w klasie T ra v e l '-►Booking. Kod nie w ykonuje żadnych operacji. Przypomnijmy, że m a tylko sym u­ lować pracę usługi i pełni funkcję dem onstracyjną. Na listingu 23.7 przedstaw iono przykładową im plem entację. Listing 23.7. Metoda BookTravel ma symulować pracę usługi

using using using using using using

System; System.C o lle ctio n s.G e n e ric ; System .Linq; System.Runtime. S e r ia liz a t io n ; System.ServiceModel; System .Text;

Rozdział 23. Dodawanie procesów do aplikacji namespace VendorReservationService { p u b lic c la s s TravelBooking : ITravelBooking { p u b lic void B o o kT ra ve l(strin g re se rv a tio n ld ) { / / Do zrobieniu: napisać kod do zakupu biletów na podstawie rezerwacji.

s t r in g rsvld = re se rv a tio n ld ; } } }

Tworzenie niestandardowej biblioteki czynności W tym kroku utworzymy dwie niestandardowe czynności: d o wyszukiwania użytkownika w celu ustalenia jego przełożonego i do spraw d zan ia, czy użytkow nik jest m enedżerem . Nie trzeba fizycznie zapisywać logiki usług. W system ie produkcyjnym czynności praw dopodobnie będą kierować wywołania do usług Active Directory lub system u kadrowego. Czynności można udostępnić w form ie usług. Jednak w przykładzie czynności posłużą do pokazania, jak tworzyć niestandardow e czynności w odrębnym projekcie, a następnie korzystać z nich w procesach.

Tworzenie niestandardowej czynności złożonej IsManager Pierwsza czynność sprawdza, czy użytkow nik jest m enedżerem . Poniżej opisano tw orzenie tej czynności. 1. Zacznijmy od projektu U se rLo o k u p A ctivity Lib (jest to projekt typu Activity Library). N ajpierw należy zmienić nazw ę pliku Activity l.xam l na IsManagerActivity.xaml. Trzeba też otworzyć i zaznaczyć proces w oknie projektow ym , a następnie wyświetlić jego właściwości i zm ienić nazw ę klasy na U s e r L o o k u p A c t iv it y L ib . IsM anager '-••A ctivity. 2. Jak widać, tworzymy niestandardow ą czynność o p a rtą na kodzie w XAML-u. Zdefi­ niujm y dwa argumenty. N ajpierw należy kliknąć zakładkę Arguments w dolnej części okna projektowego. Argument wejściowy pow inien mieć nazwę U se rid i typ s trin g , a argum ent wyjściowy — nazw ę I sManage r i typ Boolean. 3. N astępnie należy przeciągnąć czynność I f z obszaru Control Flow okna Toolbox na pow ierzchnię projektową. 4. Teraz dodajmy w warunku C o n d itio n czynności I f logikę do określania, czy użyt­ kow nik jest menedżerem. T utaj logika ma d ru g o rzę d n e znaczenie — m ożna użyć in­ strukcji U s e rid . EndsW ith( "m g r"). 5. Po stronie Then czynności I f użyjm y czynności A ssig n do ustawienia argum entu IsM anager na True. W w arunk u E ls e należy ustaw ić argum ent na F a ls e . Na rysunku 23.27 pokazano wygląd gotow ej czynności Is M a n a g e rA c tiv ity .

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Rysunek 23.27. Za pomocą okna projektowego procesów można szybko budować niestandardowe, złożone czynności

Tworzenie niestandardowej czynności GetUsersManagerActivity typu Code Activity D ruga czynność wyszukuje przełożonego danego uż.ytkownika na podstaw ie nazwy tego ostat­ niego. W poniższych krokach opisano, jak utworzyć tę czynność. 1. W róćmy do projektu U se rL o o k u p A c tiv ity L ib . Najpierw dodajm y do projektu czynność typu Code Activity i nazwijmy ją G e tU se rs M a n a g e rA c tiv ity . 2. Należy zmienić sposób dziedziczenia w czynności, tak aby dziedziczyła po klasie Code v-» A c tiv ity < T R e s u lt> , gdzie T R e su lt to łańcuch znaków. W ten sposób m ożna określić typ zwracany przez czynność. 3. Następnie zdefiniujm y param etr wejściowy, aby umożliwiał użytkow nikom czynno­ ści przekazywanie nazwy użytkownika. P aram etr pow inien być publiczną właściwo­ ścią InA rg u m en t< st rin g > czynności. 4. Aby pobrać dane przełożonego określonego użytkownika, trzeba przesłonić m etodę E xecute. M etoda m oże zwracać łańcuch znaków, do którego przypisano wynik działania czynności. Na listingu 23.8 pokazano, jak może wyglądać potrzebny kod. W arto zauważyć, że operacja „w yszukiw ania” jedynie dołącza człon mgr do nazwy użytkownika.

Rozdział 23. Dodawanie procesów do aplikacji Listing 23.8. Czynność CodeActivity umożliwia zwrócenie pojedynczej wartości przez metodę Execute

using using using using using

System; System .C o lle ctio n s.G e n e ric ; System .Linq; System .Text; System .A c t iv it ie s ;

namespace U serLookupA ctivityLib { p u b lic sealed cla ss GetUsersM anagerActivity : C o d e A ctivity< strin g > { p u b lic InArgument Userid { get; se t; > protected override s t r in g Execute(CodeActivityContext context) { s t r in g userid = c o n te x t.G e tV a lu e (th is .U s e rid ); / / Do zrobienia: wywoływanie kodu do wyszukiwania przełożonego danego użytkownika.

return userid + "mgr"; } } } Utworzyliśmy czynność złożoną opartą na XAML-u i czynność opartą wyłącznie na kodzie. Obie czynności są wykorzystywane w procesie. W czasie jego rozwijania utw orzym y kilka innych czynności opartych tylko na kodzie. Opisujem y to w następnych punktach.

Wskazówka Można zdefiniować okno projektowe d la niestandardow ych czynno­ ści. W tym celu n ależy użyć sza b lo n u A ctivity Designer Library. Pojawi się okno projektow e p o d o b n e d o o k n a projektow ego te c h ­ nologii W PF. M ożna tu zdefiniować, ja k czynność procesu p o w in ­ na wyglądać i ja k użytkow nicy m ają w ch o d zić z nią w in terak cje (na przykład przygotow ać obszary um ożliw iające d o d aw an ie in ­ nych czynności).

Projektowanie procesu zgłaszania podróży Nadeszła pora, aby zaprojektować sam proces. W dalszych podpunktach opisujemy każdy krok, który trzeba wykonać w celu zbudow ania i uruchom ienia procesu.

Przygotowywanie projektu Poniżej znajduje się zestaw kroków zw iązanych z konfigurow aniem i przygotowywaniem p ro ­ jektu procesu (T ra ve lR e q u e stS e rvi.e e ).

C zę ść V Tworzenie aplikacji dla przedsiębiorstw 1. Dodajmy referencje do projektów T r a v e lD a ta L ib i U se rL o o k u p A c tiv ity L ib . N a­ leży kliknąć plik projektu prawym przyciskiem myszy, wybrać opcję Add Reference, zaznaczyć zakładkę Projects i wybrać oba w ym ienione projekty. 2. Zdefiniujmy referencję do usługi W CF V e n d o rR eservatio n S ervi.ee. Należy klik­ nąć plik projektu praw ym przyciskiem myszy, wybrać opcję A dd Service Reference, kliknąć przycisk Discover w oknie dialogow ym Add Service Reference i wybrać usługę TravelBook.ing.svc. Referencję do usługi nazwijm y V en d o rR eservatio n Srv. 3. Teraz zdefiniujmy łańcuch połączenia z bazą danych. Należy otw orzyć plik Web.config i dodać łańcuch połączenia prowadzący do pliku TravelRcquest.mdf Pamiętajmy, że połączenie jest używane przez bibliotekę dostępu do danych, dlatego nazwijmy łańcuch połączenia T ra v e lR e q u e st. Łańcuch pow inien wyglądać podobnie do poniższego:



Niestandardowe czynności zapewniające dostęp do danych Należy utworzyć dwie now e niestandardow e czynności oparte na kodzie. Czynności będą obejm ow ać wywołania dodające element do kolejki zgłoszeń podróży i oznaczające czynność jako zam kniętą (czasem także jako zatwierdzoną). Tw orzenie czynności opisano w poniższych krokach: 1. Zacznijmy od projektu T ra v e lR e q u e s tS e rv ic e . Aby zapisywać zgłoszenia podróży w bazie danych, dodajm y do projektu procesu nową czynność Code Activity i nazwijmy ją TraveRequestQueueAddActivity.cs.

2. Czynność pow inna mieć dwa param etry wejściowe. Pierwszy, T ra v e lR e q u e st, to kompletny kom unikat ze zgłoszeniem podróży. Przypomnijmy, że typ T ravelRequest zdefiniowaliśmy z atrybutem D a taC o n tract w projekcie obsługującym dostęp do danych. Drugi param etr, Managerld, to łańcuch znaków służący do przekazywania do zgłoszenia danych przełożonego określonego użytkownika. 3. M etoda E xe cu te po ustawieniu od p o w ied n ich param etrów pow inna wywoływać metodę Save z biblioteki dostępu do danych. Na listingu 23.9 przedstaw iono przykładowy kod. Listing 23.9. Niestandardowa czynność TraveRequestQueue Add Activity

using using using using using using

System; S y ste m .C o lle ctio n s. Generic; System .Linq; System .Text; System.A c t iv it ie s ; TravelD ataLib ;

Rozdział 23. Dodawanie procesów do aplikacji namespace TravelRequestService { p u b lic sealed c la ss TraveRequestQueueAddActivity : CodeA ctivity { //

Wysyła zgłoszenie podróży do zapisanej w bazie danych kolejki określonego przełożonego.

p u b lic InArgument TravelRequest { get; se t; } p u b lic InArgum ent Managerld { g e t; set; } protected override void Execute(CodeActivityContext context) { / / Pobieranie zgłoszenia podróży z kontekstu.

TravelRequestMsg tRequest = context.GetValue(t h i s . TravelRequest); / / Ustawianie identyfikatora procesu na potrzeby korelowania.

tR e q u e st.W orkflowlnstanceld = co n text.W o rkflo w lnstanceld .To Strin g( ) ; / / Konfigurowanie powiadomienia do przełożonego odpowiedzialnego za zatwierdzenie zgłoszenia.

tR e q u est.ApprovalManagerld = context.G etV alue(t h i s .M anagerld); / / Zapisywanie zgłoszenia podróży.

T ravelRequestDataAccess. S a ve ( tRequest); } > >

________________________ ________________ _____________________________________ ___

_

_

4. Należy też poinformować o zakończeniu obsługi zgłoszenia podróży. D odajm y do projektu procesu nową czynność typu Code Activity i nazwijmy ją C o m p le te !"ra ve l ■ -•Request. cs. 5. D odajm y do czynności trzy p aram etr)' wejściowe. Pierwszy, T r a v e lR e q u e s t, pow i­ nien przyjm ować kompletny k o m u n ik at ze zgłoszeniem podróży. Drugi, M an agerld, to łańcuch znaków na identyfikator m enedżera odpowiedzialnego za zatw ierdzenie zgłoszenia. Trzeci, IsA p p ro ve d , służy do określania, czy zgłoszenie zostało zatw ier­ dzone. 6. M etoda E x e c u te po ustaw ieniu odpow iednich param etrów pow inna wywoływać metodę Com plete biblioteki d o stęp u do danych. Przykładowy kod pokazano na listingu 23.10. Listing 23.10. Niestandardowa czynność CompleteTravelRequest

using using using using using using

System; System .C o lle ctio n s.G e n e ric System .Linq; System .Text; S y s te m .A c tiv itie s ; TravelD ataLib ;

namespace TravelRequestService

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

p u b lic sealed c la s s CompleteTravelRequest : CodeActivity { / / Aktualizowanie zgłoszenia podróży za pomocą informacji o zatwierdzeniu.

pub lic InArgument TravelRequest { g e t; s e t; } pub lic InArgum ent Managerld { get; set; } pub lic InArgument IsApproved { get; set; } protected o ve rrid e void Execute(CodeActivityContext context) { / / Pobieranie zgłoszenia podróży z kontekstu.

TravelRequestMsg tRequest = c o n te x t.G e tV a lu e (th is.T rave lR e q u e st); / / Określanie menedżera odpowiedzialnego za zatwierdzenie zgłoszenia.

tRequest.ApprovalManagerld = c o n te x t.G e tV a lu e (th is.M anagerld); / / Określanie, czy zgłoszenie jest zatwierdzone.

tRequest. IsApproved = co n text.G e tV a lu e (th is .IsApproved); / / Zapisywanie zgłoszenia podróży.

T ravelRequestDataAccess.Complete( tRequest) ; } } >__________________ ____________ _______________

_

_

_

___________________ ___________ ___________ ___

Projektowanie procesu Teraz jesteśmy gotowi do utw orzenia procesu. Poniżej opisano, jak to zrobić. 1. Zacznijm y od zm ian y nazwy procesu w projekcie T r a v e lR e q u e s tS e r v i.e e na R equestT r a v e l . xam lx. Należy też otw orzyć proces i zmienić w łaściwości Name oraz C o n fig u ra tio n name w oknie Properties na RequestT ra v e l. 2. Usuńmy dom yślnie wyświetlaną czynność Sequence. 3. Teraz należy dodać do procesu now ą czynność Sequence i ustaw ić właściwość D isp la y name na Sekwencja z a tw ie rd z a n ia zg ło sze n ia podróży. 4. Kliknijmy zakładkę Variables w dolnej części okna projektow ego, aby zdefiniować zmienne używane w procesie — re q u ire s Approval (typ Boolean), isUserManager (Boolean), isA pproved (Boolean) i m anagerUserld ( s t r in g ) . Należy się upewnić, czy zasięg zm iennych to wspomniana wcześniej czynność Sequence. Trzeba też dodać zm ienną na kom unikat wejściowy (zgłoszenie podróży). Będzie to zmienna t ravelRequestM sg. W liście rozwijanej z typem zm iennej należy wybrać

Browse for Types, aby otworzyć okno dialogowe Browse and Select a .Net Type. W polu Type Name w piszm y T ra v e l. Spowoduje to przefiltrow anie listy. Należy zaznaczyć typ T ravelRequestM sg z projektu do obsługi dostępu do danych.

Rozdział 23. Dodawanie procesów do aplikacji Na zakończenie dodajmy zm ienną p ro ce ssC o rre la tio n H a n d le . Posłuży ona do korelowania komunikatów, co pozwoli zagwarantować, że komunikaty trafią do odpo­ wiedniego egzemplarza procesu. Należy powtórzy opisane wcześniej kroki, aby u sta­ wić typ zm iennej na System. S e r v ic e M o d e l.A c t iv it ie s . C o rre la tio n H a n d le . Zm ienne pow inny wyglądać podobnie jak na rysunku 23.28.

5. Zdefiniujm y mechanizm odbierania komunikatów. W tym celu należy dodać czyn­ ność R e c e iv e w górnej części czynności Sequence. N ow a czynność posłuży do zde­ finiowania usługi WCF udostępnianej przez proces klientowi (interfejsowi użytkow ­ nika system u zgłaszania podróży). 6. U stawm y właściwość OperationName na P ro ce ssT ra v e lR e q u e st. Jest to nazwa metody usługi. 7. Należy kliknąć pole Content czynności Receive, aby wyświetlić okno Content Definition. Tu m ożna zdefiniować kom unikat pobierany przez usługę od klientów. Kliknijmy pole Message. W polu tekstowym Message data należy wprowadzić nazwę zm iennej (travelRequestM sg), aby określić, że należy przypisać do niej kom unikat wejściowy. W polu Message type w ybierzm y typ T r a v e lD a t a L ib . TravelRequestM sg. Na ry­ sunku 23.29 pokazano przykładow e ustawienia.

8. Ważne — należy zaznaczyć w oknie projektow ym czynność Receive, wyświetlić jej właściwości i ustawić właściwość C a n C re a te ln sta n ce na tru e (czyli zaznaczyć pole).

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Jest to informacja, że czynność m oże utworzyć egzemplarz procesu. Jeśli pom iniem y ten krok, proces nie zadziała. 9. Ostatni krok w czasie konfigurowania czynności R eceiv e polega na zainicjowaniu korelowania kom unikatów . Jeżeli tego nie zrobimy, to kiedy nadejdzie oczekiwane przez proces zatwierdzenie, silnik uruchom ieniow y nie będzie wiedział, do której jednostki skierowany jest komunikat. W oknie Properties wybierzmy przycisk z wielokropkiem przy właściwości C o r r e la tio n '-► In itia liz e rs . Należy kliknąć przycisk Add Initializer, widoczny po lewej stronie okna dialogowego Add Correlation Initializers, a następnie wpisać nazwę zmiennej — p r o c e s s C o r r e la tio n '-►Handle. Po stronie okna dialogowego zawierającej zapytania X Path należy zazna­ czyć opcję Query correlation initializer i ustawić klucz k e y l na I d : S tr in g za pom o­ cą listy rozwijanej z elementami k o m u n ik atu z kontraktu dotyczącego danych ze zgłoszenia podróży. M ożna użyć identyfikatora, ponieważ jest niepowtarzalny dla zgłoszeń podróży, a w tym przykładzie używamy korelowania opartego na treści (przy czym identyfikator to fragment treści kom unikatu). Na rysunku 23.30 pokazano przykładowe ustawienia mechanizmu obsługi korelowania. Rysunek 23.30. Inicjowanie korelowania opartego na treści służącego do korelowania komunikatów z zatwierdzeniem

10. Teraz otwórzmy okno Toolbox. Pow inno pojawić się kilka nowych pól zawierających utworzone do tej pory niestandardowe czynności. Jeśli pola są niewidoczne, należy skom­ pilować rozwiązanie i ponownie otworzyć okno. W nowym polu UserLookupActivityLib należy zaznaczyć czynność G e tU se rs M a n a g e rA c tiv ity i przeciągnąć ją pod czyn­ ność R eceive w czynności Sequence. Nowa czynność posłuży do wyszukiwania in­ formacji o przełożonym użytkownika. W oknie Properties należy ustawić właściwość U se rid (identyfikator szukanego użyt­ kownika) na tr a v e lR e q u e s tM s g .R e q u e s te r ld , a właściwość R e s u lt (identyfikator przełożonego) — na zmienną m a n ag e rU serld . 11. Ponownie należy użyć okna Toolbox i przeciągnąć czynność T rav e lR eq u e stQ u eu e '-►AddActivity do czynności S eq u en ce pod czynność G e tU se rs M a n a g e rA c tiv ity . Przypomnijmy, że nowa czynność rejestruje zgłoszenia w bazie danych.

Rozdział 23. Dodawanie procesów do aplikacji W oknie Properties ustawmy p aram etr wejściowy Manager ld na zmiennq manager '- U s e rid , a param etr T ra ve lR e q u e st — na zmiennq travelRequestM sg. 12. Z pola UserLookupActivityLib okna Toolbox należy przeciqgnqc do procesu czynność IsM a n a g e rA ctiv ity i umieścić jq pod procesem TravelRequestQ ueueAddActivity. W oknie Properties należy przypisać do właściwości IsManager zmiennq isUserManager, a do właściwości U serid — zm iennq trave lR e q u e stM sg . R eq u esterld . Proces pow inien wyglqdac podobnie do tego z rysunku 23.31. Rysunek 23.31. Kilka pierwszych etapów w procesie zgłaszania podróży

Sekwencja zatwierdzania zgłoszenia podrć

K7

V [ j Czy jest menedżerem?

V

13. Następny krok polega na w ykorzystaniu czynności procesu do ustalenia, czy zgłosze­ nie wymaga zatwierdzenia. Posłuży do tego czynność Flo w ch art. Należy przeciqgnqc jq do czynności Sequence pod czynność IsM a n a g e rA ctivity. Właściwość DisplayName ustawmy na Czy wymaga z a tw ie rd z e n ia ? . W arto zauważyć, że można d w ukrotnie kliknąć zwiniętą czynność, aby wyświetlić tylko jq. O dnośniki nawigacyjne w górnej części procesu pozwalajq wrócić do innych czynności. Oczywiście, można też rozw inąć wszystkie czynności w jednym oknie. W diagram ie wykorzystamy elem ent D e cisio n do spraw dzenia, czy zgłoszenie o p ie­ wa na kwotę powyżej 1000 złotych. Jeśli tak, należy użyć czynności A ssign i dodać przypisanie re q u ire sA p p ro va l= T ru e . Jeżeli jest inaczej, należy dodać drugi elem ent D ecisio n , aby sprawdzić w arunek isUserM anager. Jeśli warunek jest spełniony, zatwierdzenie nie jest konieczne (re q u ire s A p p ro v a l= F a ls e ). W przeciwnym razie trzeba uzyskać zatwierdzenie. Na rysunku 23.32 pokazano diagram w oknie projektow ym . 14. Dodajmy czynność I f pod czynnością Flo w ch a rt w czynności Sequence. Nazwę DisplayName nowej czynności należy ustawić na J e ś l i potrzebne.

z a tw ie rd z e n ie

je s t

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

15. Właściwość C o n d itio n czynności I f należy ustawić na zmienną re q u ire s A p p ro v a l. 16. Dodajmy czynność R eceive do strony Then warunku I f . W łaściwość Operation '-►Name należy ustawić na ReceiveManagerApproval. Jest to nazwa metody usługi udo­ stępnianej przez proces do obsługi zatw ierdzenia zgłoszeń przez m enedżerów . Należy użyć okna Properties do ustawienia właściwości ServiceContractN am e na IR eq uestT r a v e lS e r v ic e . 17. Kliknijmy odnośnik Define... (lub View message...) przy czynności R e ce ive (obok opcji Content w oknie projektowym czynności). W oknie Content Definition należy ustawić dwa parametr)' pobierane od jednostki wywołującej usługę: t ravelRequestld typu S trin g (do korelowania kom unikatów ’) i isApproved typu Boolean. Należy koniecznie przypisać do param etru isApp roved zmienną isApp roved z procesu. Na rysunku 23.33 pokazano przykładowe ustaw ienia.

Rozdział 23. Dodawanie procesów do aplikacji

« Parameters

Name

Type

Assign To

travelRequestld

String

Enter a VB expression

isApproved

8oolean

isApproved

Add new parameter

Rysunek 23.33. Należy ustawić parametry czynności Receive w czynności Jeśli zatwierdzenie jest potrzebne

18. Czynność R e c e iv e jest dostępna jako odrębna m etoda usługi. Dlatego wymaga ko­ relowania komunikatów. Należy użyć okna Properties i ustawić właściwość C o rre la te s '-♦With na p ro c e ssC o rre la tio n H a n d le . Następnie kliknijm y przycisk z w ielokrop­ kiem przy właściwości C o rre la te sO n . Należy ustaw ić klucz k e y l na p a ra m etr tra v e lR e q u e s tld . Na rysunku 23.34 pokazano przykładow e ustawienia param etru korelacji. W arto zauważyć, że wystarczy wybrać opcję tra v e lR e q u e s tld , a n arzę­ dzie wykona potrzebne operacje. Rysunek 23.34. Należy ustawić parametr travelRequestld jako zapytanie związane z korelowaniem opartym na treści

19. W w arunku E ls e czynności J e ś l i z a tw ie rd z e n ie j e s t potrzebne należy d o ­ dać czynność A ssign. Przypom nijm y, że w arunek E ls e jest urucham iany, jeśli zgło­ szenie podróży nie wymaga zatw ierdzenia (wartość poniżej 1000 złotych i użytkow ­ nik jest m enedżerem ). Na rysunku 23.35 pokazano gotow ą czynność I f . 20. W dolnej części czynności Sequence dodajm y ostatnią czynność I f . Nowa czynność ma sprawdzać, czy żądanie zostało zatwierdzone lub czy zatw ierdzanie jest zbędne (właściwość Condition to (isA pproved) Or ( re q u ire sA p p ro val = F a ls e )). Jeśli można rezerwować podróż, trzeba wysłać komunikat do odpowiedzialnego za to systemu. Przypomnijmy, że wcześniej ustaw iliśm y referencje do obsługującej rezerwacje usługi WCF biura podróży. Visual Studio w ygenerow ało w tedy niestandardow ą czynność do wywoływania metody BookTr a v e l z usługi. Nowa czynność powinna znajdow ać się w oknie Toolbox. Jeśli jest niedostępna, należy ponow nie skom pilow ać rozwiązanie.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Rysunek 23.35. Gotowa czynność If leśli zatwierdzenie jest potrzebne

^

Czy wymaga zatwierdzenia

¥

Double-click to view

V •y- Jeśli zatwierdzenie jest potrzebne Condition requiresApproval Then *

Else

Receive ArB Assign OperationName

ReceiveManagerApprova isApproved

Content

- True

Wetv porometer

Przeciągnijmy czynność do pola Then w arunku I f . Należy użyć okna Properties do ustawienia param etru re s e rv a tio n ld na travelRequestM sg.V endorReservationld. Pole E ls e m ożna pozostaw ić puste. Na rysunku 23.36 pokazano przykładową czyn­ ność I f i ustawienia m etody BookTra v e l w oknie Properties. jeśli należy zarezerwować podroż

• f X

Properties

C o n d it io n

TravelReq uestServ ice. VendorReservationSrv Activities BookTravel

( is A p p r o v e d ) O r ( r e q u ir e s A p p r o v a l Then

r

F a ls e ) E ls e

i

21

Clear

Search:

Q M is t R e zerw u j p o d ró ż

DisplayName

Rezerwuj podróż

EndpointConfigurationNa...

BasicHttpBindingJTravelBooking

D ro p a c tiv ity h e re

Rysunek 23.36. Czynność If określająca, czy należy zarezerwować podróż

21. Należy określić, że proces zakończył działanie. W tym celu przeciągnijm y z okna To­ olbox utworzoną wcześniej niestandardow ą czynność CompleteTra v e lR e q u e st typu Code A c t iv it y . Pow inna ona zajmować ostatnią pozycję w czynności Sequence. Trzeba jeszcze o d p o w ied n io skonfigurow ać p aram etry w ejściow e IsA pproved, Managerld i T ra v e lR e q u e st. Na rysunku 23.37 pokazano ostateczny wygląd procesu (większość czynności jest zwinięta).

Dodawanie usługi do utrwalania procesu Procesy są usuwane w czasie czyszczenia pamięci — na przykład w wyniku zakończenia pracy procesu systemu lub ponow nego uruchom ienia kom putera. Jeśli chcemy utrw alić proces, co dotyczy głów nie długich procesów , m usimy zdefiniow ać odpow iednią pam ięć trwałą.

Rozdział 23. Dodawanie procesów do aplikacji Rysunek 23.37. Ostateczna wersja czynności Sequence procesu; wszystkie czynności podrzędne są zwinięte

j

Sekwencja zatwierdzania zgłoszenia podrć

V ♦

Przyjmowanie zgłoszenia OperationName ProcessTravelRequest Content

View message

Pobierz dane menedżera

V Dodaj do kolejki zgłoszeń

V Czy jest menedżerem?

V , J s Czy wymaga zatwierdzenia

^

Double-click to view

V •v - Jeśli zatwierdzenie jest potr

^

Double-click to view

V

'

Jeśli należy zarezerwować p

V

Double-click to view

■ V

tV

*1 Zamknij zgłoszenie podróż

V

Tworzenie pamięci trwałej Platforma WF jest udostępniana z dom yślną pam ięcią trwałą w postaci bazy SQL Server. O k re­ ślone są też sposoby tworzenia i konfigurow ania innych rodzajów pamięci trwałej. W tym przykładzie zastosujem y pamięć trwałą w postaci bazy SQL Server. Najpierw potrzebny jest egzemplarz bazy SQL Server. W przykładzie używamy wersji SQI. Express. Pierwszy krok polega na upewnieniu się, że pam ięć trwała jest zainstalow ana i działa. W tym celu trzeba utworzyć bazę danych. M ożna nazwać ją I n s t a n c e S t o r e lub w podobny sposób. Zwykle do tworzenia baz używa się jednej z wersji narzędzia SQL Server M anagement Studio. Następnie należy uruchom ić skrypty w bazie danych, aby skonfigurow ać schem at i logikę. W systemach W indow s 7 i Vista potrzebne skrypty znajdują się w następującym katalogu; C:\W indows\Microsoft. NET\Framework\v4. 0 . 30319\SQL\en

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Uwaga Aby korzystać z bazy SQL Express, można pobrać program SQL Server Management Studio Express. Narzędzie to umożliwia two­ rzenie baz danych SQL Express i uruchamianie skryptów. Naj­ szybszy, naszym zdaniem, sposób na lokalne zainstalowanie bazy w systemie Windows 7 lub Vista polega na użyciu instalatora Microsoft Web Platform i wybraniu bazy jako opcji. Instalator można znaleźć na stronie http://www.microsoft.com/web/. Są dwa skrypty, których trzeba użyć do zainstalowania schem atu pamięci trwałej: SqlW orkfow ^ InstanceStoreSchema.sql i SqlWorkflowInstanceStoreLogic.sql. Pozwalają one skonfigurować egzem plarz pamięci trwałej w bazie SQL Server.

Komunikowanie się z pamięcią trwałą Istnieje wiele sposobów kom unikow ania się z pamięcią trw ałą. Można utworzyć własną aplika­ cję hosta i użyć usług utrw alania procesu do bezpośredniej komunikacji z pam ięcią trwałą. Pozwala to na precyzyjną obsługę m echanizm u utrw alania. Jednak w tym przykładzie proces jest przechowywany w aplikacji WCF i doskonale nadaje się do um ieszczenia w usłudze WAS (W indows Process Activation Service) lub na serwerze IIS. Po zastosow aniu tych narzędzi wystarczy skonfigurować pamięć trwałą za pom ocą pliku k o n ­ figuracyjnego. Kiedy proces przejdzie w stan bezczynności, zostanie autom atycznie utrwalony przez silnik uruchomieniowy platformy WF. Można też wykorzystać czynność P e r s is t (i właści­ wości innych czynności) do w ym uszenia utrwalenia w kluczowych punktach procesu. Aby skonfigurować utrw alanie, otw órzm y plik Web.config usługi T ra v e lR e q u e s tS e rv ic e . N astępnie m ożna zdefiniować łańcuch połączenia sqlW orkf Io w In sta n ce S to re w znaczniku b e h avio r. Poniżej pokazano przykładow y kod. Tu egzem plarz magazynu jest zainstalowany w bazie SQL Express.



Rozdział 23. Dodawanie procesów do aplikacji

Tworzenie aplikacji klienckiej (formularze do zgłaszania i zatwierdzania podróży) W ostatnim kroku utw orzym y interfejs użytkownika do w chodzenia w interakcje z usługi} procesu.

Przygotowywanie witryny W poniższych punktach opisujemy podstaw ow e zadania przygotowawcze potrzebne do ro zp o ­ częcia pracy. 1. O tw órzm y w oknie Solution Explorer witrynę TravelManagerWeb. Dodajmy referencję do usługi T ra v e lR e q u e s tS e rv ic e . W tym celu należy kliknąć projekt praw ym przyciskiem myszy i wybrać opcję Add Service Reference, a następnie przejść do pliku RequestTravel.xamlx lub kliknąć Discover w oknie dialogowym A dd Service Reference. Nazwijmy referencję T ra ve lR e q u e stS vc. Posłuży ona jako p o ­ średnik W C F procesu. 2. Dodajmy zwykłą referencję do procesu T ra v e lD a ta L ib . Jest to potrzebne do zdefi­ niowania kontraktu dotyczącego danych z katalogu przesyłanych do usługi ob słu g u ­ jącej zgłoszenia podróży. 3. Należy dodać nowe strony — NewRequest.aspx i PendingRequest.aspx. W przykłado­ wym kodzie użyjemy domyślnej stro n y wzorcowej z szablonu witryny. Dlatego w cza­ sie tw orzenia stron należy wybrać szablon Web Form i zastosować stronę wzorcową. 4. Otwórzmy stro n ę Site.Master. Należy zmienić opcje m enu, aby obejmowało pozycje Strona główna, Nowe zgłoszenie i Oczekujące zgłoszenia. Poniżej pokazano potrzebny kod ze znacznikam i:

} protected void ButtonRequest Click(object sender, EventArgs e)

{ / / Do zrobienia: dodać sprawdzanie poprawności formularza i obiektów. / / Tworzenie obiektu zgłoszenia podróży przekazywanego do procesu.

TravelRequestMsg tRequest = new TravelRequestMsg()

{ CreationDate = DateTime.Now, Id = Guid.NewGuid().ToString(), Justification = TextBoxJust.Text, Name = TextBoxName.Text, Requesterld = TextBoxrequester.Text, TravelEstimate = double.Parse(TextBoxCost.Text), VendorReservationld = TextBoxResId.Text, ApprovalManagerld = "Nieznany", IsApproved = false, Workflowlnstanceld = "TBD"

>; //

Tworzenie obiektu usługi procesu.

TravelRequestSvc.RequestTravelClient client = new T ravelRequestSvc.RequestTravelClient(); / / Rozpoczynanie procesu (przekazanie zgłoszenia).

client.ProcessT ravelRequest(tRequest); client.Close(); / / Powrót do strony głównej.

PanelRequest.Visible = false; LabelResult.Text = "Wysiano zgłoszenie podróży!"; PanelResult.Visible = true;

} }

Tworzenie strony z oczekującymi zgłoszeniami Poniżej opisano, jak. utworzyć stronę z oczekującym i zgłoszeniam i 1. Otwórzmy stronę PendingRequests.aspx.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw 2. Umieśćmy na stronie dwa panele. Jeden m a zawierać kolejkę oczekujących zgłoszeń, a drugi — wyniki działań użytkownika (początkowo powinien być ukryty). 3. N astępnie dodajmy kontrolkę G ridV iew do górnego panelu.

4. K ontrolkę GridView należy powiązać z tabelą Request. Posłuży d o tego kreator. Najpierw wybierzmy listę rozwijaną Choose Data Source w inteligentnym znaczniku Grid View Tasks. Spow oduje to uruchom ienie kreatora, w którym m ożna utworzyć kontrolkę SqlDataSource powiązaną z tabelą Request. Ponadto k re a to r doda do pliku Web.configłańcuch połączenia i powiąże tabelę Request z kontrolką GridView. Zaznaczmy opcję Enable Selection w inteligentnym znaczniku kontrolki GridView. Użytkownicy mogą zaznaczyć w kontrolce jeden wiersz. Kiedy klikną przycisk Za­ twierdź zgłoszenie lub Odrzuć zgłoszenie, program powinien znaleźć zaznaczoną po­ zycję i podjąć odpow iednie działania. 5. W górnej części form ularza dodajmy trzy przyciski — Zatwierdź zgłoszenie, Odrzuć zgłoszenie i Odśwież. Form ularz powinien wyglądać podobnie do tego pokazanego na rysunku 23.39. W ITRYN A DO ZARZADZANIA PODRÓŻAMI Strona główna

Nowe 2głoszeni*

HeadLogiovie

O czerniące zgłoszenia

* 4 « n C o rte n t (C u s to rrj

Zaznacz w kolejce element który me został zatwierdzony lub zamknięty. Użyj przycisków aby zatwierdzić tub odrzucić zgłoszenie.

Odrzuć zgłoszenie 10 zg ło szen ia

Tytuł

Odśwież

10 procM U Z g łaszający D ata zgłoszenia S zacunkow y ko szt Zatw ierdzono? Z am kn ię to ? Z atw ierd zający

Zaznacz Databound

Databound D atabound D atabound

Databound

Databound

D atabound

Zaznacz Dat abound

Databound D atabound D atabound

Databound

Databound

D atabound

Zaznacz D atabound

Databound D atabound D atabound

Databound

Databound

D atabound

Zaznacz Databound

Databound D atabound D atabound

Databound

Databound

Datal ound

Zaznacz D atabound

Databound D atabound D atabound

Databound

Databound

D atabound

S q lD a ta S o u r c e - TravelR equ estD s

[LabeIResutt

Kliknij ab.- odświeżyć listę

Rysunek 23.39. Strona do zatwierdzania zgłoszeń

Dodajmy do każdego przycisku metodę obsługi zdarzenia. 6. W pliku z kodem należy utworzyć m etodę ProcessApproval. M etoda m a przyjm o­ wać parametry isApproved i message. Kod do obsługi przycisków Zatwierdź zgłoszenie i Odrzuć zgłoszenie pow inien wywoływać om aw ianą metodę. 7. W metodzie ProcessApproval należy pobrać identyfikator G U ID zaznaczonego zgłoszenia podróży. Identyfikator będzie potrzebny do korelow ania komunikatów. N astępnie należy wywołać klienta, aby przekazać inform acje o zatw ierdzeniu do p ro­ cesu. Przypomnijmy, że służy do tego wywołanie ReceiveManagerApproval.

Rozdział 23. Dodawanie procesów do aplikacji Na listingu 23.12 pokazano, jak pow inna wyglądać zaw artość pliku z kodem Listing 23.12. Klasa w pliku z kodem PendingRequests.aspx.cs

using using using using using using

System; System.Collections.Generic; System.Linq; System.Web; System.Web.UI; System.Web.Ul.WebControls;

namespace TravelManagerWeb

{ public partial class PendingRequests : System.Web.UI.Page

{ protected void Page Load(object sender, EventArgs e)

{ } protected void ButtonApprove Click(object sender, EventArgs e)

{ ProcessApproval(true, "Zgłoszenie zatwierdzono!");

} protected void ButtonReject_Click(object sender, EventArgs e)

{ ProcessApproval(true, "Zgłoszenie odrzucono!”);

} protected void ProcessApproval(bool isApproved, string message)

{ / / Pobieranie identyfikatora zgłoszenia z zaznaczonego wiersza.

string travelld = this.GridViewl.SelectedRow.Cells!11 .Text; / / Do zrobienia: sprawdzanie, czy zgłoszenie nie jest już zatwierdzone łub zamknięte. I I Przekazy wanie danych do czynności Receive w celu ich skorelowania.

TravelRequestSvc.RequestTravelServiceClient client = new T ravelRequestSvc.Request!-ravelServiceClient (); / / Uruchamianie procesu (przekazywanie zgłoszenia).

client.ReceiveManagerApproval(travelId, isApproved); client.Close(); ShowResult(message);

} private void ShowResult(string message)

{ PanelList.Visible = false; LabelResult.Text = message; PanelComplete.Visible = true;

} protected void ButtonRefresh Click(object sender, EventArgs e)

{

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Response.Redirect("PendingRequests.aspx");

} } }

Uruchamianie aplikacji do obsługi procesu zgłaszania podróży Jesteśmy ju ż prawie gotowi do uruchom ienia aplikacji. Najpierw jednak należy poinform ować Visual Studio, że po kliknięciu przycisku Run ma włączyć trzy projekty. Pozwala to zagwaran­ tować, że będzie można wywołać usługi. Kliknijmy rozwiązanie prawym przyciskiem myszy i wybierzmy opcję Properties, aby urucho­ mić strony z właściwościami rozwiązania pokazane na rysunku 23.40. Należy zaznaczyć opcję Multiple Startup Projects i wybrać ustawienie Start w kolum nie Action dla projektów T ra v e l '-► R equestService, V e n d o rR e s e rv a tio n S e rv ic e i TravelM anagerW eb.

Rysunek 23.40. Konfigurowanie rozwiązania, aby po włączeniu uruchamiało trzy projekty

Teraz jesteśmy gotowi do uruchomienia aplikacji! Należy kliknąć przycisk w środow isku Visual Studio i poczekać chwilę na zainicjowanie aplikacji. Przejdźmy ze strony Default.aspx do strony NewRequest.aspx , wpiszmy proste szczegóły zgło­ szenia, co pokazano na rysunku 23.41, i kliknijmy przycisk Zgłoś.

Rozdział 23. Dodawanie procesów do aplikacji

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Zaznaczm y oczekujące zgłoszenie podróży za pom ocą odnośnika Zaznacz w idocznego po lewej stronie tabeli. Następnie należy kliknąć przycisk Zatwierdź zgłoszenie. Na stronie z po­ tw ierdzeniem w celu odświeżenia tabeli należy wybrać opcję Kliknij, aby odświeżyć listę. Zgło­ szenie pow inno być widoczne jako zatwierdzone i zam knięte. W arto zauważyć, że konieczne może być kilkukrotne kliknięcie przycisku odświeżania — zwłaszcza przy pobieraniu inform a­ cji z pam ięci trwałej po zaprzestaniu korzystania z w itryny na minutę lub dwie. Przykładowe dane pokazano na rysunku 23.43.

Następne etapy To dość długi przykład, zawiera je d n ak odpowiedzi na większość ważnych pytań związanych z rozwijaniem i przechowywaniem procesów. Oczywiście, wielu zagadnień nie omówiliśmy. Posta­ ram y się nim i zająć i zamieścić odpow iednie wpisy o raz filmy wideo na blogu pod adresem visualstudiounleashed.com/workflow. O to niektóre z nieopisanych tematów: • obsługa usługi do śledzenia pracy procesu, • możliwość anulow ania zgłoszeń, • sprawdzanie popraw ności danych wejściowych od użytkowników, • obsługa błędów, • obsługa rzeczywistych załogowanych użytkowników' i menedżerów, • zwiększenie niezawodności procesu rezerwacji w systemie biura podróży.

Rozdział 23. Dodawanie procesów do aplikacji

Podsumowanie W tym rozdziale opisaliśmy podstawy tworzenia aplikacji opartych na platformie Windows W ork­ flow Foundation. O m ów iliśm y kom ponenty wszystkich aplikacji związanych z procesem: klienta, hosta i sam ego procesu. Klient to dow olna aplikacja, która wywołuje hosta, aby użyć egzem plarza procesu. Proces to zbiór etapów, które prowadzą do rozwiązania problemu bizne­ sowego. Proces należy skom pilow ać i umieścić w hoście, który zarządza wywołaniami przeka­ zyw anym i między klientem a środowiskiem uruchom ieniow ym procesu. O pisaliśm y także okno projektow e i liczne czynności, w' tym wbudowane czynności służące do tw orzenia procesów. P onadto omówiliśmy rozw ijanie własnych niestandardow ych czynności. M am y nadzieję, że um ożliw i to Czytelnikom sam odzielne zapoznanie się z dalszymi zagadnie­ niam i i usługami platform y WF.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Rozdział 24. Tworzenie aplikacji biznesowych opartych na pakiecie Office

Część V

Tworzenie aplikacji dla przedsiębiorstw

W tym rozdziale: • Przegląd rozszerzalnych funkcji pakietu Office • Tw orzenie dodatków dla pakietu Office • Tw orzenie rozszerzeń dokum entów Office Microsoft Office to niezwykle popularny pakiet aplikacji podnoszących efektywność pracy z in ­ form acjam i. Wszyscy znają funkcje edytora tekstu, arkusza kalkulacyjnego, klienta pocztow ego i formularzy udostępniane przez aplikacje Microsoft W ord, Microsoft Excel, M icrosoft O utlook i Microsoft InfoPath. Jednak możliwości tych programów to nie tylko wbudowane mechanizmy. Aplikacje te sam e w sobie stanowią platformy programistyczne, które można w zbogacać i dosto­ sowywać, aby tworzyć aplikacje biznesowe wykorzystujące najwyższej klasy w budow ane funkcje tych program ów . Na przykład w aplikacji do obsługi zakupów można wykorzystać to, że użytkownicy końcowi znają edytor Microsoft W ord, i umożliwić wpisywanie danych przy użyciu form ularzy w tej aplikacji, a raporty i diagram y m ożna generować przy użyciu Excela na podstaw ie historii zamówień. W przeszłości podstawowym narzędziem do wzbogacania aplikacji z pakietu M icrosoft Office był język Visual Basic for A pplications (VBA). Przy użyciu VBA programiści, a naw et użytkow'nicy końcowi, mogli tworzyć różnorodne rozwiązania — od prostych m akr po bardziej za­ awansowane rozwiązania z obsługą logiki biznesowej i dostępem do danych przechowywanych w bazach. VBA zapewnia prosty „skrót” dający dostęp do modeli obiektowych poszczególnych aplikacji bogatego pakietu M icrosoft Office: Project, W ord, Outlook, InfoPath, PowerPoint, Publisher i tak dalej. Jednak po udostępnieniu pierwszej wersji Visual Studio Tools for Office (VSTO) program iści uzyskali solidne narzędzie do tw orzenia rozwiązań opartych na pakiecie Office w' kodzie zarzą­ dzanym — w’językach Visual Basic i C# — bezpośrednio w Visual Studio. Visual Studio 2010 obejmuje narzędzia VSTO czwartej generacji, które umożliwiają tworzenie rozwiązań opartych na najnowszej (w czasie pow staw ania książki) wersji pakietu Office, M icrosoft Office 2007, a także dla M icrosoft Office 2010. Stosowanie VSTO do program ow ania z wykorzystaniem pakietu Office to rozległy temat, którem u poświęcone są całe książki. W tym rozdziale przedstawiamy w prow adzenie do zagadnień związanych z VSTO i pokazujemy, jak używać projektów z rodziny Visual Studio Office do szybkiego tworzenia wartościowych progra­ mów, które wykorzystują możliwości aplikacji W ord, Excel i O utlook. O m aw iam y tu między innymi następujące zagadnienia: Tw orzenie niestandardowych paneli z operacjami. Tw orzenie niestandardowych paneli z zadaniami. Dostosowywanie wstążki pakietu Office.

Rozdział 24. Tworzenie aplikacji biznesowych opartych na pakiecie Office Celowo nie opisujem y tu obiektowego modelu automatyzacji aplikacji Office i ograniczam y się do przedstawienia inform acji niezbędnych do zrozumienia wymienionych zagadnień. W yczer­ pujące omówienie pakietu Office jako platform y programowania m ożna znaleźć w blogu ze­ społu rozwijającego VSTO (http://blogs.msiin.com/vsto/), książce Visual Studio Tools fo r Office 2007: VSTO for Excel, Word and Outlook autorstwa Erica Cartera i Erica Lipperta (AddisonWesley Professional, 2009) i oczywiście w różnych punktach dokum entacji MSDN pośw ięco­ nych VSTO (należy poszukać tem atu Visual Studio Tools fo r Office). Zacznijmy od krótkiego przeglądu funkcji pakietu Office, które można dostosować do własnych potrzeb.

Uwaga C hoć w Visual S tu d io 2010 m ożna tworzyć rozw iązania o p arte n a pakietach Office 2007 i 2010, w tym rozdziale om aw iam y tylko projekty związane z w ersją 2007. W szystkie ty py projektów i m e­ to d y rozszerzania aplikacji oraz d o k u m en tó w z pakietu Office są identyczne w w ersjach Office 2007 i Office 2010.

Przegląd rozszerzalnych funkcji pakietu Office Ponieważ każda aplikacja pakietu Office m a wyjątkowe i wyspecjalizowane funkcje, nie p o ­ w inno dziwić, że sposoby dostosowywania aplikacji zależą od tego, którą z nich program ista chce zmodyfikować. C hoć wszystkie pro gram y pakietu mają w spólny ogólny układ interfejsu, każda aplikacja ma specyficzne cechy, które wyznaczają możliwości ich dostosowywania przy użyciu VSTO. Na przykład w aplikacjach Excel i W ord podstaw ow ym elem entem roboczym są pliki, n a to ­ miast Outlook używa listów elektronicznych przechowywanych lokalnie, na serwerze lub w obu lokalizacjach. Dlatego m ożna zastosować rozszerzenia z poziom u dokum entów w aplikacjach Excel i W ord, jednak nie jest to możliwe w O utlooku. Z drugiej strony' model obiektow y O utlooka obsługuje regiony formularza, a Excel i W ord nie mają tej funkcji.

Funkcje pakietu Office I abela 24.1 przedstawia różne funkcje, które m ożna dostosowywać i wzbogacać w poszczegól­ nych aplikacjach pakietu Office. W następnych punktach om aw iam y wszystkie te elementy.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Tabela 24.1. Rozszerzalne elementy pakietu Microsoft Office

Aplikacja

Funkcja

Panel operacji Panel zadań Microsoft Excel 2007

Pamięć podręczna danych Wstążka Tagi inteligentne

Microsoft InfoPath 2007 Microsoft Outlook 2007 Microsoft PowerPoint 2007

Panel zadań Panel zadań Regiony formularza aplikacji Outlook Panel zadań Panel operacji Panel zadań

Microsoft Word 2007

Pamięć podręczna danych Wstążka Tagi inteligentne

N iektóre z tych elementów to funkcje z poziomu dokum entu, a inne — z poziom u aplikacji. Różnią się one przede wszystkich zasięgiem. Zmiany z poziom u dokumentu są dołączane i udo­ stępniane w konkretnym dokumencie, na przykład pliku .tioc lub ,docx aplikacji W ord lub arkuszu programu Excel. Natomiast funkcje z poziomu aplikacji są bardziej globalne i mają postać dodat­ ków do specyficznych programów pakietu Office, dlatego przypominają dodatki tworzone i dołą­ czane do środow iska Visual Studio (zobacz rozdział 15., „Tw orzenie dodatków i kreatorów ”). M echanizm y różnicujące rozw iązania z poziom u dokum entu i aplikacji opisujem y w dalszej części rozdziału przy przedstaw ianiu typów projektów VSTO. Najpierw je d n ak om aw iam y funkcje wym ienione w tabeli 24.1. Ich poznanie to klucz do zrozumienia, jak we własnych roz­ wiązaniach wykorzystać pakiet Office przy użyciu VSTO.

Panele zadań i operacji Panele zadań pakietu Office w taki sposób udostępniają polecenia i funkcje związane z zada­ niami, aby użytkownik mógł skoncentrow ać się na w czytanym dokum encie. Rysunek 24.1 przedstawia panel zadań do scalania formularzy listów w aplikacji Microsoft W ord 2007. Panel prowadzi użytkownika przez szereg etapów, przy czym dokum ent wciąż jest widoczny. Panele zadań działają na poziomie aplikacji. Natomiast panele operacji, które są rodzajem paneli za­ dań, funkcjonują na poziomie dokum entu.

Rozdział 24. Tworzenie aplikacji biznesowych opartych na pakiecie Office

Pamięć podręczna danych Pamięć podręczna danych to mechanizm VSTO umożliwiający lokalne przechowywanie danych w dokum encie. Ta pam ięć jest czasem nazyw ana wyspą danych. Poniew aż VSTO um ożliw ia odczyt i zapis informacji z tej pamięci, jest to przydatne narzędzie do przechowywania danych potrzebnych w dodatkach pakietu Office lub do powielania danych z bazy niezbędnych w scena­ riuszach bezpołączeniowych.

Wstążka W stążka to nowy elem ent interfejsu użytkow nika w prow adzony w M icrosoft Office 2007. Stanowi ona nowy sposób udostępniania funkcji bez korzystania z tradycyjnych pasków narzędzi i menu. Polecenia na wstążce są pogrupowane w edług kategorii zadań, a w ramach każdej z nich podobne instrukcje są połączone wizualnie. Na przykład w edytorze W ord znajduje się zakładka Recenzja, która łączy wszystkie polecenia zw iązane z recenzow aniem dokum entów . Ponieważ najczęściej używane polecenia są bezpośrednio w idoczne i dostępne, nie występuje problem charakterystyczny dla m odelu paska narzędzi, w którym elem enty są grupowane i zagnież­ dżane na kilku poziom ach w systemie m enu, a p rzez to niewidoczne. Zakładki wstążki i widoczne w nich grupy poleceń zmieniają się w różnych aplikacjach w zależ­ ności od kontekstu. Rysunek 24.2 przedstaw ia zakładkę Narzędzia główne w aplikacjach W ord i PowerPoint.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw J

J

;

Prcm > t«cj»l • M rcrcw ft PosvefPomt

Marc■

f?4 -t doc fTryb rg o d n o io ) - Microsoft Word

Wstawiane

Narzędzia główne *

Times Mew Roman

B

/

U

4.

10 X

Układ stroni



*• Aa

Członka

A-

** i * ;

O dw ołana

Korespondenga

mmn-v

S - t e

lii

■A

r.

! ; > •

-

Narzędzia tabel

Retenga

Widok

M 3t

AaBt

o a m e w .

Akaed K&\^1 r. .t

Deweloper

AaBbi

Dodatki

AaBbCc AaBbCcD

'h . a t o » 'm g i o . 'm a t ó w.

.;.................. sv
Przy stosowaniu m etody StartCaching () nie trzeba dołączać do klasy atrybutu Cached, jednak obiekt m usi spełniać inne w ymagania związane z serializacją wysp danych w pakiecie Office. M etody StopCaching obiektu kontenerow ego m ożna użyć do nakazania środow isku VSTO usunięcia obiektu z pamięci podręcznej dokum entu.

Wskazówka Istnieje jeszcze jeden sposób na umieszczanie obiektów w pamięci podręcznej danych. Można użyć do tego okna P ro p e rtie s. Jeśli pro­ gramista doda zbiór danych do projektu przy użyciu okna D a t a S o u rc es , może następnie utworzyć egzemplarz zbioru danych i za­ znaczyć go w oknie projektowym. W oknie P ro p erties należy wtedy ustawić właściwość Cache In Document na True. Trzeba też zmie­ nić typ dostępu do egzemplarza na Public.

Dostęp do pamięci podręcznej danych Aplikacje biznesowe oparte na pakiecie Office często w ym agają działającego serw era, który pełni funkcję centralnego repozytorium dokum entów . Zw iązane jest to z pew nym p ro b le ­ mem — aplikacje pakietu Office, na przykład W ord i Excel, nie są zaprojektowane do działa­ nia w środow isku serwerowym, w którym trzeba utw orzyć wiele obiektów w celu obsługi licznych żądań skierowanych do rozszerzeń z poziomu d o kum entu. Do tej pory używaliśmy obiektów z m odelu obiektowego Office do wzbogacania aplikacji z tego pakietu. O znacza to, że na maszynie, na której działa dany podzespół, trzeba zainstalow ać pakiet Office, co nie jest normą w typowych rozwiązaniach serwerowych. Na szczęście jednym z podstawowych celów przy rozwijaniu architektury pakietu Office na poziomie dokum entów było um ożliw ienie oddzielenia danych od warstwy ich prezentacji. Oznacza to, że architektura VSTO określa sposób dostępu do dokum entu bez konieczności używania aplikacji klienckiej z pakietu Office, a za pomocą środowiska uruchomieniowego VSTO. Kluczowym elem entem przy dostępie do dokum entów po stronie serwera jest klasa Server '—Document. Ta klasa jest częścią środow iska uruchom ieniow ego VSTO i przestrzeni nazw Microsoft .VisualStudio.Tools .Applications. U m ożliw ia ona program ow y d o stęp do pamięci podręcznej dokum entu na kom p u terach bez zainstalow anego pakietu Office. Proces działający na serw erze przekazuje ścieżkę potrzebnego d o k u m e n tu do k o n stru k to ra klasy

Rozdział 24. Tworzenie aplikacji biznesowych opartych na pakiecie Office ServerDocument, a następnie używa klasy CachedDataHostltem i CachedDataltem, aby pobrać z wyspy danych d o k u m en tu schemat, dane XML lub oba te elementy. Jeśli na kom puterze docelowym jest zainstalowane środow isko uruchom ieniow e VSTO, poniż­ szego kodu m ożna użyć do uzyskania dostępu do danych na temat zamówień z arkusza zamó­ wień zapisanego po stronie serwera: s t r i n g p o F ile = @ " C :\ S e rv e rD a ta \ p o 3 9 2 3 3 2 0 2 .x ls " ; S e rv e rD o c u m e n t poDoc = n u l i ; poDoc

=

new S e r v e r D o c u m e n t ( p o F i l e ) ;

C a ch e d D a ta H o stlte m

d a ta H o stlte m

=

s d l . C a c h e d D a ta . H o s t lt e m s [ " E x c e lW o rk b o o k l. D a ta S h e e tl" ] ; C a ch e d D a ta lte m

dataCache

=

d a ta H o stlte m .C a c h e d D a ta ( "CachedPO "];

/ / Właściwość dataCache.Xml będzie zawierać dane XML z / / określonej wyspy danych.

Przy użyciu właściwości dataCache .Xml można przeprow adzić deserializację obiektu na źró­ dłowy typ danych, wyświetlić dane i tak dalej.

Implementowanie własnych tagów inteligentnych Proces działania tagów inteligentnych wygląda następująco: użytkownik wpisuje w dokumencie tekst, który jest rozkładany na elementy porównywane następnie z wszystkimi słowami i wyraże­ niami rozpoznaw anym i przez tagi inteligentne pakietu Office. Jeśli tekst zostanie rozpoznany, użytkownik zobaczy listę operacji. Są one wyświetlane przy użyciu interfejsu użytkownika opisanego przy pierwszej w zm iance na tem at tagów inteligentnych na początku rozdziału. Opisany proces obejmuje dwa etapy: rozpoznawanie i działanie. Przy użyciu VSTO można tw orzyć własne tagi inteligentne i określać w nich rozpoznawany tekst oraz listę operacji wyświetlanych użytkownikowi p o wykryciu danego elem entu. Aplikacje W ord i Excel obejmują klasy dziedziczące po klasie bazowej Microsoft .O ffice . Tools ^♦SmartTagBase. W edytorze W ord jest to klasa Mi ero s o ft .O ffic e .Too ls.Word. Smart Tag, a w Excelu — klasa Microsoft .Of f ice.T o ols . Excel .SmartTag. Obie mają dwie ważne właści­ wości klasy SmartTagBase: Terms i Expressions. Jeśli dany tag inteligentny ma wykrywać proste jednostki tekstu, można dodać je do kolekcji Terms. Aby zastosować bardziej zaawansowane funkcje dopasowywania, m ożna użyć wyrażeń regularnych i właściwości Expressions. Aby skonfigurow ać obiekt tagu inteligentnego, trzeba znać podstawy analizy tekstu przez apli­ kacje pakietu Office. Na przykład jeśli użytkowmik wpisze w edytorze W ord tekst „ZAM29302”, parser autom atycznie podzieli go na dwie jednostki: „ZA M ” i „29302”. D odanie łańcucha znaków „ZAM” do kolekcji Terms spowoduje rozpoznanie tekstu przez tag inteligentny, ponieważ jedna z jednostek pasuje do tego łańcucha. Można utworzyć bardziej zaawansowane i niezawodne

C zę ść V Tworzenie aplikacji dla przedsiębiorstw wyrażenie regularne, które wykrywa „poprzedzone przynajmniej jednym odstępem litery ZAM, po których n astęp u je dowolna liczba cyfr i przynajm niej jed en o d stęp ”. T akie w y rażenie to

\sZAM[0-9]*\s. Po określeniu, na jaki tekst mają reagować tagi inteligentne, trzeba ustalić listę operacji u d o ­ stępnianych użytkow nikom po kliknięciu takiego tagu. Jeśli aplikacja ma w ykryw ać n u m e r zamówienia na podstawie przedstawionego wcześniej wyrażenia regularnego, a następnie um oż­ liwiać użytkow nikom wyświetlenie szczegółowych informacji o danym zamówieniu (na przykład w panelu operacji lub regionie formularza w Outlooku), należy zdefiniować odpow iednią operację przy użyciu klasy A c tio n . Jest ona dostępna w aplikacjach W ord i Excel, a udostępnia zdarzenie, które m ożna powiązać z uruchom ieniem niestandardowego kodu: //

Tworzenie obiektu Action.

D is p la y P O

//

= new A c t i o n ( " W y ś w i e t l

dane z z a m ó w ie n ia ." ) ;

D o d a w a n ie o b iek tu Action Jo in telig en tn eg o tagu.

P O S m a r t T a g . A c t i o n s = new A c t i o n ! ]

{ D is p la y P O

};

Listing 24.1 łączy cały potrzebny kod w obszar, który m ożna skopiować i wkleić do klasy doku­ m entu edytora W ord (na przykład klasy ThisDocument), aby utworzyć niestandardow y inteli­ gentny tag. Rysunek 24.18 przedstawia jego działanie. Listing 24.1. Projekt dokumentu edytora Word z niestandardowym inteligentnym tagiem u s in g

System ;

u s in g

S y s te m .C o lle c t io n s .G e n e ric ;

u s in g

S y s t e m .D ata;

u s in g

S y s t e m .L in q ;

u s in g

S y s te m .T e xt;

u s in g

S y s t e m .T e x t .R e g u ła rE x p r e s s io n s ;

u s in g

S y ste m .W in d o w s. Form s;

u s in g

S y s t e m .X m l.L in q ;

u s in g

M ic r o s o f t .V is u a lS t u d io . T o o ls . A p p l i c a t i o n s . R u n tim e ;

u s in g

T o o ls

u s in g

O ffic e

u s in g

W ord = M i c r o s o f t . O f f i c e . I n t e r o p . W o r d ;

= M ic r o s o ft.O ffic e .T o o ls .W o r d ; = M ic r o s o ft .O ffic e .C o r e ;

n a m e sp a ce W ordD ocum entl { p u b lic

p a r tia l

c la s s

T h isD o cu m e n t

{ p r iv a te

v o id

A d d P O Sm artTag()

{ //

Tworzenie obiektu SmartTag.

T o o ls .S m a rtT a g

p o Sm artTag =

ne w T o o l s . S m a r t T a g ! " w w w .co n to so .co m # P O S m a rtT a g " , "Tag

//

in te lig e n tn y

d la

za m ó w ie ń " );

Wykrywanie oparteje st na wyrażeniu regularnym.

p o S m a r t T a g . E x p r e s s i o n s .A d d (n ew R e g e x (@ "\ sZ A M [ 0 - 9 ] * \ s " ) ) ;

Rozdział 24. Tworzenie aplikacji biznesowych opartych na pakiecie Office / / Definicja operacji lagu inteligentnego. T o o ls .A c tio n

d is p la y D e ta ils

=

new T o o l s . A c t i o n ( " W y ś w i e t l d a n e z

z a m ó w ie n ia ..." );

/ / Dodawanie obiektu Action do lagu inteligentnego. p o S m a r tT a g .A c tio n s

=

new T o o l s . A c t i o n [ ] { d i s p l a y D e t a i l s

};

/ / Dodawanie lagu inteligentnego do dokumentu. t h i s . V sto S m a rtT a g s.A d d (p o S m a rtT a g );

/ / Połączenie metod obsługi zdarzeń z operacjami lagu inteligentnego. d is p la y D e ta ils . C lic k

+ = new

T o o ls .A c t io n C lic k E v e n t H a n d le r ( d is p la y D e ta ils

C lic k );

} v o id

d is p la y D e ta ils

C lic k (o b je c t

T o o ls .A c tio n E v e n tA rg s

sender,

e)

{ / / Tu należy umieścić kod. który’kontaktuje się z systemem I I zakupowym i wyświetla informacje w otwartym dokumencie. ł p r iv a te

v o id

T h is D o c u m e n t_ S ta rtu p (o b je c t

S y ste m .E v e n tA rg s

sender,

e)

{ A d d P O Sm artT a g () ;

> p r iv a te

v o id

T h is D o c u m e n t S h u t d o w n (o b je c t

S y ste m .E v e n tA rg s

sender.

e)

{ > # re g io n

VSTO D e s g i n e r

generated

code

I I I I I I Required method for Designer support - do not modify I I I the contents o f this method with the code editor. I l l p r iv a te

v o id

In te rn a lS ta rtu p ()

{ th is .S ta r tu p

+=

new S y s t e m . E v e n t H a n d l e r ( T h i s D o c u m e n t th is.S h u td o w n

new S y s t e m . E v e n t H a n d l e r ( T h i s D o c u m e n t

# e n d re g io n

1

Sta rtu p );

+= Sh u td o w n );

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

5



N arzęd d zia g łó w n e

—*

J • Sch o w e k

ordDocumentl.docx - Microsoft Word 8

in W sta w ia n ie

C a lib ri (Tekst p od staw o ’

11

* J

A

A a-

A

a

Czcionka

r*

U kład stro n y

O d w o ła n ia

• iE " |E * >-

_ - )ł

;|E f

k o re sp o n d en cja

Hlłn

R ece nzja

,v'

A aB b C c D c

AaBbCcD c

K N orm alny

*

Akapit

B e z o d st... .

W idok

D ew elo per

D o d a tk i

AaBbC Nagłówek 1

zm ie ń style •

E d y to w a n ie *

Style Z am ó w ie n ia

Aktywne zamówienia: Zam 890129832 (Cootcso services} Zam 392332222 (Lighthouse Project ) Zam 392332229 (Lighthouse 2}

Zam 392100101 (H/W Refresh Zam 922020210 (Corp T ra n łnc )

To test niestandardowego tagu inteligentnego. Czy rozpozna tekst

U staw ienia procesu

i ag inteligentny dla zam ówień: ZAM230123923

Uzasadnienie biznesowe

W yśw ietl d a n e z z a m ó w ie n ia ...

Badama nad PO

y s u n te n ta g in te lig e n tn y Z atrzym aj ro zp o zn a w a n ie

ZA M 230123923



Zatw ierdza: m m Nowok

Opcje ta g o w in te lig e n tn y c h ...

Sztywny budżet

y | Zewnętrzny dostawca

{' J Tylko usług Stron a: 1 z 1

Wyrazy- 9

Polski fPolska)

1 2 0 -c

Rysunek 24.18. Niestandardowy znacznik inteligentny zaimplementowany w edytorze Microsoft Word 2007

Podsumowanie W tym rozdziale opisaliśmy możliwości środowiska Visual Studio 2010 w zakresie wzbogacania aplikacji pakietu Microsoft Office i modyfikowania ich działania na poziom ie aplikacji i doku­ mentu. Przy omawianiu dodatków dla pakietu Office pokazaliśmy, jak dołączać do wstążki własne elementy, zakładki i grupy, jak tworzyć regiony form ularzy w Outlooku, a także jak budować niestandardowe panele zadań. Przy omawianiu rozszerzeń dla pakietu Office na poziom ie doku­ mentów opisaliśmy zagadnienia związane z umieszczaniem w dokumencie kontrolek formularzy W indows i natywnych kontrolek pakietu Office, tworzeniem niestandardowych paneli operacji do udostępniania użytkownikom funkcji oraz informacji dostosow anych do kontekstu i uży­ waniem pamięci podręcznej danych do odczytu i zapisu danych w dokumentach pakietu Office po stronie klienta i serwera. Na zakończenie pokazaliśmy, jak tw orzyć własne tagi inteligentne. Choć skoncentrowaliśmy się tylko na kilku aplikacjach pakietu Office, które można zmodyfikować przy użyciu VSTO, mamy nadzieję, że przedstawiliśmy wystarczającą ilość informacji z obszaru projektów VSTO i narzędzi projektow ych, aby Czytelnik m ógł zacząć sam odzielne poznaw anie platform y programistycznej obejmującej Visual Studio i pakiet Office.

Rozdział 25. Aplikacje działające w chmurze i technologia Windows Azure

C zę ść V Tworzenie aplikacji dla przedsiębiorstw W tym rozdziale: • Podstaw y platformy Azure • Rozwijanie i wdrażanie aplikacji na platformę Azure Aplikacje i program ow anie związane z chm urą stały się rzeczywistością. W czasie pow staw ania tej książki M icrosoft zaczął realizować obietnice dotyczące udostępnienia produkcyjnych cen­ trów danych dla chmury, zlokalizowanych na całym świecie w pobliżu bogatych źródeł energii. Microsoft i inni dostawcy systemów opartych na chm urze przedstawili studia przypadku, które pokazały niezwykłe korzyści, jakie odniosły pierwsze firmy korzystające z tej technologii. Programiści chcą móc wykorzystać dużą m oc obliczeniową i uproszczone m echanizm y zarzą­ dzania serwerem. W tym rozdziale przedstawiamy z punktu widzenia programistów’ stosowanie Visual Studio 2010 do budowania rozwiązań działających w chm urze i wdrażanych za pomocą technologii W indow s Azure.

Podstawy platformy Azure Pierwsze pytanie zadawane przez większość program istów brzmi: „Czym jest A zure?”. O d p o ­ wiedź jest prosta, a zarazem złożona. Pozornie Azure to tylko model hostingu aplikacji. M odel ten jest jednak zbudow any w' taki sposób, aby udostępniać przechowywanym aplikacjom zu­ pełnie nowy poziom usług. To właśnie sprawna, że technologia Azure jest ciekawa. Tak, Azure to sposób hostingu. Jest wysoce skalowalny (w praktyce bez ograniczeń) i oparty na centrach danych. Umożliwia natychm iastowy dostęp do dow olnej ilości zasobów — w zależ­ ności od potrzeb i budżetu. M ożna szybko, przez w prow adzenie kilku znaków, zwiększyć lub zmniejszyć zajm ow ane zasoby w odpowiedzi na wymagania. Zapewmia to elastyczną skalowalność na żądanie. Co lepsze, za pomocą komputera używanego do programowania oraz środowiska Visual Studio m ożna zarówno em ulować pracę centrum danych, jak i bezpośrednio w drażać rozwiązania w takim centrum .

Korzyści, jakie daje platforma Azure Platforma A zure umożliwia program istom i zespołom do spraw infrastruktury przyjęcie n o ­ wego sposobu myślenia o rozwijaniu aplikacji oraz zarządzaniu nimi. Poniżej znajduje się przegląd korzyści, jakie zapewnia platforma Azure. Uwzględniono tu cztery główne perspektywy. P la tfo rm a A zure jako system operacyjny. W indow s A zure to system operacyjny zaprojektow any tak, aby działał na wielu serwerach (zarów no fizycznych, jak i w irtu­ alnych). Azure można traktować jak system operacyjny udostępniany w formie usługi. Działanie takiego systemu umożliwia narzędzie AppFabric (od ang. application fabric), które zapewnia zasoby, skalowalność, odporność na błędy, równoważenie obciążenia, wykrywanie usterek i m onitorow anie aplikacji. A ppFabric udostępnia głów ne usługi

Rozdział 25. Aplikacje działające w chmurze i technologia Windows Azure platform y Azure: przetw arzanie (hosting), przechowywanie danych, magistralę usłu­ gową (w ykryw anie i łączenie usług aplikacji) oraz kontrolę d o stęp u (na podstaw ie w arunków i reguł). Programiści m ogą używać usług platform y Azure bez konieczności uwzględniania systemu operacyjnego. Umożliwiają to podstawowe elementy platform y. •

P latform a A zure ja k o m echanizm hostingu. C entra danych A zure składają się z se­ tek połączonych kom puterów , które wykorzystują wirtualizację i są zarządzane przez narzędzie A ppFabric. Oczywiście, istnieje wiele centrów' danych, dlatego dostępne są tysiące kom puterów i jeszcze więcej jednostek wirtualnych. M ożliwość korzystania ze skalowalnych, niezaw odnych i dostępnych źródeł mocy obliczeniow ych pozwala rozwiązać wiele tradycyjnych problemów. Czytelnik może przypom nieć sobie, jak wyglądało rozw ijanie i zapew nianie hostingu ostatniej dużej aplikacji internetowej, nad którą pracował. Azure sprawia, że nie trzeba martwić się o kupowanie, instalow anie, zarządzanie, rozwiązywanie problem ów , dodaw anie poprawek i aktualizow anie serwerów, narzę­ dzi do równoważenia obciążenia, sieci, pamięci do przechowywania danych i tak dalej. W szystkie elem enty czekają ju ż w chm urze na aplikacje. Zespoły program istyczne mogą dzięki tem u skupić się na pisaniu kodu i problemach biznesowych. Platforma Azure odpowiada za hosting, przetwarzanie, replikację, kopie zapasowe, odporność na błędy, pracę sieci i pow iązane zagadnienia.

• A zure jako p la tfo rm a pro g ram o w an ia. D obra w iadom ość jest taka, że wr platform ie Azure można w ykorzystać wiedzę o rozwijaniu aplikacji .NET. W szystkie elementy działają także w Azure. Dotyczy to używ anych na co dzień narzędzi (Visual Studio) i technologii (ASP.NET, Silverlight, W PF, W CF, W F i tak dalej). Wiele aplikacji m ożna po niewielkich zm ianach przenieść do ch m u ry . Oczywiście, aby w pełni w ykorzystać dostępne usługi, w arto zastosow ać w aplikacjach techniki przechowywania danych specyficzne dla chm ury. M ożna naw et rozważyć zastosowa­ nie technologii SQI. A zure do przeniesienia do chm ury baz danych SQL. Pakiet Azure SDK zaw iera lokalne narzędzie DevFabric (od ang. development fabric ), które emuluje pracę chm ury na kom puterze. Em ulacja obejm uje urucham ianie wielu egzemplarzy, równoważenie obciążenia i mechanizmy przechowywania danych platfor­ my Azure. W spom niane narzędzie um ożliw ia diagnozow anie i usuw anie problemów z aplikacji w środow isku lokalnym. • A zure jako system do przechow yw ania d an y ch i plików . Platform a Azure oferuje wiele możliwości w zakresie przechowywania danych: tabele, obiekty blob, dyski i kolejki. Wszystkie techniki om aw iam y w dalszej części rozdziału. W arto jednak zapamiętać, że platforma dba o zabezpieczanie danych (za pom ocą kontroli dostępu opartej na warunkach) i gwarantuje, że informacje nie zostaną uszkodzone lub utracone. Wszystkie dane w chm urze są powielane w trzech egzem plarzach. N a w ypadek awarii zawsze przechowywane są trzy kopie, których narzędzie AppFabric używa do automatycznego przywrócenia danych.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Jeśli program ista chce wyjść poza podstawowe rozwiązania z obszaru przechow yw a­ nia danych, może zastosować SQI. Azure i wykorzystać wszystkie możliwości, jakie oferują skalowalne relacyjne bazy danych. To podejście omawiamy w dalszym punkcie. Jak widać, przetwarzanie w chm urze za pomocą platform y Azure daje liczne korzyści. Zacznijm y rozwijać kod działający w chmurze. Jest to najlepszy sposób na zapoznanie się z nowym i technikami wprowadzonym i w Azure.

Uwaga Hosting w' platformie Azure jest płatny w zależności od wykorzy­ stanych zasobów. Najnowsze informacje można uzyskać na stronie m i c r o s o f t.c o m /W in d o w s A z u r e . Można tam znaleźć także studia przypadku dotyczące pierwszych firm korzystających z platformy i inne materiały.

Konfigurowanie środowiska programistycznego Aplikacje działające w chm urze zwykle można tworzyć w standardow y sposób. Dotyczy to przede wszystkim rozwiązań związanych z siecią W W W , na przykład aplikacji Silverlight, ASP.NET, WCF i tak dalej. Platforma Azure umożliwia też udostępnianie tradycyjnych aplikacji za pomocą ich w irtualnych egzemplarzy. T u jednak koncentrujem y się na rozwijaniu i w drażaniu program ów działających w chm urze, czyli na rozwiązaniach sieciowych opartych na hostingu. Największą zm ianą w obszarze rozwijania aplikacji jest to, że są one przechow yw ane za pom o­ cą m echanizm u AppFabric z zastosow aniem równoważenia obciążenia. D ostępne są też nowe m echanizm y przechowywania danych, co sprawia, że czasem tru d n o jest przetestow ać aplika­ cję lokalnie przed przeniesieniem do chm ury. Na szczęście pakiet Azure SDK obejm uje lokalną wersję m echanizm u AppFabric — narzędzie DevFabric, które em uluje urucham ianie aplikacji w wielu egzem plarzach w chm urze z równoważeniem obciążenia. Emulowane jest też prze­ chowywanie obiektów blob, tabel i kolejek. W dalszych podpunktach opisujemy, jak skonfigu­ rować środow isko, aby lokalnie zbudow ać działające w chm urze aplikacje, które m ożna łatwo przenieść na platform ę Azure.

Instalowanie pakietu SDK Pierwszy krok polega na zainstalowaniu pakietu SDK. Pakiet Azure SDK nie jest obecnie u do­ stępniany wraz ze środowiskiem Visual Studio 2010, dlatego trzeba go pobrać i zainstalować. Microsoft udostępnił kilka wersji tego narzędzia. Najnowsza, 1.2, pojawiła się w czerw cu 2010 roku i um ożliwia program ow anie z wykorzystaniem platform y .NET 4.0. O m aw iany pakiet SDK można łatwo znaleźć, wpisując „W indows Azure Tools for Microsoft Visual Studio” w wy­ szukiwarce. Jeśli na komputerze dostępna jest starsza wersja pakietu, warto pobrać i zainstalować edycję 1.2.

Rozdział 25. Aplikacje działające w chmurze i technologia Windows Azure

Kliknięcie szablonu projektu Enable Windows Azure Tools pow oduje utw orzenie prostego projektu Visual Studio, który wczytuje stronę HTM L z odnośnikiem umożliwiającym pobranie pakietu. Na rysunku 25.2 pokazano projekt w środow isku IDE. Następnie należy kliknąć przy­ cisk Download Windows Azure Tools, co spow oduje przejście d o w itryny M icrosoftu, skąd można pobrać pakiet (należy zapisać go na dysku tw ardym ). Pobierany pakiet SDK nosi nazwę VSCloudService.exe. Należy uruchom ić plik, aby zainstalo­ wać szablony Visual Studio i narzędzie DevFabric. Pakiet SDK obejm uje następujące elementy:

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

• szablony projektów dla języków C# i Visual Basic przeznaczone do budow ania witryn oraz usług działających w chm urze; • narzędzia do dodawania, usuw ania i konfigurowania ról w chm urze (więcej o rolach za chwilę); • narzędzie DevFabric służące do lokalnego em ulow ania pracy chm ury na kom puterze program isty; • usługi platform y Azure do zarządzania przechowywaniem danych na etapie progra­ m ow ania; • usługi kompilacji i tw orzenia pakietów przydatne do w drażania usług oraz aplikacji działających w chmurze. Przed zainstalow aniem pakietu SDK trzeba się upewnić, że na kom puterze działa serw er IIS z obsługą ASP.NET. Jeśli elem enty te są niedostępne, przy próbie instalacji pakietu SDK insta­ lator wyświetli błąd pokazany na rysunku 25.3.

Rozdział 25. Aplikacje działające w chmurze i technologia Windows Azure Rysunek 25.3. Do korzystania z pakietu Azure SDK konieczny jest serwer IIS i obsługa ASP.NET



W indow s £ Azure’*' To ols for M icrosoft S ' V isu al S tu d io S Installation W izard

O

Setup has detected that ths computer does not meet the reojremerts to nstal the software. The fotowmgbloding issues must be resolved before you car. nstal Windows® Azure’** Tods for Microsoft^ Visual Stuck)*.

Lnstaltatlpn Requirements: The Windows Azue SDK repures Internet Information Services 7.0 with ASP.fCT Apdcacon Development components nstated.

**a se se t

K axt'~ Toob for H o m o ft* Vsud Studw t readme far more nfwmatlor.

y Serwer IIS i obsługę ASP.NET można zainstalować w oknie dialogowym Funkcje systemu Windows ( Sturt/Panel sterowania/Odinstaluj program/Wlącz lub wyłącz funkcje systemu Windows). Na rysunku 25.4 pokazano podstawowe ustawienia potrzebne do zainstalow ania potrzebnych narzędzi w systemach W indow s 7 i Vista. Rysunek 25.4. Serwer IIS i obsługę ASP.NET można zainstalować w oknie dialogowym Funkcje systemu Windows

C zę ść V Tworzenie aplikacji dla przedsiębiorstw O statni krok polega na ponownym uruchom ieniu instalatora pakietu SDK (pliku VSCloud ^Service.exe). Instalator sprawdzi wersję środowiska Visual Studio i zainstaluje odpow iednie narzędzia. W arto zauważyć, że m ożna zainstalować pakiet SDK dla środowiska V isual Studio 2008 SP1 i 2010. Na rysunku 25.5 przedstawiono pierwszy ekran instalatora. Rysunek 25.5. Instalator pakietu SDK platformy Azure wykrywa wersję środowiska Visual Studio i instaluje odpowiednie szablony

I to już wszystko. Środowisko programistyczne jest gotowe do rozpoczęcia lokalnego budow a­ nia aplikacji na platform ę Azure. W arto zauważyć, że trzeba jeszcze utworzyć konto do h o stin ­ gu w platform ie Azure. Omawiamy to w dalszym punkcie. Po zainstalow aniu pakietu SDK można też zasymulować pracę aplikacji na platformę Azure.

Role w platformie Azure W aplikacjach na platformę Azure dostępne są role. Role wyznaczają typ projektu, m etody przechowywania aplikacji i sposób zakupu hostingu na platform ie Azure. Obecnie dostępne są dwie role: W eb i W orker. Rolę aplikacji m ożna określić w modelu usługi. Model tego rodzaju to m etadane inform ujące mechanizm A ppFabric o tym, jak należy przydzielać zasoby aplikacji i jak ją przechowywać. Można wybrać rolę W orker lub Web. Rola Web służy do tworzenia aplikacji udostępnianych w sieci W W W . Są to aplikacje: ASP.NET, ASP.NET MVC 2 i WCF. Po stronie platformy Azure aplikacje o roli Web są wykonywane na ser­ werze IIS7 w środowisku ASP.NET 3.5 SP1 lub 4.0 (obsługiw any jest też kod natywny). Rola Worker działa inaczej. Jest przeznaczona dla aplikacji, które przetwarzają dane w tle i zwykle nie mają adresu w sieci WWW. M ożna traktować je jak pliki DEL usług system u W indow s. Oczywiście, aplikacje o roli W orker m ają dostęp do tabel, obiektów blob i kolejek platform y

Rozdział 25. Aplikacje działające w chmurze i technologia Windows Azure Azure. Są doskonałym rozw iązaniem do przetw arzania kom unikatów od użytkowników, w prow adzonych w program ach o roli Web (tak działa na przykład Tw itter). Po zastosowaniu hosta m ożna uzyskać dostęp do platformy .N E T i urucham iać kod natywny. Dostępny jest też port T C P do kom unikow ania się z aplikacjami o roli W orker.

Uwaga Warto zauważyć, że aplikacje o obu rolach (Web i Worker) są przechowywane w odpowiednikach systemu Windows Server 2008.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Po wybraniu szablonu Windows Azure Cloud Service pojawia się następne okno dialogow e —

New Cloud Service Project. 'I'u m ożna zdefiniować projekty składające się na rozw iązanie wdrażane w chm urze. Dostępne są projekty ASP.NET, WCF i inne. O drębne okno dialogow e umożliwia dodanie projektów rozwiązania, tak aby narzędzia platform y Azure mogły popraw ­ nie zdefiniować skrypty konfiguracyjne w czasie generowania szablonów projektu. Na rysunku 25.7 pokazano przykładowe ustawienia. Rysunek 25.7. Okno New Cloud Service Project umożliwia skonfigurowanie w rozwiązaniu jednej lub kilku aplikacji działających w chmurze

New Good Service Pro-ect

?... s

.NET Framework 4 rotes:

Cloud Service Solution:

v Visual Basic -

■ gH

V h u lIC * Q

UnleashedC loud Feedback Web ASP.NET W eb Role .

ASP.NET Web Role Application with a Web user interface

-a * __ Q

ASP.NET MVC 2 W eb Role Application with a W tb user interface us*..

--W *

W Cf Service Web Role Web Role for WCF Services

j

J

.

*

>
.

W ie rs z :

{ 1 > . Do:

'{Z}'."

Rozdział 25. Aplikacje działające w chmurze i technologia Windows Azure 4. D odajm y do witryny nową stronę i nazwijmy ją ViewFcedback.aspx. Strona posłuży do w ybierania partycji z inform acjam i zwrotnymi (według miesiąca i roku) oraz wy­ św ietlania jej adm inistratorom . W tej wersji ad m in istrato r może zaznaczyć wiado­ m ość i oznaczyć, że udzielono na nią odpowiedzi. 5. Teraz trzeba umieścić na stronie pole tekstowe i przycisk, aby umożliwić użytkow ni­ kom podanie partycji zwracanej z bazy danych. W kodzie strony należy określić, że dom yślnie partycja m a dotyczyć obecnego miesiąca i roku. M ożna też zastosować kontrolkę kalendarza. 6. D odajm y do strony kontrolkę G ridView. Należy użyć znacznika inteligentnego, aby zdefiniow ać nowe źródło danych do powiązania z kontrolką. W kreatorze konfiguracji źródła danych należy zaznaczyć Object jako typ źródła danych i wybrać obiekt FeedbackDataSource. Jeśli obiekt jest niedostępny, należy zamknąć kreator i skompilować rozwiązanie. W zakładce SELECT jako metodę pobierania danych należy wybrać metodę Select. Przykładowe ustawienia pokazano na rysunku 25.16.

Na stronie Parameters należy ustawić opcję Parameter source: na Control i wybrać utw orzone wcześniej pole tekstow e na partycję. Przypiszm y do p aram etru nazwę partitionM m Y yyy i zakończm y pracę kreatora. W ostatnim kroku można użyć znacznika inteligentnego kontrolki G ridV iew i kliknąć pole w yboru Enable Selection, aby umożliwfić zaznaczenie wierszy.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw 7. Następnie dodajmy etykietę, która będzie wyświetlać użytkownikom wybraną partycję. 8. Na zakończenie dodajmy przycisk. Ma on uruchamiać zdarzenie, które będzie d o d a­ wać do elem entu w tabeli oznaczenie informujące, że w ysłano odpowiedź na daną wiadomość. Na rysunku 25.17 pokazano wygląd przykładowej strony. rsrirs. Ł a

VS2010U nleashedFeedback - M icro so ft V isu a l Studio

File

Ed*

View

Project

Build

Debug

Team

Data

Format r

-V Ś

; (N ew In lin e S tyle) View feed back.asp K*

Table

Tools

Test

Debug

Help ■

n yC P U

3

None

Window

B/ u A



■processtravelrequest ■---

• -1 3 ',:-

m •j := i=:

X

Site Mastei

Visual Studio 2010. Księga eksperta ContentPlaceH olderH am (Custom

Wpisz m iesiąc i rok w formacie (MMRRRR). czvli (022010 [ L a b e lD a ta P a r titio n ] k rU f I n a z w tv k o

(m a il Dalafcou'xt

Zazn acz

ta to fn » a q c

O d p o w ird z7

Data bound

W ystano?

C zas

K h ic z w w rs z a

: n r MM d

Databound

Databouvl

Databound

.M MM:

^abound

MM MM

Databound

[ atac 3ui :

. utaf:.-n

^ atabcurd

Databound

Databound

Datafccurd

[ MMMUM

Databound

Databound

:a-if . -

Data bound

Databound

O znaczono, że udzielono odpowiedzi!

[ul Design

rd Split

aj Source

1* «Vr>e here far you. Get support n o *

J I 'X



:.::.;

. :

^

______________M ł c r o s o t t

Rysunek 25.20. Usługi platformy Azure można zakupić w serwisie Microsoft Online Services Customer Portal

7. Pod koniec procesu zakupu należy kliknąć odnośnik Proceed to Activation, aby ro z­ począć proces aktywowania. Trzeba wpisać nazwę subskrypcji. Nazwa służy wyłącznie do identyfikowania subskrypcji na rachunkach. Należy też podać adm inistratora witryny. W arto zauważyć, że kto inny m oże być w ła­ ścicielem konta (ta osoba opłaca rachunki), a kto inny — adm inistratorem technicz­ nym w itryny.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw 8. Ostatecznie właściciel otrzymuje e-mail z potwierdzeniem, że konto jest skonfigurowane i gotow e do użytku. Należy kliknąć odnośniki w w iadom ości, aby rozpocząć pracę. Jeśli e-m ail zostanie usunięty, m ożna wrócić do w itryny, aby wyświetlić status akty­ wacji (aktywowanie zajmuje od kilku m inut do 24 godzin) i odnośniki do konta. K onto potrzebne do opłacenia usług Azure pow inno być ju ż gotowe. Przyjrzyjm y się teraz konfiguracji technicznej i etapom w drażania.

Tworzenie konta do przechowywania danych Teraz, kiedy kon to w platformie Azure jest już gotowe, trzeba je skonfigurować pod kątem przechowywania danych i hostingu. W przykładzie w tabelach platform y Azure przechow y­ wane będą dane o informacjach zwrotnych. Skonfigurowanie k o n ta do przechowywania danych powoduje utworzenie adresowalnego punktu końcowego, którego aplikacja używa do kom uniko­ wania się z magazynem danych. Punkt końcowy wymaga klucza dostępu generowanego w czasie tworzenia konfiguracji. W poniższych punktach opisano tw orzenie konta do przechowywania danych w Azure. 1. Należy zalogować się do platform y Azure (można użyć odnośnika z e-maila z potw ier­ dzeniem założenia konta) i otw orzyć stronę Summary z listą M y Projects. W idoczny pow inien być projekt skonfigurow any w czasie rejestracji. Przykładowe ustaw ienia pokazano na rysunku 25.22.

Rysunek 25.22. Należy kliknąć projekt na liście My Projects, aby go skonfigurować

Rozdział 25. Aplikacje działające w chmurze i technologia Windows Azure 2. W ybierzm y projekt, klikając jego nazwę. Należy przejść d o witryny, gdzie widoczny jest bieżący stan projektu. Ponieważ witryna jest nowa, nie zawiera wielu inform acji. W prawej górnej części strony znajduje się odnośnik New Service. Należy go kliknąć, aby dodać do projektu usługę związaną z przechow yw aniem danych lub hostingiem . O dnośnik pokazano na rysunku 25.23. AH Services • W in d o w i In te rn e t Exp lo rer ^



http s

ć

■.j K Favorites

a :u re c o rn

1Cj ^j

AU Services

Windows Azure Platform

*

-



*

Page •

Safe t) »

Toote ▼

Mike Windows Azure

SQ LAziee

Appfabnc



v

■Mfrr-ineM-£nun com Brtltng | P ro ftd i * | v ę n out

Marketplace

W indows Azure N rw IfT O f

P *

fc^>

S e a rch M SD N

Sum m ary

Account

H elp and Resources

W indo w s A zure HeOo C loud S ile

New Service

-T* Create Marketplace tiiL n a

Visual Studio 2010 Unleashed

SQL A zure A p p Fab ric

H ello Cloud Site

M a rk e tp la c e

N e e d H e lp G e t t in g S t a r t e d ?

na

& Learn more about W indows

Arute

ser/Ko.

(1 item rem aining) D ow nloading p ictu re h ttp s://sto ro g e.W e com /m ydata/m yproffo/ Z ...:

Check cwt the torums. See what others tn the community are building.

&

^

In tern et | Protected M o d e O r

Rysunek 25.23. Należy kliknąć odnośnik New Service, aby skonfigurować usługi przechowywania danych lub hostingu

3. O dnośnik New Service powoduje przejście do strony w idocznej na rysunku 25.24. Należy kliknąć odnośnik Storage Account, aby rozpocząć konfigurowanie konta do przechow yw ania danych. 4. M ożna ustawić nazwę i opis służące do identyfikowania usługi w konsoli ad m in istra­ cyjnej. Przykładowe ustawienia pokazano na rysunku 25.25. 5. Zdefiniujmy niepowtarzalną nazwę DNS w celu określenia adresu usługi do przechowy­ wania danych (zobacz rysunek 25.26). Nazwa posłuży d o w ygenerow ania p u n k tu końcowego po kliknięciu przycisku Create w dolnej części strony. Należy wpisać n a ­ zwę w polu tekstowym i użyć przycisku Check Availability. Nazwa stanie się częścią identyfikatora URI, dlatego musi być niepow tarzalna w narzędziu AppFabric. S tano­ wi to gwarancję, że dane m ożna zidentyfikować za pom ocą punktu końcowego.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

| l192 |

Rozdział 25. Aplikacje działające w chmurze i technologia Windows Azure

Inna opcja na stronie to Storage A ffinity Group. Opcja umożliwia ustawienie nazwy, której narzędzie AppFabric może użyć do kolokacji odpowiednich elementów aplikacji. Jeśli funkcja ta nie jest potrzebna, m ożna zezwolić narzędziu AppFabric na ok reśle­ nie, w jaki sposób elem enty m ają zostać rozmieszczone. T u jednak określimy nazwę, aby zapewnić, że kod związany z przechow yw aniem danych i hostingiem znajdzie się blisko siebie. Należy wybrać region centrum danych. 6. Kliknijmy przycisk Create, aby w ygenerow ać punkty końcow e dla magazynu danych. Może to zająć kilka m inut. G en ero w an y jest też głów ny i pom ocniczy w spółużyt­ kowany klucz niejawny, który posłuży do uw ierzytelniania jednostek wywołujących usługę. Na rysunku 25.27 pokazano przykładow e ustaw ienia. W arto zauważyć, że jeśli klucze zostaną skradzione, m ożna użyć przycisku Regenerate do utworzenia ich n o ­ wych wersji.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Tworzenie konta usług hosted service Teraz trzeba utworzyć usługę hosted service, która posłuży do w drożenia kodu. Usługa będzie działać w środowisku ASP.NET i reagować na żądania HTTP od użytkowników. 1. Aby rozpocząć, należy wrócić do stro n y z informacjami o projekcie w adm inistracyj­ nej aplikacji sieciowej w Azure (należy wybrać opcję Sum m ary w górnej części strony). U góry strony powinien pojawić się elem ent związany z przechow yw aniem danych (Unleashed Feedback Store). Należy kliknąć odnośnik New Service w prawej części strony, tak jak zrobiliśmy to w oknie widocznym na rysunku 25.23.

Rozdział 25. Aplikacje działające w chmurze i technologia Windows Azure 2. Tym razem wybierzmy usługę Hosted Services (zobacz rysunek 25.24). 3. Pierwszy krok wymaga zdefiniowania nazw)’ i opisu usługi, tak jak zrobiliśmy to wcześniej (zobacz rysunek 25.25). Tym razem nazwijmy usługę Unleashed Feedback Web. 4. Następny etap polega na zdefiniow aniu identyfikatora URI usługi. Tym razem form at identyfikatora to [nazwa u s łu g i] . c lo u d a p p . n et. Nazwa DNS musi być niepow ta­ rzalna, poniew aż jest to publiczny identyfikator URI pełniący funkcję adresu w in te r­ necie. Można użyć tej samej nazwy, którą przypisano kontu do przechowywania danych. Na tej samej stronie trzeba wybrać grupę opartą na podobieństw ie (na panelu Affinity Group). Ponieważ utworzyliśmy grupę we wcześniejszym kroku. Azure przyjmuje, że chcemy jej użyć. Jest to słuszne założenie, ponieważ grupa jest częścią tej samej ap li­ kacji. Przykładowe ustawienia pokazano na rysunku 25.28.

5. Po kliknięciu przycisku Create na stronie widocznej na rysunku 25.28 przejdziem y do strony z usługą hosted service. Powinny pojawić się dwie wersje — Production i Staging. Jeżeli jedna z nich jest niewidoczna, m ożna kliknąć pasek ze strzałką, aby rozwinąć listę.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Na stronie m ożna wdrożyć rozwiązanie w wersji Staging, przetestować je, a następnie wdrożyć w wersji Production, kiedy będzie gotowe. Na rysunku 25.29 pokazano przy­ kładowe ustawienia. W arto zauważyć, że można też zmienić grupę opartą na p o d o ­ bieństwie, zarządzać certyfikatami (na potrzeby protokołu HTTPS) lub usunąć usługę.

£ &

New «

Search M SD N

W indows Azure

.

Service

- •

S u m m a ry •

Windows Azure

Unleashed Feedba... •

JJJJJI

H e lp a n d R e s o u rc e s

• •; •

HeMoCloud Stfe

S Q L A z u re

A ccount

tang

Visual Studio 2010 Unleashed | Unleashed Feedback Web PwOMliOft. .. The w eb



------------------------------------- —

site for the Unleashed Feedback Example.

.................... ................. ..................

; Delete Service

-Ed>t

|

A p p Fab rk

M arketplace

H to tg fl > ■ > .«

Przygotowywanie aplikacji do publikacji Przypomnijmy, że utw orzona aplikacja zawiera łańcuch połączenia z tabelam i platformy Azure. Łańcuch skonfigurowano pod kątem środow iska program istycznego. Trzeba go zm odyfiko­ wać, tak aby działał w wersji produkcyjnej. Można to zrobić na kilka sposobów. Po pierwsze, m ożna wdrożyć aplikację na platform ie A zure, a następnie użyć witryny administracyjnej do zmodyfikowania XML-owej konfiguracji za pomocą łańcucha znaków. Inny sposób to ustawienie łańcucha połączenia w Visual Studio i późniejsze wdrożenie wersji gotowej do pracy w środowisku produkcyjnym (nie jest przy tym konieczna zm iana konfiguracji). Poniżej opisano to drugie podejście.

Rozdział 25. Aplikacje działające w chmurze i technologia Windows Azure

2. Zaznaczmy w iersz StorageCnnStr. Należy kliknąć przycisk z wielokropkiem po prawej stronie wiersza, aby otworzyć okno dialogow e Storage Connection String widoczne na rysunku 25.31. 3. Trzeba zaznaczyć opcję Enter Storage Credentials i podać nazwę konta do przechowywa­ nia danych (tu jest to visualstudiounleashed, jak pokazano na rysunku 25.26). W polu na klucz konta należy wprowadzić w spółużytkowany niejawny klucz wygenerowany dla usług przechow yw ania danych. Aby znaleźć te informacje, należy wrócić do wi­ tryny w platform ie Azure i zaznaczyć usługę do przechowywania danych ( Unleashed

Feedback Store). Potrzebny jest klucz Primary Access Key widoczny na rysunku 25.27. Można użyć opcji Use Default HTTP Endpoints do określenia, że punkty końcowe są ustawione za pom ocą nazwy konta i nazewnictwa standardowego dla platformy Azure.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Rysunek 25.31. Należy zmodyfikować łańcuch połączenia, aby prowadził do konta w platformie Azure

Storage C onnection String Use developm ent storage ® Enter storage credentials To generate a storage connection string, en ter an account nam e and key. To use cu sto m endpoints, o ne of the Blob, Table or Q ueue endpoints m ust be specified. A ccount n am e

vtsualstudiounleashed

A ccount key.

0YAF30Nm5ANrhW18Y5UphWlN2XiOuZnHQXnP7/O8ccsPFnZJF*yF* *3* qBuoSWpEOnc

C onnection • Use default HTTP endpoints Use default HTTPS endpoints Use custom endpoints Blob endpom t



Table endpoint Q ueue en d p o m t

:

Cancel

4. Powtórzmy te kroki dla łańcucha DiagnosticConnectionString (nad łańcuchem Storage

CnnStr w zakładce Settings), który inform uje platform ę A zure, gdzie ma zapisać in ­ formacje diagnostyczne. Możliwe pow inno być wybranie tej samej nazwy konta, któ rą w pisano dla łańcucha StorageCnnStr. N astępnie Visual Studio automatycznie w prow adzi klucz konta. P o ­ nadto należy koniecznie zaznaczyć punkty końcowe protokołu HTTPS. Przykładowe ustawienia pokazano na rysunku 25.32. Rysunek 25.32. Dla łańcucha DiagnosticConnectionString należy użyć protokołu HTTPS

Dla łańcucha DiagnosticConnectionString należy użyć protokołu HTTPS

Use development storage o Enter storage credentials To generate a storage connection string, enter an account nam e an d key. key To use custom endpoints, one of the Blob, Table or Q ueue endpoints m u st be specified. specified Account name: name;

visualstudiounleashed

Account key

0YAF30Nm5ANrhW18Y5UphWlN2X.OuZnHQXnP7/O8ccsPFnZJFxyF**3*q!9uo5WpEOn< 0YAF30Nm5ANrhW18Y5UphWlN2XiOuZnHQXnP7/O8ccsPFnZJFxyF**3*q»u©5WpEOnc

Connection C o n n e c tio n Use default HTTP endpoints *—■o Use default HTTPS endpoints Use custom endpoints Blob endpoint endpoint endpoint:t Table endpom Queue endpoint:

.----------

_ancei

Aplikacja jest gotowa do w drożenia w w itrynie platform y Azure. W następnym punkcie opisa­ no proces wdrażania. Trzeba pamiętać o tym, aby w czasie u ru ch am ian ia aplikacji w środow i­ sku lokalnym zmienić łańcuch połączenia z pow rotem na Use Development Storage.

Rozdział 25. Aplikacje działające w chmurze i technologia Windows Azure

Publikowanie i wdrażanie aplikacji w chmurze Są dwa sposoby na w drożenie aplikacji w platform ie Azure. Pierwszy to ręczny proces oparty na witrynie windowsazure.com. Drugi polega na bezpośrednim zastosowaniu środowiska Visual Studio (funkcję tę w prow adzono w wersji 1.2 pakietu SDK). W dalszych podpunktach opisano oba sposoby.

Ręczne publikowanie i wdrażanie usługi działającej w chmurze Trzeba utworzyć dwa pliki, które posłużą do skopiowania witryny do chm ury. Pliki są genero­ w ane przez Visual Studio (więcej na ten tem at za chwilę). Pierwszy plik ma rozszerzenie .cspkg. Jest to skom presow any plik zawierający cały kod witryny, który trzeba wdrożyć (strony .aspx, pliki .dli, rysunki i tak dalej). D rugi plik ma rozszerzenie .csfg i obejmuje inform acje o konfiguracji witryny. Pliki potrzebne do opublikowania aplikacji m ożna utworzyć albo za pomocą opcji Publish z m enu Build , albo klikając praw ym przyciskiem myszy projekt w oknie Solution Explorer i wybierając opcję Publish. W obu przypadkach pojawi się okno dialogowe Publish Cloud Service. Przykła­ dow e ustawienia przedstaw iono na rysunku 25.33. W arto zauważyć, że wybrana jest opcja Create Service Package Only. Inne opcje um ożliw iają bezpośrednie wdrażanie aplikacji (tej technice przyjrzymy się za chwilę). Rysunek 25.33. Przykładowe ustawienia dotyczące publikowania aplikacji

Kliknięcie przycisku OK w oknie dialogowym Publish Cloud Service inform uje środow isko Visual Studio, że należy wygenerować dwa pliki potrzebne przy w drażaniu. Visual Studio skompiluje aplikację i spakuje potrzebne pliki. N astępnie otworzy potrzebne przy w drażaniu pliki w odrębnym oknie, aby można je było wyświetlić. Na rysunku 25.34 widoczne są przy­ kładowe ustawienia.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Rysunek 25.34. Opublikowane, gotowe do wdrożenia pliki potrzebne w platformie Azure

«

Nazwa

VS2O10UnleashedFeedback ► b in

Data 'nodyfikacii

S«rviceConfiguratio n.cscfg

Typ

► Debug » Publish

Rozmiar

vS2010Unleashed

W arto zauważyć, że pliki są publikowane w katalogu [nazwa projektu]\bin\[debug lub release]\publish. Oczywiście, w czasie tworzenia ostatecznej wersji należy przełączyć opcję kom pi­ lacji na Release na pasku narzędzi środowiska Visual Studio.

Wdrażanie w środowisku testowym T eraz można wdrożyć rozwiązanie w środowisku testowym. Proces ten obejm uje przeniesienie dw óch utworzonych w czasie wdrażania plików do aplikacji o roli W eb. Należy wykonać n a ­ stępujące operacje: 1. Najpierw — jeśli wcześniej tego nie zrobiono — trzeba przejść do witryny dla program i­ stów używających platformy W indows Azure ( windows.azure.com ) i zalogować się. 2. Kliknijmy p rojekt na liście My Projects. Należy wybrać p ro jek t Visual Studio 2010 Unleashed. 3. W ybierzmy aplikację o roli Web z listy program ów i usług. A plikacja pow inna mieć nazwę Unleashed Feedback Web. 4. Powinniśm y znaleźć się na stronie administracyjnej aplikacji o roli W eb (zobacz ry­ sunek 25.29). Należy wybrać kostkę testową (opcja Staging). Jeśli jest niew idoczna, trzeba kliknąć pasek ze strzałką. Kliknijmy przycisk Deploy, aby uruchom ić stronę Staging Deployment widoczną na rysunku 25.35. 5. M ożna przesłać pliki z innego obszaru z systemu Azure. Tu jed n ak wyślemy je z lo­ kalnego dysku twardego. Należy kliknąć przycisk Browse z pan elu Application Package i wybrać wygenerowany wcześniej plik .cspkg. Tak sam o należy postąpić z plikiem .esefg z obszaru Configuration Settings. W ostatnim kroku zdefiniujmy nazwę wdrażanego rozwiązania i kliknijm y przycisk Deploy. 6. Po zakończeniu wdrażania, co może chwilę potrwać, pow inna ponow nie pojawić się strona adm inistracyjna aplikacji o roli Web. W trakcie w drażania (w czasie zajm ow a­ nia zasobów serwera, konfigurowania usług i tak dalej) w idoczny jest pasek postępu. W kolejce dla wersji testowej pow inna być widoczna zdefiniow ana wcześniej nazwa. Opcja Web Site URL ustawiona jest na GUID, co umożliwia platform ie Azure utw o­ rzenie testowego niepowtarzalnego wpisu DNS dla witryny przed przeniesieniem jej do środowiska produkcyjnego. Kostka testowa nie jest już pusta, co pokazano na rysunku 25.36. W arto ponadto zauważyć, że witryna jest zatrzymana. D ostępne są opcje Run, Delete, Upgrade i Configure. W itrynę przed uruchom ieniem trzeba skonfigurować.

Rozdział 25. Aplikacje działające w chmurze i technologia Windows Azure

Wine owsAzure'

:

t a n g Q

A ccou nt

S u m m a ry

N ew S e tv k e

Search MSDt

m

H e lp a n d R e s o u rc e s

W in d o w s A z u re U n le a sh e d Feed b a.,

unleashedFeta SQL

A z u re

A p p F a b r ic

Visual Studio 2010 Unleashed | Unleashed feedback Web Stag in g D e p lo ym en t A fifibutnnjfedgifl*.

................................... ..

.

.

.

.

.

.

M arketplace • Upload a file from your local storage Use a file from an Azure Storage account Select a file: C:\Users\M ike\Desktop\CODE\Unleashed\C Browse. j

Contauialion Settings • Upload a file from your local storage Use a file from an Azure Storage account Select a file: _____________________________ C:\Users\M ike\Desktop\CODE\Unleashed\C Browse. )

. Operating

System Settings

..................... ..

.

.

_

...

...

_

Guest Operating System substantially compatible with Windows Server 2008 Select OS Upgrade Method:* Automatic Manual Select OS Version: latest OS .Windows Azure Guest OS

What 15 Upgrade Mote? 1 .4

(RetajM •

Whal jffi.te e Qpt*c"s?

JUse configuration settings file to define Operating System settings , Semite OenlaynKtu Name . Choose a label for this deployment: RC

Deploy

Cancel

Rysunek 25.35. Należy podać wdrażane pliki i określić nazwę wdrażanego pakietu

7. Teraz m ożna kliknąć przycisk Run dla w itryny testowej (zobacz rysunek 25.36). U ru ­ chamianie m oże zająć trochę czasu — pięć m inut lub nawet więcej. Ponadto nazwę DNS trzeba rozesłać po serwerach platform y Azure. Jeśli w rócim y d o strony w czasie urucham iania, platform a Azure wyświetli informacje o postępie. Kiedy witryna zo­ stanie udostępniona, platform a Azure oznaczy ją symbolem Ready. 8. Teraz m ożna przejść do witryny za pom ocą opartego na identyfikatorze GUID adresu URL dla kostki testowej. Należy przetestow ać witrynę. Jeśli działa poprawnie, m ożna przenieść ją do środowiska produkcyjnego, co opisano dalej.

M ożna użyć przycisku Upgrade danej usługi hosted service, aby zaktualizow ać pakiet lub konfigurację aplikacji. Ponadto w d o ­ w olnym m om encie m ożna zaktualizować pojedynczą aplikację (o roli Web lub W orker).

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Seine* HSDN

kW] W indows Azure -f-

Summary

N fw Sendee

tjirig Q

Account

c a

Help and Resources

Windows Azure HeHo Cloud Stfe U n le a sh e d Feed to e..

unleashed SQL Azure

Visual Studio 2010 Unleashed | Unleashed Feedback Web '

i i iieiaaeaM B eeeaM M M M M ifc

. ■iii— i—

— .— i— .—.— ------- Łflł*

The web site for the Unleashed Feedback Example.

Delete Service

AppFabric M arketplace



........................

WARNING While your deployment is stopped, it continues to accrue charges. Please delete the stopped deployment if you no longer wish to be charged for it. For more details visit Windows Azure Priong FAOs.

Production

S tag in g RC

Deploy a Hosted Service package. ;

D e p lo y ..

90% of the time, this operation takes less than 87 seconds.

:

Upgrade^..

Rem

C o nfig u re...

.

D e le t e

UnlcashcdFccd back Web: © Stopped Web Site URL: http://85b34Qb8cldt4laS82de31e3af5c6d98.doudappjiet/ Deployment ID: 85b340b8cldc4faS82de31e34f5c6d98

Rysunek 25.36. Wdrożona witryna w kostce Azure Staging

Publikowanie i wdrażanie za pomocą Visual Studio Pokazaliśmy, jak ręcznie opublikować aplikację za pom ocą witryny platform y Azure. M ożna też automatycznie publikować aplikacje za pomocą Visual Studio. Umożliwia to okno dialogowe Publish Cloud Service (zobacz rysunek 25.33), gdzie dostępna jest opcja Deploy Your Cloud Service to Windows Azure. Aby rozpocząć pracę, trzeba udostępnić dane uwierzytelniające do konta platform y Azure. Jest to jednorazowa operacja konfiguracyjna. Należy użyć opcji Add z listy rozwijanej Credentials widocznej na rysunku 25.37. W oknie dialogowym Cloud Service Management Authentication trzeba udostępnić certyfikat x.509 v3 i identyfikator subskrypcji z platform y Azure. Jeśli program ista nie ma certyfikatu, może go wygenerować w Visual Studio. Identyfikator subskrypcji znajduje się w dolnej części strony Account w witrynie dla program istów używających Azure. Przykładowe ustawienia widoczne są na rysunku 25.38.

Rozdział 25. Aplikacje działające w chmurze i technologia Windows Azure Rysunek 25.37. Aby wdrażać aplikacje bezpośrednio w Visual Studio, należy podać dane uwierzytelniające do platformy Azure

Publish Cloud Service Create Service Package Ordy ® Deploy your Cloud Service to Windows Azure

Hosted Service: Credentials:

r 1

.

~

-

.

1

Storage A ccount to deploy through: . ' N ot connected >

J

P rom pt before deleting an existing deploym ent

D eploym ent Label VS2010UnleashedFeedback - 6/19/201011:15*.27 PM

Ofllmtimmyrtftcrocrt Rysunek 25.38. Można utworzyć konto uwierzytelniające platformy Azure

Cancel

:

Cloud Service M anagem ent Authentication Set up your credentials to authorize Visual Studio to m a n ag e and deploy to your W indows Azure a c co u n t

Hdp me ret.ua my credential 1. Create or select an existing certificate for authentication:

*

Windows Azure Tools - Azure Auth Cert

View

2. Copy th e full path of th e certificate to the clipboard, brow se to the API Certif Kates page of th e Developer Portal and upload the certificate. 3. Copy th e subscription ID for your account from th e Developer Portal: GCT-FROM-ACCOUNT PAGE-ON-DEY-PORTAL N am e th e se credentials: W mdowsAzureAccountUrleashed

Online privacy statem ent

C

OK

Cancel

Przed zamknięciem okna dialogowego należy najpierw pobrać certyfikat uwierzytelniający i prze­ słać go do witryny platform y Azure. Przesyłanie trzeba zacząć od kliknięcia odnośnika Copy the Full Path widocznego na rysunku 25.38. Następnie należy otworzyć stronę Account w w itrynie dla program istów i wybrać odnośnik Manage My API Certificates w górnej części ek ran u . Spowoduje to przejście do strony, na której można przesiać certyfikat. Kliknijmy przycisk Browse i wklejmy ścieżkę. W ostatnim kroku należy kliknąć przycisk Upload, aby przesłać certyfikat na platform ę Azure. Jest to je d ­ norazowa operacja. N astępnym razem wystarczy opublikow ać witrynę. W róćm y do Visual Studio i kliknijmy przycisk OK w oknie dialogowym Cloud Service M ana­ gement Authentication. Teraz Visual Studio pow inno nawiązać połączenie z witryną w p la t­ formie Azure i możliwe będzie wdrożenie aplikacji w wersji testowej i produkcyjnej. Przykładowe ustawienia widoczne są na rysunku 25.39. Po kliknięciu przycisku OK w celu w drożenia aplikacji w platform ie A zure Visual Studio w y­ świetli dziennik Windows Azure Activity Log. D ziennik obejm uje inform acje o stanie i pow o­ dzeniu procesu wdrażania, co pokazano na rysunku 25.40 (zobacz panel w dolnej części ekranu).

^L2c3

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

| l204 |

Rozdział 25. Aplikacje działające w chmurze i technologia Windows Azure adm inistracyjnej aplikacji o roli Web i przejście ze środowiska testowego do produkcyjnego (zakładam y, że witryna została już wdrożona i przetestowana w środow isku testowym). Oczywiście, można też ponow nie wykonać opisane wcześniej operacje i wdrożyć pliki w kostce produkcyjnej. Jednak łatwiej jest kliknąć przycisk, aby przejść między środow iskam i testowym i produkcyjnym (zobacz rysunek 25.41). Kliknięcie powoduje przejście między środowiskami testowym i produkcyjnym

( Upgrade...

| (

Suspend J Delete

[^Configure... i

[ upgrade...

j

| |

Suspend

|

Oelete

i [ Configure... ]

UnU—hddfeedbackWeb:________________________________ Unl«»»h«dF— db»ckWtb:________________________________

Rysunek 25.41. Można przejść między środowiskami testowym i produkcyjnym, aby szybko wdrożyć wersję testową

Po wdrożeniu (lub przeniesieniu) aplikacji możliwe powinno być przejście do witry ny w in te r­ necie za pomocą zdefiniowanej nazwy DNS. Będziemy zaszczyceni, jeśli Czytelnicy zechcę sprawdzić aplikację i wpiszą zdefiniow aną dla strony nazwę DNS. Aby przesłać do nas informacje zwrotne na temat książki, należy wpisać adres URL w przeglądarce i odwiedzić wdrożoną wersję witryny. Oto adres: http://visualstudiounleashed.

cloudapp.net/. Stronę pokazano na rysunku 25.42. Postaram y się prowadzić witrynę przez pewien czas po opublikow aniu książki. Czekamy na inform acje od Czytelników.

Następne kroki Był to kolejny długi przykład, jednak mamy nadzieję, że udało nam się odpowiedzieć na w ięk­ szość istotnych pytań dotyczących stosowania Visual Studio 2010 d o budow ania rozwiązań na platform ę Azure. Nadal trzeba jednak zapoznać się z wieloma zagadnieniam i. W arto zająć się następującymi tematami: • Dodawaniem komunikatów do kolejek w Azure po zostawieniu informacji zwrotnych przez użytkowników; należy utworzyć w tym celu aplikację o roli W orker do p o b ie­ rania kom unikatów i pow iadam iania adm inistratorów o inform acjach. • Nadawaniem w itrynom rzeczywistych nazw domenowych (innych niż cloudapp.net). • Siedzeniem i m onitorow aniem aplikacji działających w chm urze.

u iO |d x3 u o t|n |o $ £ «

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Wskazówka Microsoft udostępnił też pakiet Windows Azure Platform Training Kit. Można znaleźć go w witrynie Azure. Pakiet obejmuje dodatkowe ćwiczenia, prezentacje i filmy wideo na temat platformy Azure.

Rozdział 25. Aplikacje działające w chmurze i technologia Windows Azure

Podsumowanie W tym rozdziale przedstaw iono podstawy dotyczące platformy W indow s Azure, w tym konfi­ gurow anie środowiska uruchom ieniow ego w celu uruchom ienia lokalnej wersji narzędzia A ppFabric i usług przechow yw ania danych platform y Azure. Aby uzyskać dostęp do tych elem entów i szablonów projektów w Visual Studio, trzeba pobrać oraz zainstalować pakiet SDK (w czasie pow staw ania książki dostępny był w wersji 1.2). W rozdziale przedstawiliśmy też, jak zbudować aplikację o roli Web na platform ę Azure. Utworzy­ liśmy w’ Azure konta do hostingu i przechowywania danych. Ponadto skonfigurow aliśm y i w d ro ­ żyliśmy aplikację w środow isku produkcyjnym. Czytelnicy powinni m óc wykorzystać te p o d ­ stawy do tworzenia i w drażania własnych aplikacji działających w chm urze.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Skorowidz !, 136

, 386

!=, 135

, 386

#End Region, 368

, 386

#endregion, 368 #region, 368

, 782 =, 135

#Region, 368

==, 135

$ C A LLE R , 504 $ FU N CTIO N , 504 &, 135,136

A

&&, 136

Abstract, 121

.N ET, 23, 175

Access, 993

.N E T Framework 4, 74

Access board section 508, 734

.N E T Framework Components, 831 //H ACK, 394

AccessDataSource, 800,993 Accessibility Validation, 289 Accordion, 917

//TO DO , 394 @Page, 769 @Register, 804

Action, 175, 745, 1154 ActionsPane.StackOrder, 1150

@WebService, 1018, 1019 \ 136

ActionsPaneControll, 1150 Activate, 574

|,136

Active Template Library, 41

||, 136 +, 135

ActivePoint, 601

, 774 , 773 , 804 , 165 , 144 , 782

ActiveWindow.Object.Getltem, 620 Activity, 1068, 1077 Activity Designer, 1068, 1069 Activity Designer Library, 1066 Activity Library, 1065 ActivityXamlServices.LoadQ, 1080 Add ASP.N ET Folder, 725, 771

, 782 , 386

Add Connection, 944

, 386, 388

Add Correlation Initializers, 1112

, 386 , 386

Add Database Reference, 970 Add New Data Source, 976

, 386

Add New Item, 56, 189, 340, 680, 728, 737,738, 758,

, 386

Add Controler, 814

765, 827, 1018

, 386 , 386

niestandardowe szablony, 341 Add New Project, 809, 1017, 1043

, 386 , 386

Add New Stored Procedure, 956

, 386

Add New Trigger, 960 Add New User Control, 290

, 386 , 386 , 386

Add New Test, 403, 433

Add Reference, 86, 730, 731 Add Related Tables, 948

Skorowidz Add Service Reference, 730, 1033,1034, 1036

aplikacje klienckie, 1064

Add Stored Procedure, 971

aplikacje konsolowe, 242

Add Style Rule, 271,758, 759, 760

aplikacje L1NQ to SQL, 996

Add Task List Shortcut, 395 Add User Control, 655

aplikacje MEF, 690 aplikacje nadrzędne, 689

Add View, 818

aplikacje okresowo nawiązujące połączenie, 71

Add Web Reference, 730, 1035

aplikacje oparte na usługach sieciowych ASP.NET, 1015

Add-in, 51 A ddin, 562 Add-in Manager, 639,653

aplikacje oparte na usługach W CF, 1041

Add-in Wizard, 677

aplikacje równoległe, 520

AddNamedCommand2,651 AddToCollection, 1087

aplikacje SharePoint, 45, 52 aplikacje Web 2.0, 904

A D O .N E T , 175

aplikacje Web Form, 808, 809

A D O .N E T Data Service, 728

aplikacje wielowątkowe, 176, 515

A D O .N E T Entity Data Model, 69, 812, 1001

aplikacje WinForm, 44

adres U RL, 807, 1016 Advanced compile options, 207 AggregateCatalog, 691 AJAX, 53, 58, 904 kontrolki, 58 UpdatePanel, 58

aplikacje rozproszone, 63

aplikacje XAML dla przeglądarek, 48,922 aplikacje ASP.NET, 44, 54, 63, 714 definiowanie sposobu kompilacji, 731 diagnostyka, 736 docelowa wersja platformy .NET, 733 dodawanie referencji, 730

UpdateProgress, 58 A JAX Client Behavior, 728

dodawanie stron internetowych, 737 dostępność, 733

A JA X Client Library, 728

interfejs użytkownika, 746

A JAX Control Library, 728

katalogi, 726

Ajax Control Toolkit, 915 kontrolki, 917 stosowanie kontrolek, 919

kompilacja, 731 kompozycje, 770

Ajax Extensions, 905,907

opcje konfiguracyjne, 729 pliki, 727

A JAX Master Page, 727

położenie kontrolek, 747

AJAX-enabled W CF Service, 728 aktualizacja częściowa, 907

prekompilacja, 736 projekt, 715

aktualizacja danych w modelu ED M , 1007

projektowanie interfejsu użytkownika, 746

aktualizacja lokalnego systemu pomocy, 313

referencje, 729

aktualizacja schematu bazy danych, 968 aktywne odnośniki, 365

serwer, 735 Silverlight, 736

AlwaysVisibleControlExtender, 917

skórki, 770

analiza kodu, 470

strony wzorcowe, 765

Anchor, 834, 835

układ strony, 747

anchoring, 833 And, 136

wdrażanie, 549 web.config, 55

AndAlso, 136

właściwości, 729

animacja, 862

zachowanie podczas ładowania strony, 735

aplikacje, 43 aplikacje .NET, 43 aplikacje AJAX, 58 aplikacje Azure, 1170

zgodność ze standardem dostępności stron

aplikacje biznesowe, 68, 71,72 aplikacje ClickOnce, 535

H TM L, 735 aplikacje ASP.NET M VC, 805, 917 Accept Verbs, 816 ActionResult, 815 adres URL, 807

Skorowidz Application_Start, 819 Content, 812 Controllers, 811 Create, 815 dane, 805, 806 definiowanie przekierowań adresów URL do kontrolera, 819

uruchamianie aplikacji do obsługi procesu, 1124 usługa, 1104 utrwalanie procesów, 1116 aplikacje działające w chmurze, 64,1158 instalacja usługi w chmurze, 66 konfiguracja aplikacji o roli Web, 1186

dodawanie mechanizmów, 812

projekt, 64, 1175 przenoszenie do środowiska produkcyjnego, 1204

dodawanie rekordów do modelu, 815

przygotowanie aplikacji do publikacji, 1196

kodu interfejsu użytkownika, 806 kontroler, 806,807 model, 805, 806

publikowanie aplikacji, 66, 1199

model przetwarzania żądań, 807 Models, 811

rozwijanie aplikacji, 1175 tworzenie, 1160,1170 tworzenie interfejsu o roli Web, 1180 tworzenie modelu danych opartego na tabeli, 1175

projekt, 809

uruchamianie aplikacji, 64

przekierowanie adresów URL, 819

wdrażanie, 1188,1199 wdrażanie w środowisku testowym, 1200

RegisterRoutes, 819 Scripts, 812 struktura katalogów, 810 szablon aplikacji, 805

aplikacje Office, 1135 projekt, 1135 aplikacje sieciowe, 44, 54,282,715

testowanie, 809

diagnozowanie, 470

tworzenie kontrolera, 814

projekt, 715 wiązanie danych, 989

tworzenie modelu, 812 tworzenie projektów, 809 tworzenie widoku, 817 UrlRoutingModule, 807 uruchamianie aplikacji, 820 View, 815

aplikacje Silverlight, 44, 59, 736, 934 interfejs użytkownika, 935 kontrolki, 936 MainPage.xaml, 935 pokaz slajdów, 936

ViewResult, 815 Views, 811

projekt, 59, 934 strona XAML, 935

widok, 805, 806, 807

tworzenie, 60, 934,935 wybór rodzaju klienta, 61

zalety platformy ASP.NKT MVC, 808 żądania HTTP, 807 aplikacje do zarządzania procesem, 1062,1096 baza danych, 1099 biblioteka dostępu do danych, 1100

aplikacje Windows, 46, 271 dodawanie kontrolek do formularza, 273 dostosowywanie wyglądu formularza, 273 formularze, 273

dodawanie usługi do utrwalania procesu, 1116

kontrolki, 273

dostęp do danych, 1108 komunikacja z pamięcią trwałą, 1118 pamięć trwała, 1117

pisanie kodu, 277 projekt, 46, 272, 826 rozmieszczanie kontrolek, 275

projekt, 1097

układ formularza, 46

projektowanie procesu, 1107,1110

układ tabelaryczny, 275

tworzenie, 1096 tworzenie aplikacji klienckiej, 1119 tworzenie biblioteki czynności, 1105

zdarzenia, 47 aplikacje WPF, 44,865, 904,922 aplikacje przeznaczone do uruchamiania w przeglądarkach, 922

tworzenie niestandardowej czynności Code Activity, 1106

DataTem plate, 893

tworzenie niestandardowej czynności złożonej, 1105

dodawanie kontrolek, 282

tworzenie pamięci trwałej, 1117

formularze, 281

tworzenie projektów, 1098

górne menu aplikacji, 887

Skorowidz aplikacje W PF

architektura ASP.NET M VC, 806

komponenty formularzy Windows, 861 lista obrazów, 886

architektura M VC, 714 architektura platformy M EF, 689

ListBox, 886 manipulowanie obrazami, 895

architektura platformy WPF, 861 AreEqual, 420

metody do obsługi zdarzeń związanych, 894

AreNotEqual, 420

nawigowanie po znacznikach, 371

AreNotSame, 420

pliki X A M L, 280 projekt, 280, 866 przeglądarka obrazów, 888

AreSame, 420 argumenty procesu, 1070, 1071 arkusze stylów, 756,758

przyciski, 894

arkusze stylów XSLT, 264, 269

rozmiar tabeli, 889

Array, 142 ArrayList, 143

tworzenie, 871, 884 tworzenie układu, 885

asercje, 404,420

układ, 871,885 wiązanie danych, 986

AreEqual, 420

wiązanie rysunków, 893

AreNotSame, 420

zapisywanie obrazów, 891 aplikacje XBAP, 922 app.xaml, 924

AreNotEqual, 420 AreSame, 420 Collection Assert, 421 Fail, 420

bezpieczeństwo, 926

Inconclusive, 420

ClickOnce, 929

IsFalse, 420 IsInstanceOfrype, 420

diagnozowanie, 925 formularze, 924 instalacja, 929 nawigowanie po witrynie, 928 PageX.xaml, 924

IsNotlnstanceOfl'ype, 420 IsNotNull. 420 IsNull, 420 IsTrue, 420

projekt, 923

sprawdzanie kolekcji obiektów, 421

strony, 924

sprawdzanie łańcuchów znaków, 422

tworzenie, 922

stosowanie danych testowych, 426

typy M IM E, 931 uruchamianie, 925 WindowX.xaml, 924 zarządzanie zabezpieczeniami, 928

StringAssert, 422 asocjacja, 297 ASP, 165 ASP.NET, 44, 52, 54,177, 282, 714, 922

app.config, 1103

cykl życia strony, 741

App_Browsers, 727

członkostwo, 795 interfejs konfigurowany przez użytkownika, 776

App_Code, 428,717,726, 1018 App_Data, 716,717,726

interfejs użytkownika, 746

App_GlobalResources, 726

katalogi, 725, 726

App_LocalResources, 726 App_Themes, 727, 771

kompozycje, 770

App_WebReferences, 726 AppFabric, 1158, 1160, 1164 Application, 863, 1017

kontrolki, 788 kontrolki danych, 799 kontrolki logowania, 795 kontrolki nawigacyjne witryny, 798

application fabric, 1158

kontrolki użytkownika, 801

Application Type, 206

kontrolki walidacyjne, 793,794

Application.EnableVisualStyles, 840, 841

kontrolki Web Part, 776

Application_Start, 819

logowanie, 795

Apply Style, 763

mapa witryny, 798

Apply Styles, 287, 763

model zdarzeń, 741

Skorowidz MVC, 56, 57 personalizacja interfejsów użytkownika, 776 pliki, 727 procedury obsługi zdarzeń, 744 skórki, 770

Assert, 420,421 AreEqual, 4 0 4 ,4 2 0 ,4 2 1 AreNotEqual, 421 Inconclusive, 405

strony wzorcowe, 765

Assign, 1085 AssociatedUpdatePanellD, 913 Asynchronous JavaScript and XML, 53,904

style, 754

ATI., 41

testy jednostek, 428 uwierzytelnianie użytkowników, 796

atrybuty, 145 atrybuty deklaratywne, 145

Web Part, 776

atrybuty testów jednostek, 431

wykresy, 800, 801 zdarzenia, 741

Attach Style Sheet, 7 6 1,7 6 2 Attach to Process, 483, 485, 514, 515

strony internetowe, 737

ASP.NET Ajax, 904 aktualizacja częściowa, 907 ASP.NET MVC. 917 kontrolki, 905

Authenticode, 349 AutoCompleteExtender, 917 AutoGenerateDeleteButton, 992

odświeżanie częściowe, 912

AutoGenerateEditButton, 992 automatyczne form atowanie kodu, 101

ScriptManager, 906

automatyczne generowanie ko



<

p ; Tasklist ■ Output P j ErrorLrst Use the arrow keys to resce by large increments.

Rysunek 17.53. Kontrolki stref Web Part dodane do strony

Następnie należy przeprowadzić „chromowanie” elementów W e b Part umieszczonych w stre­ fach. Proces ten polega na określeniu stylów nagłówków, odnośników i przycisków. Jest wiele stylów, które można zastosować do strefy i umieszczonych w niej elementów W e b Part. Na przykład można określić, jak kontrolki mają wyglądać po wystąpieniu błędu, przejściu w stan nieaktywny itak dalej. Do zmiany ustawień służą liczne właściwości stref. Programista może też użyć znaczników inteligentnych powiązanych z kontrolką, aby automatycznie zmienić forma­ towanie strefy. Rysunek 17.54 przedstawia przykład okna dialogowego A u to F o rm a t. Po lewej znaj­ dują się możliwe formaty. Po prawej widoczny jest podgląd elementów W e b Part w strefie. Podgląd oparty jest na aktualnej zawartości strefy. Następnie należy użyć opcji A u t o F o r m a t ,aby określić „chromowanie” każdej strefy. Obszary z odnośnikami iinformacjami należy ustawić na P rofession al ,a strefę z katalogiem — na C o lo rfu l. Dodawanie elementów Web Part do stref

Teraz jesteśmy gotowi do dodania elementów W e b Part do zdefiniowanych stref. Istnieje na to kilka sposobów. Można utworzyć rzeczywiste kontrolki, które implementują klasę WebPart. Pozwala to na większą elastyczność podczas tworzenia elementów W e b Part, ale wymaga najwięcej pracy. Umożliwia także utworzenie konfiguracji użytkownika dla własnych elementów W e b Part. Konfiguracja ta jest pokazywana, gdy użytkownik edytuje dany element W e b Part. Oczywiście, technika ta jest zalecana dla twórców portalu.

Rozdział 17. Tworzenie aplikacji ASP.NET Rysunek 17.54. Okno dialogowe AutoFormat umożliwia jednoczesne ustawienie licznych właściwości formatujących kontrolek stref

Inny, szybki sposób na utworzenie kontrolki W e b Part polega na zdefiniowaniu kontrolki użytkownika lub wykorzystaniu standardowych kontrolek ASP.NET. Przykładowo, kiedy użyt­ kownik przeciągnie na formularz etykietę, ASP.NET zdefiniuje element W e b Part oparty na tej kontrolce. Stanowi to łatwy sposób tworzenia elementów W e b Part. Zastosujmy ostatnią metodę. Najpierw utworzymy element Web Part Ł ą c z a k lie n ta . Ten ele­ ment W e b Part udostępnia zestaw łączy do zarządzania klientem. Oto zarys procesu tworzenia tego elementu: 1. Należy przeciągnąć kontrolkę ASP Label do kontrolki WebPartZone przeznaczonej na odnośniki do danych klientów. 2. Etykieta zostanie automatycznie przekształcona w kontrolkę Web Pan. Można zobaczyć to na znaczniku. W węźle dodany został element . Wewnątrz niego znajduje się kontrolka Label umieszczona na formularzu. 3. Należy określić tytuł kontrolki We b Part. W tym celu trzeba dodać atrybut title do kontrolki Label. Atrybut ten jest przechwytywany przez ASP i stosowany do kon­ trolki W e b Part. 4. Należy dodać kilka odnośników w deklaracji . Ostateczny kod przed­ stawia listing 17.2. Ze względu na przejrzystość pominęliśmy tu informacje o stylu, które standardowo znajdują się w strefach W e b Part. L istin g

17.2. Web Part Łącza klienta





C o ll



] J 3 Solution 92714' (1 project) J I a ,> C U \ 9 2 7 1 4 \ App.Data t» A App,T hemes t» : 'A images contoso.gif b ' Copy of MomtorC ustom > £ CustLmks.ascx 0 j 2J CustomerEditaspx yT-l CustomerEdit2.aspx b ~~-j CustomerEditAbsolute.a b _ j CustomerEdrtMaster.asp Default asp* > j A Default 2.aspx J|) fabnlcam.png FmdCustascx > r > J j, FindCustomer.aspx Help.ascx b M images-jpeg b Cj \ Login.aspx a |£j MonitorCustomer.aspx MonitorCustcmer.as b ' MomtorCustomef_temp Ą j Site.css ""1 Srte.master b TopProducts.ascx i j i web.config in * ■

Chi

— —i --i -------------------------------------------------- --- -—

■■■

Rysunek 17.59. W większości scenariuszy związanych z wprowadzaniem danych można wykorzystać standardowe kontrolki ASP.NHT

Na etapie projektowania można przeciągnąć kontrolki z okna T o o lb o x na powierzchnię projek­ tową, a następnie modyfikować je przy użyciu okna P ro p erties. Każda kontrolka m a liczne właściwości, które określają jej wygląd, działanie, dostępność iinne cechy. Lista kontrolek standardowych widoczna jest po lewej stronie rysunku 17.59. W części środ­ kowej znajdują się etykiety, pole tekstowe, przycisk ipole wyboru, przy czym pole tekstowe jest zaznaczone. Po prawej stronie znajduje się okno P ro p e r tie s z właściwościami tego pola. Aby wyświetlić zdarzenia powiązane z daną kontrolką, należy kliknąć ikonę błyskawicy w oknie właściwości.

Rozdział 17. Tworzenie aplikacji ASP.NET Istnieje wiele kontrolek standardowych. Tabela 17.4 zawiera ich listę oraz krótkie opisy. Tabela 17.4. Kontrolki standardowe

Kontrolka

B u tto n

Służy do w yw oływ ania przez użytkownika zdarzeń, na przykład zapisyw ania danych, przywracania ustawień lub anulow ania operacji. Podobne kontrolki to L i n k B u t t o n , która w ygląda jak odnośnik, ale działa jak przycisk, oraz Im a g e B u t t o n będąca przyciskiem w formie rysunku.

C a le n d a r

Wyświetla daty i um ożliw ia ich wybór. Przy użyciu właściwości S e l e c t io n M o d e można określić zaznaczane jednostki: dni, tygodnie lub miesiące.

Chec kBox

Umożliwia użytkownikom wybór ustawień (tak lub nie, włączony lub wyłączony). Jeśli nie jest potrzebna obsługa danych po stronie serwera, można użyć odpowiednika tej kontrolki z języka HTML.

D ropDown L i s t

Służy do udostępniania użytkownikom list opcji do wyboru. Można powiązać listę z danymi, a także reagować na zaznaczenie elementu przez użytkownika. Jeśli dostępnych jest wiele opcji, warto rozważyć zastosow anie kontrolki L i s t B o x . Istnieje też kontrolka C h e c k B o x L i s t do tw orzenia list w ielokrotnego wyboru i kontrolka R a d io B u t t o n L i s t do udostępniania list wzajemnie wykluczających się opcji.

Filellpload

Umożliwia użytkownikom przesyłanie plików z lokalnych komputerów lub sieci na serwer WWW z witryną.

Image

Służy do dynam icznego określania rysunku na stronie (służy do tego w łaściw ość I m a g e U r l ) . Obrazy statyczne m ożna w yśw ietlać za pomocą HTM L-ow ego znacznika < im g / > . Podobna kontrolka Im a g e M a p pozwala określić fragmenty rysunku, których kliknięcie prowadzi do wykonania specyficznych operacji.

Label

Służy do w yśw ietlania tekstu użytkownikom. Kontrolki L a b e l są potrzebne w tedy, jeśli programista chce tw orzyć napisy dynam icznie (w czasie d ziałania program u). Tekst statyczny zw ykle wystarczy zapisać na stronie w kodzie w HTML-u.

ListBox

Umożliwia użytkow nikom zaznaczenie jednej lub kilku opcji na liście. Można z nią powiązać dane.

Literal

Umożliwia dodaw anie do strony kodu w HTM L-u. Zw ykłe służy do dynam icznego tworzenia znaczników w kodzie i dodawania ich do strony.

MultiView

Udostępnia u żytkow nikom wiele w idoków na podstaw ie dokonanego w yboru lub stanu system u. Te same dane m ożna w yśw ietlać na przykład w trybie odczytu lub edycji. Każdy w idok w ym aga przeciągnięcia kontrolki View do kom ponentu MultiView. Następnie w kontrolce View trzeba um ieścić w yśw ietlane elementy. Podobny efekt można uzyskać przy użyciu kilku kontrolek Panel, jednak komponentMultiView ma dodatkowe funkcje obsługi w idoków .

Panel

Pełni funkcję kontenera na inne kontrolki. Jest szczególnie przydatna przy program ow ym dodawaniu kontrolek do stron. M ożna w tym celu w yw ołać m etodę P a n e l . C o n t r o l s . A d d .

RadioButton

Wyświetla listę elem entów , z których m ożna w ybrać tylko jeden. W łaściw ość G ro u p N a m e pozwala połączyć kilka przycisków opcji w jedną grupę.

Table

Służy do dynamicznego tworzenia tabel w kodzie. Do tworzenia tabel statycznych należy użyć HTML-owego znacznika < t a b l e > .

TextBox

Umożliwia użytkow nikom wpisywanie danych tekstowych. Kontrolka ta ma w łaściw ość T e x tM o d e , która określa tryb wpisyw ania: jeden wiersz (ustaw ienie domyślne), wiele w ierszy lub hasło.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Tabela 17.4. Kontrolki standardowe — ciąg dalszy

Kontrolka

Opis

W iz a r d

Ten kom ponent przypomina kontrolkę M u l t i V ie w , jednak udostępnia dodatkow e m ożliw ości potrzebne do przechodzenia naprzód i wstecz m iędzy etapami kreatora (lub widokam i).

XM L

Służy do wyświetlania informacji w form acie XML. Dane w tym form acie m ożna w skazać za pom ocą właściwości D o c u m e n t S o u r c e . Można też podać plik transformacji (XSLT) określający formatowanie danych w XML-u. W tym celu należy przypisać do właściwości T r a n s f o rm S o u r c e odpowiedni plik.xslt.

Kontrolki do sprawdzania poprawności ASP.NET udostępnia zbiór kontrolek do sprawdzania poprawności (walidacji). Przy ich użyciu można określić, jak system ma sprawdzać dane wpisane przez użytkownika, zanim przystąpi do przetwarzania strony. Walidacja pozwala zagwarantować, że internauta podał dane we wszystkich wymaganych polach, a także ustalić, czy informacje są zgodne z regułami zapisanymi w aplikacji. Walidacja ma miejsce po stronie serwera i zapobiega przetwarzaniu stron ASP, jeśli dane są nieprawidłowe (zobacz omówiony wcześniej cykl życia strony). Kontrolki mogą też generować kod w JavaScripcie uruchamiany po stronie klienta (wartość domyślna właściwości E n a b l e C l i e n t ' - ♦ S c r i p t to T r u e ) . Umożliwia to powiadomienie użytkownika o błędach wykrytych na poziomie strony przed przesłaniem jej na serwer. Aby użyć kontrolek do walidacji, należy w standardów)' sposób przeciągnąć je na formularz. Warto umieścić je obok sprawdzanego elementu, co pozwala wyświetlić użytkownikom tek­ stowe wskazówki na temat błędów. Standardowa technika polega na umieszczaniu kontrolek do walidacji po prawej stronie kontrolowanego elementu. Następnie należy wskazać ten element we właściwości ControlToValidate kontrolki walidacyjnej. Zwykle programiści określają właściwości T e x t i E r r o r M e s s a g e kontrolek walidacyjnych. Pierwsza z nich zawiera tekst wyświetlany po nieudanym sprawdzaniu poprawności, a druga — komunikat o błędzie widoczny w kontrolce V a l i d a t i o n S u m m a r y na poziomie strony. Ta ostatnia kontrolka służy do wyświetlania wszystkich komunikatów o błędach w jednym miejscu. Przykładowe kontrolki walidacyjne przedstawia rysunek 17.60. W oknie T o o lb o x w lewej części ilustracji widoczna jest otwarta lista kontrolek walidacyjnych. Na górze strony internetowej znajduje się kontrolka V a l i d a t i o n S u m m a r y (pod napisem E d ycja d a n y c h k lie n ta ) . Można też zauważyć, że pola tekstowe z imieniem iadresem e-mail są powiązane z kontrolkami walidacyjnymi. Na rysunku zaznaczona jest kontrolka R e g u ł a r E x p r e s s i o n V a l i d a t o r przy polu z adre­ sem e-mail. Przy jej użyciu można zastosować wyrażenia regularne do sprawdzenia, czy użytkow­ nik wpisał adres o właściwym formacie. Po prawej stronie widoczne są właściwości tej kontrolki. W tabeli 17.5 znajduje się lista kontrolek walidacyjnych udostępnianych przez ASP.NET oraz krótki opis każdej z nich.

Rozdział 17. Tworzenie aplikacji ASP.NET

Tabela 17.5. Kontrolki walidacyjne

K o n tro lk a

O pis

RequiredField '-♦Validator

Służy do sprawdzania zawartości wymaganych pól. Można ją łączyć z innymi kontrolkami z listy.

RangeValidato r

Spraw dza, czy w pisane dane zaw ierają się w określonym przedziale. W łaściw ość T y p e pozwala określić typ przedziału, na przykład s t r i n g , i n t e g e r , d o u b l e , d a t e lub c u r r e n c y .

RegułarExpression '-♦Validator

Sprawdza zgodność wpisanych danych z w yrażeniem regularnym . W e w łaściw ości V a l i d a t i o n E x p r e s s i o n należy podać praw idłow e w yrażenie regularne. Można też użyć w yrażeń w budow anych środowiska Visual Studio. Kliknięcie przycisku z wielokropkiem pozwala w ybrać standardowe wyrażenie opisujące kod pocztowy, adres e-m ail lub numer telefonu.

CompareValidator

Porównuje dane wejściowe od użytkownika ze statyczną wartością, inną kontrolką lub typem danych i określa ich poprawność. To ostatnie porównanie pozwala się upewnić, że użytkownik w pisał odpowiednią wartość, którą można przekształcić na określony typ. Aby zastosować to podejście, należy użyć właściwości T y p e .

CustomValidator

Służy do tworzenia niestandardowych kontrolek do sprawdzania poprawności. Programista może utworzyć kod sprawdzający dane po stronie serwera i kod w JavaScripcie do obsługi walidacji po stronie klienta.

ValidationSummary

W yświetla listę błędów sprawdzania popraw ności zgłoszonych na stronie. W idoczna jest w n iej wartość właściwości E r r o r M e s s a g e wszystkich kontrolek, które wykryły usterki.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

K o n tro lk i lo g o w a n ia ASP.NET ma wbudowany zbiór kontrolek logowania użytkownika. Mają one na celu udostęp­ nienie kompletnego rozwiązania z minimum (a czasem bez) kodu do zarządzania uwierzytel­ nianiem użytkowników wewnątrz aplikacji sieciowej. Na rysunku 17.61 przedstawiono listę wszystkich kontrolek tego rodzaju w oknie T o o lb o x . Rysunek 17.61. Kontrolki logowania ASP.NET umożliwiają skonfigurowanie zabezpieczeń witryny

Toolbox i* Validation

- a x

N avigation a Login It

Pointer C hang ePassw ord C re ate ltse i Wizard Lo g in Lo gtnN am e Lo g in Status Lo g in View

%jj,

U

P assw ordR ec every

W ebP aits ' AJAX Extensions Dynam ic Data

-

Domyślnie kontrolki logowania używają mechanizmu nazywanego członkostwem A SP .N E T (ang. A S P .N E T M e m b e r s h ip ). Pozwala to kontrolkom na pracę z bazą danych uwierzytelniania i powiązanymi funkcjami bez pisania kodu. Członkostwo ASP.NET pozwala na tworzenie użyt­ kowników igrup oraz zarządzanie danymi użytkowników (w tym hasłami). Usługi członkostwa wewnątrz ASP.NET mogą współpracować z bazami danych SQL Express lub Active Directory. Można także napisać swojego własnego dostawcę, który' będzie włączony do modelu. Przyjrzyjmy się przez chwilę konfigurowaniu członkostwa. Najpierw spójrzmy na liczne kon­ trolek logowania. Tabela 17.6 przedstawia krótki przegląd takich kontrolek. Tabela 17.6. Kontrolki logowania

K o n tro lk a

O pis

Login

Udostępnia podstawowy interfejs spraw dzania poświadczeń użytkow ników (ich nazw i haseł). Można sform atow ać w ygląd kontrolek, a także w yśw ietlić inne łącza i kom unikaty, takie jak błędy uwierzytelniania. Kontrolka jest przeznaczona domyślnie do pracy z mechanizmem ASP.N ET Membership. Jeśli się ją skonfiguruje, nie trzeba pisać kodu. Jeżeli jednak program ista chce napisać sw ój w łasny kod, m oże użyć zdarzenia A u t h e n t i c a t e do napisania niestandardow ego schematu.

LoginView

Pozwala na definiowanie dwóch widoków: widoku dla użytkowników, którzy są zarejestrowani, oraz użytkowników anonimowych. Do każdego z widoków dodaje się kontrolki, aby na podstawie statusu użytkowników określić, co widzą.

PasswordRecovery

Jest używ ana do odzyskiwania haseł użytkowników. Typowo konfiguruje się tę kontrolkę, aby w ysyłać do użytkowników listy e-m ail z hasłami. Jednak istnieją też inne opcje.

Rozdział 17. Tworzenie aplikacji ASP.NET Tabela 17.6. Kontrolki logowaniu — ciąg dalszy

EBH9HHI

Opis

LoginStatus

Pokazuje status uwierzytelniania bieżącego użytkownika. Użytkownicy mogą być zarejestrowani lub nie. Jeśli są, kontrolka pozwala im na wylogowanie. Jeżeli nie, m ogą się zalogować.

LoginName

Wyświetla nazw ę załogowanego użytkownika.

CreatellserWizard

Pozwala użytkownikom na tworzenie w łasnych kont lub pomaga w odzyskaniu haseł. Za pomocą tej kontrolki użytkownicy mogą zażądać utworzenia konta (i podać informacje personalne).

ChangePassword

Pozwala użytkownikom na wprowadzanie bieżących i nowych haseł. Kontrolka ta może następnie sprawdzić hasła i zm ienić je w przypadku ich poprawnego podania.

Konfigurowanie uwierzytelniania użytkowników Można utworzyć stronę logowania (lub kontrolkę), przeciągając kontrolkę Login bezpośrednio na formularz. Po jej umieszczeniu można zacząć określać właściwości, które definiują bez­ pieczeństwo aplikacji. Rysunek 17.62 przedstawia przykład. Widoczną stronę, L o g in .a sp x , utworzono w folderze Account jako część szablonu witryny. Warto zauważyć, że strona korzy­ sta ze strony wzorcowej. W oknie projektowym nie m a zbyt wielu możliwości formatowania, ponieważ jest ono ustalane na podstawie kompozycji. 'o)s TT

o© 92714 - Microsoft Visual Studio £dit

i*** W ebjite frułd fiebug Team

.J * —J* A A h -J ^ >0 • 7i® A . !| & L $ -1 7 -U jJ . -*

ffirm at -

Tjb le

Jools

Defcug

1^» S>



&1

Test

jjfiodow

Help

Any CPU

•I i ^

:



editocone

fNew Inline Style)

-

• « / ^4 ! : fNone i *

Accountiogm .aspi* X I r>Standard

■, »)-.. (Default Fon:)

J □ Sr*

S te ■ ■ -aster

. Data

33 Solution ‘9Z714 a project)

✓ Validation i- Navigation

a

.J

C:\_\92714\

a

^

s Login ^

Pointer

I

ChangePasiword CreateUserWaard

Aj

Login

4^

LogmName



~

pi,pgm«Loy

kltent

IZnsjd: zamówienie

Logow ane W pis: nazwę użytkownika i hasło Jeśli nie masz konta, zarejestruj się Nazwa użytkownika

LogmVieur PasswordRecovery



Logm.aspx.es

INowe zamówienie Login Tasks ; A u to F o r m a t ,

j C o n vert to T empiate

Hasło!

> —i jA p a

App,Data App.T hemes images | Copy of MonitorCuł

t>

i

C ustlm ks-jsci

$

£2ł C ustomerE drtasp«



ier£dit2.aspi

«— -- -- — TTiRtomerlEditAbsciu

P Zaparoętaj mnie

Zaloguj j

t> Dynamic Data ;>AJAX Extensions AlAX Toolkit

CustomerEditMastei *-i Default asp* f -j DefauH2.asp> fabrAam.png

Contoso 2010

. Reporting

| £jj 1 l

HTML >AJAX Controls a fVebPartsProject Theft are no usable controls « this orouc Drao an item

Account jd contoso.gf

a Ć-JLogm^spx Znajdź klienta

LogmStatus

WebParts

*

Solution Explorer

4

4 Design

73 Split

Source

< tent2>



C zę ść V Tworzenie aplikacji dla przedsiębiorstw Rysunek 17.64 ukazuje wyniki, które użytkownicy widzą w przeglądarce. W tym przypadku kontrolka SiteMapPath została dodana do strony wzorcowej, dlatego występuje w całej witry­ nie. Kontrolka automatycznie pobiera zawartość pliku W e b .s ite m a p . & Untitled Page - Windows Internet Explorer

/ U lu b io n e

c i Hm •t

0 U n tt.ed P .g e

O

contoso j

v I ♦ f I X ! |fe>

Znajdź kKenta

^

-

Q

-

fi

!W » Stfo na ▼

w

B e zp ie cze ń stw o w N a jze d zia ▼



ZARZĄDZANIE KLIENTAMI Nowy kKent

Znajdź zamówienie

Nowe zamówienie

Strona downa > Znajdź klienta > Edytuj dane klienta

Edycja danych klienta Nazwisko

Imię

1 1

1

1

Numer telefonu

E-mail

i

i

1 r ~ Miejscowość

Adres

1

Woj

_ | [wybterz)

_______ 1

Kod j |__

Klient wyrazi zgodę na kontakt przez e mail Kbent wyrazi zgodę na kontakt telefoniczny Zapisz

Anulu]

Contoso 2010 . f

Zau fa n e w itryny | Tryb ch ro n io n y; w toczon y

«• +»100% »

Rysunek 17.64. Kontrolka SiteMapPath korzysta z pliku .sitemap do udostępnienia nawigacji użytkownikom

Kontrolki danych ASP.NET m a duży zbiór kontrolek, których można używać do pracy z danymi, wyświetlania ich oraz wiązania. Kontrolki te powinny działać z niewielką ilością lub w ogóle bez kodu. Zamiast pisać kod, programista powinien być w stanie skonfigurować kontrolki tak, aby zachowywały się zgodnie z jego oczekiwaniami. Rysunek 17.65 pokazuje listę wszystkich kontrolek danych w panelu T o o lb o x .

Uwaga S p o so b y p racy z d an ym i i b a z a m i danych zo sta n ą o p is a n e w roz­ d zia le 21., „Praca z b azam i d a n y c h ”, w punk cie „ W ią z a n ie danych z k o n tr o lk a m i sie c io w y m i”.

Rozdział 17. Tworzenie aplikacji ASP.NET Rysunek 17.65. Można wykorzystać kontrolki danych ASP.NET, aby umożliwić użytkownikom pracę z danymi w witrynie

Tcclbcx

Standard a Data Pointer A A cce ssD a ta So u rce > C h art M D a ta ln t ■D «*► O a taP a ge i D etailsView P • i En tityD ataSou rce Fo rm V iew P G n d V ie w P Lin q D a ta So u rce Z J ListV iew H ; O b je ctD a ta So u rce Q u e iyE xte n d e f Repeater H ffc SiteM ap D ataSou rce W Sq lD ataSo u rce ii X m lD ata So u rce V alid ation

• a x A

-

Tabela 17.7 udostępnia krótki przegląd wszystkich tych kontrolek. Tabela 17.7. Kontrolki danych

Kontrolka

E3

A cce ssD a ta S o u rce , ASP.NET udostępnia wiele kontrolek źródła danych. Te źródła mogą być konfigurowane do pracy E n t i t y D a t a S o u r c e , ze źródłami danych i wykonywać operacje wyboru, uaktualniania, dodawania i usuwania. Kontrolki L in q D a t a S o u r c e , źródła danych używa się do łączenia z innymi kontrolkami (takimi jakG r id V ie w ) . Kontrolki O b je c t D a t a S o u r c e , źródła danych ASP.NET pozwalają na dostęp do danych SQL Server, Microsoft Access, danych S it e M a p D a t a S o u r c e , zaw artych w obiekcie, danych w formacie XML, zdefiniowanych w pliku .sitemap i pobranych S q lD a t a S o u r c e , przy użyciu zapytań LINQ. XmlDataSource

C h a rt

Um ożliw ia tworzenie stron w yśw ietlających dane w formie wykresu. Można powiązać dane z kontrolką, w yśw ietlać różne rodzaje w ykresów i um ożliwić interakcje za pomocą Ajaksa. Zobacz podpunkt „Kontrolka Chart" w dalszej części rozdziału.

D a t a L is t

Kontrolki tej używa się, gdy chce się kontrolować sposób wyświetlania i formatowania danych. Można użyć tej kontrolki z szablonam i w celu uzyskania kontroli nad sposobem wyświetlania danych.

D a ta P a g e r

Um ożliwia zarządzanie stronicowaniem danych i interfejsem użytkownika związanym z tym procesem . Można jej używać niezależn ie lub jako części innej kontrolki. Opisano ją także w rozdziale 1., „Krótki przegląd środow iska Visual Studio 2010".

D e t a ils V ie w

Ta kontrolka pozw ala na w yśw ietlanie pojedynczego wiersza danych (lub szczegółów wiersza). Można wyświetlić ten wiersz jako zbiór edytowalnych pól wewnątrz tabeli. Kontrolka D e t a i l s V i e w może być używana w połączeniu zkontrolką G r i d V i e w w celu uzyskania hierarchicznej struktury edycji.

F o r m V ie w

Udostępnia te same funkcje, co kontrolka D e t a i l s V i e w , a dodatkowo umożliwia definiowanie szablonów służących do w yśw ietlania danego wiersza.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Tabela 17.7.

K o n tro lk i d a n y c h

Kontrolka

— c ią g d a ls z y

| Opis

G rid V ie w

To kontrolka służąca do wiązania i pracy z danymi tabelarycznymi. Kontrolka ta współpracuje z wieloma źródłami danych. Pozwala na sortowanie, stronicowanie, edycję, dodawanie i usuwanie danych.

L is t V ie w

Upraszcza wyświetlanie powtarzających się danych, a jej podstawą są szablony użytkownika. Dlatego programista może określić, jak interfejs ma działać w trakcie wyświetlania, modyfikowania, dodawania i usuwania danych. Ponadto kontrolka L is t V ie w obsługuje sortowanie, stronicowanie i — oczywiście — wiązanie danych.

Q u e ry E x te n d e r

Umożliwia definiowanie filtrów do danych zwracanych ze źródła.

R e p e a te r

Ta kontrolka jest kontenerem na powtarzające się dane. W połączeniu z szablonami pozwala określić sposób wyświetlania takich informacji. Czasem lepszym rozwiązaniem jest użycie kontrolki L is t V ie w .

Kontrolka Chart Nowością w Visual Studio 2010 i ASP.NET 4.0 jest kontrolka Chart. Umożliwia definiowanie wykresów na podstawie ponad 25 ich typów. Wykres można powiązać ze źródłem danych (szczegóły opisano w rozdziale 21.). Po uruchomieniu kontrolka generuje plik graficzny (zwykle .p n g ) iwysyła go w odpowiedzi ze stroną. Jest to doskonały dodatek dla programistów, którzy chcą udostępniać w internecie informacje statystyczne lub finansowe w formacie graficznym. Kontrolkę Chart można przeciągnąć z okna T o o lb o x na stronę. Następnie można skonfigurować kontrolkę w oknie projektowym lub za pomocą znaczników. W oknie projektowym dostępny jest inteligentny znacznik, który umożliwia wykonanie wielu operacji związanych z konfigurowa­ niem kontrolki (służy do tego także okno P r o p e r tie s ). Pozwala on zdefiniować źródło danych, wybrać rodzaj wykresu, a następnie określić wyświetlane elementy danych. Na rysunku 17.66 przedstawiono prosty wykres kolumnowy. Tu wykres jest powiązany ze źródłem danych, w którym połączono informacje o sprzedaży produktów według kategorii. Warto zauważyć, że na osi X podano numery kategorii, natomiast na osi Y — poziom sprzedaży. Informacje pochodzą z kolumn źródła danych.

Kontrolki użytkownika Jeśli programista nie może znaleźć wrpełni odpowiadającej m u kontrolki, powinien skorzystać z platformy do tworzenia własnych komponentów dostępnej w Visual Studio. Można zastoso­ wać proste podejście i zbudować kontrolkę użytkownika. Kontrolki użytkownika działają po­ dobnie jak strony. Można określić ich budowę w oknie projektowym, mają powiązany plik z kodem i korzystają z takiego samego modelu zdarzeń jak strony. Po utworzeniu kontrolki użytkownika można umieścić ją na stronach witryny.

Rozdział 17. Tworzenie aplikacji ASP.NET

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Dodawanie kontrolki użytkownika do strony Kontrolkę użytkownika można dodać do strony, przeciągając ją z okna S o lu tio n E x p lo re r na okno projektowe formularzy sieciowych. Niestety, kontrolki użytkownika nie są dostępne w oknie T o o lb o x . Mają jednak reprezentację graficzną w czasie projektowania, co pokazano na rysunku 17.68. Tu kontrolkę użytkownika M o n ito r P r o ilu c ts U c .a s p x dodano do formularza sieciowego P r o d u c t D a s h b o a r d , a s p x opartego na stronie wzorcowej S ite .m a s te r .

Rozdział 17. Tworzenie aplikacji ASP.NET

Oczywiście, kontrolkę można dodać także bezpośrednio za pomocą znaczników. Jednak zasto­ sowanie okna projektowego jest nieco łatwiejsze. Korzystając ze znaczników, trzeba najpierw zarejestrować kontrolkę na stronie. Służy do tego znacznik @Register. Należy umieścić go pod dyrektywą @Page. Znacznik ^Register powinien obejmować plik kontrolki użytkownika (atrybut src), nazwę typu kontrolki użytkownika (atrybut tagname) iprzedrostek pomagający w zidentyfikowaniu znacznika (tagpref ix). Poniżej znajduje się przykładowy kod:

Po zarejestrowaniu kontrolki można używać jej za pomocą standardowych znaczników. Poniż­ szy kod to przykład zastosowania wcześniej zarejestrowanej kontrolki:

C zę ść V Tworzenie aplikacji dla przedsiębiorstw

Więcej

informacji Jed yn ie p o r u s z y liś m y z a g a d n ie n ie p isa n ia w łasn ych k o n tr o le k w A S P .N E T . Jedną z w ad k o n tr o le k u żytk ow n ika jest ic h zależ­ ność od w itryn y. O czywiście, m ożn a skopiow ać i wkleić plik, jednak pojaw iają s ię w te d y p rob lem y z k o n tr o lą w ersji. Inną w ad ą jest

Toolbox oraz w czasie p r o je k to ­ w an ia (n ie m o ż n a u żyw ać okna Properties, in telig e n tn y c h z n a c z ­ brak o b s łu g i k o n tr o le k w ok n ie

n ik ó w i ta k d a le j). A by z a p e w n ić o b s łu g ę w c za sie p r o je k to w a n ia i in sta la cji, tr z e b a u tw orzyć kontrolkę niestandardową. D zia ła ona w taki sam sp o só b , jak gotow e k on trolk i A SP.N ET. M o żn a naw et utw orzyć k la sę p o ch o d n ą , r o z sz e r z y ć istn ieją cą k on trolk ę i p rzy­ g o to w a ć jej n iesta n d a rd o w ą w ersję

Tworzenie aplikacji ASP.NET MVC W Visual Studio 2010 i platformie .NET 4.0 wprowadzono szablon aplikacji ASP.NET MV C , który służy do budowania witryn na podstawie wzorca M V C (ang. m o d e l- v ie w - c o n tr o lle r ) . Sam wzorzec M V C nie jest niczym nowym, nowością jest natomiast zaimplementowanie go przez Microsoft w środowisku ASP.NET. Wzorzec pozwala odejść od standardowego modelu rozwijania stron za pomocą formularzy sieciowych. Zamiast tego można utworzyć kilka luźno powiązanych obiektów łatwych do sprawdzenia za pomocą testów. Polega to na zamianie klasy Page, cyklu życia i obiektu View >-►51316 na luźno powiązaną architekturę, która ułatwia powtórne wykorzystanie kodu i pro­ gramowanie sterowane testami. W implementacji architektury M V C w ASP.NET zachowano możliwość stosowania stron wzorcowych, arkuszy stylów i standardowych znaczników do określania układu kontrolek. Jednak pisanie mechanizmów wygląda tu zupełnie inaczej.

Wprowadzenie do aplikacji ASP.NET MVC Szablon aplikacji ASP.NET M V C pozwala oddzielić dane i logikę biznesową (model) od kodu wyświetlającego informacje (widoku). Ponadto umieszcza kod cło obsługi interakcji z widokiem imodele w odrębnej klasie (w kontrolerze). Podział ten zmienia sposób pisania stron w ASP.NET. W modelu ASP.NET M V C nadal można tworzyć strony .a s p x i kontrolki ,a sc x , aby określić układ interfejsu użytkownika. Jednak zamiast pisać kod w' plikach z kodem strony, do zarzą­ dzania komunikacją z użytkownikiem należy użyć klasy kontrolera. Ponadto kod z definicjami obiektów z danej dziedziny iprzeznaczony do obsługi baz danych jest niezależny od kontrolera. Na rysunku 17.69 przedstawiono implementację modelu ASP.NET MV C.

Rozdział 17. Tworzenie aplikacji ASP.NET R y su n e k 17.69.

Model

W aplikacjach ASP.NET MVC model (dane) jest odrębny od widoku (kodu interfejsu użytkownika) i kontrolera (kodu leczącego model z widokiem)

Widok Wyświetla dane modelu, aby użytkownik mógł je zobaczyć lub zmienić

EditCustomer.aspx

Customer.es

Kontroler Pobiera dane modelu i zwraca je do modelu w ce u utrwalenia

Wybiera widok, przesyła dane modelu do widoku, obsługuje interakcję użytkownika z widokiem

CustomerController.es

Luźno powiązane elementy implementacji architektury M V C w ASP.NET ułatwiają powtórne wykorzystanie kodu i umożliwiają stosowanie programowania sterowanego testami. Podział kodu na warstwy obiektów z dziedziny idanych to dobra praktyka używana już od wielu lat. W ASP.NET M V C wymienione elementy składają się na model. Ponadto umieszczenie kodu interfejsu użytkownika w odrębnej klasie (w kontrolerze), gdzie nie trzeba uwzględniać specy­ fiki środowiska ASP.NET, ułatwia pisanie testów jednostek. Poniżej znajdują siędodatkowe informacje na temat trzech warstw architektury ASP.NE T MVC: •

M odel — reprezentuje kod do zarządzania danymi w aplikacji. Stan modelu dotyczy

danych przechowywanych w relacyjnej (lub innej) bazie. Obiekt modelu można traktować jak obiekty z dziedziny stosowane w innych architekturach. Załóżmy, że programista używa obiektu Customer reprezentującego w aplikacji klienta. Atrybuty obiektu mogą znajdować się w bazie danych. Obiekt Customer w architekturze M V C potrafi współdziałać z bazą w celu zapisania swojego stanu. Zawiera też reguły bizne­ sowe dotyczące klienta. Oczywiście, można zaimplementować w aplikacji warstwę dostępu do danych iumożliwić obiektom modelu korzystanie z tej warstwy. Ponadto do zdefiniowania modelu można użyć platformy Entity lub technologii LINQ to SQL (więcej informacji o nich zawiera rozdział 21.). Jeśli programista nie utworzył (lub nie potrzebuje) obiektów z dziedziny, nie musi pisać długiego kodu modelu. Na przykład jeśli korzysta z obiektów DataSet w pracy z da­ nymi z bazy, może używać tych obiektów bezpośrednio w kontrolerze i przekazywać je do widoku. Wtedy same obiekty DataSet pełnią funkcję modelu. W ten sam sposób można wyświetlać w całości zawarte w widoku informacje, które nie są oparte na

C zę ść V Tworzenie aplikacji dla przedsiębiorstw modelu. Wtedy możliwe jest przetwarzanie żądania w kontrolerze i wyświetlanie w y ­ ników w widoku bez konieczności tworzenia egzemplarzy obiektu modelu. •

W id o k — wyświetla użytkownikom dane, aby można się było z nimi zapoznać i je

zmodyfikować. Widoki to komponenty interfejsu użytkownika aplikacji (w ASP.NET oparte są na znacznikach). Źródłem danych widoku są dane udostępniane przez m o ­ del. Widok otrzymuje je od kontrolera. Kontroler może na przykład przesłać dane klienta do strony przeznaczonej do edycji takich danych. Na stronie można wyświe­ tlić dane do edycji za pomocą kontrolek TextBox. •

K o n tr o le r — to kod pisany do obsługi zdarzeń i interakcji z użytkownikiem w apli­

kacjach M V C . Żądania do witryny są kierowane do klasy kontrolera. Kod kontrolera potrafi obsłużyć interakcję z użytkownikiem, współdziała z modelem i wiąże wyniki z odpowiednim widokiem. Na przykład kiedy użytkownik zażąda szczegółów ze strony do edycji danych klienta, kontroler skontaktuje się z modelem, aby pobrać informa­ cje, wybierze właściwy widok iprzekaże dane z modelu do widoku. Kiedy użytkownik wciśnie przycisk Z a p i s z , kontroler przeniesie dane z powrotem do modelu, a model zapisze je w bazie.

Model przetwarzania żądań w aplikacjach ASP.NET MVC Model przetwarzania w aplikacjach napisanych za pomocą platformy ASP.NET M V C wygląda inaczej niż cykl życia w tradycyjnych aplikacjach ASP.NET opisanych we wcześniejszej części rozdziału. Jeśli programista pisze aplikacje ASP.NET MVC, musi zrozumieć, w jaki sposób kod jest przetwarzany przez klasy z przestrzeni nazw System.W e b .Mvc. Przetwarzanie w aplikacjach ASP.NET M V C , podobnie jak we wszystkich aplikacjach sieciowych, zaczyna się od zgłoszenia przez użytkownika żądania H T T P za pomocą adresu URL. Platforma ASP.NET M V C odwzorowuje adres U RI. na klasę kontrolera (zamiast na strony .a s p x ) . To odwzorowanie można kontrolować za pomocą reguł przekierowywania adresów URL w pliku G lo b a l.a $ a x . Metoda Application Start służy do rejestrowania przekierowań adresów URI. z żądania do konkretnego kontrolera. Przykład zastosowania tej techniki prześledzimy w dal­ szym punkcie, „Definiowanie przekierowań adresów URI. do kontrolera”. Klasa kontrolera przetwarza żądanie, komunikuje się z modelem i wybiera odpowiedni widok do wyświetlenia użytkownikowi. Widok generuje kod w H T M L - u wysyłany z powrotem do przeglądarki użytkownika w celu wyświetlenia. Poniżej przedstawiono przegląd modelu prze­ twarzania w aplikacjach ASP.NET M V C : Użytkownik żąda adresu URL. Żądanie jest przekazywane z ISS do klasy Uri '-►RoutingModule. Jest to moduł H T T P używany jako początkowy kontroler do prze­ kierowywania żądań. Klasa UrlRoutingModule przetwarza żądanie i obsługuje przekierowanie, używając klasy MvcRouteHandler do wybrania w witrynie obiektu kontrolera, który otrzyma żądanie. D o określania, który obiekt kontrolera odbierze żądanie, służy metoda Application Start w pliku G lo b a l.a s a x .

Rozdział 17. Tworzenie aplikacji ASP.NET U w aga — jeśli klasa nie znajdzie przekierowania, przekaże żądanie do środowiska

ASP.NET. Umożliwia to łączenie kodu M V C istandardowego kodu ASP.NET w jed­ nej witrynie. 3. Po ustaleniu klasy kontrolera platforma M V C tworzy egzemplarz kontrolera i wy ­ wołuje jego metodę Execute. 4. Metoda operacji uruchamiana w kontrolerze jest określana na podstawie żądania. Metodę tę wywołuje platforma MVC. Metodę operacji należy napisać w kontrolerze w' celu obsługi żądania ipowiązania modelu z widokiem. 5. Metoda operacji pobiera z żądania (widoku) dane wejściowe od użytkownika, łączy te informacje z modelem, a następnie przekazuje odpowiedź za pomocą specyficznego typu zwracanych danych platformy MVC. Najczęściej stosowany jest typ ViewResult, który zawiera wyniki przekazywane do widoku w celu wyświetlenia ich użytkownikom. Inne typy zwracanych danych to: RedirectToRouteResult, RedirectResult, ContentResult, JsonResult,FileResult i EmptyResult. Opisany model przetwarzania znacznie różni się od standardowego modelu ASP.NET. Warto zauważyć, że nie obejmuje odsyłania danych. Zamiast tego żądania są przekazywane przez główną klasę kontrolera. Dla programistów tworzących aplikacje w środowisku ASP.NET oznacza to, że nie mogą korzystać ze zdarzeń związanych z cyklem życia strony ani obiektu ViewState. Dlatego kontrolki ASP.NET oparte na odsyłaniu i obiekcie ViewState nie będą działać na platformie M V C . Dotyczy to kontrolek GridView, Repeater iDataList. To wady, ale są także pewne zalety. Omawiamy je dalej.

Kiedy wybrać MVC zamiast formularzy sieciowych? Istnieje wiele programów, które nadal należy pisać w postaci aplikacji W e b Form. Platforma ASP.NET M V C nie zastępuje technologii W e b Form. Stanowi natomiast alternatywę przydat­ ną dla zespołów programistycznych, które oczekują wyraźniejszego podziału zadań, łatwiejsze­ go pisania testów jednostek idokładniejszej kontroli odpowiedzi z kodem w HTML-u. Zalety platformyASP.NET MVC

Aplikacje ASP.NET M V C są przydatne w wielu scenariuszach. Po pierwsze, aplikacje ASP.NET M V C dobrze nadają się dla zespołów, gdzie obowiązuje wyraźny podział obowiązków. Jeśli oso­ by odpowiedzialne za interfejs użytkownika piszą widok, a inne — obiekty z domeny (modele), podział tych elementów na odrębne pliki iwarstwy jest korzystny. Po drugie, aplikacje ASP.NET M V C obsługują programowanie sterowane testami nie tylko dla modelu, ale też dla kodu do przetwarzania interfejsu użytkownika. Jest tak, ponieważ kod do przetwarzania interfejsu użytkownika jest oddzielony od kodu związanego z wyświetlaniem interfejsu (czyli od widoku). Osoby, które próbowały testować kod tradycyjnych formularzy sieciowych ASP.NET, wiedzą, że jest to trudne. W ramach testów trzeba wczytać stronę, kon­ trolki i inne powiązane obiekty. W platformie ASP.NET M Y C nie ma takich barier w obszarze testów jednostek.

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Po trzecie, aplikacje ASP.NET M V C zapewniają większą kontrolę nad odpowiedziami odsyła­ nymi użytkownikom. Zwykle można kontrolować generowany kod w HTML-u i JavaScripcie. Dzieje się to jednak kosztem braku możliwości korzystania z wielu kontrolek ASP.NET, a także wymaga pisania większej ilości kodu niż w tradycyjnych formularzach sieciowych ASP.NET. Zalety formularzy sieciowych ASP.NET

Model formularzy sieciowych jest dobrze znany wielu programistom i stanowi doskonałe środowisko do szybkiego tworzenia witryn. Aplikacje ASP.NET W e b Form często są bardziej zrozumiałe dla programistów przyzwyczajonych do programowania opartego na zdarzeniach. Ponadto pozwalają korzystać z: modelu stanu HTTP, obsługiwanych po stronie serwera zda­ rzeń strony i kontrolek, a także obiektu ViewState do przechowywania stanu między żąda­ niami. Strony oparte na formularzach sieciowych często wymagają mniej znaczników w in­ terfejsie użytkownika i mniej kodu w plikach z kodem. Ponadto takie aplikacje łatwiej jest zrozumieć niż luźno powiązane rozwiązania oparte na wzorcu M V C .

Uwaga T radycyjne fo r m u la r z e siecio w e i s tr o n y A SP .N E T M V C m o g ą w sp ó łistn ie ć ze sob ą. Jedno r o z w ią z a n ie n ie w yklucza d r u g ie g o . W aplikacjach A S P .N E T M V C c z ę sto p r z y d a tn e są sta n d a r d o w e strony A SP.N E T d o ob słu gi pewnych scenariuszy, na przykład p r o ­ stego w iązan ia i w y św ie tla n ia d an ych .

Tworzenie projektów MVC Do tworzenia aplikacji ASP.NET M V C w środowisku Visual Studio służy szablon A S P .N E T M V C 2 W e b A p p l ic a ti o n . Jest to szablon aplikacji, a nie witryny. Dlatego powstaje odrębny plik projektu, a konfigurowanie aplikacji przebiega inaczej niż witryn. Szablon można otworzyć w oknie dialogowym A d d N e w P r o je c t (należy kliknąć rozwiązanie prawym przyciskiem myszy i użyć opcji S e le c t A d d / N e w P r o je c t lub wybrać z menu opcję F ile / N e w /P ro je c t). Na rysunku 17.70 pokazano tworzenie witryny opartej na omawianym szablonie. Warto zauważyć, że przebiega to podobnie jak tworzenie w Visual Studio innych projektów. Visual Studio umożliwia utworzenie powiązanego projektu testów jednostek witryny M V C . Przypomnijmy, że jedną z zalet architektury ASP.NET M V C jest ułatwienie testowania jedno­ stek kodu aplikacji sieciowej. Dlatego zachęcamy do korzystania z tej możliwości. Warto ze­ zwolić środowisku Visual Studio na utworzenie projektu testów powiązanego z aplikacją sie­ ciową. Na rysunku 17.71 pokazano okno C r e a te U n it T est P r o je c t otwierane w czasie tworzenia nowej aplikacji ASP.NET MVC. W tym rozdziale nie zamierzamy ponownie opisywać testów jednostek. Więcej informacji na ten temat można znaleźć w rozdziale 9., „Testowanie kodu”.

Rozdział 17. Tworzenie aplikacji ASP.NET

C zę ść V Tworzenie aplikacji dla przedsiębiorstw



M od els — jest przeznaczony na pliki klas logiki biznesowej i obsługi baz danych.

Można na przykład napisać klasę C u s to m e r .e s i umieścić ją w tym katalogu. Można też zapisać model w odrębnym pliku .d li iużywać go w witrynie. •

V iew s — zawiera pliki związane z interfejsem użytkownika. Są to: strony, kontrolki

użytkownika i strony wzorcowe. Pliki tego rodzaju można dodać za pomocą okna dialogowego A d d V ie w (zobacz punkt „Tworzenie widoku” w dalszej części rozdzia­ łu). Warto zauważyć, że w katalogu V iew s znajduje się wiele folderów. Każdemu kontrolerowi powinien odpowiadać odrębny folder widoku. Na przykład po utwo­ rzeniu klasy C u s to m e r C o n tr o lle r .e s należy utworzyć katalog V ie w s \C u s to r n e r . Warto też zwrócić uwagę na folder S h a r e d . Jest on przeznaczony na widoki współużytkowa­ ne przez kontrolery, na przykład na stronę S ite .m a s te r . •

C o n tr o ller s — służy do przechowywania wszystkich klas kontrolerów aplikacji. Klasy

kontrolerów zawierają kod operacji łączących działania użytkownika z modelem i okre­ ślających właściwą odpowiedź (zwykle widok). Platforma ASP.NET M V C wymaga dołączenia słowa C o n tro ller do nazwy każdej klasy kontrolera, na przykład C u s to m e r C o n tro ller.e s.

Rozdział 17. Tworzenie aplikacji ASP.NET •

Scripts — przechowuje pliki skryptów. W

projektach ASP.NET M V C katalog ten domyślnie zawiera podstawowe skrypty ajaksowe ipliki biblioteki jQuery.



C o n ten t —

służy do przechowywania statycznych elementów witryny, na przykład arkuszy stylów irysunków.

Dodawanie mechanizmów za pomocą ASP.NET MVC Może się wydawać, że budowanie aplikacji za pomocą platformy ASP.NET M V C wymaga skonfigurowania wielu elementów inapisania dużej ilości kodu. Jednak Visual Studio znacznie ułatwia definiowanie modeli, kontrolerów iwidoków'. W tym punkcie przedstawiamy przykład zastosowania narzędzi platformy ASP.NET M V C do utworzenia mechanizmów, które umoż­ liwią użytkownikom wyświetlenie klientów na liście, zaznaczenie klienta izmianę dotyczących go danych.

Tworzenie modelu Przypomnijmy, że model to kod służący do interakcji z danymi w' aplikacji. Jeśli programista korzysta z bazy danych, kod zwykle zwraca listę danych i pojedynczych rekordów. Czasem użytkownicy mogą pracować z tymi danymi (dodawać je, aktualizować i usuwać). Jeśli w apli­ kacji dostępny jest już zestaw' klas do obsługi bazy danych i przetwarzania logiki biznesowej, można zastosować go w modelu. Jeżeli takie klasy nie istnieją, trzeba je utworzyć. Załóżmy, że programista korzysta z bazy danych zawierającej tabelę Customers (dla uprosz­ czenia użyjemy bazy Northwńnd). Można napisać niestandardowy klasę odzwierciedlającą właściwości ireguł)’sprawdzania danych specyficzne dla obiektu Customer.Trzeba też napisać kod do pobierania listy klientów, wczytywania danych jednego klienta iaktualizowania ich w'bazie. Inna możliwość to wykorzystanie platformy Entity do utworzenia modelu. Dzięki temu nie trzeba pisać modelu od podstaw. Platforma Entity generuje klasę z odwzorowaniem między fizyczną bazą danych imodelem obiektowym. W tym przykładzie wykorzystamy właśnie plat­ formę Entity (więcej informacji na jej temat zawiera rozdział 21.). Aby rozpocząć pracę, należy kliknąć prawym przyciskiem myszy katalog M o d e ls w oknie S o lu tio n E x p lo r e r iwybrać opcję A d d N e w I te m . W oknie dialogowym A d d N e w I te m trzeba zaznaczyć widoczny po lewej stronie węzeł D a ta iwybrać szablon elementu A D O .N E T E n tity D a ta M o d e l. Jeśli model zawiera wiele encji, można nazwać go N o r th w in d . Tu użyliśmy nazwy C u s to m e r .e d m x , co pokazano na rysunku 17.73. Szablon elementu A D O .N E T E n tity D a ta M o d e l powoduje uruchomienie kreatora Entity Data Model. Kreator umożliwia zdefiniowanie połączenia z bazą danych i wybranie tabel, które należy umieścić wrmodelu. Na rysunku 17.74 pokazano przykładowe ustawienia. Warto zauważyć, że wybrana jest tabela C u s to m e r s . Wygenerowany kod znajdzie się w przestrzeni nazw M o d e ls .

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Add NeA Item -

ISwiawr

ContosoM vc

Installed Templates J

Sort by: Default

Visual C* Code Data General Web Windows Forms WPF Reporting Silverlight Workflow

lit ta i #

& Si

S 3 "K! do

Database Unit Test

Visual C«

XSLT File

Visual C*

XM L File

Visual C*

DataSet

Visual C»

XM L Schema

Visual C*

LlN Q to SQL Classes

Visual C*

SQL Server Database

Visual C *

ADO.NET Entity- Data M odel

Visual C*

P

S| Search Installed Templates Type: Visual C * A project item for creating an ADO.NET Entity Data Model.

f

Online Templates

!> I

4

Name:

R y su n ek 1 7 .7 3 .

Custom er, edmx

Modele można definiować za pomocą platformy Entity

■5-7

R y su n e k 1 7 .74.

Należy wybrać tabele, które mają znaleźć się w modelu danych

rri-ii-r

Choose Your Database Objects

W hich database objects do you want to include m your model? t

y l a j Tables 1 3 Categories (dbo) 1 3 Custom erCustom erDem o (dbo) 1 H Custom erDem ographics (dbo) es (dbo) Order Details (dbo) “ 3 Orders (dbo) 3 Products (dbo) ^ 2 Region (dbo) f Shippers (dbo)

Pluraliie or sm gulanze generated object names y Include foreign key colum ns in the m odel j

M odel Namespace Models

< Previous

Finish

]

Cancel

Sam model w oknie projektowym E n t i t y F r a m e w o r k pokazano na rysunku 17.75. Następny krok polega na zdefiniowaniu kontrolera współdziałającego z modelem.

Rozdział 17. Tworzenie aplikacji ASP.NET

^813^

C zę ść V Tworzenie aplikacji dla przedsiębiorstw Warto pamiętać, że klasy kontrolera można poddać testom jednostek. Jest to jedna z głównych zalet platformy ASP.NET MVC. W programowaniu sterowanym testami test)' powstają w czasie pisania kontrolera. W tym miejscu nie omawiamy testów jednostek — szczegółowe informacje znajdują się w rozdziale 9. Następny krok polega na napisaniu kodu łączącego klasę CustomerCont roller imodel Customer. W przykładowym projekcie na początku kodu kontrolera dodamy deklarację zmiennej, która pozwoli połączyć się z modelem. Deklaracja tworzy egzemplarz modelu. Tu używamy modelu northwndEntitiesl: / / Łączenie się z modelem (bazą North wind).

namespace ContosoMvc.Controllers

{ public class CustomerController : Controller { private ContosoMvc.Models.northwndEntitiesl nwdEntities = new ContosoMvc.Models.northwndEntitiesl();

Następny krok wymaga napisania kodu, który zwróci listę klientów do wyświetlenia przez wńdok. Platforma ASP.NET M V C do zwracania listy danych z modelu używa metody Index kontrolera. Typem zwracanym przez większość metod platformy jest ActionResult. Typ ten informuje platformę, że należy wykonać operację. Jedną z nich jest ViewResult, polegająca na przekształceniu modelu na widok. Dlatego poniższy kod zwraca wartość typu ViewResult, wywołując metodę Cont roller.View iprzekazując dane modelu (listę klientów): public ActionResult Index()

{ / / Pobieranie listy wszystkich klientów.

return View( nwdEntities.Customers.ToList());

} Teraz chcemy, aby użytkowmicy mogli dodać do bazy danych nowego klienta. Oznacza to, że użytkownikowi należy wyświetlić pusty widok (więcej na ten temat za chwilę), w którym m o ż ­ na wprowadzić dane klienta, a następnie przesłać je do kontrolera. Następnie kontroler prze­ każe dane klienta do modelu, aby zaktualizować bazę. W ostatnim kroku kontroler ponownie wyświetli listę klientów. W e wzorcu ASP.NET M V C do dodawania rekordów' do modelu służy metoda Create. W kontro­ lerze znajdują się dwie jej w'ersje. Pierwsza nie przyjmuje parametrów i umożliwia zwrócenie pustego widoku na dane. Wersja ta wygląda następująco: public ActionResult Create!)

{ return View();

> Druga metoda obsługuje dane przesłane przez użytkownika, 'fu metoda Create przyjmuje obiekt Customer. Następnie kieruje wywołanie do modelu, aby dodać dane klienta, zapisać zmiany iprzekazać przetwarzanie z powrotem do strony z listą (Index). Wersję te pokazano poniżej:

Rozdział 17. Tworzenie aplikacji ASP.NET [AcceptVerbs(HttpVerbs.Post)J public ActionResult Create(Customer customer)

{ try

{ //

Wstaw d a w klienta.

nwdEntities.AddToCustomers(customer); _nwdEntities.SaveChanges(); / / Przekierowanie do strony z listą klientów.

return RedirectToAction("Index");

} catch

{ return View();

> } Warto zwrócić uwagę na atrybut metody — AcceptVerbs. Określa on, że tę wersję metody C reate należy wywołać w ramach żądania H T T P POST. Możliwość edycji danych klienta to ostatnia funkcja, którą dodamy do kontrolera. Platforma ASP.NET M V C używa do edycji metody Edit. Także ona ma dwie wersje. Pierwsza umożliwia użytkownikom zobaczenie danych pojedynczego klienta w trybie edycji. Metoda pobiera dane z modelu iprzekazuje do odpowiedniego widoku. Proces ten pokazano w poniższym kodzie: public ActionResult Edit(string id)

{ //

Wybieranie danych klienta na podstawie identyfikatora.

Customer cust = (from c in nwdEntities.Customers where c.CustomerlD == id select c).First(); return View(cust);

} Warto zauważyć, że platforma ASP.NET M V C domyślnie używa parametru id do przekazy­ wania identyfikatora rekordu do metody. Parametr ten został ustawiony na stronie I n d e x .a s p x (jest to widok). Jeśli chce się zmienić wartość parametru, należy to zrobić w widoku. Poniższy kod pokazuje, jak ustawić parametr na stronie I n d e x .a s p x (widoki omawiamy dalej):

|