2016-03-04 48 views
6

我在项目中升级AutoMapper,将静态Mapper.CreateMap转换为新方式,并在需要映射的地方注入IMapper在ITypeConverter中使用Automapper

除了一个用例外,这个过程很好。对于使用Mapper.Map函数的复杂映射,我有几个ITypeConverter。我怎样才能解决这个问题?以下是我目前使用的代码。

静态Mapper.Map找不到我定义的映射,因为它不是使用静态方法创建的。

public partial class ApplicationMappingsProfile 
{ 
    private void RegisterMappings() 
    { 
     CreateMap<Application, AppDto>() 
      .ConvertUsing<ApplicationTypeConverter>(); 
    } 
} 

private class ApplicationTypeConverter : ITypeConverter<App, AppDto> 
{ 
    public AppDto Convert(ResolutionContext context) 
    { 
     var src = context.SourceValue as App; 
     if (src == null) 
     { 
      return null; 
     } 

     var dto = Mapper.Map<App, AppDto>(src); 
     dto.property = Mapper.Map<Property>(src.SomeProperty); 

     return result; 
    } 
} 

回答

7

ResolutionContext包含对当前映射引擎的引用。切换Mapper.Mapcontext.Engine.Mapper.Map,你很好去。

public partial class ApplicationMappingsProfile 
{ 
    private void RegisterMappings() 
    { 
     CreateMap<Application, AppDto>() 
      .ConvertUsing<ApplicationTypeConverter>(); 
    } 
} 

private class ApplicationTypeConverter : ITypeConverter<App, AppDto> 
{ 
    public AppDto Convert(ResolutionContext context) 
    { 
     var src = context.SourceValue as App; 
     if (src == null) 
     { 
      return null; 
     } 

     var dto = Mapper.Map<App, AppDto>(src); 
     dto.property = context.Engine.Mapper.Map.Map<Property>(src.SomeProperty); 

     return result; 
    } 
} 
+0

谢谢你分享你解决的问题 –

+0

有没有办法在ctor中使用IMapper实例? –

+0

@AmelSalibasic注入它? – Thijs