You are on page 1of 55

ASP.NET 2.0.

Projektowanie aplikacji
internetowych
Autor: Randy Connolly
Tumaczenie: Pawe Gonera, Ireneusz Jakbik
ISBN: 978-83-246-1128-7
Tytu oryginau: Core Internet Application
Development with ASP.NET 2.0
Format: B5, stron: 928
oprawa twarda

Wydawnictwo Helion
ul. Kociuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl

Poznaj nowoczesne technologie tworzenia aplikacji sieciowych


Jak wykorzystywa kontrolki .NET?
W jaki sposb pobiera i wywietla dane z bazy?
Jak zabezpiecza i personalizowa aplikacje?
Wprowadzenie na rynek technologii .NET 2.0 zrewolucjonizowao sposb projektowania
i tworzenia aplikacji internetowych. Arsena programistw wzbogaci si o narzdzia
cechujce si niespotykan dotychczas wydajnoci i elastycznoci. Potna
biblioteka gotowych komponentw, nowe mechanizmy dostpu do danych,
udoskonalone techniki zabezpieczania i personalizowania aplikacji oraz ich
uruchamiania w rodowisku produkcyjnym wszystko to sprawio, e budowanie
nowoczesnych systemw dziaajcych w sieci stao si atwe i szybkie. Jednak wraz
ze wzrostem moliwoci wzrosa take ilo wiedzy, ktr musi przyswoi sobie
programista zamierzajcy korzysta z technologii .NET 2.0.
Ksika ASP.NET 2.0. Projektowanie aplikacji internetowych to doskonay podrcznik,
za ktrego pomoc opanujesz niesamowite moliwoci platformy .NET 2.0 w zakresie
budowania systemw sieciowych. Dowiesz si, jak dziaaj aplikacje ASP.NET, jak
tworzy formularze na stronach WWW i korzysta ze standardowych kontrolek
udostpnianych przez platform .NET 2.0. Nauczysz si czy aplikacje z bazami
danych za pomoc mechanizmu ADO.NET oraz wywietla dane na stronach
z wykorzystaniem kontrolek. Przeczytasz take o technikach projektowania zoonych
aplikacji, o zarzdzaniu sesjami, zabezpieczaniu aplikacji, stosowaniu mechanizmw
personalizacji oraz wdraaniu aplikacji w rodowisku produkcyjnym.
Tworzenie formularzy
Model zdarze ASP.NET
Stosowanie kontrolek serwera .NET
Obsuga wyjtkw
Zarzdzanie wygldem witryny WWW
Operacje na danych z wykorzystaniem ADO.NET
Projektowanie aplikacji .NET
Uwierzytelnianie uytkownikw
Tworzenie usug sieciowych
Technologia ASP.NET AJAX
Opanuj do perfekcji zasady wykorzystywania technologii .NET 2.0
w programowaniu aplikacji sieciowych!

Spis treci
O autorze ..................................................................................................................................................15
Wstp ........................................................................................................................................................17

Cz I ASP.NET

23

Rozdzia 1. Wstp do ASP.NET .................................................................................................................. 25


Dlaczego ASP.NET? ...................................................................................................... 25
Statyczna a dynamiczna zawarto stron WWW ......................................................... 26
Konkurencyjne dynamiczne technologie serwera ........................................................ 26
Zalety ASP.NET ....................................................................................................... 29
.NET Framework ........................................................................................................... 30
Skadniki .NET Framework ....................................................................................... 31
Wykonywanie .NET .................................................................................................. 35
Formularze WWW ASP.NET ............................................................................................ 36
Jzyk C# ................................................................................................................ 40
Struktura aplikacji internetowej ................................................................................ 41
Visual Studio 2005 ...................................................................................................... 43
Projekty WWW Visual Studio .................................................................................... 45
Opcje serwera WWW ............................................................................................... 45
Samouczek: tworzenie formularzy WWW ASP.NET ........................................................... 48
Tworzenie witryny WWW w Visual Studio .................................................................... 48
Dodawanie nowego formularza WWW ........................................................................ 50
Dodawanie kodu HTML do formularza WWW .............................................................. 50
Dodawanie logiki programowej ................................................................................. 57
Obsuga bdw ...................................................................................................... 60
Uycie debugera Visual Studio ................................................................................. 63
Podsumowanie ............................................................................................................ 66
wiczenia .................................................................................................................... 66
Najwaniejsze zagadnienia ............................................................................................ 66
Odnoniki .................................................................................................................... 67

ASP.NET 2.0. Projektowanie aplikacji internetowych


Rozdzia 2. Sposb dziaania ASP.NET .................................................................................................... 69
Model zdarze ASP.NET ................................................................................................ 69
Przesanie danych ................................................................................................... 71
Stan widoku oraz stan kontrolki ............................................................................... 73
Cykl ycia strony ..................................................................................................... 74
Kompilacja kodu ASP.NET ............................................................................................. 85
Kolejno kompilacji ............................................................................................... 88
Klasa Page .................................................................................................................. 90
Request ................................................................................................................. 90
Response ............................................................................................................... 91
Server .................................................................................................................... 92
Cykl ycia aplikacji ASP.NET .......................................................................................... 93
Uytkownik da przesania zasobu ASP.NET z serwera .............................................. 93
Tworzenie podstawowych obiektw ASP.NET dla dania ............................................ 98
Przypisywanie obiektu HttpApplication do dania ...................................................... 99
Przetwarzanie dania z uyciem potoku HttpApplication .......................................... 101
Podsumowanie .......................................................................................................... 104
wiczenia .................................................................................................................. 104
Najwaniejsze zagadnienia .......................................................................................... 104
Odnoniki .................................................................................................................. 105

Rozdzia 3. Wykorzystanie standardowych kontrolek serwera WWW .............................................107


Wprowadzenie do kontrolek serwera ............................................................................ 107
Kontrolki HTML serwera ......................................................................................... 108
Kontrolki serwera WWW ......................................................................................... 108
Kontrolki sprawdzajce poprawno ....................................................................... 108
Kontrolki uytkownika ............................................................................................ 109
Wasne kontrolki serwera ....................................................................................... 109
Przegld kontrolek serwera WWW ................................................................................ 109
Wsplne skadniki ................................................................................................. 109
Programowe manipulowanie waciwociami ........................................................... 113
Najwaniejsze standardowe kontrolki serwera WWW ..................................................... 115
Kontrolka Label .................................................................................................... 115
Kontrolka Literal ................................................................................................... 117
Kontrolka TextBox ................................................................................................. 119
Kontrolki przyciskw .............................................................................................. 122
Kontrolka CheckBox .............................................................................................. 128
Kontrolka RadioButton .......................................................................................... 131
Kontrolki list ......................................................................................................... 132
Kontrolka Image ................................................................................................... 141
Kontrolka ImageMap ............................................................................................. 143
Kontrolka HyperLink .............................................................................................. 146
Kontrolka HiddenField ........................................................................................... 147
Kontrolka Table .................................................................................................... 149
Kontrolka Calendar ............................................................................................... 156
Podsumowanie .......................................................................................................... 171
wiczenia .................................................................................................................. 171
Najwaniejsze zagadnienia .......................................................................................... 172
Odnoniki .................................................................................................................. 172

Spis treci

Rozdzia 4. Dodatkowe standardowe kontrolki serwera WWW .........................................................173


Przegld dodatkowych standardowych kontrolek serwera WWW ...................................... 173
Kontrolka Panel ......................................................................................................... 175
Kontrolki MultiView oraz View ...................................................................................... 182
Nawigacja pomidzy widokami ............................................................................... 185
Tworzenie paneli z zakadkami przy uyciu MultiView ................................................ 185
Kontrolka Wizard ........................................................................................................ 190
Zastosowanie kontrolki Wizard ............................................................................... 194
Opis ukadu kreatora Wizard .................................................................................. 196
Dostosowywanie kreatora ...................................................................................... 198
Obsuga zdarze kreatora ...................................................................................... 206
Kontrolka FileUpload .................................................................................................. 208
Przetwarzanie przesanego pliku ............................................................................. 211
Ograniczanie wielkoci przesyanego pliku ............................................................... 212
Kontrolka PlaceHolder ................................................................................................ 212
Tworzenie przegldarki plikw ................................................................................ 213
Kontrolka AdRotator ................................................................................................... 220
Plik XML z danymi reklam ...................................................................................... 221
Wywietlanie reklam z bazy danych ......................................................................... 222
Programowanie kontrolki AdRotator ........................................................................ 223
Kontrolka XML ........................................................................................................... 224
Tworzenie pliku XSLT ............................................................................................. 226
Programowanie kontrolki XML ................................................................................ 228
Podsumowanie .......................................................................................................... 233
wiczenia .................................................................................................................. 235
Najwaniejsze zagadnienia .......................................................................................... 236
Odnoniki .................................................................................................................. 236

Rozdzia 5. Obsuga wyjtkw i kontrolki sprawdzania poprawnoci ..............................................237


Obsuga bdw ......................................................................................................... 237
Obsuga wyjtkw .NET .......................................................................................... 238
Obsuga wyjtkw na poziomie klasy przy wykorzystaniu bloku trycatch .................. 239
Obsuga wyjtkw na poziomie strony ..................................................................... 242
Obsuga wyjtkw na poziomie aplikacji .................................................................. 243
Uycie kontrolek serwera sprawdzajcych poprawno .................................................. 249
Proces kontroli poprawnoci formularza w ASP.NET ................................................. 251
Kontrolka RequiredFieldValidator ............................................................................ 257
Kontrolka ValidationSummary ................................................................................ 258
Kontrolka CompareValidator .................................................................................. 260
Kontrolka RangeValidator ...................................................................................... 262
Kontrolka RegularExpressionValidator ..................................................................... 263
Kontrolka CustomValidator .................................................................................... 270
Grupy kontroli poprawnoci .................................................................................... 275
Podsumowanie .......................................................................................................... 280
wiczenia .................................................................................................................. 280
Najwaniejsze zagadnienia .......................................................................................... 282
Odnoniki .................................................................................................................. 282

ASP.NET 2.0. Projektowanie aplikacji internetowych


Rozdzia 6. Dostosowywanie wygldu witryny i zarzdzanie nim ....................................................283
Zmiana wygldu kontrolek serwera .............................................................................. 283
Zastosowanie wsplnych waciwoci formatujcych ................................................ 283
Uycie CSS dla kontrolek ....................................................................................... 285
Waciwoci wygldu, CSS i ASP.NET ...................................................................... 290
Uycie tematw i motyww .......................................................................................... 290
Definiowanie motyww .......................................................................................... 292
Tworzenie tematw w Visual Studio ........................................................................ 292
Stosowanie tematu ............................................................................................... 294
Jak dziaaj tematy ................................................................................................ 294
Przesanianie tematw .......................................................................................... 295
Motywy nazwane ................................................................................................... 296
Tematy i obrazy ..................................................................................................... 297
Tematy i CSS ........................................................................................................ 297
Dynamiczne ustawianie tematu .............................................................................. 300
Tworzenie przykadowej strony z dwoma tematami ................................................... 302
Strony wzorcowe ........................................................................................................ 310
Definiowanie strony wzorcowej ............................................................................... 313
Zagniedone strony wzorcowe ............................................................................... 316
Jak dziaaj strony wzorcowe? ................................................................................ 318
Programowanie strony wzorcowej ........................................................................... 320
Strony wzorcowe i tematy ...................................................................................... 322
Kontrolki uytkownika ................................................................................................. 328
Tworzenie i modyfikacja kontrolek uytkownika ........................................................ 328
Dodawanie danych i funkcji do kontrolki uytkownika ............................................... 330
Podsumowanie .......................................................................................................... 331
wiczenia .................................................................................................................. 332
Najwaniejsze zagadnienia .......................................................................................... 333
Odnoniki .................................................................................................................. 333

Rozdzia 7. Nawigacja w witrynie ASP.NET ..........................................................................................335


Przedstawienie nawigacji w witrynie ASP.NET ................................................................ 335
Model dostawcy .................................................................................................... 337
Mapa witryny XML ...................................................................................................... 337
Korzystanie z mapy witryny XML ............................................................................. 340
Programowanie mapy witryny ................................................................................. 343
Korzystanie z rnych map witryny .......................................................................... 345
Inne funkcje mapy witryny ...................................................................................... 348
Kontrolka SiteMapPath ............................................................................................... 348
Nadawanie stylu kontrolce SiteMapPath ................................................................. 349
Integracja cigw zapytania z SiteMapPath ............................................................. 353
Kontrolka Menu ......................................................................................................... 356
Zastosowanie kontrolki Menu ................................................................................ 358
Zmiana wygldu kontrolki Menu ............................................................................. 361
Obsuga zdarze menu .......................................................................................... 369
Kontrolka TreeView ..................................................................................................... 375
Opis kontrolki TreeView ......................................................................................... 376
Zastosowanie kontrolki TreeView ............................................................................ 378
Zmiana wygldu kontrolki TreeView ........................................................................ 380
Zastosowanie innych danych w kontrolce TreeView .................................................. 382
Odpowiadanie na zdarzenia kontrolki TreeView ........................................................ 386

Spis treci

Podsumowanie .......................................................................................................... 392


wiczenia .................................................................................................................. 392
Najwaniejsze zagadnienia .......................................................................................... 392
Odnoniki .................................................................................................................. 394

Cz II Operacje na danych

395

Rozdzia 8. czenie i reprezentacja danych ......................................................................................397


Podstawy doczania danych ....................................................................................... 397
Jak korzysta z doczania danych? ........................................................................ 398
Co moe by rdem danych? ............................................................................... 398
Wykorzystanie kolekcji ................................................................................................ 400
Interfejsy kolekcji .................................................................................................. 400
Uycie standardowych kolekcji ............................................................................... 401
ArrayList ............................................................................................................... 405
Typy oglne .......................................................................................................... 408
Kolekcje sownikowe ............................................................................................. 412
Tworzenie wasnych kolekcji oglnych ..................................................................... 414
DataSet ..................................................................................................................... 418
Uycie obiektu DataTable ....................................................................................... 419
Zastosowanie obiektu DataSet ............................................................................... 425
Relacje midzy obiektami DataTable ....................................................................... 429
Integracja XML z DataSet ....................................................................................... 431
Wybr kontenera danych ............................................................................................. 438
Kolekcje .NET jako kontenery danych ...................................................................... 439
Wasne kolekcje jako kontenery danych .................................................................. 439
Obiekty DataSet jako kontenery danych .................................................................. 440
Typowane obiekty DataSet jako kontenery danych ................................................... 441
Podsumowanie .......................................................................................................... 442
wiczenia .................................................................................................................. 442
Najwaniejsze zagadnienia .......................................................................................... 443
Odnoniki .................................................................................................................. 443

Rozdzia 9. Zastosowanie ADO.NET .......................................................................................................445


Wprowadzenie do ADO.NET ......................................................................................... 445
Wybr dostawcy danych ......................................................................................... 449
Klasy dostawcy danych .......................................................................................... 449
Klasy DbConnection ................................................................................................... 450
Cigi poczenia .................................................................................................... 450
Programowanie DbConnection ................................................................................ 451
Przechowywanie cigw poczenia ......................................................................... 454
Pule pocze ....................................................................................................... 455
Klasy DbCommand ..................................................................................................... 455
Tworzenie obiektu DbCommand ............................................................................. 456
Polecenia SQL do pobierania, dodawania, modyfikowania i usuwania danych ............. 457
Procedury skadowane ........................................................................................... 458
Wykonywanie pocze za pomoc obiektu DbCommand .......................................... 459
Wykorzystanie klasy DbParameter .......................................................................... 460
Uycie transakcji ................................................................................................... 463

