sobota, 10 września 2011

ASP.MVC 3 Nowości w kontrolerach

Swój cykl postów związanych z omówieniem nowości w ASP.NET MVC 3 rozpocznę od kontrolerów. Kontroler to jak wiadomo warstwa pośrednia między modelem a widokiem.
Można sobie go wyobrazić jako potężna centrala telefoniczna, która przekazuje połączenia w odpowiednie miejsca.

1. Globalne filtry
Z filtrami w ASP.NET MVC 2 spotkaliśmy się nie raz. Są to bardzo przydatne narzędzia pozwalające oddzielić często powtarzające się czynności od logiki metod/kontrolera. Dzięki temu kontroler za pomocą akcji spełnia swoje zadania, a elementy takie jak identyfikacja, cache itp. nie "zaciemniają kodu".
W wersji MVC 2 mogliśmy nakładać filtry na pojedyncze akcje czy kontrolery:



Code:
    [Authorize(Roles="Admin")]
    public class HomeController : Controller
    {
        [OutputCache(Duration=10, VaryByParam="None")]
        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";

            return View();
        }

        public ActionResult About()
        {
            return View();
        }
    }

Rozwiązanie bardzo przydatne i intuicyjne. Co jednak jeżeli chcemy jeden filtr nadać dla wszystkich kontrolerów?

Aby rozwiązać ten problem wprowadzono tzw. globalne filtry. Filtry te definiujemy w pliku Global.asax w metodzie RegisterGlobalFilters:

Code:
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }


2. ViewBag
ViewBag to nowa właściwość za pomocą której możemy przesyłać dane do widoku. Zobaczmy na przykład tworzony wraz z nowym projektem aplikacji:


Code:
        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";
            ViewData["Message"] = "Welcome to ASP.NET MVC!";

            return View();
        }

W porównaniu z właściwością ViewData - ViewBag jest typu dynamic, co w uproszczeniu oznacza że nie jest sprawdzane co znajduje się pod taką zmienną podczas kompilacji ale podczas wykonywaniu programu. W przypadku MVC 3 możemy korzystać z obu możliwości w zależności od naszych preferencji.


3. Caching rezultatu akcji
MVC 3 wprowadza nowość w postaci możliwości caschowania rezultatów wykonania akcji. Zobaczmy na przykład:
Code:
        [OutputCache(Duration=4000, VaryByParam="idCategory")]
        public ActionResult ProductList(int idCategory)
        {
            var q = db.GetProductsByCategories(idCategory);

            return PartialView(q);
        }

Mając do czynienia z np. stroną na której wyświetlamy produkty z danej kategorii, które nie zmieniają się np. na bieżąco tylko są dodawane raz dziennie, stosujemy caschowanie rezultatu. Rezultat jest zatem zapamiętany i nie będzie potrzeby odwoływania się do bazy danych po każdym requescie użytkownika. Dla np. 5 kategorii odwołanie do bazy nastąpi przykładowo 5 krotnie a następne po 4 tysiącach sekund.
Rozwiązanie bardzo przydatne, odciążające serwer, przyspieszające zarazem działanie całej aplikacji.


4. Nowe typy rezultatów akcji:
W nowej odsłonie MVC wprowadzono 3 nowe typy rezultatów:

HttpNotFound - przydatny w przypadku kiedy użytkownik chce się dostać do zasobu którego nie ma - np. poprzez ręczne sterowanie parametrami przekazywanymi do akcji kontrolera. Jest to oczywiście kod odpowiedzi na błąd 404.
RedirectResult - odpowiednik błędu 302, co jest bardzo ważne w przypadku SEO HttpStatusCodeResult - umożliwia zwrócenie kodu błedu 5.


5. Filtry na akcjach wykonywane przed tymi na kontrolerach 
Poprzednio w MVC 2 należało być szczególnie ostrożnym podczas nakładnia filtrów na kontrolery. Powodem tego było, że jeżeli na akcję nakładany był filtr a później na cały kontroler inny filtr mogło dojść do niezamierzonej sytuacji, że filtr na kontrolerze uniemożliwiał dostanie się do żądanej akcji, chociaż była ona pierwotnie dozwolona.
Jeżeli nie chcemy korzystać z nowej funkcjonalności wystarczy nadać odpowiednią kolejność filtrom.


6. Sessionless controlers
Jak wiadomo nadzorowanie sesji nie jest rzeczą prostą a wręcz może prowadzić do spowolnienia działania witryny. Jeżeli weźmiemy pod uwagę, że ta sama przeglądarka próbuje wysłać kilka requestów do serwera, na czas przetwarzania każdego z nich sesja musi zostać zablokowana. MVC 3 wprowadza możliwość wyboru w jaki sposób ma być traktowany obiekt sesji. Możemy wybrać spośród 4 trybów:
- Default
- Disabled - wyłączona
- ReadOnly - tylko do odczytu
- Required - zapis i odczyt


