Wie zu verwenden mapper.Karte in MapperConfiguration der AutoMapper?
Ich brauche die Karte ein Objekt auf ein anderes mit AutoMapper. Die knifflige Frage ist, wie kann ich den Zugriff auf eine Instanz des Mappers (Instanz von IMapper) innerhalb der mapping-Konfiguration oder in einer benutzerdefinierten Art Konverter?
Den code unten funktioniert nicht, aber es ist ein Beispiel, was ich erreichen möchte - bitte beachten Sie die mapper.Map
anrufen und davon ausgehen, dass die Zuordnungen Customer => CustomerDto
und Customer => DetailedCustomerDto
definiert sind.
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)
})
);
Den client-Teil ist:
var mapper = config.CreateMapper();
var orderDto = mapper.Map<Order, OrderDto>(order);
Vereinfachte version von Objekten, die ich abbilden will, ist:
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; }
}
Wie Sie sehen, von den codes oben, basierend auf dem Wert von Order.Type
, der mapper sollte die Karte das Eigentum Order.Customer
an verschiedenen Zielen. Als ein Ziel (DetailedCustomerDto
) erbt von der anderen (CustomerDto
) wird es ein wenig knifflig.
Bitte beachten Sie, dass die Nutzung der überflüssig und veraltet statische Methode Mapper.Karte ist KEINE option.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als der AutoMapper 5.1.1
Kann man die mapper mit einer anderen überladung der
ResolveUsing
mit vier Parametern, der vierte von denen istResolutionContext
(context.Mapper
):Vor AutoMapper 5.1.1
Kann man die mapper mit einer anderen überladung der
ResolveUsing
mit zwei Parametern, der erste istResolutionResult
(result.Context.Engine.Mapper
):Neben Evk ist Super Antwort, die hat mir geholfen,, wenn Sie tun müssen, um eine Zuordnung innerhalb einer Zuordnung innerhalb einer config/profile, die erfordert, dass Sie einen benutzerdefinierten Konstruktor (d.h. der Typ hat keine default-Konstruktor), die folgenden arbeiten in v5.2.0:
In diesem Beispiel bin ich-Zuordnung der X. PagedList benutzerdefinierten collection-Typ von einem Objekttyp auf einen gleichwertigen Sammlung von einem anderen Objekt geben. Der erste parameter der lamdba-Ausdruck ist Ihre Quelle-Objekt, die zweite ist Ihre
ResolutionContext
von der Sie Zugriff auf ein mapper-Instanz anzeigen aus.