10

ASP.NET 2.0. Projektowanie aplikacji internetowych


Klasy DbDataReader .................................................................................................. 467
Programowanie DbDataReader ............................................................................... 468
Niejawne zamykanie poczenia ............................................................................. 470
Samouczek: odczytywanie i modyfikowanie danych .................................................. 471
Klasy DbDataAdapter .................................................................................................. 479
Wypenianie obiektu DataSet ................................................................................. 480
Modyfikowanie danych ........................................................................................... 483
Tworzenie kodu ADO.NET niezalenego od dostawcy danych .......................................... 485
Kontrolki rda danych ............................................................................................... 488
Uycie parametrw ................................................................................................ 491
Modyfikowanie danych ........................................................................................... 494
Jak dziaaj kontrolki rde danych? ...................................................................... 494
Uycie ObjectDataSource ....................................................................................... 495
Podsumowanie .......................................................................................................... 505
wiczenia .................................................................................................................. 505
Najwaniejsze zagadnienia .......................................................................................... 506
Odnoniki .................................................................................................................. 507

Rozdzia 10. Kontrolki danych ...............................................................................................................509


Wprowadzenie do wielowartociowych kontrolek danych ................................................ 509
Zrozumie szablony ............................................................................................... 513
Wyraenia wizania danych .................................................................................... 513
Kontrolka DataList ..................................................................................................... 517
Uywanie szablonw oglnych ................................................................................ 520
czenie stron za pomoc kontrolki DataList ........................................................... 523
Kontrolka Repeater .................................................................................................... 524
Kontrolka FormView .................................................................................................... 526
Przechodzenie midzy rekordami ............................................................................ 529
Modyfikowanie danych ........................................................................................... 532
Kontrolka DetailsView ................................................................................................. 540
Dostosowywanie pl kontrolki DetailsView .............................................................. 541
Modyfikowanie danych kontrolki DetailsView ........................................................... 546
Kontrolka GridView ..................................................................................................... 550
Dostosowywanie kolumn kontrolki GridView ............................................................ 550
Wybieranie wierszy ................................................................................................ 560
Stronicowanie w kontrolce GridView ........................................................................ 565
Sortowanie w kontrolce GridView ............................................................................ 568
Edycja danych w kontrolce GridView ........................................................................ 570
Pozostae funkcje kontrolki GridView ....................................................................... 574
Podsumowanie .......................................................................................................... 581
wiczenia .................................................................................................................. 581
Najwaniejsze zagadnienia .......................................................................................... 582
Odnoniki .................................................................................................................. 583

Rozdzia 11. Projektowanie oraz implementacja aplikacji sieciowych ..............................................585


Projektowanie aplikacji ............................................................................................... 586
Korzystanie z warstw ............................................................................................. 587
Skutki podziau na warstwy .................................................................................... 589
Model dwuwarstwowy ................................................................................................. 590

Spis treci

11

Model trjwarstwowy .................................................................................................. 592


Projektowanie oraz implementacja obiektu biznesowego .......................................... 594
Programowe uywanie obiektu biznesowego ............................................................ 602
Uywanie obiektw biznesowych z kontrolk ObjectDataSource ................................. 603
Model czterowarstwowy .............................................................................................. 606
Projektowanie architektury czterowarstwowej ........................................................... 606
Modyfikowanie warstwy dostpu do danych ............................................................. 609
Tworzenie zoonej encji domeny ............................................................................ 613
Tworzenie warstwy logiki aplikacji ........................................................................... 615
Uycie architektury w warstwie prezentacji ............................................................... 618
Podsumowanie .......................................................................................................... 627
wiczenia .................................................................................................................. 628
Najwaniejsze zagadnienia .......................................................................................... 628
Odnoniki .................................................................................................................. 629

Rozdzia 12. Zarzdzanie stanem w rodowisku ASP.NET ...................................................................631


Stan przechowywany po stronie klienta ........................................................................ 632
Stan widoku ......................................................................................................... 632
Stan kontrolek ...................................................................................................... 636
Pola ukryte ........................................................................................................... 636
acuchy zapyta .................................................................................................. 636
Cookies ............................................................................................................... 637
Stan aplikacji ............................................................................................................. 638
Plik Global.asax .................................................................................................... 639
Stan sesji .................................................................................................................. 641
Jak dziaa stan sesji? ............................................................................................ 642
Dostawcy stanu sesji ............................................................................................ 644
Waciwoci profilu ............................................................................................... 650
Pami podrczna rodowiska ASP.NET ....................................................................... 650
Buforowanie danych aplikacji ................................................................................. 651
Zalenoci pamici podrcznej ............................................................................... 655
Buforowanie zwracanych stron ............................................................................... 657
Podsumowanie .......................................................................................................... 660
wiczenia .................................................................................................................. 660
Najwaniejsze zagadnienia .......................................................................................... 661
Odnoniki .................................................................................................................. 661

Cz III Implementacja aplikacji sieciowych

663

Rozdzia 13. Bezpieczestwo, czonkostwo i zarzdzanie rolami ......................................................665


Wprowadzenie do zagadnie bezpieczestwa w rodowisku ASP.NET ............................. 666
Omwienie bezpieczestwa w serwerze IIS .............................................................. 667
Proces bezpieczestwa w rodowisku ASP.NET ....................................................... 670
Bezpieczestwo bazujce na uprawnieniach kodu oraz poziomy zaufania
rodowiska ASP.NET ........................................................................................... 672
Uwierzytelnianie w rodowisku ASP.NET .................................................................. 675
Uwierzytelnianie formularzy ......................................................................................... 676
Korzystanie z uwierzytelniania formularzy ................................................................ 676
Tworzenie formularza logowania ............................................................................. 679
Jak dziaa uwierzytelnianie formularzy? ................................................................... 684
Uywanie biletw uwierzytelniania bez cookies ........................................................ 687

12

ASP.NET 2.0. Projektowanie aplikacji internetowych


Model dostawcy ......................................................................................................... 689
Architektura modelu dostawcy ................................................................................ 690
Tworzenie dostawcw niestandardowych ................................................................. 692
Czonkostwo .............................................................................................................. 699
Omwienie systemu czonkowskiego ...................................................................... 699
Konfiguracja dostawcy SqlMembershipProvider ....................................................... 700
Uywanie interfejsu API czonkostwa ....................................................................... 702
Zarzdzanie rolami ..................................................................................................... 708
Dostawca rl ........................................................................................................ 709
Zarzdzanie rolami ................................................................................................ 709
Uywanie interfejsu API zarzdzania rolami .............................................................. 712
Kontrolki logowania .................................................................................................... 717
Kontrolka Login ..................................................................................................... 718
Kontrolka LoginName ............................................................................................ 723
Kontrolka LoginStatus ........................................................................................... 723
Kontrolka LoginView .............................................................................................. 724
Kontrolka ChangePassword ................................................................................... 726
Kontrolka PasswordRecovery ................................................................................. 727
Kontrolka CreateUserWizard .................................................................................. 729
Podsumowanie .......................................................................................................... 729
wiczenia .................................................................................................................. 730
Najwaniejsze zagadnienia .......................................................................................... 731
Odnoniki .................................................................................................................. 732

Rozdzia 14. Personalizacja za pomoc profili oraz skadnikw Web Part .......................................733
Profile rodowiska ASP.NET ........................................................................................ 733
Definiowanie profili ............................................................................................... 734
Uycie danych profilu ............................................................................................. 735
Jak dziaaj profile? ............................................................................................... 739
Zapisywanie i odczytywanie danych profilu ............................................................... 741
Uywanie typw niestandardowych .......................................................................... 742
Praca z uytkownikami anonimowymi ...................................................................... 745
Kiedy uywa profili? ............................................................................................. 749
Skadniki Web Part ..................................................................................................... 751
Skadniki Web Part, strefy Web Part oraz meneder skadnikw Web Part .................. 753
Tworzenie skadnikw Web Part i korzystanie z nich ................................................. 756
Konstruowanie skadnikw Web Part z kontrolek uytkownika ................................... 762
Tworzenie skadnikw Web Part na podstawie kontrolek niestandardowych ................ 766
Zmiana trybw wywietlania ................................................................................... 769
Tryb projektowania ................................................................................................ 771
Tryb katalogu ........................................................................................................ 773
Tryb edycji ............................................................................................................ 774
Poczenia skadnikw Web Part ............................................................................ 780
Podsumowanie .......................................................................................................... 791
wiczenia .................................................................................................................. 792
Najwaniejsze zagadnienia .......................................................................................... 793
Odnoniki .................................................................................................................. 794

Spis treci

13

Rozdzia 15. Usugi WWW ......................................................................................................................795


Wprowadzenie do usug WWW ..................................................................................... 795
Zalety usug WWW ................................................................................................ 797
Konsumowanie usug WWW ........................................................................................ 798
Jak konsumowa usug WWW za pomoc programu Visual Studio? ......................... 799
Konsumowanie usug WWW w kontrolce uytkownika ............................................... 803
Konsumowanie usugi WWW Amazon ...................................................................... 806
Konsumowanie usug WWW a wydajno ................................................................ 814
Asynchroniczne usugi WWW .................................................................................. 817
Tworzenie usug WWW ................................................................................................ 822
Tworzenie prostej usugi z cytatami ......................................................................... 824
Testowanie usugi z cytatami ................................................................................. 828
Tworzenie fasady usugi WWW dla klasy biznesowej lub klasy logiki aplikacji .............. 830
Wskazwki dotyczce tworzenia usug WWW ........................................................... 831
Podsumowanie .......................................................................................................... 833
wiczenia .................................................................................................................. 833
Najwaniejsze zagadnienia .......................................................................................... 834
Odnoniki .................................................................................................................. 834

Rozdzia 16. Internacjonalizacja i wdraanie ......................................................................................837


Internacjonalizacja aplikacji WWW ................................................................................ 837
Wprowadzenie do plikw z zasobami ...................................................................... 839
Generowanie plikw z zasobami ............................................................................. 839
Lokalizacja plikw z zasobami ................................................................................ 843
Zasoby globalne .................................................................................................... 848
Ustawienia kultury na poziomie strony .................................................................... 849
Wdraanie ................................................................................................................. 854
Rczne kopiowanie plikw z komputera programisty na komputer docelowy ............... 855
Prekompilacja witryn WWW .................................................................................... 857
Tworzenie programu instalacyjnego za pomoc narzdzia Web Setup Project ............. 861
Podsumowanie .......................................................................................................... 867
wiczenia .................................................................................................................. 867
Najwaniejsze zagadnienia .......................................................................................... 867
Odnoniki .................................................................................................................. 868

Dodatki ............................................................................................................................. 869


Dodatek A Rzut oka na technologi ASP.NET AJAX ................................................................................871
Skorowidz .............................................................................................................................................893

11

Projektowanie oraz implementacja


aplikacji sieciowych
Projekt jest poznaniem zwizkw zachodzcych midzy rnymi rzeczami Nie moesz
wynale projektu. Poznajesz go w czwartym wymiarze. To znaczy swoj krwi i komi,
ale te swoimi oczami.
D.H. Lawrence, Art & Morality

rodowisko ASP.NET jest na tyle dobrze wyposaon technologi projektowania, e moe


by kuszce skupienie si wycznie na poszczeglnych funkcjach, ktre wchodz w jej
skad. W niniejszym rozdziale rodek cikoci zostanie przesunity z konkretnych kontrolek
i klas na niektre zagadnienia zwizane z tworzeniem w rodowisku ASP.NET nieco bardziej
zoonych aplikacji sieciowych. Rozdzia rozpocznie si omwieniem modelu aplikacji sieciowych oraz niektrych czsto spotykanych modeli warstwowych tego typu aplikacji, po
czym zostanie opisana implementacja przykadowej architektury warstwowej.
Chocia dobry projekt rzeczywicie nie musi by, jak to twierdzi Lawrence, wycznie wynikiem racjonalnego rozumowania, istnieje cakiem pokana literatura na temat projektowania oprogramowania, ktra dostarcza wielu wskazwek i nauk, ktre mog by przydatne
podczas projektowania aplikacji sieciowych. Szczegowe omwienie zagadnienia wspczesnego projektowania oprogramowania wykracza poza zakres tej ksiki. W materiaach dodatkowych, wymienionych pod koniec niniejszego rozdziau, wskazano kilka szczeglnie
przydatnych prac powiconych temu bardzo obszernemu zagadnieniu. Gwn natomiast
rol tego rozdziau jest omwienie rnych, najlepszych podej do projektowania aplikacji
sieciowych, a nastpnie zilustrowanie ich kilkoma przykadowymi implementacjami tych
projektw.

586

Cz II

Operacje na danych

Projektowanie aplikacji
rodowisko ASP.NET dysponuje wieloma funkcjami, ktre wspomagaj szybkie projektowanie aplikacji sieciowych. Wydajne deklaracyjne kontrolki umoliwiaj programistom
tworzenie wyszukanych interfejsw sucych do wywietlania i edycji danych przy maym
nakadzie programowania lub w ogle bez koniecznoci pisania kodu. Wygoda korzystania
z programu Visual Studio Designer i jego moc take zachcaj programistw do szybkiej
implementacji stron WWW. rodowisko ASP.NET i Visual Studio zdaj si mwi: Nie
marnuj czasu na projektowanie i planowanie; bierz si do przecigania i upuszczania i zakocz projekt!. Taka moliwo szybkiego opracowania strony jest zachcajca zwaszcza
podczas tworzenia witryny WWW z ograniczon liczb przypadkw uycia, czyli niewielkim zakresem wymogw funkcjonalnych.
Funkcjonalnoci wielu prawdziwych aplikacji sieciowych nie da si jednak opisa za
pomoc zaledwie kilku przypadkw uycia. W rzeczywistoci mog by dziesitki, a nawet
setki opisanych przypadkw, ktre wymagaj wysiku wielu programistw powicajcych
sporo czasu, aby je wszystkie zaimplementowa. To wanie podczas pracy nad takim rodzajem aplikacji sieciowych szybki styl programowania moe w rzeczywistoci spowolni
og procesw tworzenia aplikacji.
Prawdziwe projekty programistyczne s wyjtkowo wraliwe na zmiany wymaga; projekty
sieciowe s chyba jeszcze bardziej wraliwe. Oznacza to, e funkcje aplikacji sieciowej s
rzadko w peni okrelone przed rozpoczciem projektowania. Dodawane s nowe funkcje,
a z innych si rezygnuje. Zmienia si model danych oraz wymogi co do ich przechowywania. W miar przemieszczania si projektu przez poszczeglne etapy cyklu projektowania
rodowisko uruchomieniowe zmienia si poczwszy od laptopa programisty, przez serwer
testowy, serwer docelowy, a skoczywszy by moe na farmie serwerw sieciowych. Programista moe pocztkowo testowa program z baz danych programu Access, po czym
przenie dane do serwera SQL, a nastpnie, po fuzji firm, powrci do bazy danych Oracle.
Na kilka tygodni przed testowaniem alfa klient moe wprowadzi zmiany, ktre w przypadku pewnych informacji spowoduj konieczno pracy z zewntrzn usug zamiast z lokaln baz danych. Analitycy uytecznoci mog mocno skrytykowa strony witryny, co moe
spowodowa konieczno wprowadzenia zmian w interfejsie uytkownika.
To wanie w takim rodowisku programowania sieciowego zwyczaje szybkiego opracowywania projektw mog przynie wicej szkd ni korzyci. Przestrzeganie jednak zasad
prawidowego projektowania oprogramowania moe w tym samym rodowisku zwrci si
w postaci cakiem wymiernych zyskw. Powicenie czasu na utworzenie dobrze zaprojektowanej infrastruktury aplikacji moe sprawi, e aplikacje sieciowe bd atwiejsze do modyfikowania i w pielgnacji, prostsze w rozbudowie i poszerzaniu ich funkcjonalnoci, mniej
podatne na bdy, a take atwiejsze w tworzeniu. W pierwszym podrozdziale niniejszego
rozdziau podjto prb rzucenia nieco wiata na proces projektowania tego typu infrastruktury aplikacji.

