2012-12-17 53 views
10

使用Automapper我创建了一个简单的地图:AutoMapper:请问<A,B>给<B,A>?

Mapper.CreateMap<MyCustomerDTO, YourCustomerDTO>() 

我经常需要走另一条路太。我是否还需要以其他方式创建映射,或者Automapper会根据上述映射来推断它?

Mapper.CreateMap<YourCustomerDTO, MyCustomerDTO>() //Needed? 

回答

11

不,您必须创建双向映射。对于双向映射好帮手方法可能是:

protected virtual void ViceVersa<T1, T2>() 
     { 
      Mapper.CreateMap<T1, T2>(); 
      Mapper.CreateMap<T2, T1>(); 
     } 

然后使用它是这样的:

ViceVersa<T1, T2>(); 
+15

请注意,现在可以使用“ReverseMap”选项“开箱即用”完成此操作。 – Mightymuke

2

您还需要创建第二个映射。一个简单的测试努力没有第二映射运行你的应用程序会给你一个运行时错误

+0

如果我没有记错的话,我不认为它会导致编译错误...它会给出运行时错误?没有针对B,A的映射发现或沿着这些线? – Alex

+0

这是正确的......我记得它给出了某种错误。 – Dmitry

1

与AutoMapper工作时,我遇到了同样的问题,并@贝楠,Esmaili是一个很好的答案,但它可以改善。

您可以实现对IMapperConfigurationExpression一个扩展方法,它会做这种双向映射和也期待这将尝试配置这两种类型的映射时,可以使用两个可选参数(Action<IMappingExpression<T, Y>>)。

public static class ModelMapper 
{ 
    private static readonly IMapper _mapper; 

    static ModelMapper() 
    { 
     var mapperConfiguration = new MapperConfiguration(config => 
     { 
      config.CreateTwoWayMap<CustomerViewModel, Customer>(
       secondExpression: (exp) => exp.ForMember((source) => source.CustomerEmail, opt => opt.MapFrom(src => src.Email))); 
     }); 

     _mapper = mapperConfiguration.CreateMapper(); 
    } 

    public static void CreateTwoWayMap<T, Y>(this IMapperConfigurationExpression config, 
     Action<IMappingExpression<T, Y>> firstExpression = null, 
     Action<IMappingExpression<Y, T>> secondExpression = null) 
    { 
     var mapT = config.CreateMap<T, Y>(); 
     var mapY = config.CreateMap<Y, T>(); 

     firstExpression?.Invoke(mapT); 
     secondExpression?.Invoke(mapY); 
    } 

    public static T Map<T>(object model) 
    { 
     return _mapper.Map<T>(model); 
    } 
} 

上面的实现是实现它的一种方式,但它可以进行不同的设计。

相关问题