Czym jest automapper i jak go skonfigurować?

Pomiędzy klientem a serwerem muszą być przesyłane w jakiś sposób dane. Jednym z możliwości będzie koncept DTOs czyli Data Transfer Objects. Tutaj przychodzi nam z pomocą Automapper, czyli najprościej mówiąc biblioteka, która automatycznie mapuje nam obiekt jednego typu na typ drugi. Automapper działa tak, że domyślnie mapuje te same nazwy np. FirstName na FirstName innego typu. Pod koniec wpisu pokażę jak go skonfigurować aby mapował nam wartość na chcianą wartość.

Zacznijmy od instalacji Automappera. Tutaj nie ma nic skomplikowanego po prostu uruchamiamy Nuget Packages, znajdujemy Automappera i przechodzimy do instalacji.

Pierwszą czynnością w projekcie będzie stworzenie pliku odpowiedzialnego za konfiguracje Automappera.

 public class AutoMapperConfig
    {
        private IMapper _mapper;
        public AutoMapperConfig()
        {
            _mapper = new MapperConfiguration(cfg =>
            {
                //miejsce na konfiguracje mappera
            }).CreateMapper();
        }
    }

Następnym krokiem jest skonfigurowanie mappera. Ja w tym celu stworzyłem model User zawierający dane o użytkowniku tj. Imię, Nazwisko, Miasto i Adres. Oraz Dto UserDto który zawiera tylko Imie i Nazwisko.

Nasz kod powinien wyglądać w ten sposób.

 public class AutoMapperConfig
    {
        private IMapper _mapper;
        public AutoMapperConfig()
        {
            _mapper = new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<User, UserDto>().ReverseMap();
            }).CreateMapper();
        }
        public UserDto MapUserToUserDto(User user)
        {
            return _mapper.Map<UserDto>(user);
        }
    }

W wyrażeniu lambda CreateMap oznacza, że tworzymy mapowanie z obiektu User na obiekt UserDto. ReverseMap informuje nas, że możemy również te mapowanie użyć w drugą stronę tj. z obiektu UserDto na User.

Dodatkowo stworzyłem metodę MapUserToUserDto która pozwoli nam na wykorzystanie mappera i zwrócenie typu UserDto.

W celach weryfikacji poprawności napisałem bardzo prosty kod który po wykonaniu zwraca nam poprawne dane.

static void Main(string[] args)
        {
            var mapper = new AutoMapperConfig();
            var user = new User
            {
                FirstName = "Imie",
                LastName = "Nazwisko",
                City = "Miasto",
                Adress = "Adres"
            };
            var dto = mapper.MapUserToUserDto(user);
            Console.WriteLine(dto.FirstName);
            Console.WriteLine(dto.LastName);
        }

W tym przykładzie wartości z obu typów były te same. Teraz zmienię w UserDto zmienną FirstName na Name. To poskutkuje błędem podczas mapowania więc wartość Name będzie wynosić null. Żeby temu zapobiec muszę trochę zmodyfikować konfigurację mappera.

public AutoMapperConfig()
        {
            _mapper = new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<User, UserDto>().ForMember(x=> x.Name, x => x.MapFrom(y => y.FirstName)).ReverseMap();

            }).CreateMapper();
        }

Dodałem metodę ForMember która pozwala określić dla jakiej wartości mapować jaką wartość. Więc dla x czyli Name mapujemy y czyli FirstName .Takie rozwiązanie pozwoli nam na uzyskanie wartości jak w wcześniejszym przypadku.

Scroll to Top