使用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