AKADEMIA TECHNICZNO-HUMANISTYCZNA W BIELSKU - BIAŁEJ WYDZIAŁ BUDOWY MASZYN I INFORMATYKI PRACA DYPLOMOWA INŻYNIERSKA nr.. Tomasz Stojecki Nr albumu: 10619/A/327 Kierunek: Informatyka Specjalność: Inżynieria oprogramowania Temat: Programowanie aplikacji RIA dla SharePoint Server 2010 Zakres pracy: Przegląd możliwości programu SharePoint Server 2010 oraz Visual Studio 2010 SharePoint Tools Wykorzystanie technologii Silverlight do programowania aplikacji działających w środowisku SharePoint po stronie klienta Implementacja aplikacji w środowisku programistycznym.net 4.0 Implementacje wzorców projektowych umożliwiających budowanie aplikacji metodami TDD/ MVVM (test driven development / model view viewmodel) Przeprowadzenie testów oprogramowania i sformułowanie wniosków Promotor: dr inż. Mirosław Kordos KATEDRA MATEMATYKI I INFORMATYKI Bielsko-Biała, rok akademicki 2010/2011... Podpis i pieczątka Kierownika Jednostki
Spis Treści 1 Wstęp... 3 1.1 Cel i zakres pracy... 4 2 Technologia SharePoint Foundation 2010 i SharePoint Server... 5 2.1 Możliwości... 5 2.2 Wymagania sprzętowe... 8 3 Omówienie budowanej aplikacji... 9 3.1 Środowisko programistyczne Visual Studio 2010 dla SharePoint... 9 4 Aplikacje RIA... 12 5 Technologia Silverlight... 13 5.1 Możliwości Silverlight... 13 6 Integracja rozwiązań Silverlight z SharePoint 2010... 15 6.1 Wdrażanie aplikacji Silverlight w środowisku SharePoint... 15 6.2 Silverlight Web Part... 23 6.3 Komunikacja Silverlight z SharePoint API... 24 6.3.1 Client Object Model... 24 6.4 Wzorzec MVVM... 26 6.5 Bindowanie danych w Silverlight... 27 7 Aplikacja Menadżer Projektów... 30 7.1 Założenia... 30 7.2 Lista Projektów w SharePoint... 30 7.3 Struktura projektu Visual Studio 2010... 32 7.4 Aplikacja Silverlight Interfejs Użytkownika... 33 7.5 Aplikacja Silverlight - Model... 36 7.6 Aplikacja Silverlight - ViewModel... 39 9 Testy jednostkowe... 41 9.1 Testy aplikacji Menadżer Projektów... 43 10 Zalecenia i wnioski... 46 11 Bibliografia... 48 12 Biblioteki i komponenty open source... 50 2
1 Wstęp Nowoczesne firmy chcąc efektywnie konkurować na rynku muszą dysponować szerokim wachlarzem aplikacji biznesowych usprawniających codzienną działalność przedsiębiorstwa. Ewolucja oprogramowania a zwłaszcza dynamiczny rozwój internetu, sprawiły że aplikacje biznesowe wykorzystują dziś infrastrukturę internetu do budowy elastycznych rozwiązań przynoszących szereg wymiernych korzyści takich jak: Praca w dowolnym miejscu i na wielu urządzeniach dająca użytkownikom możliwość dokonywania szybkich i bardziej trafnych decyzji Zwiększona moc oprogramowania poprzez wykorzystanie usług i serwisów w architekturze typu chmura Zmniejszenie kosztów związanych z wdrożeniem i utrzymaniem oprogramowania Lepszy kontakt i współpraca przy wykorzystaniu narzędzi pracy grupowej i wymiany informacji Firma Microsoft od dłuższego czasu podąża strategią budowy sztandarowych technologii produktywności biznesowej z wykorzystaniem usług online. Można zaliczyć do nich między innymi najnowszą wersję pakietu Microsoft Office 2010, technologię SharePoint czy technologię Silverlight. Dziś budowanie aplikacji przy użyciu pojedynczej technologii staje się nieefektywne, w związku z tym firmy programistyczne poszukują zestawienia technologii, które umożliwi im tworzenie aplikacji w sposób elastyczny, produktywny i dający zamierzony efekt końcowy. Nie wystarczy już wyłącznie dostarczenie funkcjonalności, trzeba również zadbać o należytą prezentację i użytkowalność oprogramowania. Użytkownik musi odnosić wrażenie, że praca z oprogramowaniem odbywa się w sposób optymalny [1]. Jednocześnie przed firmami decydującymi się na inwestycję w oprogramowanie stawia się pytanie czy zlecać tworzenie oprogramowania od podstaw na wyłączne potrzeby danego przedsiębiorstwa, czy też wykorzystywać gotowe rozwiązania, które spełnią znaczną część wymagań i uzupełnić pozostałe poprzez budowę zintergorwanych rozwiązań niestandardowych. Taka strategia potocznie nazywa się kup czy buduj (z ang. buy vs build). Technologia SharePoint jest realizacją wizji Microsoftu budowy systemu, posiadającego szeroki asortyment funkcji niezbędnych do efektywnego konkurowania na rynku. By strategia ta odniosła sukces, Microsoft zdał sobie sprawę, że niezbędnym jest umożliwienie integracji rozwiązań niestandardowych i szeroko rozumianej modyfikacji systemu w celu dostosowania do unikalnych procesów charakterystycznych dla danego klienta. Strategia ta okazała się sukcesem a rynek usług integracyjnych SharePoint świadczonych przez programistów i partnerów firmy 3
Microsoft jest obecnie szacowany w miliardach dolarów [2]. SharePoint tym samym stał się elastyczną platformą pozwalającą programistom szybko reagować na potrzeby biznesowe. 1.1 Cel i zakres pracy Poniższe opracowanie ma na celu przedstawienie niektórych z możliwości jakie oferuje platforma SharePoint zarówno w samym produkcie jak i pod kątem rozszerzania o dodatkową funkcjonalność. Od strony platformy SharePoint, stworzona zostanie przykładowa witryna SharePoint 2010, wyposażona w bibliotekę umożliwiają przechowywanie dokumentów, kalendarz, listę zadań oraz listę definiującą aktualne projekty i zespoły nad nimi pracujące. Zwrócimy uwagę na prosty proces tworzenia i dostosowywania do własnych potrzeb witryn i ich elementów składowych. Zaprezentowane zostaną również możliwości łatwego wyszukiwania użytkowników portalu na podstawie funkcji jakie pełnią w firmie, dokumentów i publikacji jakie opracowali czy ich zainteresowań. Drugą częścią pracy będzie budowa aplikacji Silverlight zintegrowanej ze środowiskiem SharePoint. Aplikacja ta będzie miała na celu łatwe tworzenia nowych projektów i zespołów, które komunikować będą się ze wspomnianą wcześniej listą. Nacisk położony zostanie na interaktywny interfejs użytkownika aplikacji Silverlight a także na sposób komunikacji poprzez technologie web serwisowe. Wreszcie omówiony zostanie wzorzec projektowy, o który zostanie oparta aplikacja, który sprawi, że kod aplikacji będzie modularny, łatwy w rozszerzeniu i testowaniu. 4
2 Technologia SharePoint Foundation 2010 i SharePoint Server Technologia SharePoint wyrosła przez lata do miana kluczowego składnika firmy Microsoft w zakresie oferty infrastruktury zwiększającej produktywność w firmie. Mimo braku kampanii marketingowych towarzyszących innym flagowym produktom Microsoftu, SharePoint wspiął się do miana najlepiej sprzedającego się produktu serwerowego firmy już w 2009 roku, przekraczając dochody rzędu 1 miliarda dolarów i kontynuując tą passę do dnia dzisiejszego. Sukces finansowy przerodził się tym samym w kolejne wersje produktu, udoskonalone o nowe funkcjonalności i możliwości [3]. Zasadniczą ideą SharePoint a od jego początkowej wersji 2001 jest stworzenie jednolitego środowiska złożonego z witryn internetowych opartych o biblioteki, listy i składniki web parts. Zasadniczą funkcją bibliotek i list jest przechowywanie danych w tworzonych wcześniej strukturach czy plikach. Użytkownicy tego środowiska zyskiwali jednolity interfejs do zarządzania dokumentami, możliwości ich szybkiego przeszukiwania, współdzielenia czy wersjonowania. Administratorzy odnajdywali łatwość tworzenia nowych witryn dla grup, zespołów, zarządzania bezpieczeństwem czy tworzenia kopii zapasowych. Wreszcie programiści otrzymali możliwość integracji rozwiązań niestandardowych opartych o technologię ASP.NET. Dziś SharePoint Foundation 2010 i SharePoint Server oferują znacznie szerszy wachlarz możliwości, nie mniej kluczowa idea pozostaje taka sama stworzyć zintegrowane środowisko współpracy nad projektami i dokumentami, opartym o technologie online. Towarzyszące temu funkcjonalności oferowane przez platformę omówione zostały w sekcji Możliwości [4]. Warto dodać, że SharePoint Foundation 2010, której poprzednikiem jest Windows SharePoint Services, jest technologią darmową oferowaną na systemach serwerowych Microsoftu. Program SharePoint Server (poprzednik Microsoft Office SharePoint Server) jest niejako rozszerzeniem SharePoint Foundation 2010, gdzie w wersji płatnej oferowane są dodatkowe funkcje systemu. 2.1 Możliwości Portal współpracy i wymiany informacji bazowa funkcja technologii SharePoint skupiająca możliwości łatwego tworzenia i zarządzania zawartością. Tworzenie zawartości odbywa się z poziomu przeglądarki bądź poprzez odwołanie się do ściśle zintegrowanych programów pakietu Microsoft Office. Funkcje zarządzania dokumentami dają możliwość na skonsolidowanie różnej zawartości z wielu lokalizacji w centralnie zarządzanym repozytorium, w którym jest stosowana spójna kategoryzacja. Funkcje zarządzania metadanymi, czyli informacją dotyczącą danych, upraszcza centralne zarządzanie metadanymi we wszystkich witrynach organizacji. Na podstawie metadanych można oprzeć nawigację systemu umożliwiając użytkownikom proste dotarcie do elementu docelowego. Zawartość może być oczywiście chroniona przed nieautoryzowanym dostępem, niemalże na każdym poziomie struktury przechowywania dokumentu. 5
Wyszukiwanie program SharePoint Server 2010 udostępnia zaawansowaną infrastrukturę wyszukiwania, będącą uzupełnieniem innych funkcji zwiększających produktywność firm, takich jak zarządzanie zawartością czy współpraca. Zarządzanie dokumentami i treścią - narzędzia współpracy, takie jak przepływy pracy, ułatwiają użytkownikom wspólne tworzenie, recenzowanie i zatwierdzanie dokumentów w uporządkowany sposób. Obieg dokumentów technologia umożliwiająca tworzenie w sposób graficzny własnych diagramów obrazujących procesy jakie chcemy wymusić na danym dokumencie. Przykładowymi procesami mogą być zatwierdzenia urlopów, umów czy artykułów publikowanych online. Narzędziem do tworzenia tego typu diagramów jest darmowy SharePoint Designer 2010 bądź środowisko Visual Studio 2010. Formularze prosty w obsłudze program do budowania aplikacji opartych o formularze InfoPath 2010 sprawia, że zbieranie, organizowanie i zarządzanie danymi oraz ich integracja z funkcjami systemu SharePoint staje się dużo łatwiejsze. Gotowe szablony, tabele, układy stron z opcjami kolumn, stylów sprawiają, że nie wymagana jest wiedza o projektowaniu stron internetowych i technologiach serwerowych, by tworzyć funkcjonalne i atrakcyjne wizualnie formularze. Zintegrowano również system reguł do formularzy umożliwiający walidację danych wprowadzanych do systemu. BI (Business Intelligence) szereg ściśle zintegrowanych technologii umożliwiających podejmowanie strategicznych decyzji na podstawie danych przechowywanych na serwerze SharePoint 2010, takich jak PowerPivot, PerformancePoint Services, Reporting Services. Dodatek PowerPivot łączy natywne funkcje programu Excel 2010 takie jak szybkie manipulowanie dużymi zestawami danych, integracji danych z wielu źródeł, możliwość tworzenia interaktywnych raportów oraz wiele innych funkcji analitycznych. Technologie PerformancePoint Services oraz Reporting Services wprowadzają możliwość tworzenia interaktywnych raportów i kluczowych wskaźników efektywności i prosty sposób ich publikacji na witrynach portalu. BCS (Business Connectivity Services) wzbogacają możliwości platformy SharePoint o funkcje, narzędzia i usługi upraszczające projektowanie rozwiązań ze ścisła integracją zewnętrznych danych i usług. Istnieje możliwość zarówno odczytywania, przeszukiwania jak i manipulacji w sposób bezpieczny danych przechowywanych w systemach zewnętrznych do systemu SharePoint. 6
2 1 3 4 5 Rysunek 1. Witryna SharePoint Rysunek 1 przedstawia typową witrynę SharePoint opartą na wbudowanym szablonie strony zespołowej (Team Site) z wyróżnionymi bardziej znaczącymi elementami składowymi. 1. Menu szybkiej nawigacji (Quick Launch). Jeden z wielu elementów nawigacji witryn SharePoint z rozbudowaną możliwością konfiguracji z poziomu strony internetowej. Nawigacja może zawierać elementy takie jak odnośniki do innych stron, list, bibliotek, funkcji administracyjnych, etc. Dla danego użytkownika wyświetlane są tylko odnośniki do stron do których użytkownik ma uprawnienia. 2. Rozbudowane, kontekstowe menu administracji witryną i jej elementami składowymi. Oparte na menu pakietu Microsoft Office 2010 (tzw. Ribbon) dostosowujące swoją zawartość w zależności od kontekstu strony. Istnieje możliwość dodawania i modyfikacji elementów menu. 3. Obszar główny witryny SharePoint, z reguły złożony ze składników web part, z bogatą opcją konfiguracji zarówno w trybie dzielonym gdzie wszyscy użytkownicy widzą wprowadzane zmiany jak i w trybie personalnym, gdzie użytkownik wprowadza zmiany widoczne tylko przez niego samego. 4. Biblioteka dokumentów, jeden z wielu możliwych widoków prezentacji 5. Lista projektów, jeden z wielu możliwych widoków prezentacji 7
2.2 Wymagania sprzętowe Bogata oferta funkcji zawartych w SharePoint Server 2010 przekłada się na wymagania sprzętowe i programowe. W najnowszej wersji, podstawowym wymaganiem stał się 64-bitowy system operacyjny na którym produkt będzie instalowany. Dla środowisk produkcyjnych, Microsoft oferuje 64-bitowe wersje systemu Windows Server 2008. W rozdziale tym skupimy się jednak na wymaganiach dotyczących środowiska programistycznego. Pomimo znaczących wymagań sprzętowych, Microsoft po raz pierwszy od początku istnienia produktu wprowadził możliwość jego instalacji na systemach nie serwerowych dla celów środowiska programistycznego. Oznacza to, że programiści mogą zainstalować program SharePoint Server 2010 lokalnie na systemach Windows Vista bądź Windows 7 zakładając że są to systemy 64-bitowe [5]. Minimalne wymagania zalecane przez Microsoft to: Procesor 64-bitowy RAM 4 GB dla środowiska programistycznego bądź w celach ewaluacji, 8 GB dla systemów produkcyjnych Dysk twardy 80 GB, przy czym na cele produkcyjne zaleca się dwa razy więcej by umożliwić funkcje logowania i monitorowania systemu. Preferowane są dyski szybkie, takie jak Solid State Drive (SSD). Instalacja programu na systemach Windows 7 oraz Vista wiążę się z dodatkowymi krokami, związanymi z konfiguracją fukcji serwerowych. Dokładne instrukcje odnośnie instalacji systemu zawarte są na stronie msdn microsoftu: http://msdn.microsoft.com/en-us/library/ee554869.aspx. Kolejną opcją jest instalacja systemu na maszynach wirtualnych. Trzeba pamiętać że z uwagi na 64-bitowe wymaganie odnośnie systemu operacyjnego nie ma możliwości instalacji programu SharePoint 2010 na darmowych maszynach wirtualnych firmy Microsoft jak Virtual PC czy Virtual Server. Można jednak instalować na znacznie wydajniejszym oprogramowaniu Microsoft Hyper-V, będącym częścią systemów Windows Server 2008 R2. Poniżej zamieszczono listę popularnych konfiguracji środowisk programistycznych dla SharePoint Server 2010 [6]: Maszyna wirtualna System operacyjny Zalety Hyper-V Windows Server 2008 R2 Wydajny, akceleracja sprzętowa, darmowy z licencją na system operacyjny VMWare Workstation lub VMWare Server Virtual Box Windows 7, Vista, Windows Server 2008 Windows 7, Vista, Windows Server 2008 Wydajny, akceleracja sprzętowa, możliwość instalacji na systemach nie serwerowych Możliwość instalacji na systemach nie serwerowych, darmowy 8
3 Omówienie budowanej aplikacji Aplikacja tworzona na potrzeby tego opracowania będzie miała dwa podstawowe zadania. Po pierwsze skupimy się na wykorzystaniu infrastruktury wbudowanej w środowisko SharePoint do stworzenia repozytorium zespołów programistycznych firmy w postaci listy umieszczonej na witrynie SharePoint. Pokażemy jak prosto można tworzyć interfejs umożliwiający łatwe przeglądanie i zarządzanie danymi, w tym przypadku opisującymi zespoły programistyczne. Wykorzystując infrastrukturę SharePoint zyskamy możliwość tworzenia własnych widoków danych, zarządzania danymi oraz ich wyszukiwania. Ponieważ członkowie zespołów reprezentowani są przez użytkowników portalu, wyszukiwanie interesujących nas charakterystyk użytkowników oprzemy wokół wbudowanych mechanizmów social features. Po drugie, zbudujemy aplikację Silverlight 4, którą następnie zintegrujemy z wcześniej utworzoną witryną i listą. W ten sposób dodamy interaktywny moduł do zarządzania zespołami programistycznymi, wzbogacając możliwości operowania danymi wykorzystując niestandardowe dla przeglądarek kontrolki czy techniki drag and drop. Proces tworzenia nowego zespołu oprzemy w aplikacji o trzy proste kroki: 1. Wyszukanie danych użytkowników i ich prezentacja w aplikacji. Każdy z użytkowników będzie opisany danymi personalnymi takimi jaki imię, nazwisko i adres email a także stawkę godzinową zależną od roli i kwalifikacji użytkownika. 2. Wypełnienie prostego formularza wprowadzającego nazwę projektu na potrzeby którego tworzony jest zespół a także możliwość ustawienia budżetu projektu, który następnie będzie monitorowany wraz z wprowadzaniem nowym członków projektu. 3. Proces tworzenia zespołu sprowadzi się do przeciągnięcia użytkowników do odpowiedniej części aplikacji. Jednocześnie monitorowany będzie budżet tak by nie dopuścić do jego przekroczenia. 3.1 Środowisko programistyczne Visual Studio 2010 dla SharePoint SharePoint od początkowych wersji umożliwiał integrację rozwiązań niestandardowych przy użyciu środowiska Microsoft Visual Studio. Początkowo rozwiązania te mogły być tworzone jako standardowe biblioteki klas, które nie miały wbudowanych żadnych specyficznych dla technologii SharePoint funkcji. Programista sam musiał dodać odpowiednie biblioteki i znaleźć efektywny sposób wdrażania i testowania rozwiązań, niejednokrotnie pomagając sobie dostępnymi jako open source bądź komercyjnie programami. Wraz ze wzrostem popularności tego typu rozwiązań przyszła i zmiana strategii Microsoftu, który w najnowszej wersji środowiska Visual Studio 2010 zdecydował się na umieszczenie szeregu szablonów projektów, znacznie upraszczających i przyspieszających proces tworzenia rozwiązań zintegrowanych z SharePoint [7]. 9
Omówmy pokrótce niektóre z nich: Składniki Web Part najbardziej popularny i fundamentalny sposób tworzenia rozwiązań niestandardowych na platformie SharePoint. Składniki Web parts to serwerowe kontrolki ASP.NET, które dodawane są do stref składników Web Part przez użytkowników czy administratorów w trakcie działania programu. Wyposażone zostały w bogate narzędzia personalizacji zawartości i wyglądu poszczególnego składnika, tak, że to użytkownicy witryny (w zależności od uprawnień) mają możliwości modyfikowania składników, wprowadzania zmian widocznych wyłącznie dla siebie bądź dla szerszego grona użytkowników. Interfejs użytkownika programu SharePoint w zdecydowanej większości oparty jest o koncepcję składników Web Parts. Strony ASP.NET ponieważ technologia SharePoint oparta jest o technologię ASP.NET, istnieje możliwość integracji aplikacji ASP.NET z tym środowiskiem. Jest to mniej popularny sposób uzyskiwania dodatkowej funkcjonalności, od składników Web Parts głównie z uwagi na bardziej złożony proces wdrażania oraz administracji tego typu rozwiązaniami. Workflows obieg dokumentów oparty o technologię Windows Workflow, dający programistą i zaawansowanym użytkownikom możliwość łatwego tworzenia diagramów opisujących procesy jakie chcemy wymusić na określonych typach dokumentów. Tego typu rozwiązania tworzone w znacznej części przy wykorzystaniu graficznych edytorów, które w przejrzysty sposób obrazują sposób działania i obiegu danego procesu. Event Receivers - obiorcy zdarzeń, czyli komponenty implementacja których daje programistą możliwość odpowiedzi na zdarzenia zachodzące w systemie. Takimi zdarzeniami mogą być dodawanie, edycja czy usuwanie dokumentów, tworzenie witryn i edycja ich zawartości, etc... List Definitions, Site Definitions elementy enkapsulacji własnych definicji list, bibliotek dokumentów i witryn. Paczkowane w ten sposób definicje mogą być łatwo rozprzestrzeniane na inne witryny i pomiędzy różnymi instancjami środowisk SharePoint. 10
Rysunek 2. Szablony projektów SharePoint w Visual Studio 2010 11
4 Aplikacje RIA RIA (z ang. RIA - Rich Internet Applications) to bogate, interaktywne aplikacje internetowe, przypominające zachowaniem i użytkowalnością aplikacje desktopowe. Dostęp do aplikacji z reguły odbywa się poprzez przeglądarkę, przeglądarkę z wtyczką (plug-in) lub wirtualną maszynę. Technologie początkowo wykorzystywane głównie do budowy gier online bądź aplikacji multimedialnych, dziś znajdują coraz większe zastosowanie w biznesie. Na rynku można wyróżnić następujące znaczące technologie RIA [8]: 1. Flash/Flex firmy Adobe 2. Microsoft Silverlight 3. Java (JRE) 4. HTML + Javascript W przypadku pierwszych trzech pozycji, wykorzystywana jest wtyczka do przeglądarek internetowych (bądź maszyna wirtualna), która musi być zainstalowana na komputerze uruchamiającym aplikację. Wtyczka taka ma za zadanie udostępnienie dodatkowej funkcjonalności przeglądarce, wykorzystywanej do dostarczenia funkcji niemożliwych bądź trudnych do uzyskania za pomocą HTML i Javascript. Takimi funkcjonalnościami mogą być zaawansowane animacje, bogate opcje nawigacji i obsługi aplikacji po stronie klienta, multimedia. Korzyści wynikające z zastosowania tego typu technologii wiążą się nie tylko z dodatkową funkcjonalnością w jakią wyposażymy aplikację, ale także z reguły z bardziej zintegrowanym środowiskiem programistycznym, które daje programistą możliwość szybszego i tym samym tańszego tworzenia rozwiązań. Trzeba sobie jednak jasno powiedzieć, wraz z dynamicznym rozwojem rozwiązań wykorzystujących technologię AJAX, bariera ta się zaciera. Dziś Javascript jest wykorzystywany na tak szeroką skalę, że powstaje cały szereg rozbudowanych środowisk programistycznych i gotowych bibliotek (z reguły open source) znacznie upraszczających proces tworzenia bogatych interfejsów i interaktywnych aplikacji. Podsumowując wyznaczmy charakterystyczne cechy aplikacji RIA: Interaktywne przypominające aplikacje typu desktop od strony użytkowalności aplikacji, nie mniej działające w oparciu o przeglądarki internetowe. Po stronie klienta obsługa interfejsu użytkownika odbywa się po stronie klienta, zmniejszając w ten sposób obciążenie po stronie serwera. Komunikacja z web serwisami komunikacja z serwerem ma z reguły na celu pozyskanie danych do prezentacji w aplikacji i odbywa się za pomocą web serwisów. Z reguły są to web serwisy oparte o protokół SOAP, bądź web serwisy typu REST, zwracające XML lub JSON (Javascript Object Notation). 12
5 Technologia Silverlight Silverlight jest rozwiązaniem firmy Microsoft do budowy aplikacji RIA działającej we wszystkich standardowych przeglądarkach internetowych. Z założenia pozwala na tworzenie atrakcyjnych wizualnie interfejsów użytkownika, które mogą procować na wielu środowiskach i urządzeniach. Przykładem może być wsparcie zarówno dla systemów Microsoft Windows jak i Apple Macintosh. Silverlight udostępnia elastyczny i spójny model programowania wspierający AJAX, języki.net i pozwalający na integrację z istniejącymi aplikacjami internetowymi. 5.1 Możliwości Silverlight Opis funkcji technologii Silverlight można podzielić na trzy grupy [9]: Aplikacje Interaktywne, rozbudowane interfejsy osiągane niewielkim wysiłkiem. Prezentacja danych, edycja danych w tabelkach i formularzach, lokalne buforowanie wyników przeliczeń, walidacja, drag and drop to tylko niektóre z wbudowanych funkcji pozwalających szybko tworzyć atrakcyjne wizualnie interfejsy użytkownika. Do tego dochodzi możliwość animacji dowolnych właściwości obiektów. Obrys, wypełnienie, kolor, gradient, wypukłość, przeźroczystość, kąt, położenie w przestrzeni quasi-3d itd. każdy z tych parametrów ma przypisaną wartość, która może zmieniać się na osi czasu. Wszystko to definiowane w jawnej strukturze XAML (XML) co ułatwia proces tworzenia, rozwoju i modyfikacji. Aplikacje w przeglądarce i na desktopie tworzenie aplikacji działających identycznie w przeglądarce WWW i poza nią przy użyciu jednej opcji. Aplikację działającą w przeglądarce można skonstruować tak, by użytkownik mógł samodzielnie zdecydować, czy może ona działać jako program całkowicie niezależny od przeglądarki bez wymuszania instalacji czegokolwiek. 60+ wbudowanych kontrolek, oraz wiele więcej open source i komercyjnych Łatwość prototypowania z użyciem narzędzie SketchFlow Rich Text, Drukowanie, dostęp do niektórych funkcji systemu takich jak schowek, lokalny dysk, funkcje MS Office Media Platforma zawiera narzędzia umożliwiające tworzenie witryn i aplikacji zarówno do dystrybucji plików audio/wideo, jak i do udostępniania ich w trybie strumieniowym. Strumienie mogą wykorzystywać pakiety multicast, a ich stopień kompresji może się dynamicznie zmieniać w zależności od dostępnego pasma. Do kodowania obrazu i dźwięku można wykorzystywać najnowsze kodeki wysokiej jakości (H.264 AVC lub VC-1, z rozdzielczością do 1080p) bez obawy o moc obliczeniową komputerów użytkowników. 13
Silverlight 4 pozwala bowiem na sprzętowe wspomaganie dekodowania sygnałów audio i wideo. Technologia Deep Zoom daje możliwość wyświetlania wysokiej jakości zdjęć bez konieczności czekania na przeładowanie grafiki czy zbędnego obciążania wydajności aplikacji. Wbudowane funkcje integrujące z kamerą czy mikrofonem dają możliwość przechwytywania sygnału z urządzeń peryferyjnych i ich wykorzystania w aplikacji. Nagrany materiał może być zapisany z nagłówkami lub jako materiał surowy a także może być zabezpieczony technologią DRM (Digital Rights Management). Windows Phone 7, Windows Embedded Silverlight 4 jest także podstawowym środowiskiem do tworzenia aplikacji dla najnowszej platformy mobilnej Windows Phone 7. Jest też przewidziany jako podstawowa platforma aplikacyjna dla nowej edycji platformy Windows Embedded (odbiorniki TV, kioski). 14
6 Integracja rozwiązań Silverlight z SharePoint 2010 Microsoft nie poprzestał na zaleceniu wykorzystania technologii Silverlight w środowisku SharePoint, ale sam oparł cały szereg elementów witryn wokół tej technologii dla uzyskania bogatszego doświadczenia jakie użytkownik odnosi przy pracy z SharePoint em. Całość została pomyślana tak, by dać użytkownikowi prawo wyboru odnośnie tego czy chce te możliwości wykorzystać, czy też woli oprzeć się o standardy HTML i Javascript. System SharePoint potrafi więc automatycznie rozpoznać czy użytkownik ma zainstalowaną wtyczkę Silverlight i wyrenderować odpowiedni interfejs. Wykorzystanie Silverlight w środowisku SharePoint 2010 zmusiło Microsoft do opracowania zespołu elementów ułatwiających tworzenie i wdrażanie aplikacji, które następnie mogą być wykorzystane przez programistę do budowy własnych rozwiązań RIA integrujących z SharePoint. Do elementów tych zaliczyć można środowisko programistyczne (IDE - Integrated Development Environment) do budowy aplikacji Silverlight, elementy wspierające wdrażanie aplikacji Silverlight i jej integrację z witrynami SharePoint oraz zespół bibliotek i web serwisów umożliwiających programowy dostęp do wbudowanych funkcji systemu (SharePoint API). 6.1 Wdrażanie aplikacji Silverlight w środowisku SharePoint Microsoft zadbał o to, by integracja aplikacji Silverlight odbywała się w prosty i przejrzysty sposób. Ponieważ cały kod źródłowy aplikacji Silverlight kompilowany jest do pliku.xap, środowisko SharePoint wyposażono w składnik Silverlight web part, którego naczelnym zadaniem jest odwołanie się do pliku xap i wygenerowanie kodu HTML uruchamiającego aplikację jako część strony internetowej. Sam plik.xap może być przechowywany zarówno w systemie plików gdzie zainstalowany jest SharePoint, przy założeniu że plik jest przechowywany w wirtualnym folderze, do którego możliwy jest dostęp poprzez HTTP, bądź w bibliotekach dokumentów lub folderach samego SharePoint. Przyjrzyjmy się teraz jak tworzone jest rozwiązanie Silverlight dla SharePoint w środowisku Visual Studio 2010. 1. Tworzenie nowego projektu Silverlight zaczyna się od wybrania szablonu Silverlight Application dostępnego w kategorii Silverlight, w menu File-New-Project... 15
Rysunek 3. Nowy projekt Silverlight Application w VS 2010 2. Przy zapytaniu czy chcemy utworzyć projekt strony web do uruchomienia aplikacji Silvelight, odpowiadamy nie, z uwagi na to, że aplikacja będzie uruchamiana w środowisku SharePoint. Rysunek 4. Okno tworzenia aplikacji testowej projektu Silverlight w VS 2010 16
3. Dodajemy kolejny projekt, tym razem z zakładki SharePoint, wybierając Empty SharePoint Project. Celem tego projektu będzie wdrożenie pliku wynikowego.xap do folderu strony SharePoint. Rysunek 5. Projekty SharePoint 2010 4. Ponieważ jest to projekt SharePoint, należy podać adres witryny, która posłuży do testowania i debugowania naszej aplikacji. Należy również odpowiedzieć na pytanie czy chcemy utworzyć Sandboxed solution czy Full Trust solution. Dla rozwiązań SharePoint wybieramy Sandboxed solution i naciskamy Finish. 17
Rysunek 6. Konfiguracja witryny testowej projektu SharePoint 5. W kolejnym kroku dodajemy tzw. moduł (Module), który ma za zadanie kopiowanie plików lokalnych do list, bibliotek bądź folderów SharePoint. Dla nowo utworzonego projektu SharePoint wybieramy więc Add New Item a następnie z kategorii SharePoint wybieramy Module i podajemy nazwę modułu w naszym przypadku XAPs. 18
Rysunek 7. Tworzenie modułu w projekcie SharePoint Na tym etapie całość rozwiązania będzie składała się z dwóch projektów Silverlight i SharePoint. Projekt Silverlight domyślnie posiada dwa pliki xaml które tworzą startowe okno aplikacji Silverlight. Projekt SharePoint będzie posiadał większa liczbę elementów i zanim przejdziemy do kolejnego kroku, przyjrzyjmy się im bliżej. 19
Rysunek 8. Elementy składowe projektów Silverlight i SharePoint Features (funkcje), moduł umożliwiający wdrażanie i administrację w systematyczny i uregulowany sposób elementarnymi funkcjami zintegrowanymi z SharePoint. Każda niestandardowa funkcjonalność wdrażana do SharePoint powinna być zawarta jako funkcja. Funkcje mogą wpływać na różne obszary SharePoint'a, np. na pojedynczą witrynę, kolekcję witryn, czy całą farmę. Wbudowane funkcje oraz funkcje z rozwiązaniami typu Full Trust zlokalizowane są w folderze %14%\TEMPLATE\FEATURES (%14% odwołuje się do folderu głównego SharePoint 2010, tzw. SharePoint Root, domyślnie zlokalizowany w C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14). W poprzedniej wersji 2007, folder ten nazywał się 12. Funkcje dla rozwiązań typu Sandboxed nie są instalowane w systemie plików, ale przechowywane są w wirtualnej galerii rozwiązań SharePoint. Funkcje mogą definiować praktycznie wszystkie elementy składowe architektury SharePoint'a, takie jak: o składnik Web Part o moduły o szablon witryny o typ zawartości o obiegi dokumentów o szablony i instancje list 20
Aktywując daną funkcję udostępniamy ją na danym poziomie, na przykład na pojedynczej witrynie lub w całej kolekcji witryn. Solution Package (rozwiązanie, paczka) plik.wsp zawierający wszystkie elementy składowe wdrażanego rozwiązania takie jak funkcje czy moduły. Administrator ma do dyspozycji narzędzia ułatwiające ich wdrażanie i administrację. Module (moduł) element pozwalający na wdrożenie jednego lub wielu plików do docelowych bibliotek, list czy folderów SharePoint a. W naszym przypadku, stworzony moduł XAPs wdroży pliki zdefiniowane w definicji modułu zawartego w pliku elements.xml. Plik ten ma za zadanie określenie źródła i miejsca docelowego dla wdrażanych plików. 6. Domyślnie moduł zawiera plik sample.txt. Jeżeli otworzymy plik elements.xml modułu zauważymy, że element File określa jak umieścić plik w zadanej lokalizacji środowiska SharePoint. <Elements xmlns="http://schemas.microsoft.com/sharepoint/"> <Module Name="XAPs"> <File Path="XAPs\Sample.txt" Url="XAPs/Sample.txt" /> </Module> </Elements> Zwróćmy uwagę, że atrybut Path definiuje lokalizację w systemie plików, natomiast atrybut Url definiuje docelową lokalizację w folderze XAPs SharePoint a. Co ważne, moduł domyślnie wyposażony jest w funkcję śledzenia jakie pliki znajdują się w katalogu modułu i odpowiednio aktualizuje zawartość pliku elements.xml. Usuniemy więc plik Sample.txt z naszego modułu i zobaczymy, że element File zostanie usunięty z pliku elements.xml. 7. Ostatnim krokiem przed uruchomieniem procesu wdrożenia jest dodanie pliku wynikowego.xap do modułu XAPs. Należy się upewnić, że plik.xap będzie miał ustawiony DeploymentType jako ElementFile we właściwościach pliku. To zapewni, że plik nasz będzie dołączony do rozwiązania (.wsp). Krok ten można zautomatyzować przy z wykorzystaniem zdarzeń budujących (post-build events) w Visual Studio 2010. Pozwalają one na specyfikowanie operacji wykonywanych przed bądź po każdorazowym skompilowaniu naszego projektu. Można więc posłużyć się komendą xcopy do skopiowania pliku.xap do folderu XAPs. Więcej na temat post-build events w Visual Studio 2010 można znaleźć na stronach MSDN: http://msdn.microsoft.com/en-us/library/ke5z92ks.aspx. 21
Rysunek 9. Plik.xap w module projektu SharePoint 8. Tak przygotowany projekt możemy wdrożyć do środowiska SharePoint opcją Deploy. Rysunek 10. Wdrażanie aplikacji Silverlight do środowiska SharePoint Zanim przejdziemy do kolejnego etapu, należy podkreślić, że pliki.xap równie dobrze kopiować można do folderów wirtualnych SharePoint a, takich jak folder _layouts 22
(%14%\TEMPLATE\LAYOUTS). W ten sposób nasz plik będzie dostępny dla całej farmy, nie tylko dla wybranych witryn. 6.2 Silverlight Web Part Na tym etapie, aplikacja Silverlight (plik.xap) jest dostępna z poziomu przeglądarki, zakładając, że użytkownik ma odpowiednie uprawnienia do pliku. Pozostaje więc skonfigurować witrynę tak, by uruchomić zawartą na niej aplikację. Do tego celu posłużymy się wbudowanym składnikiem Silverlight Web Part. Składnik ten jest bardzo prosty w konfiguracji i sprowadza się do podania parametru URL określającego adres pliku.xap. W naszym przypadku plik został wdrożony do folderu XAPs korzenia hierarchii portalu, w związku z czym adres internetowy możemy określić jako /XAPs/AplikacjaSilverlight.xap. Opcjonalnie składnik daje możliwość podania parametrów startowych, które następnie są przekazywane do aplikacji Silverlight poprzez właściwość InitParameters. Rysunek 11. Konfiguracja składnika SharePoint web part 23
6.3 Komunikacja Silverlight z SharePoint API Ponieważ Silverlight jest technologią kliencką a SharePoint serwerową wymagane jest zapewnienie mechanizmów komunikacji, które umożliwią wykorzystanie bogatych funkcji serwerowych w aplikacji klienckiej. Mechanizmy te oparte zostały o serwisy webowe (web service) umożliwiające komunikację z serwerem w oparciu o standardowe protokoły sieciowe takie jak HTTP. Należy podkreślić, że w Silverlight komunikacja sieciowa musi odbywać się w sposób asynchroniczny. Narzucenie tej konwencji ma na celu uniemożliwienie blokowania systemu klienckiego przy wykonywaniu dłuższych operacji, takich jak komunikacja z web serwisem. Model programowania asynchronicznego zostanie omówiony szerzej w sekcji Komunikacja Silverlight z SharePoint API. W SharePont 2010 zdecydowanie najbardziej popularną opcją komunikacji klienta z serwerem jest Client Object Model. Do alternatywnych metod dostępu do SharePoint API zaliczyć można: Web serwisy SOAP, przeniesione w znacznej części z wersji 2007 pomimo że oferują dostęp do znacznej części API, model programowania znacznie odbiega od ideału. Z reguły by uzyskać interesujące nas dane, zmuszeni jesteśmy do parsowania XML a, co prowadzi do częstych błędów i wymaga większego nakładu pracy. REST Services zyskujący coraz większą popularność wzorzec architektury systemów rozproszonych oparty na wykorzystaniu protokołu HTTP i mechanizmów w nim zawartych do reprezentacji zasobów przechowywanych na serwerze. Jako nośnik informacji wykorzystuje się formaty XML i JSON, co znacznie upraszcza programowanie po stronie klienta z uwagi na możliwość wykorzystania standardowych bibliotek obsługujących te formaty praktycznie w każdym języku programowania. 6.3.1 Client Object Model Microsoft od samego początku wprowadzania technologii Silverlight podkreślał, że programiści.net będą mieli do dyspozycji dobrze im znany model programowania oparty o języki C# i VB.NET. Nie inaczej jest w przypadku programowania aplikacji Silverlight dla SharePoint, gdzie stworzono zespół bibliotek.net umożliwiających komunikację z API SharePoint a w sposób programowy bez konieczności wywoływania metod i usług zapewniających komunikację sieciową. W tym celu stworzono Client Object Model (Client OM), który charakteryzuje się następującymi własnościami: Zawiera znaczną część SharePoint API umożliwiając programową komunikację z witrynami i ich elementami składowymi, takimi jak listy, biblioteki dokumentów, użytkownicy. Wspiera operacje wykonywane grupowo w celu optymalizacji czasu zapytania i odpowiedzi. Implementacja dla.net, Silverlight i Javascript umozliwia wykorzystanie w różnorakich aplikacjach, takich jak aplikacje desktopowe, strony internetowe, czy aplikacje Silverlight. 24
Na diagramie Rysunek 12. Schemat działania Client Object Model przedstawiono elementy składowe i role jakie odgrywają w procesie komunikacji klienta z serwerem [10]. Kod aplikacji Silverlight odwołuje się bezpośrednio do bibliotek Client OM operując na zawartych tam klasach i obiektach. Następnie biblioteka Client OM delegując do klas proxy kieruje żądania wykonania poszczególnych usług do kodu odpowiedniego web serwisu. Logika web serwisu zawarta jest w serwisie WCF (Windows Communication Foundation) o nazwie Client.svc. Web serwis ten z kolei odwołuje się do API SharePoint a, w odpowiedzi dostając żądane dane bądź zlecając wykonanie usług. Rysunek 12. Schemat działania Client Object Model Aby wykorzystać biblioteki w aplikacji Silverlight, musimy dodać dwa pliki.dll zawarte w folderze 14\TEMPLATE\LAYOYTS\ClientBin Microsoft.SharePoint.Client.Silverlight.dll Microsoft.SharePoint.Client.Silverlight.Runtime.dll W ten sposób możemy zacząć odwoływać się do obiektów reprezentujących elementy składowe SharePoint jak na przykład Web (witryna) czy List (lista). 25
6.4 Wzorzec MVVM Programista przy budowie aplikacji Silverlight ma pełną swobodę projektowania kodu aplikacji według własnych upodobań. Z czasem jednak, programiści zaczęli opracowywać pewne wzorce, których naczelnym celem było utrzymanie wysokiej jakości kodu, między innymi poprzez odseparowanie zagadnień logiki biznesowej od logiki prezentacji. Jednym z takich wzorców jest wzorzec MVVM (Model View ViewModel) [11], zaprojektowany na podstawie popularnego w technologiach serwerowych języków programowania wzorca MVC (Model View Controller). O popularności MVC świadczy fakt, że praktycznie wszystkie znane języki programowania aplikacji internetowych (ASP.NET, Java, Ruby on Rails, Python) dostarczają rozwiązań umożliwiających tworzenie projektu podążając wytycznymi wzorca MVC. Do korzyści wynikających z takiej budowy aplikacji zaliczyć można m.in. separację zagadnień, testowalność aplikacji (możliwość pisania testów jednostkowych, o których mowa będzie szerzej w rozdziale 26
Testy jednostkowe), łatwiejszą rozbudowę aplikacji, reużywalność kodu, czy płynniejsza współpraca pomiędzy grafikiem a programistą z uwagi na łatwość wprowadzania danych projektowych (design data). Konieczność dostosowania wzorca MVC, w wyniku czego powstał wzorzec MVVM, wzięła się głównie z chęci wykorzystania bardzo użytecznej cechy technologii Silverlight i WPF jaką jest bindowanie danych (data bindings). Cecha ta umożliwia zlecenie wyświetlania danych i ich formatowania oraz określenie sposobu interakcji elementom interfejsu użytkownika w sposób deklaratywny. Nie tylko upraszcza to procedurę prezentacji i interakcji z danymi po stronie interfejsu użytkownika, ale pozwala również na monitorowania zmian zachodzących w obiektach przechowujących dane i odpowiednią reakcję elementów prezentacji danych. Jako programiści oznacza to, że jesteśmy zwolnieni z obowiązku odświeżania kontrolek wraz ze zmianą danych, kontrolki bindowane do danych będą natywnie pełniły tę funkcję. Działanie bindowania danych zostanie omówione szerzej w sekcji Popularność wzorca MVVM sprawiła, że powstał cały szereg szkieletów aplikacyjnych (framework) stworzonych przez firmę Microsoft badź open source, upraszczających znacznie budowę aplikacji tą metodą. Do bardziej popularnych należą: MVVM Light Toolkit open source (http://mvvmlight.codeplex.com/) Caliburn open source (http://www.codeplex.com/caliburn) Calcium open source (http://calcium.codeplex.com/) MEF (Managed Extensibility Framework) Microsoft Do budowy naszej aplikacji, wykorzystany został MVVM Light Toolkit. Bindowanie danych w Silverlight. Wzorzec MVVM jak sama nazwa wskazuje wyróżnia trzy podstawowe bloki budujące aplikację: View (widok) kod bezpośrednio tworzący interfejs użytkownika, w przypadku Silverlight najczęściej zawarty w plikach XAML (Extensible Application Markup Language) będącym językiem XML opisującym elementy interfejsu użytkownika. Jedynym zadaniem widoku powinna być prezentacja danych. Widok nie powinien zawierać logiki biznesowej, czy nawet logiki odnoszącej się do prezentacji. Powinien zawierać okna, strony, kontrolki, style, czyli wszystko co służy do prezentacji informacji. Oczywiście elementy te będą z reguły umożliwiały pewną formę interakcji z użytkownikiem i tu widok ma za zadanie umożliwienie takowej, poprzez przekazanie obsługi zdarzenia elementowi ViewModel. Model (model) dane i usługi im towarzyszące. Obiekty tworzące logikę biznesową naszej aplikacji dające możliwość pozyskania i manipulacji interesującymi nas danymi. W skład modelu wchodzą z reguły obiekty domeny biznesowej, ich właściwości i reguły walidacji. ViewModel (widok model) element pośredniczący pomiędzy widokiem a modelem (interfejsem a danymi). Będzie zbindowany do widoku, co umożliwi bardzo prostą obsługę 27
wszelkiego rodzaju interakcji udostępnionej przez elementy widoku. Jednocześnie będzie posiadał potrzebne elementy modelu, delegując wszelkiego rodzaju żądania usług i danych do tej warstwy. Widok nigdy nie komunikuje się bezpośrednio z modelem i odwrotnie. Komunikacja odbywa się poprzez element ViewModel. ViewModel Logika prezentacji View (Widok) Model XAML Kod Logika biznesowa Rysunek 13. Komunikacja pomiędzy elementami wzorca MVVM Popularność wzorca MVVM sprawiła, że powstał cały szereg szkieletów aplikacyjnych (framework) stworzonych przez firmę Microsoft badź open source, upraszczających znacznie budowę aplikacji tą metodą. Do bardziej popularnych należą: MVVM Light Toolkit open source (http://mvvmlight.codeplex.com/) Caliburn open source (http://www.codeplex.com/caliburn) Calcium open source (http://calcium.codeplex.com/) MEF (Managed Extensibility Framework) Microsoft Do budowy naszej aplikacji, wykorzystany został MVVM Light Toolkit. 6.5 Bindowanie danych w Silverlight Zasada działania bindowania danych może być przedstawiona w następujący sposób: Cel bindowania Źródło bindowania Element Interfejsu Właściwośd zależna Obiekt Bindujący Obiekt Właściwośd Konwerter wartości 28
Rysunek 14. Bindowanie w Silverlight Mechanizm bindujący otrzymuje od obiektu bindującego następujące informacje: 1. Docelowa własność elementu interfejsu użytkownika, która wyświetla i pozwala bądź nie na wprowadzenie zmian. 2. Obiekt źródłowy zawierający dane przepływające między źródłem i elementem docelowym. 3. Kierunek przepływu danych zdefiniowany przez właściwość Mode obiektu bindującego. 4. Opcjonalny konwerter wartości (Value Converter), będący implementacją interfejsu IValueConverter. W naszym projekcie zastosujemy bindowanie danych do wyświetlania i edycji danych. Bindowanie ustawia się w pliku XAML, gdzie znajduje się nasza kontrolka przy użyciu składni {Binding...}. Poniższy przykład prezentuje kontrolkę TextBox, gdzie właściwość Text jest deklaratywnie bindowana do właściwości ProjectName obiektu źródłowego. W ten sposób nazwa projektu będzie się automatycznie zmieniać w zależności od wartości przechowywanej we własności ProjectName. Zauważmy również, ze jako źródło przypisania można użyć zasobów statycznych (np. atrybut Style do zmiany wyglądu kontrolki). <TextBox x:name="projectnametextbox" Text="{Binding ProjectName}" Style="{StaticResource TextBox}"/> Należy podkreślić, że aby istniała możliwość automatycznego odświeżenia wartości prezentowanych danych przy zmianie danych w obiekcie źródłowym, obiekt ten musi zaimplementować interfejs INotifyPropertyChanged, a konkretnie zdarzenie PropertyChanged. Zdarzenie to ma za zadanie powiadomienie obiektu docelowego, że obiekt źródłowy uległ zmianie, tak by wymusić aktualizację prezentowanych wartości. W naszym przypadku, zaimplementowany zostanie w klasie bazowej NotifiableObject od której to dziedziczyć będą obiekty będące źródłami bindowania. Przyjrzyjmy się zatem implementacji klasy bazowej: public abstract class NotifiableObject : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void RaisePropertyChanged(string propertyname) { if (PropertyChanged!= null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } 29
} Jak widać implementacja interfejsu opiera się na dostarczeniu logiki definiującej zdarzenie PropertyChanged, a więc zdarzenie zmiany właściwości obiektu. Tego typu sposób obsługi zdarzeń jest typowy dla języków programowania technologii.net i można go spotkać w większości klas umożliwiających obsługę zdarzeń. Sprowadza się on do dwóch zasadniczych kroków: 1. Deklaracji zdarzenia wraz z delegatem (PropertyChangedEventHandler), określającym sygnaturę metody obsługującej zdarzenie: public event PropertyChangedEventHandler PropertyChanged; 2. Udostępnienia metody umożliwiającej wywołanie zdarzenia. Sprawdzenie wartości null obiektu event odpowiada sprawdzeniu, czy są obiekty nasłuchujące danego zdarzenia. W przypadku gdy takie są, zostaną powiadomione o zdarzeniu. protected void RaisePropertyChanged(string propertyname) { if (PropertyChanged!= null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } W ten prosty sposób uzyskujemy klasę abstrakcyjną, dziedziczenie od której daje nam funkcję niezbędną do efektywnego bindowania obiektów w Silverlight. 7 Aplikacja Menadżer Projektów Menadżer Projektów jest aplikacją Silverlight stworzoną na potrzeby tego opracowania prezentującą praktyczne zastosowanie omówionych wcześniej technologii. W tym rozdziale szczegółowo omówię elementarne moduły wraz z kodem źrodłowym tworzące aplikację a także proces wdrażania i uruchamiania w środowisku SharePoint Server 2010. Zanim przejdę do szczegółów implementacji, omówione zostaną założenia projektu. 7.1 Założenia Założenia funkcjonalne: Aplikacja ma wyświetlić dane istniejących pracowników firmy, takie jak imię, nazwisko, email, zdjęcie oraz stawka godzinowa 30
Aplikacja ma umożliwić tworzenie zespołów projektowych złożonych z pracowników firmy przy określeniu nazwy i budżetu projektu Aplikacja ma umożliwić wprowadzenie budżetu projektu i wymusić by koszt projektu złożony dla uproszczenia wyłącznie ze stawek godzinowych pracowników nie został przekroczony Założenia niefunkcjonalne: Aplikacja ma być uruchamiania na witrynie środowiska SharePoint jako aplikacja Silverlight Aplikacja ma komunikować się z listami środowiska SharePoint do pobierania i manipulacji danych poprzez wykorzystanie bibliotek Client OM Aplikacja ma umożliwić łatwe tworzenie nowych projektów z użyciem technologii drag and drop do wyboru pracowników projektu Aplikacja ma dostarczyć łatwy w użyciu i intuicyjny interfejs użytkownika Budżet ma być wprowadzany za pomocą kontrolki typu numeric picker 7.2 Lista Projektów w SharePoint Zanim przejdziemy do tworzenia aplikacji Silverlight, niezbędne jest stworzenie elementów z którymi aplikacja będzie się komunikować w środowisku SharePoint. W naszym przypadku będzie to prosta lista, umieszona na witrynie SharePoint zadaniem której będzie wyświetlanie projektów i biorących w nich udział pracowników. Lista powinna grupować członków poszczególnych projektów według ich przynależności do projektu. Powinna wyświetlić zdjęcie użytkownika, jego dane osobowe oraz stawkę godzinową. W środowisku SharePoint, tworzenie nowych list sprowadza się do kilku prostych kroków. 1. Z menu Site Actions należy wybrać opcję More Options... 2. Zaprezentowane zostanie okno Create wyświetlające wszystkie dostępne typy obiektów jakie możemy utworzyć. Z lewego menu Filters wybieramy List, następnie z okna głównego Custom List i nadajemy nowo tworzonej liście nazwę Projekty po czym klikamy przycisk Create. 31
Rysunek 15. Okno Create witryny SharePoint 3. Na tym etapie nasza lista została stworzona. Pozostaje dodać pola, które będą opisywać dane przechowywane w liście. W tym celu, z menu górnego wybieramy List Settings. Rysunek 16. Nowo stworzona lista SharePoint 4. W List Settings, w sekcji Columns, klikamy na domyślną kolumnę Title i zmieniamy jej nazwę na Nazwa Projektu. 5. Klikamy Create Column i tworzymy dodatkowe kolumny o następujących nazwach i typach: a. Funkcja - Typ: Choice (w polu Type each choice on a separate line należy wprowadzić wartości: Kierownik, Programista, Tester, Menadżer) b. Pracownik Typ: User or Group (w polu Show field należy wybrać Name (with picture) ) c. Stawka Typ: Currency (w polu Currency format należy wybrać zł (Poland) ) 32
6. W List Settings, z sekcji Views klikamy na widok All Items. W sekcji Columns, zaznaczamy pola Pracownik, Funkcja, Stawka. W sekcji Group By, obok First group by the column, wybieramy Nazwa Projektu (linked to item with edit menu). Na tym etapie nasza lista jest utworzona. Pozostaje utworzyć projekty i przypisać im pracowników. Rysunek 17. Widok listy projektów 7.3 Struktura projektu Visual Studio 2010 W rozdziale Wdrażanie aplikacji Silverlight w środowisku SharePoint omówiliśmy szczegółowo proces tworzenia projektu aplikacji Silverlight na potrzeby integracji z środowiskiem SharePoint. Projekt Menadżer Projektów został stworzony podążając tymi samymi wytycznymi. Całość składa się więc z projektu Aplikacji Silverlight, projektu SharePoint oraz projektu zawierającego testy (projekty testowe będą szerzej omówione w rozdziale Testy aplikacji Menadżer Projektów). 33
Rysunek 18. Projekty tworzące aplikację Menadżer Projektów 7.4 Aplikacja Silverlight Interfejs Użytkownika Elementy interfejsu użytkownika zostały zawarte w pliku MainPage.xaml. Zauważmy, że otwarcie pliku MainPage.xaml, zaprezentowane na Rysunek 19, prezentuje okno aplikacji wraz z danymi projektowymi (z ang. Design data, czasami nazywane danymi testowymi). Jest to niezwykle użyteczna funkcja wynikająca z zastosowania wzorca MVVM wraz z biblioteką MVVM Light, oraz jej wsparcia dla danych projektowych. W oknie poniżej widać wycinek kodu wynikowego XAML powstającego w wyniku dodania kontrolek składowych okna aplikacji. 34
1 4 2 3 5 6 7 Rysunek 19. Okno aplikacji w środowisku VS 2010 z danymi projektowymi 1. Elementy grupowane są za pomocą kontrolek Grid oraz StackPanel. Są to standardowe kontrolki Silverlight dające możliwość elastycznego budowania układu strony. Element Grid jest strukturą złożoną z wierszy i kolumn [12]. Najbardziej zewnętrznym elementem jest Grid o nazwie LayoutRoot określający zewnętrzne wymiary okna. Wewnątrz znajduje się kolejny Grid (UsersGrid) dzielący okno główne na trzy kolumny widoczne na Rysunku 2. Pozycjonowanie elementów wewnątrz kolumn odbywa się za pomocą tzw. atrybutów dołączonych (attached properties) elementów składowych. Na przykład aby umieścić element StackPanel w kolumnie o indeksie 2, dodajemy atrybut Grid.Column o wartości 2. <StackPanel Name="TeamFormStackPanel" Grid.Column="2" ></StackPanel> 35
Element StackPanel z kolei pozwala na proste pozycjonowanie elementów jeden pod drugim bądż jeden obok drugiego. 2. Lista użytkowników portalu wyświetlana jest za pomocą kontrolek ListBox. ListBox jest niezwykle elastycznym komponentem pozwalającym na wyświetlania, formatowanie, grupowanie kolekcji danych. My posłużymy się nim do sformatowania danych użytkowników pobranych ze środowiska SharePoint w sposób pokazany na Rysunek 19. Widzimy, że wyświetlamy zdjęcie użytkownika wraz z częścią jego danych, takich jak imię czy stawka godzinowa. Element oznaczony jako 3 jest również kontrolką ListBox, na która będziemy przeciągać użytkowników aplikacji, których chcemy przypisać do danego zespołu projektowego. Mechanizm drag and drop zaimplementowany został za pomocą kontrolek ListBoxDragDropTarget, będących częścią biblioteki Silverlight 4 Toolkit [13]. Uzyskanie efektu drag and drop ogranicza się do umieszczenia kontrolek ListBox wewnątrz ListBoxDragDropTarget i ustawienia atrybutów AllowDrop = True. Ponieważ my chcemy odpowiadać na zdarzenia przeciągnięcia czy upuszczenia użytkownika, zdefiniujemy również jakie zdarzenia chcemy przekazywać w postaci komend (Command) do elementu ViewModel za pomocą tzw. wyzwalaczy zdarzeń (Event Trigger). W przykładzie poniżej definiujemy, że chcemy aby zdarzenie ItemDragStarting kontrolki ListBoxDragDropTarget (rozpoczęcie przeciągania) uruchomiło komendę DropStartingUserCommand zbindowaną w klasie ViewModel. Możemy również określić argument do przekazania metodzie odbierającej zdarzenie [14]. <toolkit:listboxdragdroptarget AllowDrop="True" VerticalAlignment="Top" HorizontalAlignment="Left" MinHeight="320"> <i:interaction.triggers> <i:eventtrigger EventName="ItemDragStarting"> <mvvmlightcmd:eventtocommand Command="{Binding DropStartingUserCommand}" PassEventArgsToCommand="True" /> </i:eventtrigger> <i:interaction.triggers> Zwróćmy jeszcze uwagę na definicję pojedynczego elementu listy. Posłużymy się w tym przypadku elementem DataTemplate, zawartym wśród zasobów okna aplikacji. Sam szablon składa się z elementów StackPanel, jednego do układu poziomego, drugiego do układu pionowego. W ten sposób możemy rozmieścić zdjęcie i dane opisujące atrybuty użytkownika. Ponieważ definicja szablonu zawarta jest w zasobach, możemy łatwo użyć go 36
w wielu miejscach aplikacji. W naszym przypadku, będą to dwie kontrolki ListBox, jedna z której przeciągamy elementy i druga docelowa. <UserControl.Resources> <DataTemplate x:key="useritemtemplate">... </DataTemplate> </UserControl.Resources> 3. Docelowa lista zawierający pracowników przypisanych do projektu jest zdefiniowana za pomocą kontrolki ListBox. Szablon, style i zdarzenia pokrywają się z tym co opisane w punkcie 2. 4. W górnej części okna znajdują sie dwie kontrolki typu Button. Począwszy od Silverlight 4, kontrolka Button implementuje ICommand interfejs co sprawia, że natywnie wspiera ona komendy. Każdemu z przycisków przypisujemy więc komendę do wywołania wykorzystując wcześniej omówiony mechanizm bindowania: <Button Content="Resetuj" Command="{Binding ResetCommand}" /> <Button Content="Utwórz" Command="{Binding SubmitCommand}"/> 5. Kontrolka TextBox pozwalająca na wprowadzenie nazwy projektu. 6. Kontrolka NumericUpDown pozwalająca na określenie budżetu projektu. 7. Panel wyświetlający dynamicznie liczone parametry projektu. 7.5 Aplikacja Silverlight - Model Logika biznesowa aplikacji została zdefiniowana w klasach umieszonych w folderach Data i Services. Usługi aplikacji zdefiniowane zostały w klasie UserDataServices i sprowadzają się do dwóch zasadniczych operacji: 1. GetUsers metoda pobierająca użytkowników portalu 2. CreateProject metoda tworząca nowy projekt wraz z przypisanymi mu użytkownikami Przyglądając się definicji metody GetUsers zauważamy, że zawiera ona parametr określony delegatem generycznym: void GetUsers(Action<IEnumerable<User>, Exception> getuserscallback) Jak wspomniano wcześniej, wszelka komunikacja sieciowa w Silverlight musi odbywać się asynchronicznie. Model programowania asynchronicznego w.net można realizować na wiele sposobów, jednakże ten z wykorzystaniem delegatów generycznych jest wyjątkowo przejrzysty. Sprowadza się do wywołania metody asynchronicznej i określenia metody zwrotnej wraz z jej typem (callback, delegate). W naszym przypadku wywoływana będzie metoda ExecuteQueryAysnc obiektu ClientContext, biblioteki Client OM. Pozostaje więc tylko 37
określenie typu metody zwrotnej. Dla GetUsers będzie to Action<IEnumerable<Users>>, Exception>, co oznacza, że po zakończeniu działania metoda ExecuteQueryAsync wywoła metodę zwrotną, której pierwszy parametr to kolekcja obiektów typu User, natomiast drugi parametr obiekt typu Exception. W ten sposób mamy dostęp do użytkowników, którzy zostali pobrani z portalu SharePoint, lub ewentualnego wyjątku, jeżeli takowy wystąpił. Przyjrzyjmy się bliżej implementacji tej metody z wykorzystaniem Client OM. Wszelka komunikacja z SharePoint odbywa się poprzez obiekt ClientContext, który w swym konstruktorze definiuje adres witryny zawierającej obiekt docelowy. using (var context = new ClientContext("http://stw500")) W podanym przykładzie odwołanie następuje do witryny SharePoint zlokalizowanej pod adresem http://stw500. Z uwagi na fakt, że obiekt odwołuje się do części niezarządzanych języka (unmanaged resources), dobrą praktyką jest umieszczenie go w dyrektywie using, która zapewni, że po zakończeniu pracy z obiektem, jego zasoby zostaną odpowiednio zwolnione. Przy pracy z obiektami API SharePoint a jest to częsta praktyka i Microsoft publikuje szereg wytycznych dotyczących odpowiedniego alokowania i zwalniania zasobów. Więcej na ten temat można znaleźć w publikacji: Best Practices: Using Disposable Windows SharePoint Services Objects pod adresem http://msdn.microsoft.com/en-us/library/aa973248(v=office.12).aspx. W momencie w którym obiekt ClientContext został poprawnie stworzony i zainicjalizowany, możemy zacząć wykonywać konkretne zapytania dla uzyskania potrzebnych nam danych. W naszym przyadku, będzie to zapytanie, które pobierze wiersze listy o tytule User Information List. Jest to wbudowana lista każdej kolekcji stron SharePoint, przechowująca wszelkich użytkowników i grupy przypisane do danej kolekcji. Aby wyspecyfikować szczegóły zapytania, takie jak lista pól, czy warunek where, posłużymy się językiem CAML (Collaborative Application Markup Language), który jest językiem XML pomagającym w tworzeniu zapytań, budowaniu i modyfikowaniu witryn SharePoint i ich elementów składowych. W naszym przypadku zapytanie będzie selekcjonowało użytkowników przypisanych do działu IT (pole Department). var userslist = context.loadquery(context.web.lists.getbytitle("user Information List").GetItems(new CamlQuery() { ViewXml = "<View><Query><Where><Eq><FieldRef Name='Department' /><Value Type='Text'>IT</Value></Eq></Where></Query></View>" })); Jak widać konstruowanie zapytań wysyłanych do SharePoint jest intuicyjne i sprowadza się do kilku prostych kroków. Samo wykonanie zapytania odbędzie się wywołaniem metody ExecuteQueryAsync, która jest asynchroniczną metodą wymagającą wyspecyfikowania dwóch 38
metod zwracających. Jedna oznacza metodę wywołaną przy poprawnej odpowiedzi systemu, druga metodę wywołaną przy zwróceniu błędu. Do specyfikacji tych metod posłużymy się niezwykle użyteczną funkcja języka C# jaką są wyrażenia lambda. Wyrażenia lambda to anonimowe delegaty, czyli delegaty bez nazwy. Lewa strona wyrażenia to parametry (może być również bezparametrowa) a prawa to operacje. Obie strony rozdzielone są znacznikiem =>. context.executequeryasync( //success callback (s, e) => { var users = new List<User>(); foreach (var listitem in userslist) { users.add(new User() { UserId = (int)listitem["id"], LoginName = listitem["name"] as string, Title = listitem["title"] as string, FirstName = listitem["firstname"] as string, LastName = listitem["lastname"] as string, Email = listitem["email"] as string, ImageUri = listitem["picture"]!= null? (listitem["picture"] as FieldUrlValue).Url : string.empty, HourlyRate = listitem["rate"]!= null? Convert.ToDecimal(listItem["Rate"]) : 0 }); } getuserscallback(users, null); }, //failed callback (s, e) => { getuserscallback(null, e.exception); }); W przypadku zakończenia sukcesem, przekażemy kolekcję danych do metody zwrotnej której zadaniem będzie przekazanie kolekcji do odpowiednich komponentów interfejsu użytkownika. W przypadku zakończenia błędem, przekażemy obiekt zawierający informację o błędzie. 39
7.6 Aplikacja Silverlight - ViewModel Trzecim składnikiem tworzącym strukturę MVVM jest element ViewModel. Jak zostało wcześniej wspomniane ma on zapewnić komunikację między elementami View i Model. W naszym przypadku, klasa pełniąca to zadanie będzie nosiła nazwę UserViewModel. Komunikacja pomiędzy tymi elementami realizowana jest poprzez właściwość DataContext wbudowaną w większość kontrolek Silverlight. W hierarchii kontrolek, właściwość ta jest dziedziczona od rodziców do dzieci, tak, że nie ma potrzeby specyfikowania tej własności dla każdego elementu. W oknie głównym aplikacji Menadżer Projektów przypisanie własności DataContext wygląda następująco: <UserControl x:class="projectmanagermvvm.mainpage" DataContext="{Binding UserViewModel, Source={StaticResource Locator}}"> Zauważmy, że tworzenie instancji klas ViewModel jest realizowane poprzez obiekt Locator, będącego kluczem zasobu zdefiniowanego w pliku ObjectResoruceDictionary. Przyglądając się defnicji zasobu, widzimy, że tworzy on instancje klasy ViewModelLocator. <viewmodels:viewmodellocator x:key="locator" /> Zadaniem klasy ViewModelLocator będzie tworzenie instancji elementów ViewModel wraz z odpowiednimi zależnościami (object dependencies). Najczęściej będą to elementy takie jak serwisy, do których klasa ViewModel będzie delegować żądania wykonania usług. Dokładnie mówiąc klasa ViewModelLocator odwoła się do klasy ServisProvider, dziedziczonej po klasie ServisProviderBase w celu uzyskania instancji odpowiednich serwisów [11]. ServisProviderBase implementując metodę CreateInstance(), podejmuje decyzję o tym w którym gdzie jest uruchamiania aplikacja i dostarcza serwisy odpowiednie dla tego środowiska. Podjęcie decyzji opiera się na sprawdzeniu właściwości IsInDesignTool klasy DesignerProperties zaimplementowanej w przestrzeni nazw System.Component model.net Framework. static ServiceProviderBase CreateInstance() { return _instance = DesignerProperties.IsInDesignTool? (ServiceProviderBase)new DesignServiceProvider() : new ServiceProvider(); } Ten rodzaj architektury umożliwia konfigurowanie innych serwisów przy uruchamianiu aplikacji w środowisku SharePoint i innych przy wyświetlaniu aplikacji w Visual Studio 2010, co wraca do idei danych projektowych. W momencie, w którym znajdujemy się w środowisku programistycznym, dostawca serwisów będzie klasą DesignServiceProvider. 40
Rysunek 20. Diagram klas - tworzenie ViewModel i klas serwisowych 41
9 Testy jednostkowe Idea testów jednostkowych polega na opatrzeniu procedurami testującymi elementów kodu, tak by możliwe była automatyczna weryfikacja kodu programu. Testy jednostkowe zyskały na popularności przy okazji popularyzacji metod Agile zarządzania projektami programistycznymi, gdzie wiele z tych metod wymaga ich stosowania (np. metoda XP Extreme Programming). Co więcej, niektóre z nich zalecają stosowanie metody TDD (test driven development), która polega na pisaniu testu przed pisaniem kodu programu. W ten sposób zaczynamy od testów, które kończą się niepowodzeniem i piszemy kod programu do momentu aż test kończy się sukcesem. W rezultacie testy jednostkowe maja nie tyko weryfikować poprawność funkcji czy metod programu, ale również wpływają na jego kształt i architekturę [15]. Przy tworzeniu testów jednostkowych w środowisku.net, wykorzystuje się szereg bibliotek testowych, open source bądź komercyjnych. Do najpopularniejszych należą NUnit (open source), MSTest (Microsoft). Biblioteki te nie zostały jednak przystosowane do pracy z Silverlight, w rezultacie czego stworzono i udostępniono jako open source bibliotekę testującą Silverlight Unit Test framework, przeznaczoną specjalnie dla środowiska Silverlight. Trzeba również wspomnieć o instnieniu tzw. bibliotek naśladujących (mocking frameworks), które wprowadzają przewidywalne i z góry ustalone zachowania do obiektów testowych ograniczając w ten sposób magines błędu. Pozwalają one jendocześnie na śledzenie i testowanie integracji z obiektami odwołującymi się do usłgu obiektu naśladującego. W środowisku.net nie mały wpływ na łatwość tworzenia testów oraz ich jakość ma architektura aplikacji. Testy wysokiej jakości z reguły odznaczają się następującymi atrybutami: Testują elementarne funkcje systemu co sprawia, że przy testach zakończonych niepowodzeniem możliwa jest szybka diagnoza źródła problemu. Są szybkie, co motywuje do ich częstego uruchamiania. Są czytelne, co ułatwia ich pielęgnację a także współpracę z innymi programistami i testerami. Model MVVM przekłada się na architekturę, która jest stosunkowo przyjazna pisaniu testów jednostkowych. Wiąże się to z tym, że aplikacja jest budowana w sposób modularny, to znaczy nie ma stałego sprzężenia między obiektami aplikacji, stąd obiekty mogą być testowane w izolacji od siebie (testowanie elementarnych funkcji systemu). Ponadto, wyjątkowy nacisk kładzie sią na oddzielenie warstwy prezentacji od warstwy biznesowej, co sprawia, że logika biznesowa jest dużo prostsza w testowaniu. Testowanie interfejsów użytkownika jest sztuką trudną z uwagi na zależności od komponentów, nad którymi autor testów nie ma pełnej kontroli, takich jak na przykład serwer www i przeglądarka, w którym uruchamiana jest aplikacja. Zamiast próby ich testowania wykorzystuje się techniki izolowania (zaślepiania) budując własne obiekty bądź wykorzystując wspomniane wcześniej biblioteki izolujące. Dla jakich obiektów mocking jest najbardziej przydatny? 42
Obiekty, których stan trudno jest odtworzyć Obiekty interfejsu użytkownika Obiekty, których metody trwają znaczący czas (połączenie z bazą danych, web serwisem, odczyt lub zapis do pliku) Obiekty klas, w których zależności z innymi obiektami są wysokie (w celu stworzenia obiektu musimy stworzyć inny obiekt, który wymaga kolejnego obiektu, etc...) Trudno przewidzieć zachowanie danego obiektu w czasie uruchamiania testu (np. metody wykorzystujące czas systemowy) W przypadku aplikacji Silverlight dochodzi jeszcze jedna ważna zależność. Mianowicie jak wspominaliśmy wcześniej, Silverlight narzuca konwencję programowania asynchronicznego przy jakimkolwiek komunikacji z różnego rodzaju źródłami danych. W związku z tym autor testów musi przestrzegać konwencji wykorzystanych do konstrukcji metod asynchronicznych. Tu z pomocą przychodzi Silverlight Unit Test Framework [16] (część Silverlight 4 Toolkit), która posiada gotowe mechanizmy do uruchamiania testów kodu asynchronicznego. Dodatkowo oferuje ona szablony dla środowiska Visual Studio 2010 oraz aplikację testującą napisaną w Silverlight co sprawia, że testy uruchamiane są w oknie przeglądarki. Rysunek 21. Szablon projektu Silverlight Unit Test framework w VS 2010 43