Je rencontre un problème à l'aide de AutoMapper (ce qui est une excellente technologie) à la carte business object pour un DTO où j'ai héritage d'une classe de base abstraite au sein d'une collection.
Voici mes objets:
abstract class Payment
class CashPayment : Payment
class CreditCardPayment : Payment
J'ai aussi une facture de l'objet qui contient une collection de paiements comme suit:
public class Invoice
{
... properties...
public ICollection<Payment> Payments { get; set; }
}
J'ai aussi correspondant DTO versions de chacun de ces objets.
Le DtoInvoice objet est défini comme:
[DataContract]
public class DtoInvoice
{
...properties...
[DataMember]
public List<DtoPayment> Payments { get; set; }
}
C'est ce que mon Mappeur de définitions de ressembler à:
Mapper.CreateMap<Invoice, DtoInvoice>();
Mapper.CreateMap<Payment, DtoPayment>()
.Include<CashPayment, DtoCashPayment>()
.Include<CreditCardPayment, DtoCreditCardPayment>();
Mapper.CreateMap<CashPayment, DtoCashPayment>();
Mapper.CreateMap<CreditCardPayment, DtoCreditCardPayment>();
Le code pour effectuer la cartographie ressemble à ceci:
var invoice = repo.GetInvoice(invoiceId);
var dtoInvoice = Mapper.Map<Invoice, DtoInvoice>(invoice);
Donc par exemple si ma facture d'objet contient une collection de paiements spécifiques (disons 1 argent et 1 carte de crédit) lorsque mappeur essaie de mapper j'obtiens une erreur que la classe abstraite de Paiement ne peut pas être créé. Si je retire le mot clé abstract de l'objet du Paiement, puis le code fonctionne, mais je ne reçois une collection d'objet du Paiement, je ne reçois pas leurs objets spécifiques (la Trésorerie et les paiements par Carte de Crédit).
La question est donc: Comment puis-je obtenir AutoMapper de la carte des types de paiement spécifiques et non pas la classe de base?
Mise à jour
J'ai fait un peu plus de creuser, et que je vois un problème, mais je suis pas sûr de savoir comment je peux résoudre ce avec AutoMapper. Je pense que c'est plus un EF chose et de ne pas AutoMapper la faute. :-)
Dans mon code j'utilise Entity Framework 4 Proxy POCOs avec un chargement différé.
Donc, lorsque j'essaie de mapper une entité retourné à partir de EF qui est un proxy POCO qu'il obtient de cette drôle à la recherche de ce type:
System.Data.Entity.DynamicProxies.CashPayment_86783D165755C316A2F58A4343EEC4842907C5539AF24F0E64AEF498B15105C2
Si ma théorie est que, lorsque AutoMapper essaie de carte CashPayment à DtoCashPayment et le paiement transmis est le type de proxy AutoMapper le voit comme un "non match" et puis des cartes génériques type de Paiement. Mais depuis de Paiement est une classe abstraite AutoMapper bombes avec un "Système.InvalidOperationException: les Instances de classes abstraites ne peuvent pas être créés." l'exception".
La question est donc: Est-il un moyen pour moi de l'utiliser AutoMapper à la carte EF POCO objets proxy à l'Otd.