Rozdzia 11.

Projektowanie oraz implementacja aplikacji sieciowych

587

Korzystanie z warstw
Jedn z najwaniejszych zalet rodowiska ASP.NET w porwnaniu z czysto skryptowymi
technologiami, takimi jak ASP albo PHP, jest moliwo tworzenia bardziej elastycznych
aplikacji za pomoc aktualnie obowizujcych dobrych praktyk projektowania obiektowo zorientowanego oprogramowania. Prawdopodobnie najwaniejsza z tych praktyk polega na
podzieleniu projektu aplikacji na dyskretne warstwy logiczne.
Czym jest warstwa? Warstwa to po prostu grupa klas, ktre s spokrewnione funkcjonalnie
lub logicznie. Uywanie warstw jest sposobem na organizowanie projektu oprogramowania
w grupy klas, ktre su wsplnemu celowi. Warstwa zatem nie jest rzecz lecz zasad organizacji. Oznacza to, e warstwy s sposobem na projektowanie aplikacji.
Powodem, dla ktrego tak wielu programistw aplikacji przyjo warstwy jako zasad organizacji swoich aplikacji, jest fakt, e warstwa nie stanowi dowolnej grupy klas. Kada warstwa aplikacji powinna by spjna (czyli klasy powinny dotyczy mniej wicej tego samego
i mie zbliony poziom abstrakcji). Spjne warstwy i klasy s zazwyczaj atwiejsze do zrozumienia, wielokrotnego uywania i pielgnowania.
Celem dzielenia na warstwy jest rozdzielenie funkcji oprogramowania midzy klasy w taki
sposb, aby zminimalizowa skojarzenia danej klasy z innymi klasami. Skojarzenie odnosi
si do liczby klas, z ktrej korzysta okrelona klasa. Kiedy pewna klasa korzysta z innej
klasy, jest od niej zalena. Wszelkie zmiany wprowadzone w interfejsie uywanej klasy mog
mie wpyw na klas od niej zalen. Kiedy klasy aplikacji s silnie skojarzone, zmiana w jednej klasie moe mie wpyw na wiele innych klas. Zredukowanie skojarze sprawia, e projekt
staje si elastyczniejszy i atwiej rozszerzalny.
Pewien stopie skojarze jest oczywicie niezbdny w kadej aplikacji w przeciwnym
razie klasy nie wchodziyby we wzajemne interakcje. Organizujc klasy aplikacji w warstwy,
mona mie nadziej na uzyskanie mniejszego stopnia skojarze ni w przypadku, gdyby
podzia na warstwy nie by przyjt zasad organizacji. Warstwa moe zalee od interfejsu
innej warstwy, jednak powinna by niezalena od jej implementacji.
Przy takim podejciu kada warstwa cechuje si cile ograniczon liczb zalenoci. Zaleno (znana take jako relacja korzystania) to taki zwizek midzy dwoma elementami, w ktrym zmiana w jednym elemencie ma wpyw na drugi element. Na rysunku 11.1 poszczeglne
warstwy s zalene tylko od warstw, ktre znajduj si poniej, to znaczy od warstw, ktre
s bardziej niskopoziomowe czy te bardziej zalene od elementw zewntrznych, takich
jak bazy danych albo usugi sieciowe.
Prosz zwrci uwag, co oznacza zaleno w odniesieniu do warstw. Oznacza mianowicie, e klasy w warstwie powyej korzystaj z klas i metod warstwy (lub warstw) poniej,
ale ju nie vice versa. Rzeczywicie, jeli zalenoci zachodz midzy wszystkimi warstwami
w obie strony, traci si cakowicie korzyci z podziau na warstwy.

588

Cz II

Operacje na danych

Rysunek 11.1.
Wizualizacja
warstw

Schemat warstw pokazany na rysunku 11.1 jest otwartym (lunym) schematem podziau
na warstwy, poniewa niektre warstwy zale od wicej ni jednej innej warstwy.
W schemacie zamknitym (nieprzejrzystym) kada warstwa zaley tylko od jednej niszej warstwy. Chocia schemat zamknity byby idealny, to jednak w praktyce jest on
czasami trudny do osignicia. Jak zauway Martin Fowler w swojej ksice Architektura
systemw zarzdzania przedsibiorstwem. Wzorce projektowe, wikszo (architektur
warstwowych) jest w wikszoci nieprzejrzysta.

Na koniec musz jeszcze wspomnie, e niektrzy autorzy uywaj terminu poziom w tym
samym znaczeniu, w jakim ja uywam terminu warstwa. Wikszo jednak wspczesnej
literatury na temat architektury i projektowania oprogramowania uywa terminu poziom
w zupenie innym znaczeniu. Znaczenie to odnosi si do granic procesu. Rne poziomy najczciej oznaczaj rne miejsca w sieci. Typowa aplikacja sieciowa moe by na przykad
rozpatrywana jako architektura trjpoziomowa: stacja robocza uytkownika jest poziomem
interfejsu uytkownika, serwer sieciowy jest poziomem aplikacji, a system zarzdzania baz
danych dziaajcy na odrbnym serwerze danych jest poziomem bazy danych, co pokazano
na rysunku 11.2. W dalszej czci niniejszej ksiki termin poziom bdzie uywany w tym
drugim znaczeniu, z kolei sowo warstwa bdzie odnosi si do pojciowego grupowania
klas w obrbie aplikacji.

Rozdzia 11.

Projektowanie oraz implementacja aplikacji sieciowych

589

Rysunek 11.2.
Poziomy

Skutki podziau na warstwy


Istnieje wiele korzyci, ktre moe przynie projektowanie aplikacji z uyciem warstw.
Pierwsz i najwaniejsz zalet korzystania z warstw jest fakt, e wynikowa aplikacja powinna by o wiele bardziej elastyczna i adaptowalna dziki niszemu oglnemu poziomowi skojarze w aplikacji. Jeli niski poziom skojarze czy si z wysokim stopniem spjnoci
w obrbie warstwy (cznie z dobrze okrelonym interfejsem dostpu do warstwy), programista powinien mie moliwo modyfikowania, poszerzania lub wzbogacania warstwy
bez wywierania nadmiernego wpywu na reszt aplikacji. Jak zauway Craig Larman w swojej
ksice Agile and Interactive Development, modyfikowanie i pielgnacja aplikacji zwykle
zabiera wikszo czasu powiconego na jej opracowanie. W rezultacie zwikszenie moliwoci pielgnowania aplikacji jest istotn zalet.
Inna korzy podziau na warstwy polega na moliwoci ponownego uycia danej warstwy
w innych aplikacjach, zwaszcza jeli zostaa ona zaprojektowana z myl o wielokrotnym
uyciu. Autor uywa w dziesitkach aplikacji sieciowych nieco bardziej zoonych wersji
warstw, ktre zostan zaimplementowane w dalszej czci tego rozdziau. Wreszcie kolejn
zalet warstw jest moliwo testowania funkcji aplikacji zawartych w warstwie odrbnie
i niezalenie od innych warstw.
Uywanie warstw ma jednak te swoje wady. Jedna z nich polega na tym, e aplikacja moe
sta si nieco trudniejsza w zrozumieniu i opracowaniu dla programistw, ktrzy znaj jedynie model projektowania oparty na jzyku skryptowym strony. Chocia zazwyczaj warto
ponie taki koszt, to jednak w przypadku bardzo prostych aplikacji sieciowych, skadajcych si zaledwie z kilku stron, uywanie wielu warstw abstrakcji prawdopodobnie nie bdzie
opacalne.
Inna wada korzystania z warstw polega na tym, e dodatkowe poziomy abstrakcji mog spowodowa spadek wydajnoci wykonywania si programu. Biorc jednak pod uwag czas
powicany na komunikowanie si komputerw w sieci, dodatkowy czas przeznaczony na
komunikacj midzy obiektami w komputerze jest wzgldnie nieistotny.
Ostatni wad podziau na warstwy jest trudno w ustanowieniu prawidowego schematu
podziau, ktry zostanie zastosowany. Jeli w aplikacji jest za mao warstw, a kada warstwa
ma za duo obowizkw, wwczas osignicie peni korzyci z podziau na warstwy moe
by niemoliwe. Jeli z kolei w aplikacji jest za wiele warstw, zapewne bdzie ona zbyt

590

Cz II

Operacje na danych

skomplikowana, a tym samym mniej elastyczna i trudniejsza do zrozumienia. W nastpnych


kilku podrozdziaach sprbuj odnie si do tych wad, analizujc kilka przykadowych architektur warstwowych.
Kiedy naley nada nazwy modelom podziau na warstwy, okazuje si, e brakuje standardowego nazewnictwa. Analizujc literatur, mona odnie wraenie, e istniej dziesitki
rnych schematw dzielenia na warstwy. W tym przypadku bdzie jednak inaczej. Jak zauwaa Eric Evans w swojej ksice Domain-Driven Design, przemys oprogramowania zorientowanego obiektowo dziki swojemu dowiadczeniu i przyjtym konwencjom zbliy si
do architektur warstwowych, cznie z wypracowaniem zbioru w miar standardowych warstw,
ktre jednak nie maj standardowych nazw. W nastpnych trzech podrozdziaach zostan omwione trzy najczciej spotykane modele warstw.

Model dwuwarstwowy
Pokazano ju w poprzednim rozdziale, e jest moliwe utworzenie sterowanej danymi aplikacji sieciowej ASP.NET niemal zupenie bez koniecznoci programowania dziki kontrolce
SqlDataSource oraz innym kontrolkom danych, takim jak DetailsView i GridView. Niemniej,
jak ju wspomniano w rozdziale 9., wielu programistw nie lubi umieszcza szczegw
dostpu do bazy danych w formularzach WWW, nawet jeli dzieje si to w deklaracyjnych
formach kontrolki SqlDataSource. W rozdziale 9. utworzono seri spokrewnionych klas,
ktre obsugiway dostp do bazy danych za porednictwem programowania w technologii
ADO.NET, a nastpnie uyto ich w formularzach WWW, korzystajc z kontrolki ObjectDataSource. By to przykad architektury dwuwarstwowej.
W modelu dwuwarstwowym szczegy dostpu do danych s zawarte w odrbnych klasach,
ktre s rne od samych formularzy WWW. Dwie warstwy wystpujce w takim modelu
mona nazwa warstw prezentacji oraz warstw dostpu do danych.
Warstwa prezentacji udostpnia interfejs uytkownika aplikacji oraz obsuguje interakcj
midzy uytkownikiem i aplikacj. W tej ksice warstwa prezentacji skada si ze stron
ASP.NET wraz z ich klasami z kodem ukrytym oraz dodatkowymi kontrolkami uytkownika
lub kontrolkami niestandardowymi. Warstwa dostpu do danych udostpnia komunikacj
z systemami zewntrznymi, takimi jak bazy danych, systemami rozpowszechniania komunikatw lub zewntrzne usugi WWW, co pokazano na rysunku 11.3.
Warstwa dostpu do danych z rozdziau 9. zawieraa cay kod ADO.NET. Kada z klas
warstwy bya odpowiedzialna za tworzenie, odczytywanie, aktualizacj i usuwanie w pojedynczej tabeli bazy danych (CRUD, od ang. Create, Retrieve, Update, Delete). Na rysunku 11.4
pokazano dwie przykadowe klasy dostpu do danych oraz ich wspln klas nadrzdn.
Naley zauway, e gdy dane s odczytywane z bazy w warstwie dostpu do danych, s
one zawarte w klasie DataTable (chocia mona by te uy klasy DataSet), po czym przekazywane do warstwy prezentacji.

Rozdzia 11.

Projektowanie oraz implementacja aplikacji sieciowych

Rysunek 11.3.
Model
dwuwarstwowy

Rysunek 11.4. Warstwa dostpu do danych

591

592

Cz II

Operacje na danych

Zalet modelu dwuwarstwowego jest jego lekko i wzgldna atwo implementacji. Model
ten moe jednak nie by idealnym rozwizaniem, jeli logika aplikacji witryny staje si bardziej zoona. Termin logika aplikacji odnosi si do midzydomenowej logiki albo przepywu procesw w samej aplikacji. Przykadem logiki aplikacji moe by przepyw pracy
w sklepie internetowym zwizany z obsug zamwienia. Po klikniciu przez uytkownika
przycisku sucego do skadania zamwie aplikacja sieciowa musi utworzy zamwienie
w bazie danych, skontaktowa si z systemem patnoci i przedoy patno. Jeli nastpi
niepowodzenie, zamwienie musi zosta wycofane, a uytkownik powiadomiony. W przeciwnym razie zamwienie musi zosta przekazane, system realizacji zamwienia powiadomiony,
a strona z potwierdzeniem zamwienia wywietlona. Taki przepyw pracy ma wiele etapw
z wieloma zestawami logiki warunkowej.
Model dwuwarstwowy moe okaza si daleki od ideau, jeli zachodzi potrzeba dodania
do aplikacji bardziej zoonych regu biznesowych. Okrelenie reguy biznesowe odnosi si
do standardowych typw walidacji danych wejciowych omwionych w rozdziale 5., a take
do bardziej zoonych regu dotyczcych danych, czsto charakterystycznych dla metod, ktrymi posuguje si organizacja, prowadzc swoj dziaalno.
W witrynach, w ktrych logika aplikacji lub reguy biznesowe s zoone, taka dodatkowa
zoono musi by zazwyczaj zaimplementowana w warstwie prezentacji, gdy uyto modelu dwuwarstwowego. W konsekwencji kody ukryte zwykle staj si zbyt skomplikowane
i przepenione powtarzalnym kodem logiki biznesowej i aplikacji. Dokonaem kiedy dla
klienta refaktoryzacji dwuwarstwowej aplikacji sieciowej ASP.NET, w ktrej kada klasa z kodem ukrytym dla wszystkich z ponad trzydziestu formularzy WWW liczya ponad 4000 wierszy. W rezultacie ich modyfikacja bya prawdziwym koszmarem z powodu ich dugoci
i zoonoci. Rozwizaniem dla tego okrelonego przypadku bya zmiana architektury witryny na model trjwarstwowy.

