У меня проблема с использованием AutoMapper (это отличная технология) для сопоставления бизнес-объекта с DTO, где у меня есть наследование от абстрактного базового класса в коллекции.
Вот мои объекты:
abstract class Payment
class CashPayment : Payment
class CreditCardPayment : Payment
У меня также есть объект счета, который содержит коллекцию платежей, например:
public class Invoice
{
... properties...
public ICollection<Payment> Payments { get; set; }
}
У меня также есть соответствующие версии DTO каждого из этих объектов.
Объект DtoInvoice определен как:
[DataContract]
public class DtoInvoice
{
...properties...
[DataMember]
public List<DtoPayment> Payments { get; set; }
}
Вот как выглядят мои определения Mapper:
Mapper.CreateMap<Invoice, DtoInvoice>();
Mapper.CreateMap<Payment, DtoPayment>()
.Include<CashPayment, DtoCashPayment>()
.Include<CreditCardPayment, DtoCreditCardPayment>();
Mapper.CreateMap<CashPayment, DtoCashPayment>();
Mapper.CreateMap<CreditCardPayment, DtoCreditCardPayment>();
Код для выполнения сопоставления выглядит следующим образом:
var invoice = repo.GetInvoice(invoiceId);
var dtoInvoice = Mapper.Map<Invoice, DtoInvoice>(invoice);
Так, например, если мой объект инвойса содержит коллекцию определенных платежей (скажем, 1 наличными и 1 кредитной картой), когда mapper пытается отобразить их, я получаю сообщение об ошибке, что абстрактный класс Payment не может быть создан.Если я удаляю абстрактное ключевое слово из объекта Payment, то код работает, но я получаю только коллекцию объектов Payment, я не получаю их конкретные объекты (платежи наличными и кредитной картой).
Поэтому вопрос таков:Как я могу заставить AutoMapper отображать определенные типы платежей, а не базовый класс?
Обновление
Я сделал еще несколько копаний и думаю, что вижу проблемуно я не уверен, как я могу решить эту проблему с AutoMapper.Я думаю, что это скорее вещь EF, а не вина AutoMapper.: -)
В моем коде я использую POCO-прокси Entity Framework 4 с отложенной загрузкой.
Так что, когда я пытаюсь отобразить сущность, возвращенную из EF, которая является POCO-прокси, это становится забавнымвыглядит как:
System.Data.Entity.DynamicProxies.CashPayment_86783D165755C316A2F58A4343EEC4842907C5539AF24F0E64AEF498B15105C2
Так что моя теория заключается в том, что когда AutoMapper пытается сопоставить CashPayment с DtoCashPayment, а переданный платеж имеет тип прокси, AutoMapper видит его как «не совпадающий», а затем отображает общийСпособ оплаты.Но так как Payment является абстрактным классом, бомбы AutoMapper имеют «System.InvalidOperationException: экземпляры абстрактных классов не могут быть созданы».исключение.
Поэтому вопрос таков: есть ли способ использовать AutoMapper для сопоставления прокси-объектов EF POCO с Dtos.