.net - objects - automapper validate
Automapper: mapeo bidireccional con ReverseMap() y ForMember() (2)
Tengo el caso en el que quiero asignar una entidad a un modelo de vista y volver. Tengo que especificar la asignación explícitamente con ForMember () porque sus propiedades no comparten los mismos nombres exactos. Aquí hay un breve ejemplo de cómo se ven mis clases:
public class PartTwo {
public int Integer { get; set; }
}
public class PartTwoViewModel {
public int PartInteger { get; set; }
}
Y quiero usarlos de esta manera:
Mapper.CreateMap<PartTwo, PartTwoViewModel>()
.ForMember(dst => dst.PartInteger, opt => opt.MapFrom(src => src.Integer))
.ReverseMap();
var partTwoViewModel = new PartTwoViewModel() { PartInteger = 42 };
var partTwo = Mapper.Map<PartTwoViewModel, PartTwo>(partTwoViewModel);
Assert.AreEqual(partTwoViewModel.PartInteger, partTwo.Integer);
Pero no coincide con la propiedad PartInteger to Integer. (El entero es 0.)
¿Hay alguna manera de hacer que esto funcione? (Cuando las propiedades de ambas clases tienen los mismos nombres, funciona.) ¿Tengo que establecer algún tipo de opción en el método ForMember ()?
Podrías definir tu configuración así:
Mapper.CreateMap<PartTwo, PartTwoViewModel>()
.ForMember(dst => dst.PartInteger, opt => opt.MapFrom(src => src.Integer));
Mapper.CreateMap<PartTwoViewModel, PartTwo>()
.ForMember(dst => dst.Integer, opt => opt.MapFrom(src => src.PartInteger));
ACTUALIZAR
Aquí está el commit donde ReverseMap
fue implementado inicialmente. Por lo que puedo ver en el código, solo crea un mapeo inverso simple. Por ejemplo, en este caso configuraría automáticamente el equivalente de:
Mapper.CreateMap<PartTwoViewModel, PartTwo>();
Para obtener algo más complejo, me temo que tendrá que configurarlo manualmente.
ReverseMap
devuelve una IMappingExpression
que representa la inversión de la asignación. Una vez que llame, las llamadas subsiguientes serán para configurar la anulación del mapa.
Aquí hay un ejemplo:
Mapper.CreateMap<CartItemDto, CartItemModel>()
.ForMember(dest => dest.ExtendedCost, opt => opt.Ignore())
.ReverseMap()
.ForMember(dest => dest.Pricing, opt => opt.Ignore())
Esto ignorará el campo de Pricing
en la dirección inversa.