0

Utilizando Mapster en C# | #1

Seguramente has utilizado alguna herramienta de mapeo de objetos. El más utilizado es AutoMapper. En esta ocasión vamos a ver veremos otra librería que nos permite asignar un objeto a otro tipo de objeto diferente.

Mapster viene a resolver el problema de tener que asignar de un objeto recuperado a otro que deseamos enviar por la red, como por ejemplo, la transformación de una entidad a un DTO (Data Transfer Object) y que si lo hacemos a mano se vuelve repetitivo e inclusive aburrido. Con Mapster podremos hacerlo de una manera sencilla de la mano de uso de convenciones configurables.

Para agregar la librería a nuestro proyecto lo haremos instalando el parquet nuget desde el repositorio principal vamos a nuestro visual studio, presionamos botón derecho, seleccionamos “Administrar paquetes nuget…”, en la solapa examinar buscamos Mapster y seleccionamos instalar.

Una vez terminado quedará disponible para nuestro proyecto.

Lo siguiente será establecer un caso de uso. Supongamos que tenemos las siguientes Clases Persona y que contendrá un objeto compuesto dirección. Por otro lado tendremos un objeto PersonaDTO que será el objeto al cual asignaremos y luego enviaremos por la red. Vemos las clases.

Persona

public class Persona
{
    public string Titulo{ get; set; }
    public string Nombre{ get; set; }
    public string Apellido{ get; set; }
    public DateTime FechaNacimiento{ get; set; }
    public Direccion direccion{ get; set; }
}

Direccion

public class Direccion
{
    public string Calle{ get; set; }
    public string Ciudad { get; set; }
    public string CodigoPostal { get; set; }
    public string Pais{ get; set; }
}

PersonaDTO

public class PersonaDTO
{
    public string Titulo{ get; set; }
    public string Nombre{ get; set; }
    public string Apellido{ get; set; }
    public DateTime FechaNacimiento{ get; set; }
}

Podemos ver que en nuestra clase DTO tenemos todas las propiedades de la persona excepto la dirección ya que no queremos enviar la dirección de la persona. Nuestro Proyecto quedará algo así:

En la carpeta data podemos ver un SeedData.Cs. En este archivo configuramos unos métodos los cuales nos retornará la creación de una persona o una colección de personas. Recuerda que estas clases solamente existen para la funcionalidad del demo. Como comentamos, tendremos un método CrearPersona y otro que será CrearListaPersonas. Este último tendrá un bucle sumando el valor i del bucle para crear 5 personas.

public static class SeedData
    {
        public static Persona CrearPersona()
        {
            return new Persona()
            {
                Titulo = "Mr.",
                Nombre = "Homero",
                Apellido = "Simpsons",
                FechaNacimiento = new DateTime(2005, 1, 1),
                direccion = new Direccion()
                {
                    Pais = "Estados unidos",
                    CodigoPostal = "12223N",
                    Calle = "Calle Siempre Viva 123",
                    Ciudad = "Sprinfield"
                }
            };
        }

        public static IList<Persona> CrearListaPersonas()
        {

            IList<Persona> personas = new List<Persona>();

            for (int i = 0; i < 5; i++)
            {

                var temp = SeedData.CrearPersona();
                temp.Nombre += " " + i.ToString();
                personas.Add(temp);
            }

            return personas;

        }
    }

Tenemos todo listo. Lo primero que haremos es utilizar Mapster directamente sin ningún tipo de configuración. Crearemos una nueva API llamada Persona. Dentro Crearemos un método GetPersona que devolverá un PersonaDTO. 

public class PersonaController : Controller
{
        [HttpGet("Persona")]
        public ActionResult GetPersona()
        {
            var persona = SeedData.CrearPersona();
            var personaDto = persona.Adapt<PersonaDto>();
            return Ok(personaDto);
        }
}

Podemos ver que estamos usando el método Adapt. Este método es de la librería de Mapster el cual nos permitirá realizar la asignación al objeto que deseamos. Es posible asignarlo a un objeto nuevo o a uno existente. Veamos el resultado desde Swagger.

Veamos que nuestra PersonaDto no posee el campo de la dirección reduciendo el tráfico de la red. Ahora vamos a realizarlo con un objeto existente, primero crearemos el DTO y luego transformaremos el objeto. 

[HttpGet("Persona")]
        public ActionResult GetPersona()
        {
            var persona = SeedData.CrearPersona();
            var personaDto = new PersonaDto();
            persona.Adapt(personaDto);

            return Ok(personaDto);
        }

Esto no cambiará el comportamiento de la api, solamente veremos otro camino de asignación.

Lo siguiente que vamos a ver es como una colección. Crearemos un nuevo método que se llama GetPersonas para retornar la lista de personas.

[HttpGet("Personas")]
        public ActionResult GetPersonas()
        {
            var personasQueryable = SeedData.CrearListaPersonas().AsQueryable();
            var personasDto = personasQueryable.ProjectToType<PersonaDto>();
            
            return Ok(personasDto);
        }

Mapster posee una extensión para mapear desde Queryable, con esto, aceleramos el proceso de mapeo de los datos que obtenemos dentro de este tipo. Vemos en ejemplo que al obtener una lista de personas invocamos al metodo AsQueryable y luego, en la siguiente línea utilizaremos el método ProjectToType  indicando al objeto que queremos reasignar. Veamos el resultado en Swagger.

Conclusiones

Hasta aquí pudimos ver como fácilmente podemos transformar o reasignar un objeto a otro objeto nuevo o uno existente por medio de la librería de Mapter y algunos de sus métodos como Adapt, AsQueqyable y ProjectToType para objetos simples o colecciones.

En próximos post veremos más en detalle cómo crear mapeos customizados, como condicionales, con esta librería.

Fernando Sonego

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *