Refactoring: AutoMapper cz. 3

Ten wpis będzie ostatnim dotyczącym mojej trochę zbyt długiej walki przygody z AutoMapperem.

Linki do poprzednich części: część 1, część 2.

Zadanie

Miałam listę obiektów viewModelList typu GamerBoardGameViewModel oraz obiekt gamer typu Gamer. Dla każdego obiektu z listy viewModelList chciałam przypisać do propercji viewModel.GamerId oraz viewModel.GamerNickname odpowiednie propercje z obiektu gamer: gamer.Id oraz gamer.Nickname.

Profil mapera wyglądał następująco:

public class GamerProfile : Profile
{
	public GamerProfile()
	{
		CreateMap<Gamer, GamerBoardGameViewModel>()
			.ForMember(dest => dest.Id, opt => opt.Ignore())
			.ForMember(dest => dest.GamerId, opt => opt.MapFrom(src => src.Id))
			.ForMember(dest => dest.GamerNickname, opt => opt.MapFrom(src => src.Nickname));
	}
}

Problem

Od razu wynikł problem następujący. AutoMapper nie pozwalał mi mapować jednego obiektu X do listy obiektów Y. Mogłam tylko mapować obiekt X do obiektu Y lub listę obiektów X do listy obiektów Y.

Stwierdziłam więc, że mogę utworzyć tymczasową listę obiektów typu Gamer (X), której wielkość zgadzałaby się z wielkością listy obiektów GamerBoardGameViewModel (Y). Dzięki temu miałam listę obiektów X, listę obiektów Y i wszystko powinno być dobrze.

var boardGames = _boardGameService.GetAllGamerBoardGames();
var gamers = Enumerable.Repeat(gamer, boardGames.Count());

var viewModelList = Mapper.Map<List<GamerBoardGameViewModel>>(boardGames);
Mapper.Map(gamers, viewModelList);

Niestety – nie było dobrze.

Powód

Jaki dokładnie był powód? Nie jestem pewna. Możliwe, że AutoMapper nie wie, który element zmapować do którego (jeśli nie mapuje propercji Id identyfikującej dany element)?

Rozwiązanie

Trzeba było sobie jakoś poradzić.  W tym celu, żeby nie tworzyć tymczasowej listy obiektów X, które są takie same, zrobiłam po prostu pętlę foreach dla listy obiektów Y i dla każdego takiego obiektu użyłam mapowania z obiektu X (Gamer) na obiekt Y (GamerBoardGameViewModel).

var viewModelList = Mapper.Map<List<GamerBoardGameViewModel>>(boardGames);
foreach (var obj in viewModelList)
	Mapper.Map(gamer, obj);

Działa – i o to chodziło.

 

Dodaj komentarz