Ho bisogno di associare un oggetto a un altro utilizzando AutoMapper. La domanda complicata è: come posso accedere a un'istanza del programma di mappatura (istanza di IMapper) all'interno della configurazione di mappatura o all'interno di un convertitore di tipi personalizzati?Come utilizzare mapper.Map all'interno di MapperConfigurazione di AutoMapper?
Il codice riportato di seguito non funziona, tuttavia è un esempio di ciò che vorrei ottenere - si prega di notare le chiamate mapper.Map
e si assume che i mapping Customer => CustomerDto
e Customer => DetailedCustomerDto
siano definiti.
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)
})
);
La parte client è:
var mapper = config.CreateMapper();
var orderDto = mapper.Map<Order, OrderDto>(order);
La versione semplificata di oggetti che voglio mappa è:
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; }
}
Come si può vedere dai codici di cui sopra, in base al valore di Order.Type
, il mapper deve associare la proprietà Order.Customer
a destinazioni diverse. Poiché un obiettivo (DetailedCustomerDto
) eredita dall'altro (CustomerDto
) diventa un po 'complicato.
Si prega di notare che l'utilizzo del metodo statico obsoleto e deprecato Mapper.Map NON è un'opzione.
Ottimo, grazie. Questo e 'esattamente quello che stavo cercando. Che peccato non può essere trovato nella documentazione ufficiale (o almeno non ero in grado di farlo). – Anton
Solo per FYI, a partire da AutoMapper v5.1.1 il ResolutionContext che contiene l'istanza dell'oggetto Mapper è ora sul 4o argomento del metodo ResolveUsing (...) e la proprietà "Engine" è scomparsa. Quindi sarebbe ResolveUsing ((src, dest, risultato, contesto) => { ritorno context.Mapper.Map <.....>()} – nano2nd
@ nano2nd, thx per la precisazione, ho aggiornato la risposta. – Anton