Kamil Kliczbor @ asptip.net

29Sep/130

Strategie pozyskiwania encji w NHibernate

NhLogoWhite64_med

Wprowadzenie

Istnieje wiele sposobów, na podstawie których NHibernate uzyskuje dostęp do powiązanych encji lub kolekcji encji. Prawidłowe zarządzanie strategiami wczytywania powiązanych obiektów umożliwia w wielu przypadkach poprawienie wydajności aplikacji. Deklaracja sposobu dostępu do encji może być podana w metadanych pliku mapowań (*.hbm.xml) lub nadpisana w zapytaniach HQL lub Criteria.

26Sep/130

Humor projektowy – jak zręcznie pisać dokumentację

Ostatnio, jeden z kolegów napisał na projektowym blogu opis nowej implementacji części infrastruktury.
Oto kilka fajnych zdań, które mnie i kolegów z zespołu rozbawiły całkiem nieźle:

Wychodząc naprzeciw Waszym oczekiwaniom wdrożyliśmy właśnie odświeżony i znacznie przebudowany mechanizm (...)
API to udostępnia wiele metod ustawiania warunków dostępności przycisków. M.in. odpowiedniki już znanych i lubianych: (...)
Niektóre z wspomnianych wyżej metod przyjmują nowe i na pierwszy rzut oka zaskakujące parametry – wrócimy do tego tematu później.
Uważny Czytelnik z pewnością zauważył, iż wspominaliśmy o tym, że (...)
Czytelnik na pewno pamięta, iż wspominaliśmy, że (...)
(...) Trudno nie docenić takiej możliwości! (...)
Opisane powyżej cechy sprawiają, iż złożoność (w sensie poziomu skomplikowania) mechanizmu znacząco wzrosła. Może to powodować konfuzje, (...)

Tagged as: No Comments
9Sep/130

NHibernate Session Get vs Load

NhLogoWhite64_med

Wstęp

Wpis ten jest poświęcony sposobom pobierania encji w NHibernate o znanym identyfikatorze. W kontekście pobrania danych pojedynczej encji dostępnymi sposobami są:

  • użycie dowolnego API zapytań z restykcją na identyfikator, np.

user = session.QueryOver<User>()
                    .Where(x => x.Id == user.Id)
                    .SingleOrDefault<User>();
  • metoda Get()

  • metoda Load()

  • odwołanie z innej encji np. var user = employee.User.

W tym wpisie skupimy się na działaniu, podobieństwach oraz różnicach pomiędzy metodą Get() i Load() oraz następstwami ich użycia.

13Mar/120

Skrót klawiaturowy na tworzenie nowego folderu w Windows 7

NewFolderCreateFromMenu

Tworzenie folderów nie zawsze należało do przyjemnych czynności. Szczególnie, gdy trzeba było ich utworzyć wiele. Wielką niedogodnością było to, że pracując z klawiaturą należało przełączyć się na chwilę w tryb „mlasków”. Poza tym, trzeba było użyć co najmniej dwóch kliknięć, aby utworzyć  folder. Pięknie ilustruje to obrazek poniżej.

Na całe szczęście od wersji Windows 7 możemy skorzystać z magicznego skrótu klawiaturowego:

CTRL + SHIFT + N

Dodatkowo bardzo przydatny okazuje się (myślę że dobrze znany) skrót,

F2

Który z kolei potrafi zmienić nazwę wybranego folderu.

Co więcej, pewnym ułatwieniem jest pokazywanie przycisku tworzenia nowego folderu wprost na pasku menu.

7Mar/120

Co mają ze sobą wspólnego DIP, IoC, DI ?

DIP

Bohaterami tego wpisu są skróty DIP (Dependency Inversion Principle), IoC (Inversion of Control) oraz DI (Dependency Injection).  DIP jest podejściem stosowanym w nowoczesnym ujęciu programowania zorientowego obiektowo. W internecie aż roi się od różnego opinii i stwierdzeń odnoszących się do tego podejścia, co może wprowadzać lekką konsternację w jego rozumieniu . Wielu programistów (i nie tylko) miesza pojęcia DIP, IoC oraz DI, co sprawia, że nie dokońca zrozumiałe jest jaki problem opisują i jak chcą go chcą rozwiązać. Aby zebrać to wszystko w logiczną całość przedstawię szereg problemów jakie DIP może rozwiązać oraz kiedy i jak je zastosować.

