具有基类枚举属性的自动映射器

时间:2010-08-24 16:38:07

标签: automapper

有什么方法可以让它发挥作用吗?这是我的问题的简化/设计说明(请原谅我罗嗦的VB):

域模型类

 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 :(得分:0)

我没有这样做,而是映射到ViewModel端的并行继承层次结构。创建SeatModel,StandardSeatModel和CustomSeatModel。然后,您将使用Include()配置选项链接Seat - &gt; SeatModel映射配置到StandardSeat的映射配置 - &gt; StandardSeatModel和另一个。

这样,你不需要所有的Ignore()和诸如此类的东西。如果您仍希望展平原始模型,则仍需要在Seat上包含Include()配置 - &gt; SeatModel。