Automapper en C#

Automapper en C#

AutoMapper en C# con ejemplos

En este artículo, voy a hablar sobre AutoMapper en C# con algunos ejemplos sencillos. Al final de este artículo, comprenderá muy bien los siguientes consejos.

  1. ¿Por qué necesitamos usar AutoMapper en C#?
  2. ¿Qué es AutoMapper en C#?
  3. ¿Cómo uso AutoMapper en C#?
  4. Múltiples ejemplos para entender AutoMapper en C#.
  5. ¿Qué sucederá si los nombres de las propiedades de origen y destino son diferentes?
  6. ¿Cómo mapear dos propiedades cuando los nombres son diferentes usando el mapeador automático?
¿Por qué necesitamos AutoMapper en C#?

Veamos por qué necesitamos un mapeador automático en C# con un ejemplo. Digamos que tenemos dos clases como Empleado y EmpleadoDTO como se muestra en la imagen de abajo.

Ahora, si desea copiar los datos o transferir los datos del Empleado objetar al EmployeeDTO Entonces, en el enfoque tradicional, primero debe crear y completar el objeto Empleado como se muestra en la imagen a continuación.

Una vez que tenga el objeto empleado, debe crear el EmployeeDTO así como la necesidad de copiar los datos del objeto del empleado al objeto DTO del empleado como se muestra en la imagen a continuación.

El ejemplo completo se muestra a continuación.

El siguiente ejemplo, copia los datos de un objeto a otro objeto en el enfoque tradicional, es decir, sin usar el asignador automático de C#.

namespace AutoMapperDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Employee emp = new Employee();
            emp.Name = "James";
            emp.Salary = 20000;
            emp.Address = "London";
            emp.Department = "IT";

            EmployeeDTO empDTO = new EmployeeDTO();
            empDTO.Name = emp.Name;
            empDTO.Salary = emp.Salary;
            empDTO.Address = emp.Address;
            empDTO.Department = emp.Department;

            Console.WriteLine("Name:" + empDTO.Name + ", Salary:" + empDTO.Salary + ", Address:" + empDTO.Address + ", Department:"+ empDTO.Department);
            Console.ReadLine();
        }
    }
    
    public class Employee
    {
        public string Name { get; set; }
        public int Salary { get; set; }
        public string Address { get; set; }
        public string Department { get; set; }
    }
    
    public class EmployeeDTO
    {
        public string Name { get; set; }
        public int Salary { get; set; }
        public string Address { get; set; }
        public string Department { get; set; }
    }
}

Eso es todo. Ahora, si ejecuta la aplicación, obtendrá el resultado esperado. Pero, mañana, ¿qué harás si los datos, es decir, las propiedades de la clase aumentan? Luego, debe escribir el código para cada dato de propiedad que se mueve desde la clase de origen a la clase de destino. Eso significa que la asignación de código se realiza una y otra vez entre el origen y el destino.

En proyectos en tiempo real, muchas veces necesitamos mapear los objetos entre las capas UI/Dominio o Servicio/Dominio. Mapear los objetos entre ellos es muy agitado usando el enfoque tradicional que discutimos en el ejemplo anterior. Entonces, ¿hay alguna solución más simple por la cual podamos mapear dos objetos? Sí, lo hay, y la solución es AutoMapper .

¿Qué es AutoMapper en C#?

El AutoMapper en C# es un mapeador entre dos objetos. Eso es AutoMapper es un mapeador objeto-objeto. Mapea las propiedades de dos objetos diferentes transformando el objeto de entrada de un tipo en el objeto de salida de otro tipo.

También proporciona algunos datos interesantes para eliminar el trabajo sucio de descubrir cómo mapear un objeto de tipo A con un objeto de tipo B siempre que el objeto de tipo B sigue la convención establecida de AutoMapper. A medida que avancemos en este curso, verá el poder del mapeador automático.