Zacznijmy od pojęcia DIP. Jest ono bardzo ogólne, a wymagania jakie stawia przed oprogramowaniem ujmuje się w dwie reguły:

  • Moduły wysokiego poziomu  nie powinny być zależne od modułów niższego poziomu. Oba poziomy powinny zależeć od abstrakcji.
  • Abstrakcja nie powinna zależeć od szczegółów. Detale powinny zależeć od abstrakcji.

Zasada DIP odnosi się do ogólnego podejścia z jakim mamy doczynienia podczas projektowania oprogramowania. Używając tego określenia nie mówimy o żadnej konkretnej implementacji, a jedynie zgadzamy się z tym, że moduły wyższego poziomu nie powinny zależeć od mudułów niższego poziomu. To co chcemy osiągnąć, to uzyskanie takiego podejścia, w którym zmiany w modułach niższych nie będą miały wplywu na moduły wyższe. Cały czas tutaj nie mówimy nic na temat w jaki sposób to osiągnąć.

Inversion of  control jest pewnego rodzaju paradygmatem, który umożliwia realizację DIP. Ale samo w sobie IoC nie zapewnia konkretnej implementacji. IoC  można podzielić na grupy implementacyjne :

  • Interface inversion
  • Flow inversion
  • Dependency creation / Binding inversion.

Z kolei, Dependency Creation może być realizowana przez następujące wzorce:

  • Factory Pattern
  • Service Locator
  • Dependancy injection

I teraz jedną z implementacji Dependancy creation może być Dependancy Injection. Jak widzimy ID nie jest jedyną formą realizacji IoC.

Aby zebrać to wszystko razem w jedną całość zależności te można przedstawić schematycznie w postaci następującego rysunku:

Kilka przydatnych linków

http://pl.wikipedia.org/wiki/Odwr%C3%B3cenie_sterowania

http://pl.wikipedia.org/wiki/Wstrzykiwanie_zale%C5%BCno%C5%9Bci

http://martinfowler.com/articles/injection.html#UsingAServiceLocator

http://en.wikipedia.org/wiki/Dependency_inversion_principle

http://martinfowler.com/bliki/InversionOfControl.html

http://msdn.microsoft.com/en-us/library/ff648968.aspx

http://msdn.microsoft.com/en-us/library/dd458907.aspx

http://msdn.microsoft.com/en-us/library/dd458879.aspx

 

30Mar/110

Codingtv – wideoblog

Niniejszy wpis dedykuję twórcom strony, a raczej wideo-bloga codingtv.pl. Jest to całkiem innowacyjna i nowatorska forma promocji tworzenia oprogramowania w technologiach .NET-opodobnych.  Twórcami strony są dwaj programiści - Łukasz Gąsior, który posiada blog techniczny pod adresem http://gasior.net.pl oraz Andrzej Kowal. Obydwa osobniki pracują w jednej firmie - PGS Software, która udostępnia im salę do nagrywania kolejnych wideo-castów. W sumie jeszcze nie spotkałem do tej pory takiej formy nauczania na polskich stronach - wyjątek stanowi oczywiście kurs C#, który jest umieszczany regularnie na stronach virtualstudy.pl.

Koledzy w swoich wideo-castach opisują proces tworzenia bloga w C#. Technologie, których używają są "najświeższe". Wśród nich można wymienić m.in. ASP.NET MVC w wersji 3 czy Entity Framework. W kolejnych wydaniach wideocastów rzetelnie i skrupulatnie opisują dlaczego i jakie kroki podejmują, aby z pustego projektu utworzyć platformę do zarządzania blogiem. Zadowalające jest to, że nie leją wody, ale walą prosto z mostu i moim skromnym zdaniem umieszczają najważniejsze informacje. Esencja prosto w gały. Myślę, że może to być  całkiem ciekawe doświadczenie dla młodych programistów "szukających swojej drogi".

