2012-12-17 115 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); 
    } 
} 

上面的實現是實現它的一種方式,但它可以進行不同的設計。

相關問題