¿Cómo uso AutoMapper en C#?

Veamos cómo usar automapper en C# con un ejemplo simple usando una aplicación de consola. Vamos a mapear el mismo Empleado clase con EmployeeDTO clase que discutimos en el primer ejemplo. Necesitamos mapear cada propiedades de empleados a las propiedades de EmployeeDTO correspondiente usando AutoMapper como se muestra en la imagen de abajo.

Hablemos del procedimiento paso a paso para usar AutoMapper en C#.

Paso 1:Instalación de la biblioteca AutoMapper

AutoMapper es una biblioteca de código abierto presente en GitHub . Para instalar esta biblioteca, abra la ventana de la Consola del administrador de paquetes y luego escriba el siguiente comando y presione la tecla Intro para instalar la biblioteca AutoMapper en su proyecto:

 PM> Instale-Paquete AutoMapper

Una vez que instaló el AutoMapper biblioteca, luego agregará una referencia a la AutoMapper dll que puede encontrar en la sección de referencias del proyecto como se muestra en la imagen a continuación.

Una vez que instaló el Automapper en su proyecto, puede usarlo de muchas maneras diferentes. Hablaremos de todas estas opciones en un artículo posterior. En este artículo, voy a discutir algunos ejemplos simples para que comprenda cómo funciona exactamente AutoMapper en un proyecto.

Vamos a trabajar con el mismo ejemplo, es decir, vamos a Mapear el objeto Empleado con el objeto EmployeeDTO pero aquí vamos a usar AutoMapper .

Paso 2:inicialización o configuración del AutoMapper

Una vez que haya definido sus tipos (es decir, clases), puede crear un mapeador para los dos tipos usando el constructor de la clase MapperConfiguration. Solo puede crear una instancia de MapperConfiguration por AppDomain y debe ser instanciado durante el inicio de la aplicación. La sintaxis para crear la instancia de MapperConfiguration se proporciona a continuación.

El tipo de la izquierda es el tipo de fuente, es decir, TSource , en nuestro ejemplo, irá a Objeto de empleado y el tipo de la derecha es el tipo de destino, es decir, TDestino , en nuestro ejemplo, irá al objeto EmployeeDTO . Entonces, dos mapean el Empleado con EmpleadoDTO , debe crear la configuración del mapeador como se muestra a continuación.

Usando AutoMapper:

La siguiente imagen muestra cómo inicializar y usar automapper en C#.

A continuación se muestra el código completo
using System;
using AutoMapper;
namespace AutoMapperDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            //Initialize the mapper
            var config = new MapperConfiguration(cfg =>
                    cfg.CreateMap<Employee, EmployeeDTO>()
                );

            //Creating the source object
            Employee emp = new Employee
            {
                Name = "James",
                Salary = 20000,
                Address = "London",
                Department = "IT"
            };

            //Using automapper
            var mapper = new Mapper(config);
            var empDTO = mapper.Map<EmployeeDTO>(emp);
            //OR
            //var empDTO2 = mapper.Map<Employee, EmployeeDTO>(emp);

            Console.WriteLine("Name:" + empDTO.Name + ", Salary:" + empDTO.Salary + ", Address:" + empDTO.Address + ", Department:" + empDTO.Department);
            Console.ReadLine();
        }
    }
    
    public class Employee
    {
        public string Name { get; set; }
        public int Salary { get; set; }
        public string Address { get; set; }
        public string Department { get; set; }
    }

    public class EmployeeDTO
    {
        public string Name { get; set; }
        public int Salary { get; set; }
        public string Address { get; set; }
        public string Department { get; set; }
    }
}

Cuando ejecute la aplicación, mostrará los datos como se esperaba.

¿Qué sucederá si los nombres de las propiedades de origen y destino son diferentes?

Veamos cómo cambiar el nombre de la propiedad del objeto de origen y de destino. Cambiemos el EmployeeDTO clase Nombre y Departamento propiedad a FullName y Departamento y ejecute la aplicación y vea qué sucedió.