Kolejnym pocieszającym faktem jest to, że koledzy chcą prowadzić dialog. Tak jak jest to w muzyce, zgodnie z zasadą "call and response" potrafią słuchać swoich słuchaczy, a raczej można by rzecz "ogladaczy" i potrafią przy tym prowadzić konwersację. Dzięki temu powstaje swoisty dialog, dzięki któremu również siła internetowej społeczności ma wpływ na treści publikowane w następnych odcinkach. Nie wiem na ile naszym kolegom starczy sił, ale to co robią jest moim zdaniem dobre. Przyczyniają się do powstawania dobrych nawyków tworzenia oprogramowania w oparciu o najnowsze technologie, wzorce oraz metodologie. Swoją drogą, gdybym miał dostęp do takiej łatwo przyswajalnej wiedzy, to nie musiał bym w swoim developerskim życiu błądzić w jakichś bliżej nieznanych okolicach.

Polecam i gratuluje twórcom codingtv.pl - oby tak dalej!

Tagged as: , , No Comments
31Jan/110

101 przykładów zapytań w NHibernate 3.x – HQL, Criteria API, QueryOver i Linq – Dzielenie danych

Wprowadzenie

Wpis ten jest częścią artykułu poświęconemu wykonywaniu zapytań w NHibernate przy użyciu różnych sposobów jakie udostępnia ten mapper - HQL, Criteria API, QueryOver i Linq.

Część ta opisuje stosowanie dzielenie danych, tj otrzymywanie części wyników zapytania w określonych porcjach. W MS-SQLu można te zagadnienia zrealizować odpowiednio przy użyciu instrukcji

  • TOP - pobiera określoną liczbę pierwszych wyników zapytania
  • TOP wraz z ROW_NUMBER OVER (ORDER BY ...) - umożliwia pobranie "strony" wyników

Spis zapytań

30Jan/111

101 przykładów zapytań w NHibernate 3.x – HQL, Criteria API, QueryOver i Linq – Złączenia

Wprowadzenie

Wpis ten jest częścią artykułu poświęconemu wykonywaniu zapytań w NHibernate przy użyciu różnych sposobów jakie udostępnia ten mapper - HQL, Criteria API, QueryOver i Linq.

Część ta opisuje łączenie tabel przy użyciu klauzuli JOIN.

Spis zapytań

24Jan/111

101 przykładów zapytań w NHibernate 3.x – HQL, Criteria API, QueryOver i Linq – Projekcje

Wprowadzenie

Wpis ten jest częścią artykułu poświęconemu wykonywaniu zapytań w NHibernate przy użyciu różnych sposobów jakie udostępnia ten mapper - HQL, Criteria API, QueryOver i Linq.

Część ta opisuje stosowanie projekcji w zapytaniach. Jeżeli piszesz instrukcję SELECT i chcesz określić jakie kolumny lub jakie przekształcenia na kolumnach chcesz wykonać, możesz użyć składni SQL-a w następujący sposób:

SELECT NazwaKolumny, funkcja_przekształcająca(NazwaKolumny) FROM NazwaTabeli

Ponieważ dane uzyskiwane w wyniku wykonania zapytania prawie zawsze różnią się od danych mapowanych do encji, stosuje się klasy transformujące wyniki na obiekty DTO. W przypadku HQl-a, Criteria API stosuje się konstrukcję SetResultTransformer(Transformers.AliasToBean(typeof(NazwaKlasyDto))), w przypadku QueryOver - TransformUsing().

Spis zapytań

6Jan/112

101 przykładów zapytań w NHibernate 3.x – HQL, Criteria API, QueryOver i Linq – Sortowanie

Wprowadzenie

Wpis ten jest częścią artykułu poświęconemu wykonywaniu zapytań w NHibernate przy użyciu różnych sposobów jakie udostępnia ten mapper - HQL, Criteria API, QueryOver i Linq.

Część ta opisuje stosowanie sortowania danych w zapytaniach. Jeżeli piszesz instrukcję SELECT zachodzi czasem konieczność uporządkowania danych, które są zwracane w wyniku zapytania. Ogólnie rzecz biorąc stosujemy w SQL słowo ORDER BY wraz z opcjonalnym ASC|DESC oznaczającym kierunek sortowania. Koncepcję użycia przedstawiam poniżej:

SELECT Co FROM NazwaObiektu ORDER BY NazwaColumny [ASC|DESC], NazwaInnejKolumny [ASC|DESC]

Spis zapytań