niedziela, 8 sierpnia 2010

Asp.net MVC - IoC i Bootstrapper. Wprowadzenie do biblioteki MVC Extensions

Następnie po interfejsie bazy danych postanowiłem zabrać się za implementowanie Bootstrappera i kontenera IoC. Troszkę opowiem tutaj o wzorcu DI i MVC tytułem wprowadzenia

Dependancy injection i Inversion of Control(IoC)
Dependancy injection(wstrzykiwanie zależności) jest to wzorzec projektowy polegajacy na usuwaniu bezpośrednich zależności miedzy komponentami na rzecz architektury typu plugin. W praktyce to wygląda tak ze stosuje się interfejsy zamiast konkretnych klas co powoduje ze można je bardzo łatwo podmieniać. Poprzez ta technikę możemy tworzyć łatwo testowalne obiekty.

Asp.net MVC
MVC jest architektonicznym wzorcem który rozdziela aplikacje na 3 główne komponenty: Model, Widok i Kontroler. W Asp.net jest on alternatywa do programowania Web Forms.

Model : Jest to komponent który składa się z obiektów biznesowych(encji) jak również logiki biznesowej. Generalnie ta cześć jest odpowiedzialna za wyciąganie i przechowywanie danych w bazie danych.

Widok : Widoki są to komponenty które wyświetlają interfejs użytkownika. Po odpowiednim przetworzeniu kodem wynikowym jest to kod html(w przypadku aplikacji web) i inne z tym związane technologie. Zwykle widoki są generowane w oparci o model danych.

Kontroler : Kontrolery maja za zadanie obsługiwać interakcje z użytkownikiem, pracować z modelem danych i wybierać jaki widok maja wyświetlić.

Po wiecej informacji polecam zajrzeć na stronę Asp.net MVC. Po krótkim wprowadzeniu możemy wrócić do głównego tematu.

Bootstrapper
Coż to takiego jest Bootstraper pewnie zapytacie. To jest obiekt który jest wykonywany na początku aplikacji web. Ma za zadanie tworzyć podstawowe konfiguracje i wykonywać zadania które są niezbędne aby aplikacja mogla zostać uruchomiona np. rejestracja kontenera IoC, skonfigurowanie routingu, dodanie własnej fabryki kontrolerów. Otoż wspomina w tytule biblioteka MVC Extensions bardzo na ułatwia ta czynność ponieważ większość już jest w mniej zawarta. Zacznijmy od początku. Pierwsza czynnością jest zastąpienie obiektu HttpApplication z global.asax odpowiednim z biblioteki Mvc Extensions. W moim wypadku będzie to UnityMvcApplication ponieważ używam kontenera Unity. Global.asax będzie teraz wyglądał tak:
public class MvcApplication : UnityMvcApplication
{

}
Jak widać nic specjalnego. Jednak to powoduje ze nie będziemy musieli np ręcznie tworzyć UnityControllerFactory która jest niezbędna aby nasza aplikacja działa z tym kontenerem. Również ta klasa spowoduje wykonanie zadań podstawowych związanych z Asp.net MVC jak również własnych które możemy zaimplementować. Oprócz tego musimy dodać obiekt który implementuje interfejs IModule. Będzie on służyć do konfiguracji kontenera IoC.
public class RegisterServices : IModule
{
    public void Load(IUnityContainer container)
    {
        //tutaj konfigurujemy kontener. Dodajemy repozytoria,uslugi.
    }
}

Bootstrapper Tasks
Pierwszy zadaniem który jest związany bezpośrednio z Asp.net MVC jest klasa która będzie konfigurowała nam routing. Musi on dziedziczyć po klasie RegisterRoutesBase. Przykładowa implementacja:
public class RegisterRoutes : RegisterRoutesBase
{
    protected override void Register(RouteCollection routes)
    {
        //tutaj zajmujemy sie konfiguracja routingu.
    }
}
Kolejnym ciekawym zadaniem choć nie wymaganym jest klasa która pozwala nam na konfiguracje globalnych filtrów. Krotko mówiąc pozwoli nam to na wstrzykiwanie zależności do filtrów gdyż normalnie nie ma możliwości aby to zrobić. Na temat konkretnego rozwiązania i przykładów będę pisał później. Przykladowa implementacja:
public class RegisterGlobalFilters : ConfigureFiltersBase
{
    protected override void Configure(IFilterRegistry registry)
    {
        //tutaj rejestrujemy globalne filtry
        registry.Register<HomeController, MyCustomAttribute>();
    }
}
Oprócz tych specjalny zadań które muszą być wykonywane przed rozpoczęciem aplikacji możemy definiować własne. Obiekty te muszą dziedziczyć po BootstrapperTask. U mnie takim zadaniem jest np inicjowanie klasy udostępniającej kontener IoC aplikacji:
public class RegisterIoC : BootstrapperTask
{
    protected override TaskContinuation ExecuteCore(IServiceLocator serviceLocator)
    {
        IoC.InitializeWith(serviceLocator);

        return TaskContinuation.Continue;
    }
}
Jedynym niezrozumiałym elementem moze byc tutaj zwracany typ TaskContinuation. Może on przyjąć 3 wartości: Continue, Skip, i Break. Continue powoduje wykonywanie następnych zadań w kolejności normalnie, Skip powoduje ominiecie następnego w kolejności zadania natomiast Break powoduje zaprzestanie wykonywania następnych zadań.

Jak widać biblioteka MVC Extensions bardzo nam ułatwiła życie gdyż posiada wiele ciekawych gotowych rozwiązań. Bardzo polecam zapoznać się z nią. Poza tym wiele rozwiązań z te biblioteki ujrzymy w Asp.net MVC 3.0

2 komentarze:

matma pisze...

W sumie tutaj najlepiej pasuje ... a mianowicie po co podczas tworzenia profilu dla Automappera podajesz at explicite co z czego ma mapować, kiedy wszystko konwencji się trzyma ;) po to jest Auto aby nie musieć tego robić samemu :)

Krzysztof Hrabia pisze...

W sumie masz racje od niedawna pracuje z automapperem :) Cenna wskazówka

Prześlij komentarz