A continuación se muestra el ejemplo completo.
using System;
using AutoMapper;
namespace AutoMapperDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            //Initialize the mapper
            var config = new MapperConfiguration(cfg =>
                    cfg.CreateMap<Employee, EmployeeDTO>()
                );

            //Creating the source object
            Employee emp = new Employee
            {
                Name = "James",
                Salary = 20000,
                Address = "London",
                Department = "IT"
            };

            //Using automapper
            var mapper = new Mapper(config);
            var empDTO = mapper.Map<EmployeeDTO>(emp);
            //OR
            //var empDTO2 = mapper.Map<Employee, EmployeeDTO>(emp);

            Console.WriteLine("Name:" + empDTO.FullName + ", Salary:" + empDTO.Salary + ", Address:" + empDTO.Address + ", Department:" + empDTO.Dept);
            Console.ReadLine();
        }
    }
    
    public class Employee
    {
        public string Name { get; set; }
        public int Salary { get; set; }
        public string Address { get; set; }
        public string Department { get; set; }
    }

    public class EmployeeDTO
    {
        public string FullName { get; set; }
        public int Salary { get; set; }
        public string Address { get; set; }
        public string Dept { get; set; }
    }
}

Con los cambios anteriores en su lugar, ahora si ejecuta la aplicación, debería obtener el siguiente resultado.

De la salida anterior, se muestra claramente que el Nombre y Departamento están vacíos, lo que significa que estas dos propiedades no están asignadas desde el tipo de origen al tipo de destino.

Nota: Cuando los nombres de propiedad son diferentes en los tipos de origen y destino, entonces, de forma predeterminada, C# Automapper no asignará esas propiedades

¿Cómo mapear dos propiedades cuando los nombres son diferentes usando el mapeador automático?

La respuesta es mediante el ForMember opción. Entonces, al Mapa el Nombre propiedad con el FullName propiedad y el Departamento propiedad con el Depto propiedad, debe asignar estas dos propiedades en la configuración de asignación como se muestra a continuación.

Nota: Discutiremos el ForMember y MapForm opciones en detalle en nuestros próximos artículos.

A continuación se muestra el código completo.
using System;
using AutoMapper;
namespace AutoMapperDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            //Initialize the mapper
            var config = new MapperConfiguration(cfg =>
                    cfg.CreateMap<Employee, EmployeeDTO>()
                    .ForMember(dest => dest.FullName, act => act.MapFrom(src => src.Name))
                    .ForMember(dest => dest.Dept, act => act.MapFrom(src => src.Department))
                );

            //Creating the source object
            Employee emp = new Employee
            {
                Name = "James",
                Salary = 20000,
                Address = "London",
                Department = "IT"
            };

            //Using automapper
            var mapper = new Mapper(config);
            var empDTO = mapper.Map<EmployeeDTO>(emp);
            //OR
            //var empDTO2 = mapper.Map<Employee, EmployeeDTO>(emp);

            Console.WriteLine("Name:" + empDTO.FullName + ", Salary:" + empDTO.Salary + ", Address:" + empDTO.Address + ", Department:" + empDTO.Dept);
            Console.ReadLine();
        }
    }
    
    public class Employee
    {
        public string Name { get; set; }
        public int Salary { get; set; }
        public string Address { get; set; }
        public string Department { get; set; }
    }

    public class EmployeeDTO
    {
        public string FullName { get; set; }
        public int Salary { get; set; }
        public string Address { get; set; }
        public string Dept { get; set; }
    }
}

Ahora ejecute la aplicación y debería ver el resultado esperado.

En el próximo artículo, voy a hablar sobre el Mapeo complejo de Automapper en C# con ejemplos En este artículo, trato de explicar AutoMapper en C# con ejemplos Espero que disfrutes este artículo.