Jak widać nowe MVC 3 wprowadza szereg nowości i unowocześnień. Przechodząc na nową wersję frameworka warto je stosować i nie bać się eksperymentów z nimi. W końcu jeżeli mają pozostać tylko wiedzą "merytoryczną" nie warto przechodzić do nowej technologii.

poniedziałek, 5 września 2011

ASP.MVC 3 pierwsze kroki cz. 1

Poprzednio publikowałem kurs na temat ASP.NET MVC 2. Od tego czasu minęło trochę czasu, a w informatyce czas nie stoi. Microsoft wprowadził w styczniu tego roku nową wersję ASP.NET MVC 3. Jak widać parcie w tej technologi jest bardzo duże i widać, że Microsoft mocno promuje framework. Między wydaniem 2 a 3 nie minął nawet rok, już teraz są zapowiedzi kolejnej wersji mającej wprowadzić kolejne usprawnienia i nowości.
Ze swojej strony jestem jak najbardziej zadowolony obrotem sprawy. MVC w wersji 2 uważam za bardzo udany produkt. Wersję 3 uważam za rozwinięcie wersji 2. Wielu może się nie zgodzić - przecież to w wersji 3 wprowadzono nowy silnik generowania widoków... W prawdzie jest to fakt, jednak i do tej pory można było skorzystać z innego silnika generującego widoki itp.

Ta seria nie będzie typowym kursem. Postaram się raczej napisać o nowościach w wersji trzeciej frameworku. Wszystko co dotyczy wersji drugiej jest nadal aktualne. Tak więc jeżeli z tego kursu chcesz nauczyć się w jaki sposób wykorzystać 100% mocy MVC 3 radzę najpierw przestudiować artykuły nt. wersji drugiej bądź też skorzystać z pełnego kursu ASP MVC 3.

Dla tych którzy mają wykonane projekty w technologi MVC 2 należy wspomnieć że wersja trzecia korzysta z .NET w wersji 4.0. Tak więc jest niezbędne stargetowanie wszystkich używanych projektów przed konwersją do MVC 3 do właśnie tego frameworku.

Przejdźmy do stworzenia pierwszego projektu:






Na pierwszy rzut oka nie widać większych zmian.
Przyglądając się bliżej można zauważyć zapis:



Code:
ViewBag.Message = "Welcome to ASP.NET MVC!";

Tutaj objawia się użycie nowości z .NET 4.0 - dynamicznych zmiennych. Zmienne takie są obsługiwane przez platformę w czasie działania programu.

Przechodząc do widoku:


Od razu rzuci się nam w oczy znaczek małpy - @
Jest to nowy sposób oznaczania części kodu od zwykłej zawartości strony. Podobnie jak w MVC 2 oznaczenie <%: %> spełnia także rolę enkodowania stringów tak małpa robi to w Razorze.
Różnica jest tu taka, że w przypadku Razora nie trzeba mu mówić gdzie kończy się kod, jest na tyle inteligentną bestią, że potrafi na podstawie kontekstu znaleźć zakończenie kodowania.

Tyle informacji na wstępie. W kolejnej części zajmiemy się ciekawszymi elementami platformy niż samo tworzenie projektu ;)

MS SQL Server 2011 nowe elementy w TSQLu

Nowa wersja SQL Server 2011 wprowadzi kilka nowości odnośnie języka. Dzisiaj zaprezentuje kilka nowych funkcji które pojawią się wraz z premierą. Warto już teraz poznać niektóre z nich, z pewnością ułatwią pracę wraz z finalną wersją produktu.

  1. IIF(warunek, prawda,fałsz). Funkcja umożliwiająca zastąpienie instrukcji
CASE WHEN warunek THEN a ELSE b END; 
Z pewnością ułatwi i "uczytelni" zapis skomplikowanych wyrażeń. Wystarczy teraz napisać:
IIF(warunek, a,b)
Oczywiście można zagnieżdżać instrukcję. Od strony MS SQL Server, IIF zostanie rozwinięty do CASE, jednak z mojego punktu widzenia instrukcja IIF jest znacznie bardziej czytelna.

  1.  Concat(string,string,....) - funkcja łączy w jeden ciąg znaków (string). Cóż wielu może się wydawać, że istnienie takiej funkcji ma raczej niezbyt duże zastosowanie, jednak biorąc pod uwagę, że w zależności od od typu funkcja sama zamienia wszystkie argumenty na łańcuchy (null traktuje jako pusty ciąg znaków) to już jej przydatność rośnie. Przykład:
