Automapper – przepisywanie danych

Automapper – dlaczego i kiedy stosować tę bibliotekę?

Automapper jest bardzo interesującą biblioteką. Może ona służyć do “przepisywania” danych (object-object). Warto skorzystać z niej jeżeli potrzebujemy przenieść dane np. z jednej klasy do drugiej gdy ich propercje są zbliżone ale posiadają inne typy. Przypisywanie ręczne nie jest dobrą techniką ponieważ może nastarczyć nam wielu problemów. Jeżeli chcemy aby nasz kod był solidny i czytelny polecam przede wszystkim skorzystanie z automapper-a. Biblioteka ta jest bardzo łatwa i przyjemna w użyciu – postaram się zobrazować ją na przykładzie.

Przykład i implementacja

Otwieramy NugetPackages następnie ściągamy Automappera i instalujemy go. Jest to darmowa biblioteka.

Dodawanie nuget-u

Automapper nuget

Dodajemy przestrzeń nazw do naszego programu aby móc korzystać z tej biblioteki.

using AutoMapper;

Zaimplementujmy dwie proste i podobne do siebie klasy. Z encji OldUser “przeniesiemy” dane do Users – zwróćmy uwagę iż pole “wiek” ma inny typ, a nazwy pól są identyczne.

public class OldUser
{
    public float Age { get; set; }
    public string FirstName { get; set; }
    public string Surname { get; set; }
}
public class User
{
    public int Age { get; set; }
    public string FirstName { get; set; }
    public string Surname { get; set; }
}

Wpiszmy więc jakieś dane do klasy OldUser.

OldUser personModel = new OldUser
{
    Age = 50.5f,
    FirstName = "Anna",
    Surname = "Nowak",
};

Następnie tworzymy konfiguracje mapowania z klasami które będą “przepisywane” (z OldUser do Users).

var config = new MapperConfiguration(cfg =>
                        cfg.CreateMap<OldUser, User>()
);

Kod odpowiedzialny za przepisywanie danych :

config.AssertConfigurationIsValid();
var userMapper = config.CreateMapper();
User test = user.Map<OldUser, User>(personModel)

Pierwsza linijka ostrzega nas przed błędami i w razie jakiegokolwiek błędu z konfigurowaniem mapowania wyrzuci nam wyjątek AutoMapperConfigurationException. W następnych linijkach tworzymy mapę.

W argumencie metody Map() podajemy dane, które chcemy przepisać. Automapper jest na tyle inteligenty że sam wyszukuje nazwy naszych propercji i wiąże je po tej samej nazwie.

automapper przepisywanie danych

Jak możemy zauważyć powyżej – automapper zadziałał.

Co się stanie, jeżeli chcemy przepisać dane ale nasze encje nie będą posiadały identycznych nazw? Tu przychodzi z pomocą metoda ForMember().

Nazwę pola “FirstName” zmieniamy na “FullName”  ponieważ chcemy, aby pole to zawierało informacje o imieniu i nazwisku. Następnie usuwamy propercję “Surname” dlatego, że nie będziemy powielać informacji skoro będzie znajdować się już w jednym polu.

Nasz klasa Users wygląda aktualnie tak:

public class User
{
    public int Age { get; set; }
    public string FullName{ get; set; }
}

Zatem zmieniamy nasz kod aby dane z pól FirstName i Surname zapisywał do pola FullName.

Kod z “configiem”

var config = new MapperConfiguration(cfg =>
                        cfg.CreateMap<OldUser, User>()
);

Zmieniamy na

var config = new MapperConfiguration(cfg =>
                cfg.CreateMap<OldUser, User>().ForMember(x => x.FullName, 
                    s => s.MapFrom(d => d.Surname + " " + d.FirstName))
);

Informuje nas iż dane z Surname i FirstName ma zapisać do pola FullName z klasy Users.

Jeżeli chcemy aby np. pole wiek z jakiegoś powodu było pomijane/ignorowane przy przepisywaniu danych wówczas dodajemy metodę ignore w konfiguracji.

var config = new MapperConfiguration(cfg =>
                cfg.CreateMap<OldUser, User>().ForMember(x => x.Age, s => s.Ignore())
);

 

Uważam że ta biblioteka jest warta uwagi. Nie jest ona wcale skomplikowana, a może poprawić czytelność naszego kodu i wyeliminować niepotrzebne błędy przy ręcznym przepisywaniu danych (bleh..).
Na przykład – w logice biznesowej implementujemy DTO i na niego rzutujemy dany model. Wtedy po stronie logiki obsługujemy wszystko a w kontrolerze mamy parę linijek kodu.
Omówiłem tutaj podstawową funkcjonalność automapper-a ma ona więcej funkcjonalności.

Zachęcam do zapoznania się z dokumentacja TUTAJ

 

 

Dodatek – cały kod

using AutoMapper;
namespace AutoMappers
{
    public class OldUser
    {
        public float Age { get; set; }
        public string FirstName { get; set; }
        public string Surname { get; set; }
    }
    public class User
    {
        public int Age { get; set; }
        public string FirstName { get; set; }
        public string Surname { get; set; }
    }
    class Program
    {

        static void Main(string[] args)
        {
            OldUser personModel = new OldUser
            {
                Age = 50.5f,
                FirstName = "Anna",
                Surname = "Nowak",
            };

            var config = new MapperConfiguration(cfg =>
                            cfg.CreateMap<OldUser, User>()
            );

            config.AssertConfigurationIsValid();
            var userMapper = config.CreateMapper();
            User test = user.Map<OldUser, User>(personModel);

        }
    }
}

 

6 Comments on “Automapper – przepisywanie danych”

  1. Automapper to bardzo fajna biblioteka. Dwie uwagi – tak na przyszłość 🙂 – :

    – klasa Users powinna się nazywać User
    – obydwie klasy powinny zawierać propertiesy nazwane po angielsku (a już na pewno nie mixup angielskiego z polskim)

        1. Powinno raczej być UserMapper aby było wiadomo że chodzi o tworzenie mapy z konfiguracją do klasy “User” ale słuszna uwaga.

Leave a Reply

Your email address will not be published. Required fields are marked *