2012-03-17 68 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