Model trjwarstwowy
W architekturze trjwarstwowej nowa warstwa zostaje dodana do modelu dwuwarstwowego.
Ta nowa warstwa jest oglnie znana pod nazw warstwy biznesowej (rysunek 11.5).
Najwaniejsz zmian w porwnaniu z modelem dwuwarstwowym jest brak koniecznoci
umieszczania danych z bazy w obiektach klasy DataTable. Warto przypomnie, e w modelu
dwuwarstwowym dane s zwracane z przykadowych klas dostpu do danych w obiektach
klasy DataTable (zamiast ktrych mona uy obiektw klasy DataSet). Kiedy obiekt klasy
DataTable albo DataSet zostanie bezporednio powizany z kontrolk, ma to swoje niewtpliwe zalety. Czasami jednak zachodzi potrzeba programowego uzyskania i przetworzenia
poszczeglnych danych z obiektw. Jak ju pokazano w rozdziale 8., zakodowanie takiej
funkcji jest nieco skomplikowane. Jeli naley na przykad pobra warto pola LastName
z pierwszego wiersza DataRow pierwszej tabeli DataTable w zbiorze DataSet, kod bdzie
wyglda nastpujco:
txtLastName.Text = myDataSet.Tables[0].Rows[0]["LastName"];

Rozdzia 11.

Projektowanie oraz implementacja aplikacji sieciowych

593

Rysunek 11.5.
Architektura
trjwarstwowa

Co gorsza, poniewa tabela DataTable prawdopodobnie odzwierciedla ukad tabeli bazy


danych, do warstwy prezentacji zosta wprowadzony kod zaleny od bazy danych. Ponadto
jeli nawet program nie jest pisany pod ktem wypenionych obiektw klasy DataTable albo
DataSet, tego typu podejcie dwuwarstwowe nadal gwarantuje, e w formularzach WWW
znajdzie si dua ilo kodu specyficznego dla bazy danych. Wemy na przykad pod uwag
nastpujc definicj kontrolki GridView:
<asp:GridView ID="grdSample" runat="server"
DataSource="someSource" >
<Columns>
<asp:BoundField DataField="Isbn" HeaderText="Isbn" />
<asp:TemplateField HeaderText="Title">
<ItemTemplate>
<%# Eval("Title") %>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

W tym kodzie znajduj si odniesienia do dwch szczegw implementacji bazy danych,


a mianowicie do pl Isbn oraz Title. W modelu dwuwarstwowym (lub jeszcze gorzej
w jednowarstwowym) takie szczegy bd porozrzucane we wszystkich formularzach WWW.
cile kojarzc formularze WWW z implementacj bazy danych, w znaczcym stopniu ogranicza si ich elastyczno. Oznacza to, e kada zmiana w bazie danych (jak na przykad
zmiana nazw pl) prawdopodobnie bdzie skutkowa koniecznoci powicenia mnstwa
czasu na wprowadzanie poprawek do formularzy, ktre korzystaj z tej bazy. Chocia moe
to by do przyjcia w przypadku hojnego i wyrozumiaego klienta, ktry paci za przepracowane godziny, to jednak w przypadku wikszoci prawdziwych klientw taka sytuacja nie
powinna mie miejsca.

594

Cz II

Operacje na danych

Projektowanie oraz implementacja obiektu biznesowego


