piątek, 26 lutego 2010

AutoMapper. A co jeśli w naszym kodzie brak konwencji?

 copier Automapper jest biblioteką ułatwiającą konwersje między dwoma typami. Wykorzystując wspomnianą bibliotekę nie ma już konieczności pisania przydługiego kodu własnych konwerterów. Jak to się dzieje, że Automapper potrafi z typu:

public class BlogPost
{
    public string Title;
    public string Description;
    public string Body;
    public int Level;
    public DateTime CreationDate;
}

wyczarować np. klasę?:

public class BlipPost
{
    public string BlipBody;
    public DateTime DateOfBlip;
}

za pomocą wywołania jednej linijki kodu?:

//konwertujemy obiekt myPostObject z typu źródłowego (BlogPost) do typu docelowego (BlipPost)
Mapper.Map<BlogPost, BlipPost>(myPostObject); 

Otóż domyśla się on - za pomocą ogólnych konwencji nazewniczych - jakiemu typowi z klasy docelowej (BlipPost) będzie odpowiadał typ z klasy źródłowej (BlogPost). Świetnie. Jednak niechaj będzie błogosławiony ten, którego kod konwencji się trzyma. Prosty przykład, dla którego Automapper polegnie na samym wejściu:

public class Osoba
{
    public string Imie;
    public string NazwiskoRodowe;
    public string Nazwisko;
    public DateTime Urodziny;
}

Uwierzcie lub nie, ale Automapper nie da rady sobie zmapować tak prostej klasy na nic – jedynym efektem jego pracy będzie przepiękny wyjątek mapowania.

Wstań, powiedz nie jestem sam…

Można by Automapera o kant … potłuc, gdyby nie umożliwiał poradzenie sobie z podobnymi problemami.

Z pomocą przychodzi własny TypeConverter, który po zaimplementowaniu jednej metody Convert będzie płodził nowe klasy docelowe w sposób jaki mu powiemy.

public class ToBlipPostConverter : ITypeConverter<BlogPost, BlipPost>
{
#region ITypeConverter<BlogPost, BlipPost> Members

public BlipPost Convert(ResolutionContext context)
{
    BlogPost old = context.SourceValue as BlogPost;
    //if old != null
    var blip = new BlipPost();
    blip.Id = old.Id;
    blip.Data = old.DataPosta;
    blip.Level = old.Poziom;
    blip.Body = old.Tresc;
    
    return blip;
}

#endregion
}

Teraz wystarczy jedynie poinformować Automappera do używania naszej klasy konwertera dla podanych typów:

Mapper.CreateMap<BlogPost, BlipPost>().ConvertUsing<ToBlipPostConverter>();

Pisanie własnych konwerterów nieco mija się z celem, jednak sygnalizuję tylko problem na jaki może się natknąć deweloper.

No i tyle. Więcej można przeczytać na stronie projektu: Type Converters.

0 komentarze: