NHibernateTworzenie aplikacji wymaga znajomości technologii , które mają rozwiązywać wszelkie problemy. Jako programiści mamy dostęp do tablicy narzędzi i właśnie z nich wybieramy tą jedną służącą do rozwiązania konkretnych problemów. Jednym z tych problemów jest sposób zarządzania danymi, aby móc je zapisać, a potem odczytać.
Istnieje prawie nieskończona ilość opcji.
- Przechowywać dane bezpośrednio na dysku w plikach:
- Tekstowych
- CSV
- XML
- JSON
- YAML
- …albo nawet stworzyć swój własny format
- Przechowywać informacje w bazie danych.
- Tutaj umieść systemy baz danych, o których możesz pomyśleć
Relacyjne bazy danych
Jako programista pracowałeś wcześniej z bazami relacyjnymi jak “Microsoft SQL Server”, MySQL albo Oracle. Większość programistów pracuje z bazami relacyjnymi każdego dnia, które na ogół są akceptowane i uznane za dojrzałe rozwiązania w rzeczywistych i nowoczesnych wyzwaniach w zarządzaniu danymi. Wiele systemów zarządzających bazami danych (RDBMS) nie są ograniczone tylko do platformy .NET. System zarządzający bazami danych (RDBMS) są to aplikacje z interface użytkownika(API), która za pomocą zapytań SQL pozwalają zarządzać tabelami. Model relacyjny jest często reprezentowany jako obiekt biznesowy . Biznes ten musi magazynować informacje o różnej tematyce jak np. klienci.konta, i produkty(obiekt biznesowy).
Zarządzanie danymi drażliwy temat
Człowiek zdaje sobie sprawę , że zarządzanie danymi to drażliwy temat. Relacyjne bazy danych są najbardziej popularne ,ale ile opcji mamy dostępnych nawet w .NET aby je obsłużyć. Jak np. klasy ze starego ADO.NET DataSet i DataRead. , które z tych klas nadaje się do konkretnej sytuacji. Czy zapytania powinny być napisane bezpośrednio w kodzie, czy może powinny być przechowywane w procedurach? A może skorzystać z jakieś narzędzie X by dynamicznie wygenerowało ci zapytanie.
Lista pytań i ich niejasnych odpowiedzi jest dosyć spora. Tutaj nie chodzi nawet o platformie .NET .
Jako programista wcześniej czy później spotkasz się z tą tematyką ,albo nawet może jest ci ona znana od wielu lat. Nikt do końca nie ma złotego środka na wszystko ,więc programiści prowadzą złożone debaty na temat, jakie rozwiązanie pasuje do sytuacji “X”.
Jedno rozwiązanie jednak uzyskało popularność ORM, czyli object/relational mapping .W wielkim skrócie chodzi o to, by relacje w tablicach w bazie danych zmapować na obiekty. Przez wiele lat powstało dużo gotowych bibliotek oraz programów, które mają pomagać programistom zaimplementować swój ORM do swoich aplikacji. Na chwilę obecną przychodzą mi na myśl trzy technologię “ADO.NET Entity Framework” oraz “NHibernate” i obecnie bez przyszłości “LINQ to SQL”.
Technologie
O “ADO.NET Entity Framework” nie będzie wiele mówił, ponieważ moja wiedza nie jest obecnie tak wszechstronna. Zastosowałem tę technologię w projekcie inżynierskim “Aplikacja webowa reklamująca Bialską Grupę .NET w Silverlight”. W tym projekcie też zastosowałem WCF RIA. Ponieważ technologie Microsoftu fajnie łączą się puzzle. To co mi się spodobało w Entity Framework, to fakt , że cały model został utworzony poprzez opuszczenie tabeli na okno aplikacji .Potem mogłem zaktualizować model za pomocą jednego kliknięcia. Jednak na razie nie znam zaawansowanych mechanik tego frameworku, które wymagają pisania czegoś odręcznie, a nie korzystanie z gotowych kreatorów i funkcji.
Linq to SQL jest obecnie martwy, ponieważ framework encji opisany powyżej jest po prostu lepszy i ma więcej funkcji. Linq to Entity jest bardziej wydajny i szybszy.
NHibernate jest .NET odpowiednik popularnej w Java biblioteki Hibernate. NHibernate kieruje danymi poprzez ich relacje i ich model domeny. Jest on i jak poprzednie opisane przykłady pośrednikiem między aplikacją a bazą danych ,więc można skoncentrować się bezpośrednio na problemach biznesowych w aplikacji ,ponieważ jest ona oddzielną warstwą. W chwili pisania tego postu NHiberante jest wersji 3.1.Jest on technologią open source więc za jego użycie nie trzeba płacić. NH ma też wiele innych dodatkowych funkcji, które nawet do dziś są rozwijanie jak np. Linq to NHibernate.
Każdy na początku może mieć trudności ze zrozumieniem, po co w ogóle te technologie są stosowane. Dlatego, zanim przejdę do pierwszej aplikacji NHibernate i teorii jak korzystać z NHibernate trzeba powiedzieć coś o bazach danych ,obiektach i warstwach aplikacji.
Obiekty oraz bazy danych
Współczesne relacyjne bazy danych oferują grupowanie ,sortowanie oraz wyszukiwanie danych. Baza danych jest odpowiedzialna za spójność danych; za ich dostępność dla różnych użytkowników w różnych aplikacjach nawet równocześnie. Baza danych oferuje też zabezpieczenia.
Zamiast działać bezpośrednio z bazami danymi ich kolumnami i wierszami .Logika biznesowa bierze udział w interakcji pomiędzy obiektowymi modelem domeny i uruchamia się jako cały diagram powiązanych ze sobą obiektów.
Logika biznesowa nigdy nie wykonuje się w bazie danych, tak jakby to była procedura SQL; to jest zaimplementowane w .NET. To pozwala logice biznesowej korzystać z mechanizmów obiektowości jak dziedziczenie i polimorfizm. Czyli można stosować wzorce projektowe.
Oczywiście nie wszystkie aplikacje .NET są stworzone w ten sposób, proste aplikacje nie potrzebują modelu domeny. A proste zapytania SQL nawet za pomocą starych klas ADO.NET mogą być wystarczające i łatwiejsze w implementacji.
Ale w przypadku rozbudowanych aplikacji model domeny pozwala na łatwiejsze ponowne użycie kodu jak i ułatwia jego zarządzanie.
Warstwy aplikacji
Wiele systemów dziś jest zaprojektowanych warstwowo. Co to znaczy. Warstwy rozpraszają system na mniejsze grupy, w których znajduje się kod rozwiązujący problem z danego działu . Czyli te działy nazywają się warstwami.
Np. kod tylko zarządzający interface użytkownika będzie znajdował się w warstwie prezentacji. Zaletą takiego rozwiązania jest fakt ,że takim systemem lepiej się zarządza.
Warstwy powinny zachowywać te podstawowe zasady:
- Powłoki komunikują się ze sobą w kolejności od wyższej do niższej.
- Każda warstwa jest nieświadoma innych warstw z wyjątkiem tej poniżej jej.
Aplikacje często korzystają z modelu trój warstwowego.
Oto opis warstw narysowanych na diagramie:
- Warstwa prezentacji: Logika obsługująca interface użytkownika i jest najwyższą warstwą. W aplikacji internetowej ta powłoka zawiera kod odpowiedzialny za rysowanie strony i ekranów , kolekcjonujący sygnały wyjściowe użytkownika i kontrolująca nawigacje.
- Warstwa biznesowa: Z reguły w tej warstwie ciężko określić ogólne jej zachowanie. Ta warstwa implementuje zasady biznesowe i wymagania systemowe. Dużo to wyjaśniło xD. W niektórych systemach ta warstwa ma swoją oddzielną reprezentacje w warstwie integracji.
- Persistence layer ( warstwa integracji): Warstwa ta to grupa klas odpowiedzialna za zapisywania danych, jak i ich odczytywania. Ta warstwa definiuję mapowanie pomiędzy enacjami domeny a bazą danych. W NHibernate będzie to plik hbm.xml.
- Baza danych: Istnieje ona poza aplikacją. Przechowuje dane trwałe. Jeśli baza danych SQL jest używana to baza danych zawiera schemat relacyjny i możliwe ,że przechowuje procedury.
- Pomocne klasy: Każda aplikacja posiada klasy, które istnieją poza tym podziałem warstwowym. Jak np. klasy odpowiedzialne za zwracanie wyjątków. Te elementy nie są traktowane jako kolejna warstwa, ponieważ nie podają się zasadą zależność.
Warstwy to doskonałe rozwiązanie złożonych aplikacji. Nikt nie jest w stanie objąć wzrokiem całego obrazka i zrozumieć jego znaczenia. Ale dzieląc go na fragmenty, krok po kroku, to co było wcześniej niezrozumiałe, teraz jest oczywiste. Poprzez proste podzielenie problemu na warstwy.
Oczywiście w prostych aplikacjach stosowanie warstw mija się z celem. Ale z czasem, gdy zaczynamy rozwijać swoją prostą aplikacje pojawiają się co raz to nowe problemy i nasza aplikacje będzie przypominać spaghetti.
Dlaczego ORM
- Pełna kontrola nad typami danych. Nie ma możliwość umieszczenia typu liczbowego tam gdzie ma być napis.
- Niezależność od bazy danych.
- Zwiększona produktywność i łatwe zarządzanie
- Dobry ORM ma minimalny wpływ na wydajność.
Podsumowanie
Trochę się rozpisałem .Nie chciałbym, aby ktoś używał technologii ORM bez ogólnej wiedzy . Znając jedną technologię tego typu łatwo przyswoić wszystkie inne.
W następnym wpisie będzie prosta aplikacja NHibernate.