Мне нужно сопоставить объект с другим с помощью AutoMapper. Трудный вопрос: как я могу получить доступ к экземпляру mapper (экземпляр IMapper) внутри конфигурации сопоставления или внутри конвертера пользовательского типа?
Код ниже не работает, однако это пример того, что я хотел бы достичь - обратите внимание на вызовы mapper.Map
и предположите, что определены сопоставления Customer => CustomerDto
и 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)
})
);
Клиентская часть:
var mapper = config.CreateMapper();
var orderDto = mapper.Map<Order, OrderDto>(order);
Упрощенная версия объектов, которые я хочу отобразить, это:
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; }
}
Как видно из приведенных выше кодов, на основе значения Order.Type
, картограф должен сопоставить свойство Order.Customer
с разными целями. Поскольку одна цель (DetailedCustomerDto
) наследуется от другой (CustomerDto
), она становится немного сложной.
Обратите внимание, что использование устаревшего и устаревшего статического метода Mapper.Map НЕ является опцией.