Przewaga podejcia trjwarstwowego polega na moliwoci lepszego odizolowania warstwy
prezentacji od potencjalnych zmian w bazie danych. Formularze WWW nie prowadz interakcji ze specyficznymi dla bazy danych obiektami klasy DataTable albo DataSet, lecz z klasami oglnie nazywanymi obiektami biznesowymi. W takim podejciu kady rekord jest
reprezentowany przez odrbn instancj odpowiedniej klasy biznesowej. Wartoci pl pochodzce z rekordw s przechowywane w danych skadowych obiektu biznesowego. Wartoci tych danych s z kolei udostpniane za porednictwem waciwoci, jak to pokazano w poniszym przykadzie:
public class SampleBusinessObject
{
// Dane skadowe
private int _id;
private string _name;

// Waciwoci
public int Id
{
get { return _id; }
set { _id= value; }
}
public string Name
{
get { return _name; }
set { _name = value; }
}

Formularz WWW moe zatem uzyska dostp do danych z rekordu, korzystajc z duo
czystszej skadni waciwoci. Do tych waciwoci mona uzyskiwa dostp programowo
w pokazany poniej sposb:
txtName.Text = aCustomer.Name

Do waciwoci mona rwnie odnosi si deklaratywnie w wyraeniach wizania danych:


<asp:GridView ID="grdSample" runat="server"
DataSource="someSource" >
<Columns>
<asp:BoundField DataField="Id" HeaderText="Id" />
<asp:TemplateField HeaderText="Name">
<ItemTemplate>
<%# Eval("Name") %>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

Rozdzia 11.

Projektowanie oraz implementacja aplikacji sieciowych

595

Gwna zaleta takiego podejcia polega na tym, e warstwa prezentacji nie zaley ju od
szczegw implementacji bazy danych, poniewa nastpuje odwoanie do waciwoci obiektu,
a nie do nazwy pola w tabeli DataTable. Ponadto dziki wyeliminowaniu obiektu DataSet
albo DataTable kod sta si zdecydowanie czystszy i bardziej czytelny.
Jeli jest potrzebna weryfikacja wyrae wizania danych podczas kompilacji, mona
zastosowa bardziej rozwlek alternatyw dla metody Eval, ktr jest pokazane poniej
polecenie Container.DataItem:
<ItemTemplate>
<%# ((Book)Container.DataItem)Book.Name %>
</ItemTemplate>

Warstwa biznesowa zatem implementuje i reprezentuje biznes, czyli funkcje, logik, procesy
i dane aplikacji. W zalenoci od aplikacji w klasach tej warstwy mog by hermetyzowane:
Q

Dane biznesowe lub aplikacji rnych klas niestandardowych.

Reguy logiki lub reguy biznesowe walidacji dla aplikacji.

Proces lub przepyw pracy biznesu albo aplikacji, taki jak proces zamawiania
i potok realizacji albo przepyw pracy wsparcia klienta.

Usunicie regu biznesowych oraz logiki aplikacji z warstwy prezentacji sprawia, e formularze WWW staj si o wiele prostsze. Teraz mog one zawiera wycznie znaczniki oraz
obsug zdarze interfejsu uytkownika. Wszystko inne jest zawarte w pozostaych klasach.
Na rysunku 11.6 pokazano cz klas, ktrych mona uy w obrbie warstwy biznesowej
w przykadowej aplikacji Book Catalog.
Naley zauway, e obiekty biznesowe nie powinny by wycznie pojemnikami dla danych
na temat obiektu. Powinny one rwnie zawiera logik. Mog na przykad zawiera metody suce do uzyskiwania lub zapisywania swoich danych (za pomoc korzystania z klas
z warstwy dostpu do danych), implementacji logiki aplikacji, autoryzacji dostpu oraz walidacji danych wzgldem regu biznesowych.
Kolejnym elementem (rysunek 11.6) wymagajcym uwagi jest potrzeba istnienia dodatkowych obiektw biznesowych, ktre bd reprezentowa zbiory obiektw biznesowych. Te
klasy zbiorw biznesowych take nie powinny by jedynie pojemnikami dla danych, ale
powinny zawiera rwnie logik. W przykadzie pokazanym na rysunku 11.6 klasy zbiorw
biznesowych zawieraj moliwo adowania siebie samych ze rda danych (za pomoc klas
z warstwy dostpu do danych), a take aktualizacji lub dodawania siebie do rda danych.
Jest prawdopodobne, e obiekty biznesowe aplikacji bd mie cz wsplnych funkcji.
Te funkcje mona umieci we wsplnej klasie nadrzdnej. Na rysunku 11.6 jest ni klasa
AbstractBO, ktrej kod przedstawiono na listingu 11.1. Ma ona dane skadowe, ktre ledz,
czy obiekt jest nowy, czy by modyfikowany oraz czy dane podklasy s prawidowe wzgldem regu biznesowych. Poniewa klasy, ktre korzystaj z tych obiektw biznesowych mog
chcie mie moliwo sprawdzenia, ktre reguy zostay naruszone, klasa AbstractBO
przechowuje zbir naruszonych regu, a take metody suce do dodawania oraz odczytywania zbiorw, ktre ze wzgldu na prostot przykadu zostay przedstawione jako lista

596

Cz II

Operacje na danych

Rysunek 11.6.
Przykadowe
obiekty biznesowe

acuchw. Poniewa kady obiekt biznesowy wie, jak okreli, czy dane s prawidowe,
klasa AbstractBO definiuje abstrakcyjny skadnik CheckIfSubClassStateIsValid, ktry jest
zaimplementowany przez kad z jej konkretnych podklas.
W tym przykadzie kady obiekt biznesowy jest odpowiedzialny za sprawdzanie swoich
regu biznesowych. Inne podejcie, bardziej skomplikowane, ale zarazem o wikszych
moliwociach adaptacji, polega na hermetyzowaniu tych regu w obrbie ich wasnej
hierarchii obiektw. Do tych regu bdzie mg stosowa si jaki typ odrbnej klasy
zarzdzania reguami. Wicej informacji o tym rodzaju podejcia znajduje si w ksice
Jimmyego Nilssona Applying Domain-Driven Design and Patterns.
Listing 11.1. AbstractBO.cs
using System;
using System.Data;
using System.Collections.Generic;
namespace ThreeLayer.Business
{
/// <podsumowanie>
/// Reprezentuje klas nadrzdn dla wszystkich obiektw biznesowych

Rozdzia 11.

Projektowanie oraz implementacja aplikacji sieciowych

/// </podsumowanie>
public abstract class AbstractBO
{
// Dane skadowe
protected const int DEFAULT_ID = 0;
// Flagi wskazujce, czy obiekt jest nowy, czy by modyfikowany
private bool _isNew = true;
private bool _isModified = false;
// Zbir opisw wszystkich naruszonych regu
private List<string> _brokenRules = new List<string>();
/// <podsumowanie>
/// Kada klasa jest odpowiedzialna za sprawdzanie, czy jej
/// stan (dane skadowe) zawiera naruszone reguy biznesowe
/// </podsumowanie>
protected abstract bool CheckIfSubClassStateIsValid
{
get;
}
/// <podsumowanie>
/// Podklasy potrzebuj moliwoci dodawania opisu naruszonej reguy
/// </podsumowanie>
protected void AddBrokenRule(string rule)
{
_brokenRules.Add(rule);
}
/// <podsumowanie>
/// Zwr opisy wszystkich naruszonych regu
/// </podsumowanie>
public List<string> BrokenRules
{
get { return _brokenRules; }
}
/// <podsumowanie>
/// Czy obiekt biznesowy jest poprawny
/// </podsumowanie>
public bool IsValid
{
get
{
_brokenRules.Clear();
return CheckIfSubClassStateIsValid;
}
}
/// <podsumowanie>
/// Czy obiekt biznesowy by modyfikowany od czasu ostatniego zapisu
/// </podsumowanie>
protected bool IsModified
{
get { return _isModified; }
set { _isModified = value; }
}

597

598

Cz II

Operacje na danych

/// <podsumowanie>
/// Czy ten obiekt biznesowy jest nowy, czy moe
/// zawiera dane, ktre ju istniej w bazie
/// </podsumowanie>
protected bool IsNew
{
get { return _isNew; }
set { _isNew = value; }
}
}
}

Nie zamieszczam kodw dla wszystkich klas z rysunku 11.6 (chocia mona je pobra z mojej
witryny WWW pod adresem http://www.randyconnolly.com/core), jednak w listingu 11.2
prezentuj kod klasy biznesowej PublisherBO.
Listing 11.2. PublisherBO.cs
using System;
using System.Data;
using ThreeLayer.DataAccess;
namespace ThreeLayer.Business
{
/// <podsumowanie>
/// Obiekt biznesowy do przechowywania informacji o wydawcy
/// </podsumowanie>
public class PublisherBO: AbstractBO
{
// Dane skadowe
private int _id = DEFAULT_ID;
private string _name = "";
// Konstruktory
public PublisherBO() { }
public PublisherBO(int id, string name)
{
_id = id;
_name = name;
IsNew = false;
IsModified = true;
}
/// <podsumowanie>
/// Wypenia obiekt danymi na podstawie przekazanego ID
/// </podsumowanie>
/// <zwraca>
/// Warto true, jeli wypenienie danymi powiodo si,
/// w przeciwnym razie warto false
/// </zwraca>
public bool Load(int id)
{
PublisherDA da = new PublisherDA();
DataTable table = da.GetById(id);

Rozdzia 11.

Projektowanie oraz implementacja aplikacji sieciowych

// Jeli w tabeli nie ma danych, wypenienie nie powiodo si


if (table.Rows.Count == 0)
{
AddBrokenRule("Wydawca o numerze id=" + id +
" nie zosta odnaleziony");
return false;
}
// Przypisz pobrane dane danym skadowym
Id = (int)table.Rows[0]["PublisherId"];
Name = (string)table.Rows[0]["PublisherName"];
IsNew = false;
// Sprawd, czy pobrane dane s zgodne z reguami
return IsValid;
}
/// <podsumowanie>
/// Zapisuje dane obiektu. Jeli obiekt jest nowy,
/// dane zostan wstawione; w przeciwnym razie, jeli dane zmieniy si,
/// zostan zaktualizowane
/// </podsumowanie>
public void Save()
{
if (IsNew)
Insert();
else
Update();
}
/// <podsumowanie>
/// Tylko aktualizuje dane
/// </podsumowanie>
public void Update()
{
if (IsValid)
{
if (IsModified)
{
PublisherDA da = new PublisherDA();
da.UpdatePublisher(Id, Name);
IsModified = false;
}
}
}
/// <podsumowanie>
/// Tylko wstawia dane
/// </podsumowanie>
public void Insert()
{
IsNew = true;
if (IsValid)
{
PublisherDA da = new PublisherDA();
da.InsertPublisher(Name);
}
}

599

600

Cz II

Operacje na danych

/// <podsumowanie>
/// Usuwa dane
/// </podsumowanie>
public void Delete()
{
PublisherDA da = new PublisherDA();
da.DeletePublisher(Id);
}
/// <podsumowanie>
/// Sprawdza, czy stan wewntrzny obiektu
/// biznesowego jest prawidowy
/// </podsumowanie>
protected override bool CheckIfSubClassStateIsValid
{
get
{
bool valid = true;
if (Name.Length == 0)
{
AddBrokenRule("Nazwa wydawcy nie moe by pusta");
valid = false;
}
if (Id < 0)
{
AddBrokenRule(
"Id wydawcy nie moe by mniejszy ni zero");
valid = false;
}
// Oto przykad bardziej zoonej reguy
if (IsNew)
{
// Sprawd, czy tytu ju nie istnieje
PublisherDA da = new PublisherDA();
DataTable dt = da.GetByName(Name);
if (dt.Rows.Count > 0)
{
AddBrokenRule("Nazwa wydawcy ju istnieje");
valid = false;
}
}
return valid;
}
}
// Waciwoci
public int Id
{
get { return _id; }
set {
_id = value;
IsModified = true;
}
}

Rozdzia 11.

Projektowanie oraz implementacja aplikacji sieciowych

601

public string Name


{
get { return _name; }
set {
_name = value;
IsModified = true;
}
}
}
}

Ta klasa hermetyzuje dane pojedynczego wydawcy i metody niezbdne do jego adowania,


aktualizacji, wstawiania oraz usuwania (za pomoc klasy dostpu do danych podobnej do
pokazanej pod koniec rozdziau 9.). Klasa biznesowa potrzebuje take moliwoci okrelania,
czy jej dane naruszaj ktr z jej regu biznesowych. Zabezpieczona waciwo CheckIfSubClassStateIsValid sprawdza, czy nazwa wydawcy nie jest pusta i czy ID wydawcy nie jest
mniejsze od zera. Oprcz tego podczas dodawania wydawcy waciwo ta sprawdza, czy
wydawca o tej samej nazwie ju nie istnieje. Wszystkie naruszone reguy s dodawane do
zbioru BrokenRules (zdefiniowanego w klasie AbstractBO).
Wyjaniajc omawiane zagadnienia w powyszym przykadzie oraz w innych przykadach
zamieszczonych w niniejszym rozdziale, znaczco uprociem kod. W klasie powinno
by na przykad wicej kodu sprawdzajcego bdy, wsparcia dla transakcji oraz by
moe rozczony mechanizm definiowania regu.

Uywanie przestrzeni nazw


Warto zauway, e w przykadowych listingach uyto sowa kluczowego jzyka C# namespace. Jest ono stosowane w celu organizowania klas za pomoc definiowania globalnie
unikalnych definicji typw. Biblioteka klas platformy .NET korzysta z przestrzeni nazw,
aby zagwarantowa brak konfliktw midzy nazwami. Klasa Image istnieje na przykad w
przestrzeniach nazw System.Drawing oraz System.Web.UI.WebControls. Kiedy na pocztku
klas jest dodawana dyrektywa using, wskazuje ona, e odwoania bd dotyczy klas z tej
wanie przestrzeni nazw bez podawania jej w peni kwalifikowanej nazwy.
Jeli zatem zachodzi potrzeba uycia klasy PublisherBO w klasie z kodem ukrytym formularza WWW, naley doda odpowiednie odwoanie:
using ThreeLayer.Business;

PublisherBO pub = new PublisherBO();

W przeciwnym razie konieczne byoby uycie w peni kwalifikowanej nazwy:


ThreeLayer.Business.PublisherBO pub = new
ThreeLayer.Business.PublisherBO();

602

Cz II

Operacje na danych

Programowe uywanie obiektu biznesowego


Aby z obiektu biznesowego mona byo korzysta w formularzu WWW, mona umieci
go w kontrolce ObjectDataSource albo uy go programowo. Aby na przykad w kontrolce
GridView wywietli zbir wydawcw, mona powiza programowo jej zbir tylko do odczytu z waciwoci kontrolki DataSource.
PublisherCollectionBO pubs = new PublisherCollectionBO();
grdPublishers.DataSource = pubs.ReadOnlyCopy();
grdPublishers.DataBind();

Przyjmijmy, e ta sama kontrolka GridView ma w kadym wierszu przycisk sucy do wybierania wiersza. Kiedy uytkownik wybierze wiersz, zostan wywietlone dane wybranego
wydawcy. Kod wykonujcy to zadanie moe wyglda nastpujco:
// Okrel ID wybranego wydawcy
int pubId = (int)grdPublishers.SelectedDataKey.Values[0];
// Utwrz obiekt biznesowy wydawcy i wczytaj jego dane
PublisherBO pub = new PublisherBO();
if (pub.Load(pubId))
{
panPublisher.Visible = true;
labId.Text = pub.Id.ToString();
txtName.Text = pub.Name;
}

W powyszym przykadzie jest tworzony obiekt biznesowy wydawcy, ktry wczytuje dane
odpowiadajce wybranemu identyfikatorowi PublisherId. Jeli wczytywanie danych zakoczy si pomylnie, wartoci pl bdzie mona odczytywa za porednictwem waciwoci
obiektu biznesowego.
W celu aktualizacji danych w bazie mona skorzysta z tej samej klasy biznesowej. Na poniszym przykadzie pokazano, jak obiekt klasy PoblisherBO jest tworzony i zapeniany danymi pochodzcymi z formularza WWW. Nastpnie obiekt ma sam siebie zaktualizowa. Jeli
aktualizacja nie powioda si na skutek naruszenia reguy biznesowej, w kontrolce formularza
zostanie wywietlony zbir acuchw z reguami.
// Pobierz wartoci ID oraz tytuu
int id = Convert.ToInt32(labId.Text);
string name = txtName.Text;
// Utwrz obiekt biznesowy wydawcy i postaraj si go zaktualizowa
PublisherBO pub = new PublisherBO(id, name);
pub.Update();
// Sprawd, czy aktualizacja udaa si
if (!pub.IsValid)
{
// Aktualizacja nie udaa si, a zatem poka naruszone reguy biznesowe
grdErrors.DataSource = pub.BrokenRules;
grdErrors.DataBind();
}

Rozdzia 11.

Projektowanie oraz implementacja aplikacji sieciowych

603

Uywanie obiektw biznesowych z kontrolk ObjectDataSource


Jak ju pokazano w poprzednim rozdziale uywajc kontrolki ObjectDataSource, mona
powiza kontrolki danych z dowolna klas. Rzeczywicie, za pomoc kontrolki ObjectDataSource stosunkowo atwo mona wywietli wydawcw w klasie PublisherCollectionBO:
<asp:ObjectDataSource ID="dsBusiness" runat="server"
TypeName="ThreeLayer.Business.PublisherCollectionBO"
SelectMethod="ReadOnlyCopy" >

Uywanie jednak obiektu biznesowego PublisherId z kontrolk ObjectDataSource rodzi


pewne problemy. Niestety, sposb, w jaki zaprojektowano t kontrolk, moe powodowa
trudnoci w uywaniu jej z typowym, jednoelementowym obiektem biznesowym. Pierwszy problem, na jaki mona si natkn, polega na tym, e w przypadku uywania kontrolki
ObjectDataSource do wywietlania obiektw biznesowych i manipulowania nimi korzystanie z wasnych funkcji obiektu sucych do adowania, aktualizowania i wstawiania moe
by trudne. Podczas projektowania obiektu biznesowego zazwyczaj hermetyzuje si nie
tylko jego dane, ale te funkcje suce do adowania i zapisywania danych (uywajc klas
pochodzcych z warstwy dostpu do danych). Takie typowe rozwizanie moe powodowa
problemy podczas prby uycia tych funkcji w kontrolce ObjectDataSource.
Zamy na przykad, e istnieje formularz WWW z kontrolk DetailsView, ktra wywietla i aktualizuje dane z klasy PublisherBO. Kady obiekt tej klasy moe zapenia swoje dane
skadowe informacjami z bazy danych za porednictwem metody Load. Warto jednak przypomnie, e metoda okrelona we waciwoci SelectMethod kontrolki ObjectDataSource
musi zwraca potrzebne dane, ktre zostan wywietlone w kontrolce. To oznacza, e jest
potrzebna metoda, ktra zwraca zapeniony ju obiekt klasy PublisherBO. Jest zatem potrzebna jaka inna klasa, ktra zwrci potrzebny, zapeniony obiekt (taki typ klasy mona nazwa adapterem, z uwagi na wzorzec projektowy adaptera). Alternatywnie mona doda do
obiektu biznesowego metod statyczn, ktra zwraca zapeniony obiekt biznesowy, jak to
pokazano poniej:
public class PublisherBO: AbstractBO
{

public static PublisherBO RetrievePublisher(int pubId)


{
PublisherBO pub = new PublisherBO();
if (pub.Load(pubId))
return pub;
else
return null;
}
}

Podobny problem zaistnieje w przypadku aktualizacji. Kady obiekt klasy PublisherBO ma


moliwo zapisywania lub aktualizacji bazy danych przy uyciu metody Save albo Update.
Kontrolka ObjectDataSource oczekuje jednak, e jej okrelona metoda pobierze jako parametr obiekt klasy PublisherBO albo list parametrw, ktre odpowiadaj aktualizowanym
wartociom danych. Tutaj te bdzie potrzebna jaka inna klasa z metod aktualizujc, ktra

604

Cz II

Operacje na danych

jako parametr pobiera obiekt klasy PublisherBO (i ktra po prostu wywouje wasn metod
aktualizujc obiektu biznesowego) albo konieczne bdzie dodanie do obiektu biznesowego
metody statycznej, ktra aktualizuje przekazany obiekt tej klasy.
public class PublisherBO: AbstractBO
{

public static void UpdatePublisher(PublisherBO pub)


{
pub.Update();
}
}

Kontrolka ObjectDataSource moe zatem by podobna do kontrolki pokazanej w poniszym


przykadzie (korzysta ona z parametru acucha zapytania w celu okrelenia, ktrego wydawc wywietli).
<asp:ObjectDataSource ID="dsBusiness" runat="server"
TypeName="ThreeLayer.Business.PublisherBO"
SelectMethod="RetrievePublisher"
UpdateMethod="UpdatePublisher"
DataObjectTypeName="ThreeLayer.Business.PublisherBO">
<SelectParameters>
<asp:QueryStringParameter Name="pubId"
QueryStringField="id" />
</SelectParameters>
</asp:ObjectDataSource>

W powyszym przykadzie naley take okreli waciwo DataObjectTypeName kontrolki.


Ta waciwo jest uywana do okrelania nazwy klasy obiektu, z ktrego korzysta kontrolka w operacjach aktualizacji, wstawiania oraz usuwania.
W pokazanym przykadzie metody wybierania i aktualizacji zawieraj si w obiekcie biznesowym. Mona te utworzy odrbn klas adapterow zawierajc metody RetrievePublisher
oraz UpdatePublisher, co zmieniaoby kontrolk ObjectDataSource w nastpujcy sposb:
<asp:ObjectDataSource ID="dsBusiness" runat="server"
TypeName="SomeAdapterClass"
SelectMethod="RetrievePublisher"
UpdateMethod="UpdatePublisher"
DataObjectTypeName="ThreeLayer.Business.PublisherBO">

Inny potencjalny problem zwizany z obiektami biznesowymi oraz kontrolk ObjectDataSource polega na tym, e wewntrzna logika typowego obiektu biznesowego moe nie integrowa si dobrze z kontrolk. Zazwyczaj sposb postpowania z obiektami biznesowymi
polega na przykad na uyciu niestandardowej klasy fabrycznej w celu tworzenia i dostosowywania rnych obiektw biznesowych w aplikacji. Kontrolka ObjectDataSource tworzy
jednak wszystkie obiekty uywane w aplikacji, korzystajc z domylnego konstruktora obiektu.
Ponadto, podczas uywania waciwoci DataObjectTypeName w celu przekazania obiektu biznesowego do metody aktualizujcej, wstawiajcej lub usuwajcej jest tworzona nowa instancja obiektu biznesowego, niektre jej waciwoci s zapeniane, po czym obiekt ten zostaje
przekazany do waciwej metody (rysunek 11.7).

Rozdzia 11.

Projektowanie oraz implementacja aplikacji sieciowych

605

Rysunek 11.7. Interakcja midzy kontrolk z list, kontrolk ObjectDataSource


oraz obiektem biznesowym

Takie zachowanie moe by przyczyn problemw w przypadku obiektw biznesowych,


ktre uywaj wewntrznej logiki, aby decydowa, czy dane maj zosta zaktualizowane,
czy te wstawione. Obiekt biznesowy moe na przykad decydowa o potrzebie aktualizacji
istniejcego rekordu albo o wstawieniu nowego rekordu na podstawie stanu swojej waciwoci IsNew, ktra ze szkod dla zgodnoci z kontrolk ObjectDataSource jest ustawiana
przez domylnego konstruktora na warto true.

606

Cz II

Operacje na danych

Oczywicie, mona przeprojektowa obiekty biznesowe, aby lepiej wsppracoway z kontrolk ObjectDataSource. W rzeczywistoci naley tak postpi w celu umoliwienia stronicowania i sortowania w obiektach biznesowych opartych na kolekcjach. Niektrzy jednak
projektanci oprogramowania mog uwaa, e zmiana projektu warstwy biznesowej w celu
dostosowania jej do potrzeb warstwy prezentacji jest niczym cica nad nimi kltwa. W innych sytuacjach mog istnie obiekty biznesowe, ktrych projektu nie da si zmieni bez
szkody dla innych aplikacji. W takim przypadku naley utworzy fasad albo klas adapterow, ktra udostpni kontrolce ObjectDataSource lepiej pasujcy interfejs. Mona oczywicie podj decyzj o cakowitej rezygnacji z uywania kontrolki ObjectDataSource i przeprowadza wizanie oraz przetwarzanie danych w starowiecki sposb znany ze rodowiska
ASP.NET 1.1, ktry polega na korzystaniu z krtkich fragmentw kodu w plikach z kodem ukrytym.
Alternatyw do korzystania z modelu trjwarstwowego jest uycie modelu czterowarstwowego. Model czterowarstwowy ma wiele zalet, z ktrych jedna polega na tym, e taki model
jest potencjalnie atwiejszy do zintegrowania z kontrolk ObjectDataSource.

Model czterowarstwowy
W podstawowym modelu trjwarstwowym warstwa biznesowa nie jest szczeglnie spjna,
poniewa moe hermetyzowa dane i role biznesowe, a take logik i procesy aplikacji. Aby
uczyni warstw biznesow bardziej spjn, niektrzy programici umieszczaj logik i procesy aplikacji w warstwie prezentacji, co niestety czsto sprawia, e warstwa ta staje si
bardzo chaotyczna i trudna w modyfikacji.

Projektowanie architektury czterowarstwowej


Lepsze rozwizanie polega na odseparowaniu logiki i procesw aplikacji zarwno od warstwy
prezentacji, jak i danych oraz operacji biznesowych, co pokazano na rysunku 11.8.
Na przedstawionym schemacie warstwy prezentacji oraz dostpu do danych s niemal takie
same jak w schemacie trjwarstwowym. Rnica kryjca si w modelu czterowarstwowym
polega na sposobie, w jaki warstwa biznesowa zostaa podzielona na dwie czci: warstw
domeny oraz warstw logiki aplikacji. Jest to zgodne z czsto spotykanym schematem polegajcym na umieszczeniu tych dwch rodzajw logiki (logiki domeny i logiki aplikacji,
ktra jest czasami nazywana logik przepywu pracy) w dwch odrbnych warstwach.
Warstwa logiki aplikacji jest odpowiedzialna za koordynacj i kontrol logiki i procesw aplikacji, czyli sprawdza te zadania oprogramowania, ktre oprogramowanie ma wykonywa.
Operacje w tej warstwie czsto s zbiene z konkretnymi przypadkami uycia. Warstwa ta
moe by rwnie nazywana warstw obsugi (Fowler albo Nilsson), warstw kontrolera,
warstw zarzdzajc albo warstw przepywu pracy biznesu (Microsoft).

Rozdzia 11.

Projektowanie oraz implementacja aplikacji sieciowych

607

Rysunek 11.8.
Model
czterowarstwowy

Obiekty warstwy logiki aplikacji nie powinny zawiera danych stanu dotyczcych biznesu,
mog jednak zawiera dane stanu dotyczce procesw aplikacji. Wikszo pracy zwizanej
z danymi biznesowymi jest przekazana warstwie domeny, ktra jest odpowiedzialna za reprezentowanie danych i regu biznesu lub aplikacji.
Poniewa warstwa domeny zawiera wanie te reguy i dane, znajduje si ona w centrum
uwagi na wstpnym etapie projektowania aplikacji. Klasy tej warstwy czsto s nazywane
encjami. Chocia klasy warstwy domeny mog by zbiene z tabelami w bazie danych (co
mona zauway na rysunku 11.10), nie jest to w adnym wypadku konieczne. Zamiast tego
klasy tej warstwy maj reprezentowa koncepcje w domenie problemu aplikacji. Rzeczywicie,
klasy domeny mona byo spotka ju w klasie Customer, w rozdziale 8.
Ostatni rzecz, na ktr naley zwrci uwag w czterowarstwowym modelu pokazanym
na rysunku 11.8, jest fakt, e klasy warstwy domeny s uywane przez pozostae trzy warstwy. Jest tak dlatego, e klasy encji w tym modelu s uywane w celu przechowywania

608

Cz II

Operacje na danych

danych, gdy s one przekazywane midzy warstwami. Peni one zatem rol, ktr w modelach dwuwarstwowym oraz trjwarstwowym odgrywaa klasa DataTable. Przypomnijmy,
e w modelach dwuwarstwowym i trjwarstwowym rne klasy dostpu do danych umieszczay dane uzyskiwane z bazy danych w obiekcie klasy DataTable i zwracay je do zgaszajcego danie. W rezultacie uytkownik dowolnej klasy dostpu do danych musia manipulowa klas ADO.NET DataTable, chocia ona sama nie bya klas dostpu do danych.
Jako rozwizanie alternatywne w modelu czterowarstwowym, pokazanym na rysunku 11.8,
klasy dostpu do danych same tworz i zapeniaj klasy encji. W sytuacjach, w ktrych s
pobierane wielokrotne rekordy danych, klasy dostpu do danych tworz wielokrotne instancje
odpowiedniej klasy encji, a nastpnie umieszczaj je w obrbie klasy EntityCollection tej
samej klasy pojemnikowej oglnego zastosowania, ktra zostaa utworzona w rozdziale 8.
Na rysunku 11.9 przedstawiono niektre przykadowe klasy z warstwy domeny. Naley zauway, e kada klasa domeny jest podklas klasy AbstractEntity, ktra jest podobna
do klasy opisanej w rozdziale 8. i z ktr ma czci wsplne, jak na przykad AbstractBO
klas bazow dla wszystkich klas biznesowych w modelu trjwarstwowym.
Rysunek 11.9.
Klasy warstwy
domeny

Rozdzia 11.

Projektowanie oraz implementacja aplikacji sieciowych

609

Rne klasy domeny maj wspln cz zespou funkcji, podobnie jak klasy obiektw biznesowych pokazane na rysunku 11.5. Gwna rnica polega na tym, e klasy domeny nie
mog wchodzi w interakcj z baz danych. W rezultacie jest usprawiedliwione uwaanie
tych klas za odpowiednik czego, co niektrzy programici znajcy jzyk Java nazywaj
obiektem transferu danych. Okrelenie to odnosi si do klasy, ktra zawiera wycznie dane
skadowe z waciwociami sucymi uzyskiwaniu dostpu do danych. Najwaniejsza rnica
midzy obiektem transferu danych a nasz klas domeny kryje si w tym, e klasa domeny
zawiera rwnie zachowania suce do sprawdzania i walidacji regu biznesowych.
Na koniec warto zauway zwizki zachodzce midzy rnymi klasami domen na rysunku 11.9. Podobnie jak w przypadku obiektw biznesowych w modelu trjwarstwowym,
encje w modelu czterowarstwowym reprezentuj koncepcje lub rzeczy w domenie problemu
aplikacji. W przykadowej aplikacji z ksikami ksika ma wydawc, seri, kategori i kilku
autorw. Encja Book ma zatem encj Publisher, encj Series, encj Category oraz zbir encji
Author. Chocia zwizki te s odzwierciedleniem modelu danych w bazie, nie s one takie
same. Encja ksiki ma na przykad obiekt encji Publisher, podczas gdy kluczem obcym rekordu Books jest pole PublisherId. Encja ksiki ma zbir obiektw encji Author, gdy tymczasem autorzy danej ksiki zawieraj si w tabelach AuthorBooks oraz Authors.
Opisywanie najlepszego sposobu projektowania modelu domeny wykracza poza zakres
niniejszego rozdziau. Czytelnicy chccy poszerzy swoje wiadomoci w przedstawionym
temacie mog zajrze do ksiek Evansa, Fowlera i Nilssona wymienionych w czci Odnoniki, pod koniec tego rozdziau.

Modyfikowanie warstwy dostpu do danych


W modelu czterowarstwowym klasy encji biznesowej s uywane w celu przenoszenia danych midzy warstwami. W rezultacie naley wprowadzi pewne zmiany w klasach dostpu
do danych, ktre zostay utworzone pod koniec poprzedniego rozdziau. W dalszym cigu s
w nich zaimplementowane podstawowe funkcje CRUD (tworzenia, odczytywania, aktualizacji oraz usuwania), a take dziedzicz one z bazowej klasy abstrakcyjnej. Rnica wystpujca w nowej wersji klas polega na tym, e klasy te w roli parametrw pobieraj encje i zwracaj dane w tych samych encjach.
Dwuwarstwowa klasa BookDA (ktrej wersja zostaa przedstawiona pod koniec rozdziau 9.)
zawieraa na przykad metod UpdateBook. Metodzie tej przekazywano wszystkie wartoci
danych, ktre powinny by zachowane w pokazany poniej sposb:
public void UpdateBook(string isbn, string title,
int publisherId, int categoryId,
int seriesId, int yearPublished,
string briefDescription, string description)

W podejciu czterowarstwowym metodzie tej jest po prostu przekazywany wypeniony obiekt


encji Book:
public void Update(Book book)

610

Cz II

Operacje na danych

W podobny sposb zostanie zmieniona take metoda suca do odczytywania danych. W poprzedniej klasie BookDA istniaa nastpujca metoda, ktra zwracaa obiekt klasy DataTable
zawierajcy jeden wiersz danych:
public DataTable GetBookByIsbn(string isbn)

Nowa wersja zwraca po prostu wypenion encj Book:


public Book GetBookByIsbn(string isbn)

Przejcie na encje powinno mie wpyw na uproszczenie warstwy dostpu do danych. Modyfikacja metody GetAll wie si jednak z pewnym stopniem zoonoci, o ktry zostanie wzbogacona nasza warstwa. W warstwie dostpu do danych w modelu dwuwarstwowym metoda
GetAll bya zaimplementowana w klasie bazowej AbstractDA. Dla odpowiedniej instrukcji
SELECT zwracaa ona po prostu wypeniony obiekt klasy DataTable:
public DataTable GetAll()
{
string sql = SelectStatement;
return GetDataTable(sql, null);
}

Oto na czym polega problem: co takiego zwraca ta metoda w modelu czterowarstwowym?


Najlepiej, gdyby zwracaa silnie typizowan wersj klasy EntityCollection, ktra zawiera
odpowiednie jednostki encji. Kopot jednak w tym, e ta metoda zostaa zdefiniowana w klasie
bazowej. Poniewa stara wersja tylko zwracaa wypeniony obiekt klasy DataTable, typ zwracanych danych nie musia by jej znany. Obecnie jednak, jeli ma by zwracany silnie typizowany zbir, klasa bazowa musi wiedzie, jaki typ danych powinien zosta zwrcony. Mona
oczywicie zaimplementowa metod GetAll we wszystkich klasach dostpu do danych;
spowoduje to jednak konieczno dodania niemal identycznego kodu do kadej z tych klas.
Rozwizanie problemu polega na uyciu typw oglnych jzyka C#, omwionych w rozdziale 8. cznie ze wzorcem Template Method. Wzorzec ten jest czsto stosowany w celu
eliminacji powtarzajcego si w podklasach kodu i polega na zdefiniowaniu gwnych krokw algorytmu w klasie bazowej, a nastpnie zaimplementowaniu w podklasach tylko tych
czci algorytmu, ktre s rne w rnych podklasach.
Spjrzmy na algorytm, ktry naley zaimplementowa w metodzie GatAll. Podstawowe kroki
algorytmu s nastpujce:
1.

Utworzenie obiektu poczenia

2. Skonfigurowanie acucha polecenia wyboru


3. Utworzenie i skonfigurowanie obiektu polecenia
4. Otwarcie poczenia
5. Uruchomienie czytnika danych
6. Utworzenie obiektu ze zbiorem encji
7. Dla kadego rekordu w czytniku danych:

Rozdzia 11.

Projektowanie oraz implementacja aplikacji sieciowych

611

8.1. Pobranie wartoci pl z rekordu


8.2. Utworzenie odpowiedniej encji obiektu biznesowego
8.3. Wypenienie encji wartociami pl
8.4. Dodanie encji do zbioru encji
9. Zamknicie czytnika oraz poczenia
10. Zwrcenie kolekcji encji

Ktre z powyszych krokw s rne dla rnych podklas dostpu do danych? S to kroki 2.
oraz kroki od 8.1 do 8.3. Wszystkie pozostae kroki algorytmu s stae i nie zale od pobieranych danych. W istniejcej klasie AbstractDA zmieniajcy si krok 2. zosta obsuony
w nastpujcy sposb:
string sql = SelectStatement;

W rozdziale 9. waciwo SelectStatement zostaa zdefiniowana w klasie AbstractDA oraz


zaimplementowana we wszystkich podklasach. Jest to przykad wzorca Template Method!
Wszystko, czego jeszcze potrzeba, to zdefiniowanie abstrakcyjnej metody w klasie AbstractDA,
ktra wykona kroki 8.1, 8.2 i 8.3, a nastpnie zaimplementowanie jej we wszystkich podklasach. Poniewa ta metoda jest odpowiedzialna za tworzenie pojedynczej encji oraz wypenienie jej wartociami pl biecego rekordu, naley zdefiniowa j nastpujco:
protected abstract AbstractEntity CreateAndFillEntity(DbDataReader
reader)

Jak moe wyglda taka metoda, gdy zostanie ju zaimplementowana? Na poniszym


przykadzie pokazano, jak moe ona wyglda w klasie dostpu do danych na temat wydawcw.
protected override AbstractEntity CreateAndFillEntity(
DbDataReader recordJustRead)
{
// Pobierz wartoci rekordw i umie je
// w tymczasowych zmiennych
int id = (int)recordJustRead["PublisherId"];
string name = (string)recordJustRead["PublisherName"];
// Utwrz obiekt i zapenij na podstawie danych
Publisher pub = new Publisher(id, name);
return pub;
}

W celu uproszczenia powyszego fragmentu kodu, a take innych fragmentw zamieszczonych w niniejszym rozdziale, pominito w nich obsug wyjtkw oraz inne
szczegy. Pene wersje s dostpne na mojej witrynie pod adresem http://www.
randyconnolly.com/core.

Gdy przykadowa wersja szablonu metody jest ju zaimplementowana, mona zacz implementacj algorytmu GetAll klasy AbstractDA. Aby byo atwiej, zajmiemy si krokami
od 5. do 10.

612

Cz II

Operacje na danych

EntityCollection<AbstractEntity> collection;
Collection = new EntityCollection<AbstractEntity>();
DbDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
collection.Add( CreateAndFillEntity(reader) );
}
reader.Close();
conn.Close();
return(collection);

Poniewa jest zwracany zbir, a nie obiekt klasy DataTable, nie ma potrzeby uywania klasy
DataAdapter w celu jego wypenienia. Zamiast tego mona skorzysta z o wiele szybszej klasy
DataReader. Wystarczy po prostu przebiec w ptli przez zwrcony czytnik danych, aby kada
podklasa odczytaa rekord, utworzy i wypeni odpowiedni encj, a nastpnie doda j
do zbioru.
W poprzednim przykadzie kryje si jednak pewien problem. W rozdziale 8. klasa EntityCollection zostaa zdefiniowana za pomoc typw oglnych, aby bya zbiorem silnie typizowanym, a w przytoczonym przykadzie jest zwracany zbir obiektw klasy AbstractEntity.
Oznacza to, e kada klasa, ktra przetwarza wspomniany zbir, musi rzutowa encje na odpowiedni typ w pokazany poniej sposb:
PublisherDA dao = new PublisherDA();
EntityCollection<AbstractEntity> collection = dao.GetAll();
Publisher pub = (Publisher)collection[0];

Poniewa klasa EntityCollection obsuguje typy oglne, naley zmodyfikowa klas


AbstractDA w taki sposb, aby rwnie korzystaa z tych typw. Najpierw mona zmieni
jej definicj klasy, dziki czemu bdzie akceptowa ograniczony typ parametru, ktry jest
podobny do parametru uytego w klasie EntityCollection w rozdziale 8.:
public abstract class AbstractDA<T> where T : AbstractEntity

W klasie AbstractDA naley uy parametru typu w miejscach, w ktrych wczeniej nastpowao odwoanie do klasy AbstractEntity. Definicja klasy abstrakcyjnej CreateAndFillEntity zmieni si zatem nastpujco:
protected abstract T CreateAndFillEntity(DbDataReader reader);

Tworzenie zbioru (czyli krok 5. algorytmu) rwnie ulegnie zmianie:


EntityCollection<T> collection = new EntityCollection<T>();

Na koniec naley zmodyfikowa wszystkie podklasy, aby udostpniay odpowiedni nazw


klasy encji za kadym razem, gdy w klasie AbstractDA zostanie uyty parametr T:
public class PublisherDA: AbstractDA<Publisher>
{
protected override Publisher CreateAndFillEntity()
{

Rozdzia 11.

Projektowanie oraz implementacja aplikacji sieciowych

613

Tworzenie zoonej encji domeny


Jak wida, do zada szablonu metody CreateAndFillEntity naley tworzenie odpowiedniego
typu encji, pobieranie wartoci rekordu, a nastpnie zapenianie encji tymi wartociami.
Przykad takiej metody dla klasy PublisherDA by cakiem prosty. Wersja metody dla klasy
BooksDA musi by jednak nieco bardziej skomplikowana, poniewa encja Book zawiera nie tylko
proste typy danych, ale te inne encje biznesowe (rysunek 11.9). Obsuga encji Publisher,
Category i Series nalecych do encji Book jest atwa, poniewa tabela Book znajduje si
w relacji wiele do jednego z tabelami Publisher, Category oraz Series (rysunek 11.10).
Rysunek 11.10.
Relacje midzy
tabelami

Jeli pola dla kadej z tych dodatkowych tabel zostan doczone do instrukcji SELECT dotyczcej ksiek (tak jak w nastpnym przykadzie), bdzie mona utworzy i wypeni encje
Publisher, Category oraz Series po odczytaniu rekordu ksiki.
protected override string SelectStatement
{
get {
return "SELECT ISBN,Title,YearPublished,BriefDescription,
Description,PublisherName,Books.PublisherId As
BookPublisherId,SeriesName,Books.SeriesId As
BookSeriesId,CategoryName,Books.CategoryId As
BookCategoryId FROM Series INNER JOIN
(Publishers INNER JOIN (Categories INNER JOIN
Books ON Categories.CategoryId = Books.CategoryId)
ON Publishers.PublisherId = Books.PublisherId)
ON Series.SeriesId = Books.SeriesId";
}
}

Obsuga autorw ksiek jest nieco bardziej skomplikowanym zagadnieniem, poniewa tabele Books oraz Authors wie relacja wiele do wielu. Metoda GetAuthors klasy AuthorDA
jest uywana w celu uzyskania zbioru obiektw klasy Author na podstawie biecej wartoci
pola ISBN. Kada encja Author w tym zbiorze jest nastpnie dodawana do encji Book w sposb
pokazany poniej:

614

Cz II

Operacje na danych

protected override Book CreateAndBuildEntity(DbDataReader


recordJustRead)
{
// Pobierz wartoci rekordw i umie je
// w tymczasowych zmiennych
string isbn = (string)recordJustRead["ISBN"];
string title = (string)recordJustRead["Title"];
int yearPub = (int)recordJustRead["YearPublished"];
string brief = (string)recordJustRead["BriefDescription"];
string desc = (string)recordJustRead["Description"];
string pubName = (string)recordJustRead["PublisherName"];
int pubId = (int)recordJustRead["BookPublisherId"];
string seriesName = (string)recordJustRead["SeriesName"];
int seriesId = (int)recordJustRead["BookSeriesId"];
string catName = (string)recordJustRead["CategoryName"];
int catId = (int)recordJustRead["BookCategoryId"];
// Utwrz i zapenij obiekt na podstawie danych
Book book = new Book(isbn, title, yearPub, brief, desc);
// Utwrz encje potomne
Publisher publisher = new Publisher(pubId, pubName);
Category category = new Category(catId, catName);
Series series = new Series(seriesId, seriesName);
// Dodaj encje potomne do ksiki
book.BookPublisher = publisher;
book.BookCategory = category;
book.BookSeries = series;
// Pobierz wszystkich autorw danej ksiki
AuthorDA dao = new AuthorDA();
EntityCollection<Author> authors =
dao.GetAuthorsForIsbn(isbn);
// Dodaj kadego autora do ksiki
foreach (Author author in authors)
{
book.AddAuthor(author);
}
return book;
}

Metoda GetAuthorsForIsbn klasy AuthorDA pobiera tabele AuthorBooks oraz Author, a zwraca
list encji Author zgodnych z przekazan wartoci pola ISBN.
public EntityCollection<Author> GetAuthorsForIsbn(string isbn)
{
EntityCollection<Author> collection =
new EntityCollection<Author>();
using (DbConnection conn =
DatabaseActions.Factory.CreateConnection())
{
conn.ConnectionString =
DatabaseActions.ConnectionSetting.ConnectionString;
conn.Open();

Rozdzia 11.

Projektowanie oraz implementacja aplikacji sieciowych

615

DbCommand cmd = DatabaseActions.Factory.CreateCommand();


cmd.Connection = conn;
cmd.CommandText =
"SELECT AuthorBooks.AuthorId,AuthorName,ISBN
FROM Authors INNER JOIN AuthorBooks ON
Authors.AuthorId = AuthorBooks.AuthorId ";
cmd.CommandText += " WHERE ISBN=@ISBN";
cmd.CommandType = CommandType.Text;
// Dodaj parametry
cmd.Parameters.Add(DatabaseActions.MakeParameter(
"@ISBN",isbn));
DbDataReader reader = cmd.ExecuteReader();
if (reader != null)
{
while (reader.Read())
{
// Utwrz encj autora i dodaj j do zbioru
collection.Add(CreateAndBuildEntity(reader));
}
reader.Close();
conn.Close();
}
}
return collection;
}

Na koniec naley w podobny sposb zmodyfikowa metody Update oraz Insert klasy BookDA,
aby tabele potomne take podlegay aktualizacji.

Tworzenie warstwy logiki aplikacji


Teraz, gdy zostay ju rozpatrzone niektre klasy z warstwy encji biznesu oraz warstwy dostpu do danych, mona utworzy warstw logiki aplikacji. Przypomn, e ta warstwa powinna hermetyzowa niezbdne w aplikacji funkcje i procesy i w zwizku z tym odzwierciedla funkcje okrelone w przypadkach uycia. Metody klas w tej warstwie maj zazwyczaj
niewielkie rozmiary, poniewa na og przekazuj wikszo swoich funkcji odpowiednim
warstwom domeny i dostpu do danych.
Zamy, e jest projektowana warstwa aplikacji dla aplikacji, ktra bdzie uywana nie
tylko z encjami pokazanymi na rysunku 11.9, ale te z innymi encjami, takimi jak na przykad Customer, CustomerAddress, Order, Payment, CreditCard oraz niektrymi innymi klasami
majcymi zwizek ze skadaniem zamwienia bd klientem. Mona podj decyzj, e warstwa aplikacji bdzie oparta na trzech klasach, ktre hermetyzuj trzy podstawowe podsystemy funkcji aplikacji: BookCatalogLogic, CustomerServiceLogic oraz OrderLogic.
Po przeanalizowaniu przypadkw uycia mona doj do wniosku, e w klasie BookCatalogLogic bd potrzebne nastpujce funkcje:

616

Cz II

Operacje na danych

Pobranie listy wszystkich wydawcw

Pobranie listy wszystkich kategorii ksiek

Pobranie listy wszystkich serii ksiek

Pobranie listy wszystkich ksiek

Pobranie ksiki na podstawie jej numeru ISBN

Pobranie listy wszystkich ksiek od okrelonego wydawcy

Pobranie listy wszystkich ksiek z okrelonej serii

Pobranie listy wszystkich ksiek z okrelonej kategorii

Aktualizacja ksiki

Jeli s to jedyne potrzebne funkcje, klas BookCatalogLogic mona zaprojektowa w sposb


pokazany na rysunku 11.11.
Rysunek 11.11.
Projekt warstwy
aplikacji

Przedstawiona warstwa logiki aplikacji jest przede wszystkim warstw usugow, poniewa nie zawiera adnych przykadw bardziej zoonej logiki aplikacji ani procesw.
Jeli w niniejszym rozdziale pokazano by klas OrderLogic, byoby widocznych wicej metod zorientowanych na procesy, takich jak na przykad CheckOutPipeline albo
MoveProductFromDistributorToInventory.

Jak ju wspomniano, klasy w warstwie logiki aplikacji prawie w ogle nie zawieraj stanu i przekazuj wikszo swoich zada innym warstwom. Na listingu 11.3 przedstawiono
przykadow implementacj wymienionych powyej funkcji w klasie BookCatalogLogic.

Rozdzia 11.

Projektowanie oraz implementacja aplikacji sieciowych

Listing 11.3. BookCatalogLogic.cs


using System;
using System.Data;
using System.Collections.Generic;
using FourLayer.BusinessEntity;
using FourLayer.DataAccessObject;
namespace FourLayer.ApplicationLogic
{
/// <podsumowanie>
/// Obsuguje cao logiki aplikacji dla katalogu ksiek
/// </podsumowanie>
public class BookCatalogLogic
{
// -------------------------------------------------// Metody zwizane z ksikami
// -------------------------------------------------public static EntityCollection<Book> GetAllBooks()
{
BookDAO dao = new BookDAO();
return dao.GetAll();
}
public static Book GetBookByIsbn(string isbn)
{
BookDAO dao = new BookDAO();
Book b = dao.GetByKey(isbn);
return b;
}
public static EntityCollection<Book>
GetBooksByPublisher(Publisher pub)
{
BookDAO dao = new BookDAO();
return dao.GetByCriteria("PublisherId", "=", pub.Id);
}
public static EntityCollection<Book> GetBooksByCategory(
int catId)
{
BookDAO dao = new BookDAO();
return
dao.GetByCriteria("Books.CategoryId", "=", catId);
}
public static EntityCollection<Book>
GetBooksBySeries(int seriesId)
{
BookDAO dao = new BookDAO();
return
dao.GetByCriteria("Books.SeriesId", "=", seriesId);
}

617

618

Cz II

Operacje na danych

public static void UpdateBook(Book book)


{
if (book.IsValid)
{
BookDAO dao = new BookDAO();
dao.Update(book);
}
}
// -------------------------------------------------// Metody zwizane z wydawcami, seriami, kategoriami i autorami
// -------------------------------------------------public static EntityCollection<Publisher>
GetAllPublishers()
{
PublisherDAO dao = new PublisherDAO();
return dao.GetAll();
}
public static EntityCollection<Series> GetAllSeries()
{
SeriesDAO dao = new SeriesDAO();
return dao.GetAll();
}
public static EntityCollection<Category> GetAllCategories()
{
CategoryDAO dao = new CategoryDAO();
return dao.GetAll();
}
}
}

Uycie architektury w warstwie prezentacji


Teraz, gdy infrastruktura warstw zostaa ju utworzona, mona j zastosowa w formularzach WWW. W przykadach od 11.1 do 11.5 uyto tych warstw w celu utworzenia strony
Bookportal.aspx, pokazanej na rysunku 11.12. Strona ta skada si z czterech kontrolek
GridView i jednej kontrolki DetailsView. Wszystkie interakcje z danymi odbywaj si za
porednictwem pewnej liczby kontrolek ObjectDataSource, ktre komunikuj si z warstw
logiki aplikacji.
cza w lewej kolumnie su do zmieniania listy ksiek widocznej w kontrolce GridView
u gry prawej kolumny. Wybranie ksiki z listy spowoduje wywietlenie w kontrolce
DetailsView, ktra znajduje si w prawej dolnej kolumnie, penych informacji o ksice.
Kontrolka ta umoliwia rwnie edycj ksiek przez uytkownika, co pokazano na rysunku 11.12.

Rozdzia 11.

Projektowanie oraz implementacja aplikacji sieciowych

619

Rysunek 11.12.
BookPortal.aspx

Przykad 11.1. Konfigurowanie kontrolek ObjectDataSource


W pierwszym wiczeniu zostan skonfigurowane kontrolki ObjectDataSource, ktre bd
wchodzi w interakcj z klas BookCatalogLogic. Reszta strony to przede wszystkim dodatkowe znaczniki formatowania.
1.

Utwrz formularz WWW o nazwie BookPortal.aspx.

2. Dodaj do formularza nastpujce kontrolki ObjectDataSource. Kontrolki te s


uywane w kontrolkach GridView.
<asp:ObjectDataSource ID="dsBooks" runat="server"
TypeName="FourLayer.ApplicationLogic.BookCatalogLogic" />
<asp:ObjectDataSource ID="dsSeries" runat="server"
TypeName="FourLayer.ApplicationLogic.BookCatalogLogic"
SelectMethod="GetAllSeries" />

620

Cz II

Operacje na danych
<asp:ObjectDataSource ID="dsPublishers" runat="server"
TypeName="FourLayer.ApplicationLogic.BookCatalogLogic"
SelectMethod="GetAllPublishers" />
<asp:ObjectDataSource ID="dsCategories" runat="server"
TypeName="FourLayer.ApplicationLogic.BookCatalogLogic"
SelectMethod="GetAllCategories" />

3. Utwrz dodatkow kontrolk ObjectDataSource.


<asp:ObjectDataSource ID="dsBookSingle" runat="server"
TypeName="FourLayer.ApplicationLogic.BookCatalogLogic"
DataObjectTypeName="FourLayer.BusinessEntity.Book"
SelectMethod="GetBookByIsbn"
UpdateMethod="UpdateBook">
<SelectParameters>
<asp:ControlParameter ControlID="grdBooks"
Name="isbn" Type="string"
PropertyName="SelectedDataKey.Values[0]" />
</SelectParameters>
</asp:ObjectDataSource>

Ta kontrolka jest uywana w kontrolce DetailsView, ktra wywietla pene dane


pojedynczej ksiki. Warto zauway, e jej metoda wybierajca ksik
(GetBooksByIsbn) wymaga parametru acuchowego o nazwie isbn zawierajcego
numer ISBN ksiki, ktrej dane maj zosta pobrane. Kontrolka zapenia ten
parametr na podstawie wartoci ISBN wiersza wybranego w kontrolce GridView
(ktra zostanie jeszcze zdefiniowana). Waciwo DataObjectTypeName take musi
zosta ustawiona, poniewa okrelonej metodzie aktualizujcej jest przekazywany
wypeniony obiekt klasy Book.
W wiczeniach jedynie zarysowano kontrolki oraz ich funkcje. Wybr stylu kontrolek
pozostawiono Czytelnikowi. Ukoczon wersj strony, cznie z nadanym stylem, mona
pobra z mojej witryny pod adresem http://www.randyconnolly.com/core.

Przykad 11.2. Dodawanie kontrolek GridView do formularza WWW


Po zdefiniowaniu kontrolek, ktre bd wchodzi w interakcj z warstw logiki aplikacji
mona skonfigurowa interfejs uytkownika formularza WWW. W poniszym przykadzie
do formularza zostan dodane cztery kontrolki GridView.
1.

Dodaj do formularza kontrolk GridView, ktra bdzie wywietla list ksiek.


<asp:GridView ID="grdBooks" runat="server"
DataSourceID="dsBooks" DataKeyNames="Isbn"
EmptyDataText="No books found"
AutoGenerateColumns="False" >
<Columns>
<asp:CommandField
SelectImageUrl="images/btn_select.gif"
ButtonType="Image" ShowSelectButton="true" />

Rozdzia 11.

Projektowanie oraz implementacja aplikacji sieciowych

621

<asp:BoundField DataField="Isbn" HeaderText="Isbn" />


<asp:BoundField DataField="Title" HeaderText="Tytu" />
<asp:BoundField DataField="YearPublished"
HeaderText="Rok" />
</Columns>
</asp:GridView>

2. Dodaj do formularza kontrolk GridView, ktra bdzie wywietla list wszystkich

moliwych wydawcw ksiek.


<asp:GridView ID="grdPublisher" runat="server"
DataSourceID="dsPublishers" DataKeyNames="Id"
AutoGenerateColumns="False"
OnSelectedIndexChanged=
"grdPublisher_SelectedIndexChanged" >
<Columns>
<asp:TemplateField HeaderText="Publishers">
<ItemTemplate>
<asp:LinkButton ID="btnSelectPublisher"
runat="server"
Text='<%# Eval("Name") %>'
CommandName="Select" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

Naley zauway, e w kontrolce GridView uyto funkcji obsugi zdarzenia wyboru.


Kiedy uytkownik wybierze wydawc, funkcja obsugi zdarzenia wyboru
(ktra zostanie jeszcze zdefiniowana) zmienia ksiki wywietlane w kontrolce
GridView na takie ksiki, ktrych wydawca jest zgodny z wybranym wydawc.
W omawianym przykadzie kolumna wyboru w kontrolce GridView nie zostaa
wyodrbniona. Zamiast tego w kontrolce GridView znajduje si jedna kolumna,
w ktrej nazwy wydawcw s czami. cza te dziaaj jak przyciski wyboru.
Niestety, nie mona uy kolumny CommandField, poniewa w kadym wierszu
jest potrzebna inna waciwo SelectText. Taki efekt mona osign, uywajc
kolumny TemplateField zawierajcej obiekty klasy LinkButton z waciwoci
CommandName ustawion na warto Select, co pokazano w przykadowym kodzie.
3. Dodaj do formularza kontrolk GridView, ktra bdzie wywietla list moliwych

nazw serii ksiek.


<asp:GridView ID="grdSeries" runat="server"
DataSourceID="dsSeries" DataKeyNames="Id"
AutoGenerateColumns="False"
OnSelectedIndexChanged="grdSeries_SelectedIndexChanged" >
<Columns>
<asp:TemplateField HeaderText="Serie">
<ItemTemplate>
<asp:LinkButton ID="btnSelectSeries" runat="server"
Text='<%# Eval("Name") %>'
CommandName="Select" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

622

Cz II

Operacje na danych

4. Dodaj do formularza kontrolk, ktra bdzie wywietla list moliwych nazw

kategorii ksiek.
<asp:GridView ID="grdCategories" runat="server"
DataSourceID="dsCategories" DataKeyNames="Id"
AutoGenerateColumns="False"
OnSelectedIndexChanged="grdCategory_SelectedIndexChanged">
<Columns>
<asp:TemplateField HeaderText="Kategorie">
<ItemTemplate>
<asp:LinkButton ID="btnSelectCategory"
runat="server"
Text='<%# Eval("Name") %>'
CommandName="Select" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

5. Dodaj cze, ktrego kliknicie spowoduje ponownie zadanie strony. Spowoduje

to przeczenie strony do stanu, w ktrym nie pracuje ju ona w trybie postback.


<a href="BookPortal.aspx">Zobacz wszystkie ksiki</a>

Przykad 11.3. Dodanie funkcji obsugi zdarze do formularza WWW


Po utworzeniu kontrolek mona doda funkcje obsugi zdarze wyboru. Kada z tych funkcji
zmienia programowo kontrolk ObjectDataSource uywan w kontrolce GridView do pracy
z danymi ksiek.
1.

Dodaj do formularza nastpujce metody z funkcjami obsugi zdarze:


protected void grdPublisher_SelectedIndexChanged(
object sender, EventArgs e)
{
dsBooks.SelectMethod = "GetBooksByPublisher";
dsBooks.SelectParameters.Clear();
Parameter p = new ControlParameter("pubId", "grdPublisher",
"SelectedDataKey.Values[0]");
dsBooks.SelectParameters.Add(p);
}
protected void grdSeries_SelectedIndexChanged(object sender,
EventArgs e)
{
dsBooks.SelectMethod = "GetBooksBySeries";
dsBooks.SelectParameters.Clear();
Parameter p = new ControlParameter("seriesId", "grdSeries",
"SelectedDataKey.Values[0]");
dsBooks.SelectParameters.Add(p);
}
protected void grdCategory_SelectedIndexChanged(
object sender, EventArgs e)
{

Rozdzia 11.

Projektowanie oraz implementacja aplikacji sieciowych

623

dsBooks.SelectMethod = "GetBooksByCategory";
dsBooks.SelectParameters.Clear();
Parameter p = new ControlParameter("catId", "grdCategories",
"SelectedDataKey.Values[0]");
dsBooks.SelectParameters.Add(p);
}

Naley zauway, e kada funkcja obsugi zdarzenia zmienia po prostu metod


wybierajc kontrolki ObjectDataSource danej ksiki na odpowiedni metod
GetBooksByX klasy BookCatalogLogic. Poniewa metoda GetBooksByX pobiera
parametr, kada funkcja obsugi zdarzenia musi zapeni ten parametr na podstawie
wybranej wartoci kontrolki GridView wydawcy, serii albo kategorii.
2. Dodaj do formularza nastpujc metod Page_Load:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
dsBooks.SelectMethod = "GetAllBooks";
}
}

Przy pierwszym zaadowaniu strony (i za kadym razem, gdy uytkownik kliknie


cze Zobacz wszystkie ksiki) kontrolka ObjectDataSource kontrolki GridView
ksiek powinna uy metody GetAllBooks, ktra zwraca zbir wszystkich ksiek
obecnych w bazie danych.
3. Teraz mona ju przetestowa stron w przegldarce. Powinny by wywietlane

listy z wydawcami, seriami oraz kategoriami, a take lista ksiek. Lista ksiek
powinna ulega zmianie po wybraniu wydawcy, serii albo kategorii.

Przykad 11.4. Dodanie moliwoci przegldania oraz edycji danych wybranej ksiki
Kontrolka DetailsView zostanie uyta w celu wywietlania i edycji wszystkich danych wybranej ksiki.
1.

Dodaj do formularza WWW nastpujc kontrolk DetailsView:


<asp:DetailsView ID="dvEditBook" runat="server"
DataSourceID="dsBookSingle" DataKeyNames="Isbn"
AutoGenerateRows="False" >
<HeaderTemplate>Book Details</HeaderTemplate>
<Fields>
<asp:BoundField DataField="Isbn" HeaderText="Isbn"
ReadOnly="true"/>
<asp:TemplateField HeaderText="Tytu">
<ItemTemplate><%# Eval("Title")%></ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtTitle" runat="server"
Columns="55"
Text='<%# Bind("Title") %>' />
</EditItemTemplate>
</asp:TemplateField>

624

Cz II

Operacje na danych
<asp:TemplateField HeaderText="Autorzy">
<ItemTemplate>
<asp:GridView id="grdAuthors" runat="server"
AutoGenerateColumns="false" ShowHeader="false"
DataSource='<%# Bind("Authors") %>'>
<Columns>
<asp:BoundField DataField="Name" />
</Columns>
</asp:GridView>
</ItemTemplate>
<EditItemTemplate>
<a href='EditAuthors.apx?book=<%#
Eval("ISBN") %>'>
Edit Authors
</a>
</EditItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="YearPublished"
HeaderText="Rok" />
<asp:TemplateField HeaderText="Opis">
<ItemTemplate>
<%# Eval("BriefDescription")%>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtBrief" runat="server"
TextMode="multiLine" Columns="45" Rows="7"
Text='<%# Bind("BriefDescription") %>'/>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Wydawca">
<ItemTemplate>
<%# Eval("BookPublisher.Name") %>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="drpPublisher" runat="server"
DataSourceID="dsPublishers" DataValueField="Id"
DataTextField="Name"
SelectedValue='<%# Bind("PublisherId") %>' />
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Seria">
<ItemTemplate>
<%# Eval("BookSeries.Name") %>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="drpSeries" runat="server"
DataSourceID="dsSeries" DataValueField="Id"
DataTextField="Name"
SelectedValue='<%# Bind("SeriesId") %>' />
</EditItemTemplate>
</asp:TemplateField>

Rozdzia 11.

Projektowanie oraz implementacja aplikacji sieciowych

625

<asp:TemplateField HeaderText="Kategoria">
<ItemTemplate>
<%# Eval("BookCategory.Name") %>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="drpCategory" runat="server"
DataSourceID="dsCategories" DataValueField="Id"
DataTextField="Name"
SelectedValue='<%# Bind("CategoryId") %>' />
</EditItemTemplate>
</asp:TemplateField>
<asp:CommandField ButtonType="Image"
ShowEditButton="true" ShowCancelButton="true"
CancelImageUrl="images/btn_cancel.gif"
EditImageUrl="images/btn_edit.gif"
UpdateImageUrl="images/btn_update.gif" />
</Fields>
</asp:DetailsView>

Naley zauway, e autorzy ksiek s wywietlani w zagniedonej kontrolce


GridView, ale ju ich edycja odbywa si w odrbnym formularzu WWW. Edytowanie
autorw na osobnej stronie jest atwiejsze, poniewa jest potrzebna nie tylko
moliwo wybierania rnych autorw, ale te ich dodawania oraz usuwania.
Oprcz tego w kontrolce uyto kilku potomnych waciwoci obiektu Book.
Nazwa wydawcy jest na przykad odczytywana w wyraeniu wizania danych
przy zastosowaniu nastpujcej notacji z kropk:
<%# Eval("BookPublisher.Name") %>

Przykad 11.5. Obsuga nieprawidowych regu biznesowych


Przed aktualizacj informacji o ksice naley sprawdzi, czy dane wprowadzone przez
uytkownika nie naruszaj jakichkolwiek regu biznesowych dla encji Book. Poniewa kontrolka ObjectDataSource ksiki wywouje metod aktualizujc, naley sprawdzi, czy w jej
zdarzeniu OnUpdating nie zostay naruszone reguy. Zdarzenie to jest uruchamiane przed
wywoaniem metody aktualizujcej, ale ju po utworzeniu i zapenieniu obiektu danych,
ktry bdzie do tej metody przekazany.
1.

Dodaj do strony ponisz kontrolk GridView. Wywietla ona naruszone


reguy biznesowe.
<asp:GridView ID="grdErrors"
runat="server" ShowHeader="false" />

2. Dodaj nastpujcy kod do kontrolki ObjectDataSource:


<asp:ObjectDataSource ID="dsBookSingle" runat="server"
TypeName="FourLayer.ApplicationLogic.BookCatalogLogic"
DataObjectTypeName="FourLayer.BusinessEntity.Book"
SelectMethod="GetBookByIsbn"
UpdateMethod="UpdateBook"
OnUpdating="dsBookSingle_Updating" >

626

Cz II

Operacje na danych

3. Dodaj do formularza ponisz funkcj obsugi zdarzenia:


/// <podsumowanie>
/// Uruchamiana, gdy kontrolka ObjectDataSource ksiki prbuje zaktualizowa dane
/// </podsumowanie>
protected void dsBookSingle_Updating(object sender,
ObjectDataSourceMethodEventArgs e)
{
// Pobierz zapeniony parametr aktualizujcy
Book bk = (Book)e.InputParameters[0];
// Zapytaj encj, czy istniej naruszone reguy biznesowe
if (!bk.IsValid)
{
// Reguy zostay naruszone; anuluj aktualizacj
e.Cancel = true;
}
// Wywietl naruszone reguy biznesowe (ktre, jeli s
// poprawne, bd puste)
grdErrors.DataSource = bk.BrokenRules;
grdErrors.DataBind();
}

Funkcja obsugi zdarzenia pobiera wypenion encj ksiki, ktra zostanie


przekazana metodzie Update w parametrze ObjectDataSourceMethodEventArgs.
Nastpnie pyta encj ksiki o naruszone reguy biznesowe. Jeli takie reguy
istniej, wie list komunikatw naruszonych regu z kontrolk GridView bdw.
4. Przetestuj formularz WWW w przegldarce. Aktualizacja powinna zosta anulowana,
jeli zostay naruszone jakiekolwiek reguy biznesowe, a w kontrolce GridView

powinny zosta wywietlone komunikaty o naruszonych reguach, co pokazano


na rysunku 11.13.

Korzystanie z niezalenych zasobw projektowych


Opracowanie w peni funkcjonalnej, wielowarstwowej architektury aplikacji nie naley
do trywialnych zada. Niektrzy programici wol zamiast tego skorzysta z zasobw
udostpnianych przez niezalenych producentw, co uatwia konstruowanie infrastruktury
aplikacji.
Istniejce biblioteki z architekturami dostpu do danych oraz aplikacji, takie jak Microsoft
Data Access Application Block (znana take pod nazw Microsoft Enterprise Library) albo
NHibernate, mog by doczone do istniejcej albo nowej aplikacji sieciowej. Narzdzia
generujce kod, takie jak LLBLGen lub MyGenerator, mog generowa profesjonalne klasy
dostpu do danych albo logiki biznesowej. Niektrzy programici z kolei w celu obsugi
poczenia modelu domeny i relacyjnej bazy danych wol korzysta z techniki ORM
(Object-Relational Mapper). Do popularnych programw ORM dla rodowiska .NET mona
zaliczy EasyObjects.NET, ORM.NET, EntityBroker albo DataObjects.
Przegld zagadnie zwizanych z uywaniem tego typu niezalenych zasobw mona znale w artykule Boumy, wymienionym w podrozdziale Odnoniki.

Rozdzia 11.

Projektowanie oraz implementacja aplikacji sieciowych

627

Rysunek 11.13.
Naruszone
reguy biznesowe
na stronie
BookPortal.aspx

Podsumowanie
W niniejszym rozdziale skupiono si na implementacji warstwowych architektur aplikacji
sieciowych. Fakt, e utworzenie aplikacji sieciowej moe by skomplikowanym przedsiwziciem, stanowi uzasadnienie dla dobrze zaprojektowanej infrastruktury aplikacji. Prawdziwa aplikacja sieciowa moe zawiera dziesitki, a nawet setki opisanych przypadkw
uycia, co sprawia, e niezbdne staje si poczenie wysiku wielu programistw. To wanie w takim rodzaju aplikacji sieciowych prawidowe zasady projektowania oprogramowania
s tak wane. W niniejszym rozdziale omwiono jedn z najwaniejszych idei wykorzystywanych podczas projektowania nowoczesnego, zoonego oprogramowania: pojciowe

628

Cz II

Operacje na danych

rozbicie klas aplikacji na powizane, ale jednoczenie niezalene warstwy. W szczeglnoci


opisano, a nastpnie zaimplementowano aplikacj dwuwarstwow, trjwarstwow, a nastpnie czterowarstwow.
W nastpnym rozdziale zostan omwione niektre dodatkowe moliwoci rodowiska
ASP.NET, ktre s istotne w kadej aplikacji sieciowej: zarzdzanie stanem oraz korzystanie
z bufora ASP.NET.

wiczenia
Rozwizania poniszych wicze mona znale na mojej stronie WWW pod adresem
http://www.randyconnolly.com/core. Znajduj si tam take dodatkowe wiczenia, ktre s
dostpne wycznie dla nauczycieli i wykadowcw.
1.

Utwrz obiekt biznesowy Book, przyjmujc za model przykad klasy PublisherBO


z listingu 11.2. W celu zaimplementowania interakcji z baz danych moesz
skorzysta z obiektu dostpu do danych BookDA. Utwrz stron testow, na ktrej
zademonstrujesz now funkcj klasy.

2. Dodaj nastpujc funkcj do klasy BookCatalogLogic: pobranie listy ksiek

z okrelonym identyfikatorem autora, aktualizacja wydawcy, wstawienie


wydawcy i usunicie wydawcy. Utwrz stron, na ktrej zademonstrujesz now
funkcj klasy.
W nastpnych dwch wiczeniach jest uywana baza danych ModernEyeCatalog.
3. Zaprojektuj i zaimplementuj dla tej bazy warstw obiektw biznesowych.

Jako wskazwki moesz uy przykadu pokazanego w listingu 11.2. Nie zapomnij


o utworzeniu obiektu biznesowego o nazwie ArtWorkBO.
4. Zaprojektuj i zaimplementuj dla tej bazy model czterowarstwowy.

Najwaniejsze zagadnienia
Q

Adapter

CRUD (tworzenie, odczytywanie, aktualizacja i usuwanie)

Domena

Encja

Logika aplikacji

Obiekt biznesowy

Obiekt transferu danych

Poziom

Rozdzia 11.

Projektowanie oraz implementacja aplikacji sieciowych

Przypadki uycia

Reguy biznesowe

Skojarzenia

Spjno

Warstwa

Warstwa biznesowa

Warstwa domeny

Warstwa dostpu do danych

Warstwa logiki aplikacji

Warstwa prezentacji

Wzorzec Template Method (wzorzec metody szablonu)

Zaleno

629

Odnoniki
Frank Bouma, Solving the Data Access Problem: to O/R Map or Not to O/R Map,
http://weblogs.asp.net/fbouma.
Frank Buschmann i inni, Pattern-Oriented Software Architecture: A System of Patterns,
John Wiley & Sons 1996.
Eric Evans, Domain-Driven Design: Tackling Complexity in the Heart of Software, Addison-Wesley 2004.
Martin Fowler, Architektura systemw zarzdzania przedsibiorstwem. Wzorce projektowe,
Helion 2005.
Craig Larman, Agile and Iterative Development: A Managers Guide, Addison-Wesley 2003.
Microsoft, Application Architecture for .NET: Designing Applications and Services, Microsoft 2003.
Jimmy Nilsson, Applying Domain-Driven Design and Patterns, Addison-Wesley 2006.

You might also like