2010-08-24 94 views
0

有沒有什麼方法可以使其工作?這裏是我的問題的簡化/做作的插圖(請原諒我的羅嗦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 

回答

0

而不是這樣做,我會映射到ViewModel一側的並行繼承層次結構。創建一個SeatModel,StandardSeatModel和一個CustomSeatModel。然後,您可以使用Include()配置選項將Seat - > SeatModel映射配置與映射配置鏈接到StandardSeat - > StandardSeatModel,另一個。

這樣,你不需要所有的忽略()和什麼。如果您仍然想要將原始模型弄平,則仍然需要在Seat - > SeatModel部分中包含Include()配置。

+0

感謝您的迴應,吉米。我用Include()試了一些東西來平坦化原始模型,但沒有成功 - 子類屬性被忽略。 感謝您對ViewModel上的並行繼承的建議。 – pettys 2010-08-24 18:26:59