2012-12-17 54 views
10

Sử dụng Automapper tôi tạo ra một bản đồ đơn giản:AutoMapper: Bản đồ <A,B> có cho <B,A> không?

Mapper.CreateMap<MyCustomerDTO, YourCustomerDTO>() 

Tôi thường cần phải đi theo con đường khác quá. Tôi có cần phải tạo bản đồ theo cách khác không, hoặc Automapper sẽ suy ra nó dựa trên bản đồ trên?

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

Trả lời

11

Không. Bạn phải tạo ánh xạ hai chiều. Một phương pháp helper tốt cho hai bản đồ cách có thể là:

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

sau đó sử dụng nó như thế này:

ViceVersa<T1, T2>(); 
+15

Lưu ý rằng điều này bây giờ có thể được thực hiện "ra khỏi hộp" với tùy chọn 'ReverseMap'. – Mightymuke

2

bạn cũng cần tạo ánh xạ thứ hai. Một xét nghiệm đơn giản cố gắng để chạy ứng dụng của bạn mà không cần lập bản đồ thứ hai sẽ cung cấp cho bạn một lỗi runtime

+0

Tôi không nghĩ rằng nó đưa ra một lỗi biên dịch nếu tôi nhớ chính xác ... nó cho một lỗi thời gian chạy? Không có ánh xạ cho B, A tìm thấy hoặc một cái gì đó dọc theo những dòng? – Alex

+0

đúng ... Tôi nhớ rằng nó cho một số loại lỗi. – Dmitry

15

Đây là một bản sao để Do i need to create automapper createmap both ways?

Lưu ý câu trả lời liên quan đến .ReverseMap()here.

Lưu ý rằng .ReverseMap() là dành cho ánh xạ cơ bản. Nếu bạn cần sử dụng các tùy chọn (chẳng hạn như ánh xạ ForMember cụ thể), bạn sẽ cần phải tạo một bản đồ ngược tùy chỉnh.

1

tôi đã đi qua cùng một vấn đề khi làm việc với AutoMapper, và @ Behnam-Esmaili là một câu trả lời hay nhưng nó có thể được cải thiện.

Bạn có thể triển khai phương thức mở rộng cho IMapperConfigurationExpression sẽ thực hiện ánh xạ hai chiều này và cũng mong đợi hai tham số tùy chọn (Action<IMappingExpression<T, Y>>) sẽ được sử dụng khi cố định cấu hình Ánh xạ cho cả hai loại.

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); 
    } 
} 

Triển khai ở trên là cách duy nhất để đạt được, tuy nhiên nó có thể được thiết kế khác nhau.

Các vấn đề liên quan