2010-08-24 4 views
0

Есть ли способ заставить это работать? Вот упрощенная/надуманная иллюстрация моего вопроса (Пардон мой многословный В.Б.):Automapper с базовым классом нумерации

домена Классы модели

Public Class Car 
    Public Property Id As Integer 
    Public Property Seats As IEnumerable(Of Seat) 
End Class 

Public MustInherit Class Seat 
End Class 

Public Class StandardSeat 
    Inherits Seat 
    Public Property Manufacturer As String 
End Class 

Public Class CustomSeat 
    Inherits Seat 
    Public Property Installer As String 
End Class 

Просмотра Классы модели

Public Class CarModel 
    Public Property Id As String 
    Public Property Seats As IEnumerable(Of SeatModel) 
End Class 

Public Class SeatModel 
    Public Property Manufacturer As String 
    Public Property Installer As String 
End Class 

Mapping и тестирование код

<Test()> Public Sub Test() 
Mapper.CreateMap(Of Car, CarModel)() 
Mapper.CreateMap(Of Seat, SeatModel)() _ 
    .ForMember("Manufacturer", Sub(cfg) cfg.Ignore()) _ 
    .ForMember("Installer", Sub(cfg) cfg.Ignore()) 

Mapper.CreateMap(Of StandardSeat, SeatModel)() _ 
    .ForMember("Installer", Sub(cfg) cfg.Ignore()) 
Mapper.CreateMap(Of CustomSeat, SeatModel)() _ 
    .ForMember("Manufacturer", Sub(cfg) cfg.Ignore()) 

Mapper.AssertConfigurationIsValid() 

Dim car As New Car With {.Id = 4} 
car.Seats = New Seat() { 
    New StandardSeat With {.Manufacturer = "Honda"}, 
    New CustomSeat With {.Installer = "Napa"}} 

Dim model = Mapper.Map(Of Car, CarModel)(car) 
model.Id.ShouldEqual("4") 
model.Seats.Count().ShouldEqual(2) 
' These next two assertions fail. 
model.Seats.First().Manufacturer.ShouldEqual("Honda") 
model.Seats.Last().Installer.ShouldEqual("Napa") 
End Sub 

ответ

0

Вместо этого я сопоставляю параллельную иерархию наследования со стороны ViewModel. Создайте SeatModel, StandardSeatModel и CustomSeatModel. Затем вы использовали параметр конфигурации Include(), чтобы связать конфигурацию отображения Seat -> SeatModel с конфигурациями сопоставления с StandardSeat -> StandardSeatModel, а другую.

Таким образом, вам не нужны все Игнорировать() и еще много чего. Если вы все еще хотите сгладить свою оригинальную модель, вам все равно нужно включить конфигурацию Include() в Seat -> SeatModel.

+0

Спасибо за ответ, Джимми. Я попробовал несколько вещей с Include(), чтобы сгладить исходную модель, но не имел успеха с этим - свойства подкласса были проигнорированы. Спасибо за предложение о параллельном наследовании на ViewModel. – pettys

Смежные вопросы