[C#] Custom value resolver en AutoMapper

Posted on Actualizado enn


Hola, anteriormente hicimos una introducción a AutoMapper, vimos algunos conceptos básicos para rápidamente ponernos a tono con dicha herramienta y finalmente comente algunas características importantes y muy comúnmente utilizadas, y como podrán adivinar quedaron algunos temas por fuera, así que en esta oportunidad vamos a revisar una de ellas, los Value Resolver.

En esencia podemos crear un Value Resolver personalizado para especificar un mapeo diferente al por defecto (propiedad origen a propiedad destino) para cumplir con necesidades específicas, así que en esta oportunidad vamos a personalizar la asignación a la propiedad Name de la clase ClientViewModel. Así que vamos a cambiar un poco la clase ClientViewModel, donde eliminamos la propiedad LastName, así nuestra clase ahora solo tiene dos propiedades, Name y Email:

public class ClientViewModel
{
	public string Name { get; set; }

	public string Email { get; set; }
}

La concatenar las propiedades Name y LastName de la clase Cliente y ese valor será el asignado para el Name de ClientViewModel, así que vamos a crear un Value Resolver que nos ayude con esa tarea, crear un Value Resolver personalizado es tan simple como tener una clase que herede de ValueResolver y sobre-escribir el método ResolveCore. Así que creamos una clase llamada FullNameResolver que hereda de ValueResolver y definimos el source (la clase cliente original) y el tipo de la salida (un string en este caso), y en el override del método ResolveCore simplemente concatenamos las propiedades y retornamos el valor:

public class FullNameResolver : ValueResolver<Client, string>
{
	protected override string ResolveCore(Client source)
	{
		return string.Format("{0} {1}",source.Name, source.LastName);
	}
}

Ya que se ha creado el resolver, solo resta usarlo, así que vamos a nuestra clase CustomDto y allí en el método Configure en la definición del mapeo de la propiedad Name llamamos el resolver creado con la función ResolveUsing y le pasamos el FullNameResolver creado anteriormente:

protected override void Configure()
{
	Mapper.CreateMap<Client, ClientViewModel>()
		.ForMember(d => d.Name, o => o.ResolveUsing<FullNameResolver>())
		.ForMember(d => d.Email, o => o.MapFrom(c => c.Email));
}

Por último una prueba:

ValueResolver

Hasta la próxima, saludos!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s