AutoMapper не поддерживает полиморфизм? - PullRequest
0 голосов
/ 29 марта 2011

Предположим следующую иерархию объектов:

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; }
}

И следующее отображение:

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

Это не работает, AutoMapper вместо этого хочет отображение, подобное следующему:

CreateMap<Customer, CustomerStubDTO>(); 

Но я хочу, чтобы OrderDTO.Customer содержал экземпляр CustomerDTO, поэтому у меня есть доступ к свойству Name, среди прочего.

Я смог использовать .Include<TSource, TDestination> для этого поведения, когда у исходного класса есть другие производные, но не когда он сам по себе.(например, если существует CustomerStub, соответствующий CustomerStubDTO, и Customer, соответствующий CustomerDTO)

Что это означает, что следующее также не работает:

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

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 06 апреля 2011

Не уверен, что вы пытаетесь сделать.Следующее работает, как и ожидалось, после того как вы измените «Customer» в OrderDTO на «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);

Если вы хотите сохранить «CustomerStubDTO» в Order, вы бы вместо этого сопоставили Customer-> CustomerStubDTO затем CreateMap<Customer, CustomerStubDTO>(); это путь, как вы отметили.

Automapper не учитывает наследование при создании TypeMap, который он использует внутри, чтобы выяснить, что и где отображать.Я даже не уверен, что делать это имеет смысл.

0 голосов
/ 29 марта 2011

Я скачал исходный код, просмотрел его и не смог найти поддержку этого сценария.

Я реализовал это сам, думаю, я отправлю патч.

...