使用Automapper我創建了一個簡單的地圖:AutoMapper:請問<A,B>給<B,A>?
Mapper.CreateMap<MyCustomerDTO, YourCustomerDTO>()
我經常需要走另一條路太。我是否還需要以其他方式創建映射,或者Automapper會根據上述映射來推斷它?
Mapper.CreateMap<YourCustomerDTO, MyCustomerDTO>() //Needed?
使用Automapper我創建了一個簡單的地圖:AutoMapper:請問<A,B>給<B,A>?
Mapper.CreateMap<MyCustomerDTO, YourCustomerDTO>()
我經常需要走另一條路太。我是否還需要以其他方式創建映射,或者Automapper會根據上述映射來推斷它?
Mapper.CreateMap<YourCustomerDTO, MyCustomerDTO>() //Needed?
不,您必須創建雙向映射。對於雙向映射好幫手方法可能是:
protected virtual void ViceVersa<T1, T2>()
{
Mapper.CreateMap<T1, T2>();
Mapper.CreateMap<T2, T1>();
}
然後使用它是這樣的:
ViceVersa<T1, T2>();
這是一個重複,以Do i need to create automapper createmap both ways?
注:關於.ReverseMap()
here答案。
請注意.ReverseMap()
用於基本映射。如果您需要使用選項(如特定的ForMember
映射),則需要創建自定義的反向映射。
與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);
}
}
上面的實現是實現它的一種方式,但它可以進行不同的設計。
請注意,現在可以使用「ReverseMap」選項「開箱即用」完成此操作。 – Mightymuke