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.