2011-03-29 6 views
0

On suppose la hiérarchie des objets suivants:AutoMapper polymorphisme non pris en charge?

class Customer 
{ 
    int Id { get; set; } 
    string Name { get; set; } 
} 

class CustomerStubDTO 
{ 
    int Id { get; set; } 
} 

class CustomerDTO : CustomerStubDTO 
{ 
    string Name { get; set; } 
} 

class Order 
{ 
    Customer Customer { get; set; } 
} 

class OrderDTO 
{ 
    CustomerStubDTO Customer { get; set; } 
} 

Et le mapping suivant:

CreateMap<Order, OrderDTO>(); 
CreateMap<Customer, CustomerDTO>(); 

Cela ne fonctionne pas, AutoMapper veut une application comme ce qui suit à la place:

CreateMap<Customer, CustomerStubDTO>(); 

Mais je veulent OrderDTO.Customer pour contenir une instance de CustomerDTO à la place, donc j'ai accès à la propriété Name, entre autres des choses.

J'ai pu utiliser .Include<TSource, TDestination> pour ce comportement lorsque la classe source a d'autres dérivées, mais pas lorsqu'elle est autonome. (Par exemple, s'il y avait un CustomerStub correspondant à CustomerStubDTO et client correspondant à CustomerDTO)

Ce que cela signifie est que ce qui suit ne fonctionne pas non plus:

CreateMap<Customer, CustomerStubDTO>().Include<Customer, CustomerDTO>(); 

Toutes les idées?

Répondre

0

J'ai téléchargé la source et je l'ai regardée sans que ce scénario puisse être pris en charge. Je l'ai implémenté moi-même, je suppose que je vais soumettre un patch.

+0

Salut, je suis exactement le même problème, pouvez-vous soumettre votre solution quelque part? – zidane

-1

Vous ne savez pas exactement ce que vous essayez de faire. Les travaux suivants comme prévu une fois que vous modifiez le « Client » sur OrderDTO taper « CustomerDTO »:

Mapper.CreateMap<Customer, CustomerDTO>(); 
Mapper.CreateMap<Order, OrderDTO>(); 
Customer customer = new Customer{Id=1,Name="John"}; 
Order order = new Order{Customer = customer}; 
var orderDto = Mapper.Map<Order, OrderDTO>(order); 

Si vous voulez garder « CustomerStubDTO » sur commande vous carte à la place Client-> CustomerStubDTO alors CreateMap<Customer, CustomerStubDTO>(); est la manière aller comme vous l'avez noté.

Automapper ne tient pas compte de l'héritage lors de la création de TypeMap qu'il utilise en interne pour déterminer les éléments à mapper. Je ne suis même pas sûr que cela soit logique.

+0

Oui, il s'est avéré que ce que j'essayais d'accomplir n'était pas possible. J'ai déjà soumis un correctif pour implémenter cette nouvelle fonctionnalité. Voici le commit: http://bit.ly/fouNnj pour référence. – andreialecu

Questions connexes