bien, creo que he descubierto esto:
Con una IValueFormatter
, la entrada para el método FormatValue()
es el valor real. (De acuerdo, técnicamente, es un objeto ResolutionContext
que le permite obtener el valor usando la propiedad SourceValue
, pero se entiende).
Con un ValueResolver
, la entrada al método ResolveCore()
es la fuente completa (no solo el valor de origen).
Por lo tanto, si desea hacer algún tipo de conversión entre un valor de origen y un valor de destino, un IValueFormatter
sólo funcionará si el tipo de destino es un string
, y una ValueResolver
sólo funcionará si el método ResolveCore()
"sabe" qué propiedad utilizar (que no será el caso si su resolver es de propósito general, es decir, no se aplica a una propiedad en particular).
Solución
Afortunadamente, siempre hay MapFrom
, que proporciona la flexibilidad que le falta tanto con resolutores y formateadores.
interfaz Convertidor
terminé escribiendo una interfaz para manejar de forma sencilla y flexible lo que creo que es un escenario muy común: las conversiones de dos vías ...
public interface ITwoWayConverter<TInput, TOutput>
{
TOutput ConvertForward(TInput value);
TInput ConvertBackward(TOutput value);
}
Ejemplo convertidor:
public class PhoneNumberToString : ITwoWayConverter<long, string>
{
public string ConvertForward(long value)
{
return string.Format("{0:(###) ###-####}", Convert.ToInt64(value));
}
public long ConvertBackward(string value)
{
return Convert.ToInt64(Regex.Replace(value, @"\D", string.Empty));
}
}
exampl uso del correo:
Mapper.CreateMap<User, UserViewModel>()
.ForMember(dest => dest.PhoneNumber, opt => opt
.MapFrom(orig => new PhoneNumberToString().ConvertForward(orig.PhoneNumber)));
Gracias por su respuesta, Jimmy. ¿Hay alguna documentación sobre cómo usar perfiles? He estado trabajando en la documentación en el sitio codeplex, pero no encontré nada sobre los perfiles. – devuxer
Para responder a mi propia pregunta, encontré un buen ejemplo de cómo usar perfiles: http://mhinze.com/automapper-in-nerddinner/ – devuxer
¡necesito un poco más de blammo! en mi código ... – CRice