Automapper со свойством перечисления базового класса - PullRequest
0 голосов
/ 24 августа 2010

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

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

 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

Картографический и тестовый код

<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

1 Ответ

0 голосов
/ 24 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...