Вы находитесь на странице: 1из 9

5/3/2016 [C#] AutoMapper desde ceros ­ Blog Julitogtu

761 days ago in C# AUTOMAPPER

[C#] AutoMapper desde ceros. 


Hola a todos, hoy vamos a ver una pequeña guía sobre AutoMapper, iniciando
desde cómo instalarlo​
y mirando algunas de sus características.

AutoMapper básicamente es una herramienta que permite realizar un mapeo de un


objeto a otro ahorrandonos gran cantidad de código y que provee algunas
utilidades para personalizar cómo se realiza dicho mapeo entre objetos.

Realizar mapeo entre objetos en una funcionalidad común en muchos de nuestros


desarrollos, ya que permiten personalizar la salida de los datos evitando revelar
información confidencial y dando al cliente solo la información que él realmente
necesita, basandonos en dicha afirmación, pensemos en una clase (modelo) Cliente
que tiene campos como Id, nombre, apellido, edad, email, fecha de creación y clave
entre otros, y ahora tenemos alguna funcionalidad que expone la información del
cliente, en este caso estamos revelando información que no deberiamos entregar
como la fecha de creación y la clave, en ese caso lo que podemos hacer es crear
una nueva clase (conocída como ViewModel) con solo los campos que vamos a
exponer; y aquí es donde AutoMapper juega un papel importante ya que nos va a
ayudar a pasar de nuestro modelo/clase Cliente a nuestro ViewModel
ClienteViewModel de una forma bastante sencilla y robusta.

Para ver como funciona AutoMapper vamos a partir de una aplicación Web con
ASP.NET MVC, sin embargo es posible usarlo en cualquier otro tipo de aplicación.

Lo primero es la instalación, y como podrán adivinar tan solo debemos añadir


AutoMapper haciendo uso de Nuget:

http://www.julitogtu.com/2014/02/03/c­automapper­desde­ceros/ 1/9
5/3/2016 [C#] AutoMapper desde ceros ­ Blog Julitogtu

Julio Avellaneda
Microsoft MVP ASPNET | Telerik
Developer Expert

Blog

     

Ahora vamos a crear el modelo, en este caso la clase Client:

’—„Ž‹……Žƒ••Ž‹‡–
Ƈ
’—„Ž‹…‹–Ž‹‡– †Ƈ‰‡–Ś•‡–Śƈ
’—„Ž‹…•–”‹‰ƒ‡Ƈ‰‡–Ś•‡–Śƈ
’—„Ž‹…•–”‹‰ƒ•–ƒ‡Ƈ‰‡–Ś•‡–Śƈ
’—„Ž‹…•–”‹‰ƒ‹ŽƇ‰‡–Ś•‡–Śƈ
’—„Ž‹…•–”‹‰”‡ƒ–‹‘ƒ–‡Ƈ‰‡–Ś•‡–Śƈ
’—„Ž‹…•–”‹‰ƒ••™‘”†Ƈ‰‡–Ś•‡–Śƈ
ƈ


Como ya mencionamos, necesitamos un ViewModel, que no es más que otra clase


con el nombre ClientViewModel:

’—„Ž‹……Žƒ••Ž‹‡–‹‡™‘†‡Ž
Ƈ

http://www.julitogtu.com/2014/02/03/c­automapper­desde­ceros/ 2/9
5/3/2016 [C#] AutoMapper desde ceros ­ Blog Julitogtu
’—„Ž‹…•–”‹‰ƒ‡Ƈ‰‡–Ś•‡–Śƈ
’—„Ž‹…•–”‹‰ƒ•–ƒ‡Ƈ‰‡–Ś•‡–Śƈ
’—„Ž‹…•–”‹‰ƒ‹ŽƇ‰‡–Ś•‡–Śƈ
ƈ


Ahora, vamos a crear una sencilla clase que va a actuar como repositorio y va a
retornar un cliente (realmente un ClientViewModel) dado su id:

’—„Ž‹……Žƒ••Ž‹‡–‡’‘•‹–‘”›
Ƈ
’”‹˜ƒ–‡”‡ƒ†‘Ž›‹•–…Ž‹‡–•ʰ‡™‹•–ſƀ
Ƈ
‡™Ž‹‡–ſƀƇŽ‹‡– †ʰɨřƒ‡ʰɑ —Ž‹‘ɑřƒ•–ƒ‡ʰɑ˜‡ŽŽƒ‡†ƒɑř
ƒ‹ŽʰɑŒ—Ž‹–‘ɏ‰–—ɒŠ‘–ƒ‹ŽŜ…‘ɑř”‡ƒ–‹‘ƒ–‡ʰƒ–‡‹‡Ŝ‘™řƒ••™‘”†ʰɑɨɩɪɫɬɭɑƈ

ƈŚ

’—„Ž‹…Ž‹‡–‹‡™‘†‡Ž
‡–› †ſ‹–‹†ƀ
Ƈ
ŵŵ
‡––Š‡…Ž‹‡–
˜ƒ”…Ž‹‡–ʰ…Ž‹‡–•ƃɥƄŚ
ŵŵ‡ˆ‹‡–Š‡ƒ’’‹‰
—–‘ƒ’’‡”Ŝƒ’’‡”Ŝ”‡ƒ–‡ƒ’ſƀŚ
ŵŵš‡…—–‡–Š‡ƒ’’‹‰
˜ƒ”…Ž‹‡–‹‡™‘†‡Žʰ—–‘ƒ’’‡”Ŝƒ’’‡”Ŝƒ’ſ…Ž‹‡–ƀŚ
ŵŵ‡–—”ƒ˜‹‡™‘†‡Ž
”‡–—”…Ž‹‡–‹‡™‘†‡ŽŚ
ƈ
ƈ


En el método anterior hacemos uso del método CreateMap de


*AutoMapper.Mapper *para definir el mapeo de objetos, el primer parámetro es el
objeto original (para el ejemplo Client) y el segundo parámetro es el objeto al cual
se va a mapear (en este caso ClientViewModel), luego para que la magia funcione
usamos el método Map para que se conviertan los objetos.

En el ejemplo anterior, AutoMapper realiza el mapeo entre las propiedades que


tengan el mismo nombre y tipo de dato entre el modelo original y el ViewModel,
razón por la cual poco hemos realizado en el método, sin embargo dicha premisa
no se cumple siempre, ya que no en todos los casos las propiedades tienen el
mismo nombre y puede existir alguna lógica adicional que se requiera implementar.

http://www.julitogtu.com/2014/02/03/c­automapper­desde­ceros/ 3/9
5/3/2016 [C#] AutoMapper desde ceros ­ Blog Julitogtu

La siguiente imagen lo muestra claramente:

Para casos más complejos que no cumplen la premisa básica del caso anterior,
AutoMapper tiene una característica conocida como perfiles, y allí podemos definir
un comportamiento más personalizado para los mapeos, para definir un perfil
tenemos tres sencillos pasos:

1. Crear una clase que herede de Profile (AutoMapper.Profile)


2. Sobreescribir la propiedad ProfileName (Nombre del perfil)
3. Sobreescribir el método Configure (Lógica del mapeo)

Entonces vamos a crear la clase CustomDto y realizamos los tres pasos anteriores,
como nombre del perfil (propiedad ProfileName) definimos CustomDto, y por el
momento vamos a dejar sin lógica el método Configure:

’—„Ž‹……Žƒ••—•–‘–‘ś”‘ˆ‹Ž‡
Ƈ
’—„Ž‹…‘˜‡””‹†‡•–”‹‰”‘ˆ‹Ž‡ƒ‡Ƈ‰‡–Ƈ”‡–—”ɑ—•–‘–‘ɑŚƈƈ

’”‘–‡…–‡†‘˜‡””‹†‡˜‘‹†‘ˆ‹‰—”‡ſƀƇƈ
ƈ


Ahora vamos a centrarnos en el método Configure, de nuevo hacemos uso de


AutoMapper.Mapper.CreateMap con objeto origen y objeto destino, y ahora para la
personalización de como será llevado a cabo el mapeo entre los objetos, para ello
hacemos uso del método ForMember, entonces para el ejemplo que veníamos
trabajando el método Configure sería (por el momento no vamos a personalizar

http://www.julitogtu.com/2014/02/03/c­automapper­desde­ceros/ 4/9
5/3/2016 [C#] AutoMapper desde ceros ­ Blog Julitogtu

nada):

’”‘–‡…–‡†‘˜‡””‹†‡˜‘‹†‘ˆ‹‰—”‡ſƀ
Ƈ
ƒ’’‡”Ŝ”‡ƒ–‡ƒ’ſƀ
Ŝ ‘”‡„‡”ſ†ʰʴ†Ŝƒ‡ř‘ʰʴ‘Ŝƒ’ ”‘ſ…ʰʴ…Ŝƒ‡ƀƀ
Ŝ ‘”‡„‡”ſ†ʰʴ†Ŝƒ•–ƒ‡ř‘ʰʴ‘Ŝƒ’ ”‘ſ…ʰʴ…Ŝƒ•–ƒ‡ƀƀ
Ŝ ‘”‡„‡”ſ†ʰʴ†Ŝƒ‹Žř‘ʰʴ‘Ŝƒ’ ”‘ſ…ʰʴ…Ŝƒ‹ŽƀƀŚ
ƈ


Ya que tenemos el perfil listo, ahora debemos llamarlo, y un buen lugar para
hacerlo es en el evento Application_Start del Global.asax:

’”‘–‡…–‡†˜‘‹†’’Ž‹…ƒ–‹‘ɏ–ƒ”–ſƀ
Ƈ
”‡ƒ‡‰‹•–”ƒ–‹‘Ŝ‡‰‹•–‡”ŽŽ”‡ƒ•ſƀŚ
 ‹Ž–‡”‘ˆ‹‰Ŝ‡‰‹•–‡”
Ž‘„ƒŽ ‹Ž–‡”•ſ
Ž‘„ƒŽ ‹Ž–‡”•Ŝ ‹Ž–‡”•ƀŚ
‘—–‡‘ˆ‹‰Ŝ‡‰‹•–‡”‘—–‡•ſ‘—–‡ƒ„Ž‡Ŝ‘—–‡•ƀŚ
—†Ž‡‘ˆ‹‰Ŝ‡‰‹•–‡”—†Ž‡•ſ—†Ž‡ƒ„Ž‡Ŝ—†Ž‡•ƀŚ
—–‘ƒ’’‡”Ŝƒ’’‡”Ŝ ‹–‹ƒŽ‹œ‡ſ…ʰʴ…Ŝ††”‘ˆ‹Ž‡ſ‡™—•–‘–‘ſƀƀƀŚ
ƈ


Ahora vamos a crear un nuevo método en la clase repositorio con el nombre


GetByIdWithProfile para ver que para usar el perfil simplemente eliminamos la
definición del mapeo:

’—„Ž‹…Ž‹‡–‹‡™‘†‡Ž
‡–› †‹–Š”‘ˆ‹Ž‡ſ‹–‹†ƀ
Ƈ
ŵŵ
‡––Š‡…Ž‹‡–
˜ƒ”…Ž‹‡–ʰ…Ž‹‡–•ƃɥƄŚ
ŵŵš‡…—–‡–Š‡ƒ’’‹‰
˜ƒ”…Ž‹‡–‹‡™‘†‡Žʰ—–‘ƒ’’‡”Ŝƒ’’‡”Ŝƒ’ſ…Ž‹‡–ƀŚ
ŵŵ‡–—”ƒ˜‹‡™‘†‡Ž
”‡–—”…Ž‹‡–‹‡™‘†‡ŽŚ
ƈ


Y si volvemos a probar efectivamente funciona sin problemas:

http://www.julitogtu.com/2014/02/03/c­automapper­desde­ceros/ 5/9
5/3/2016 [C#] AutoMapper desde ceros ­ Blog Julitogtu

Hasta el momento se ha usado la funcionalidad por defecto de AutoMapper, así que


vamos con el primer caso, en donde vamos a controlar cuando el valor de la
propiedad origen es null, primero que pasa si por ejemplo la propiedad LastName
no tiene un valor:

Como podemos ver, la propiedad del ViewModel también tendrá el valor, así que
por alguna regla de negocio, cuando el cliente no tiene un valor en LastName se
debe mostrar el texto “-“, dicha regla de negocio la podriamos implementar en
nuestra capa de UI o validando el valor de la propiedad antes de retornar el objeto…
o aún mejor, en la definición del mapeo de AutoMapper, así que volvemos al
método Configure y hacemos uso de NullSubstitute:

’”‘–‡…–‡†‘˜‡””‹†‡˜‘‹†‘ˆ‹‰—”‡ſƀ
Ƈ
ƒ’’‡”Ŝ”‡ƒ–‡ƒ’ſƀ
Ŝ ‘”‡„‡”ſ†ʰʴ†Ŝƒ‡ř‘ʰʴ‘Ŝƒ’ ”‘ſ…ʰʴ…Ŝƒ‡ƀƀ
Ŝ ‘”‡„‡”ſ†ʰʴ†Ŝƒ•–ƒ‡ř‘ʰʴ‘Ŝ—ŽŽ—„•–‹–—–‡ſɑŞɑƀƀ

http://www.julitogtu.com/2014/02/03/c­automapper­desde­ceros/ 6/9
5/3/2016 [C#] AutoMapper desde ceros ­ Blog Julitogtu
Ŝ ‘”‡„‡”ſ†ʰʴ†Ŝƒ‹Žř‘ʰʴ‘Ŝƒ’ ”‘ſ…ʰʴ…Ŝƒ‹ŽƀƀŚ
ƈ


Y probando de nuevo:

Otro caso típico, se da cuando necesitamos trabajar con colecciones de datos en


lugar de 1 solo objeto, en este caso prácticamente es transparente el cambio, basta
solo con especificar en el método Map que por ejemplo usaremos un IEnumerable,
para mostrarlo de nuevo creamos un nuevo método en nuestra clase repositorio:

’—„Ž‹… —‡”ƒ„Ž‡ʳŽ‹‡–‹‡™‘†‡Žʴ
‡–ŽŽſƀ
Ƈ
ŵŵš‡…—–‡–Š‡ƒ’’‹‰
˜ƒ”…Ž‹‡–‹‡™‘†‡Žʰ—–‘ƒ’’‡”Ŝƒ’’‡”Ŝƒ’ʳ —‡”ƒ„Ž‡ʳŽ‹‡–ʴř —‡”ƒ„Ž
‡ʳŽ‹‡–‹‡™‘†‡Žʴʴſ…Ž‹‡–•ƀŚ
ŵŵ‡–—”ƒ˜‹‡™‘†‡Ž
”‡–—”…Ž‹‡–‹‡™‘†‡ŽŚ
ƈ


Y de nuevo probando:

http://www.julitogtu.com/2014/02/03/c­automapper­desde­ceros/ 7/9
5/3/2016 [C#] AutoMapper desde ceros ­ Blog Julitogtu

Y por el momento vamos a dejar aquí, la idea del post era dar una rápida
introducción a AutoMapper y creo que ha sido así, en próximos post veremos otras
características de esta poderosa herramienta.

Descarga el ejemplo

Saludos.

http://www.julitogtu.com/2014/02/03/c­automapper­desde­ceros/ 8/9
5/3/2016 [C#] AutoMapper desde ceros ­ Blog Julitogtu

2 Comentarios Julitogtu Blog 
1  Acceder

  Recomendar ⤤ Compartir Ordenar por los mejores

Join the discussion…

Pablo Valor  •  hace 6 meses
Muy buen articulo! Felicitaciones!
△  ▽ • Responder • Compartir › 

Julito Avellaneda  Moderador   > Pablo Valor  •  hace 6 meses


Gracias por el comentario Pablo, saludos!
△  ▽ • Responder • Compartir › 

TAMBIÉN EN JULITOGTU BLOG ¿QUÉ ES ESTO?

Implementando refresh_token en [ASPNET] Una nueva era de
ASPNET Web API ­ Blog Julitogtu desarrolladores Web .Net.
2 comentarios • hace 4 meses 8 comentarios • hace 9 meses
Julito Avellaneda — Gracias por el Julito Avellaneda — Gracias Mario, si,
comentario Rodolfo, saludos hoy día se ven muchas aplicaciones muy
mal construidas, y el problema nunca ha
sido la tecnología :)
[ASP.NET MVC] Iniciando con las [Angularjs] Utilizando ngResource
plantillas ASP.NET Boilerplate. para consumir un servicio REST de
Un comentario • hace un año Web API.
8 comentarios • hace 4 meses
Hernan Demczuk — Que lástima que Julito Avellaneda — Maneras muchas
todavía no llegó para .NET Core viejo Juan, pero en este caso no me
gusta como lo haces, ese array luego no
será muy claro, adicionalmente me gusta

© 2016. All rights reserved. Built with Ghost and Uno Zen theme.

http://www.julitogtu.com/2014/02/03/c­automapper­desde­ceros/ 9/9

Вам также может понравиться