2012-03-17 63 views
2

條件映射我想要做類似下面,我想知道,如果有人知道如何做到這一點:AutoMapper - 對於類型

Mapper.CreateMap<Worksheet, V2WorksheetModel>().If(pWorksheet=> pWorksheet.VisitLevel == 2); 
Mapper.CreateMap<Worksheet, V3WorksheetModel>().If(pWorksheet=> pWorksheet.VisitLevel == 3); 

Worksheet entityVisit2 = MyService.GetWorksheetByID(100); //visit level 2 
Worksheet entityVisit3 = MyService.GetWorksheetByID(150); //visit level 3 
WorksheetModelBase modelBase1 = Mapper.Map(entityVisit2); 
WorksheetModelBase modelBase2 = Mapper.Map(entityVisit3); 
Assert.True(modelBase is V2WorksheetModel); 
Assert.True(modelBase2 is V3WorksheetModel); 

所以我想Mapper.Map()來返回WorksheetModelBase的正確派生類型。這可能嗎? (我知道我可以在調用代碼中執行if語句,但如果我可以使用這一個Mapper.Map行來返回正確的類,那很酷。)

謝謝!

回答

3

而不是映射V2WorksheetModel和V3WorksheetModel可以映射到基類嗎? 如果是的話你就可以在你的映射使用ConstructUsing

[Test] 
public void Test1() 
{ 
    Mapper.CreateMap<Worksheet, WorksheetModelBase>().ConstructUsing(GetWorksheetModel); 

    Worksheet entityVisit2 = new Worksheet { VisitLevel = 2 }; 
    Worksheet entityVisit3 = new Worksheet { VisitLevel = 3 }; 

    var modelBase1 = Mapper.Map<WorksheetModelBase>(entityVisit2); 
    var modelBase2 = Mapper.Map<WorksheetModelBase>(entityVisit3); 

    Assert.IsTrue(modelBase1 is V2WorksheetModel); 
    Assert.IsTrue(modelBase2 is V3WorksheetModel); 
} 

private WorksheetModelBase GetWorksheetModel(ResolutionContext context) 
{ 
    var worksheet = (Worksheet) context.SourceValue; 
    if (worksheet.VisitLevel == 2) 
     return new V2WorksheetModel(); 
    if (worksheet.VisitLevel == 3) 
     return new V3WorksheetModel(); 
    return new WorksheetModelBase(); 
} 
+0

我結束了使用來自該拿了類型參照目標工作表型基轉換器類派生的兩個轉換器。但是,我需要考慮使用ConstructUsing()。我的主要問題是試圖兌現DRY,我的解決方案是實現這一目標的一種方式,但您的工作甚至更好。謝謝! – diegohb 2012-03-17 21:35:32