Potrzebuję odwzorować obiekt na inny przy użyciu programu AutoMapper. Trudne pytanie brzmi: w jaki sposób uzyskać dostęp do instancji narzędzia odwzorowującego (instancji programu IMapper) w konfiguracji odwzorowania lub wewnątrz niestandardowego konwertera typów?Jak korzystać z mappera. Mapowanie w MapperConfiguration of AutoMapper?
Poniższy kod nie działa, ale jest przykładem tego, co chciałbym osiągnąć - proszę zwrócić uwagę na wywołania mapper.Map
i założyć, że zdefiniowano odwzorowania Customer => CustomerDto
i Customer => DetailedCustomerDto
.
var config = new MapperConfiguration(
cfg => cfg.CreateMap<Order, OrderDto>()
.ForMember(dst => dst.Customer, src => src.ResolveUsing(o => {
return o.Type == 1
? mapper.Map<Customer, CustomerDto>(o.Customer)
: mapper.Map<Customer, DetailedCustomerDto>(o.Customer)
})
);
Część klient jest:
var mapper = config.CreateMapper();
var orderDto = mapper.Map<Order, OrderDto>(order);
Uproszczona wersja obiektów chcę mapie jest:
public class Order
{
public int Type { get; set; }
public Customer Customer { get; set; }
}
public class Customer
{
public long Id { get; set; }
public string Name { get; set; }
}
public class OrderDto
{
public CustomerDto Customer { get; set; }
}
public class CustomerDto
{
public long Id { get; set; }
}
public class DetailedCustomerDto : CustomerDto
{
public string Name { get; set; }
}
Jak widać z kodów powyżej, na podstawie wartości Order.Type
, mapper powinien odwzorować obiekt Order.Customer
na różne cele. Ponieważ jeden cel (DetailedCustomerDto
) dziedziczy po drugim (CustomerDto
), staje się nieco trudny.
Należy zauważyć, że użycie przestarzałej i nieaktualnej metody statycznej Mapper.Map NIE jest opcją.
Świetnie, dziękuję. Właśnie tego szukałem. Szkoda, że nie można go znaleźć w oficjalnej dokumentacji (a przynajmniej nie byłem w stanie tego zrobić). – Anton
Po prostu dla FYI, jak z AutoMapper v5.1.1, parametr ResolutionContext zawierający instancję obiektu Mappera znajduje się teraz na 4. metodzie metody ResolveUsing (...), a właściwość "Engine" zniknęła. Więc byłoby ResolveUsing ((src, dest, wynik, kontekst) => { powrót context.Mapper.Map <.....>() } – nano2nd
@ nano2nd, thx za wskazanie tego, że zostały zaktualizowane odpowiedź. – Anton