Concat('Ala',' ','ma',' ',' 2 ', 'koty);
  1.  FORMAT(value, format) - funkcja z pewnością znana dobrze wszystkim programistą C#. Pozwala dowolnie sformatować ciąg znaków. Należy pamiętać, że aby była możliwość skorzystania z tej funkcji na serwerze musi być zainstalowany .NET Framework.
  2. PARSE(string AS typ) - funkcja czerpiąca z .NET frameworka i działająca jak popularne funkcje dodawane do typów prostych Parse. Pozwala na prostą konwersję jednego typu do drugiego
  3. TRY_PARSE(string AS typ) - bezpieczniejsza wersja instrukcji PARSE.W przypadku niepowodzenia podczas konwersji funkcja zwróci NULL a nie tak jak w przypadku funkcji PARSE rzuci błędem.
  4. EOMONTH(data_startowa, [offset]) - zwraca ostatni dzień miesiąca - przydatny jeżeli chcemy dowiedzieć się jaki dzień jest ostatnim w danym miesiącu. Dodatkowo możemy dodać lub odjąć żądaną ilość dni.
  5. DATEFROMPARTS(rok,miesiąc,dzień) - konwertuje części daty na typ date
  6. TIMEFROMPARTS(godziny,minuty,sekundy,część ułamkowa, dokładność) - podobnie jak w poprzedniej funkcji z tym że zwraca typ time
  7.  
Wymieniłem tutaj tylko kilka nowych funkcji które zostaną dołączone do nowego wydania SQL Servera. W finalnej wersji z pewnością nie zabraknie kolejnych udoskonaleń/nowości.

niedziela, 4 września 2011

MS SQL Server 2011 column store index

Premiera MS SQL Server 2011 zapowiedziana jest na listopad. Już teraz można zapoznać się z nową wersją popularnej bazy i zobaczyć na własne oczy nowości które wprowadza. Co prawda nie ma takiego postępu jak między wersją 2000 a 2005 jednak i tak sporo nowinek czeka zarówno DBA jak i deweloperów. Dzisiaj napiszę o jednej nowości która z pewnością przyda się w pracy z hurtowaniami danych - lub bardzo dużymi zbiorami danych. Nowa wersja serwera SQL wprowadzi tzw. column storing. Co kryje się pod tą nazwą? Spójrzmy na rysunek poniżej:

Rysunek przedstawia klasyczne podejście do przechowywania danych. Podstawową jednostką jest tutaj strona, strona przechowuje dane które są w postaci wierszy. Możemy nazwać ten sposób jako row store. Podczas tworzenia zapytań, i tak mimowolnie odczytujemy dane z innych kolumn, chociaż tak na prawdę nie są nam one do niczego potrzebne. Co za tym idzie zwiększa się ilość operacji I/O, wzrasta zapotrzebowanie na pamięć RAM. Przechowywanie kolumnowe (column store) przełamuje dotychczasowe zasady przechowywania danych w wiersza, na przechowywanie w kolumnach. Spójrzmy znów na pomocniczy rysunek:

Tak więc wybrane kolumny zapisywane są na pojedynczych stronach. Oprócz tego, że dane zapisywane są na stronach kolumnowo, zwiększa się możliwość ich kompresji - co wpływa znacząco na obniżenie ilości zajmowanego miejsca przez indeks. Column store index: - indeks który przechowuje dane w postaci kolumnowej, w przeciwieństwie do modelu wierszowego - dane są czytane tylko z wybranych kolumn co zmniejsza ilość operacji I/O Składnia polecenia tworzącego ten indeks jest następująca:
CREATE NONCLUSTERED COLUMNSTORE INDEX [nazwa_indeksu] ON [nazwa_tabeli] ([kolumny])
Po nałożeniu tego indeksu z tabeli nie można usuwać, dodawać ani modyfikować rekordów. Próba takich operacji skutkuje odpowiednim błędem. Jeżeli chcemy mieć możliwość dodawania operacji możemy wyłączyć na czas operacji indeks a później znów go nałożyć:
ALTER INDEX [nazwa] ON [tabela] DISABLE;
Operacje
ALTER INDEX [nazwa] ON [tabela] REBUILD;
Index ten ma oczywiście pewne ograniczenia o których warto wiedzieć, zanim przystąpi się do pracy z nim:
- nie ma możliwości utworzenia CLUSTERED INDEX tego typu
- tylko NONCLUSTERED index jest dozwolony
- nie ma możliwości zawierania kolumn w takim indeksie
- nie jest dostępny dla kolumn wyliczeniowych
- można utworzyć tylko 1 taki indeks

Stosowanie tego indeksu jest zalecane w następujących sytuacjach:
- hurtownie danych
- duża kompresja wartości klucza dla indeksu
- mniejsze zużycie pamięci, dysku, czasu procesora podczas wykonywania zapytań, co zwiększa możliwości zgromadzenia w cache większej ilości zapytań
- bardzo szybkie otrzymanie wyników podczas wykorzystania tego indeksu na dużych zbiorach danych .

Na koniec warto obejrzeć ten filmik, prezentujący jak sprawuje się nowy typ indeksu w pracy z tabelą w której znajdują się 2 miliardy wierszy:




Źródło: http://social.technet.microsoft.com/wiki/contents/articles/sql-server-columnstore-index-faq.aspx