Convirtiendo Entidades de Dominio a Dtos y viceversa (2 de 2)
En la entrada anterior, explicamos formas “manuales” de la conversión entre entidades y dtos.
El objetivo de esta entrada es hablar de algunas alternativas desarrolladas por compañías o desarrolladores que nos ayudaran a realizar estas conversiones, y ademas veremos una breve comparación de características y tiempos.
Opciones de Terceros:
AutoMapper
AutoMapper es quizas la opción más conocida y extendida entre los desarrolladores del ámbito .NET. No voy a entrar a explicar mucho de automapper ya que por si solo merece varios artículos así que iré al “grano”.
Podemos agregar AutoMapper a nuestro proyecto a través de Nuget
PM> Install-Package AutoMapper
Lo primero que tendremos que hacer es definir los mapeos:
Mapper.Initialize(cfg => cfg.CreateMap<Order, OrderDto>());
De esta manera se va a crear el mapeo basado en convencion de nombres (como vimos en el metodo de reflection).
Pero AutoMapper va mas alla:
AutoMapper.Mapper.CreateMap<Order, OrderDto>()
.ForMember(dest => dest.Prop,
opts => opts.MapFrom(
src => “Something…”));
Con ForMember nos permite modificar como mapear las propiedades, y va mucho mas alla con Resolvers, CustomMappings, acciones pre y post mapeos…
Para mas info de AutoMapper en GitGub tienen gran cantidad de información.
EmitMapper
Hace relativamente poco tiempo empece un nuevo proyecto y estuve buscando algunas alternativas a AutoMapper buscando mejoras de rendimiento sobre todo (ya que a nivel de configuración, bajo mi punto de vista, AutoMapper es el mejor), encontré una opción que tenia ya unos pocos años (es de 2010 según codeplex, aunque en Nuget se publicó en 2011, y no ha habido actualizaciones desde entonces).
Esa opción es EmitMapper. Del mismo modo que con AutoMapper, podemos descargarlo y empezar a usarlo desde Nuget:
Install-Package EmitMapper
Para empezar a utilizarlo:
var mapper = ObjectMapperManager.DefaultInstance.GetMapper<Order, OrderDto>();
Con esto definimos el objeto encargado de realizar los mapeos y si utilizamos el método Map() llevara a cabo la conversión del objeto.
Emit utiliza el código generado por el utiliza la clase Emit de Reflection, que se basa en el uso del código IL.
También, nos permite mucha menos configuración que la que nos ofrece AutoMapper, pero nos permite ignorar propiedades, definir prefijos o sufijos, substitución de nulos…
Bueno ahora una de c̶a̶l̶a̶m̶a̶r̶e̶s̶ datos:
Esta es una breve comparación mapeando el numero de elemento indicados y con las distintas implementaciones.
Se puede observar que la parte de Reflection es mucho mas lenta, pero también es susceptible de mejora.
Podemos ver que el mapeo Manual y Emit están muy parejos, y que AutoMapper no se queda atrás.
Conclusiones:
Ya veis los datos, ¿cual elegir? Bueno es una decisión que tenéis que consensuar en el equipo, hay que pensar que los mapeos manuales puede llevar mas tiempo escribirlos. Que si queremos poder customizarlo mucho, esta claro, la opción buena será AutoMapper, pero OJO a mayor personalización de los mapeos mayor sera el coste de los mismos. Por el contrario si los mapeos son sencillos podéis ir por Emit.
Os dejo publicado el código en GitHub :)
Espero vuestros comentarios!