net mvc example ejemplo corner configurar asp asp.net .net asp.net-mvc automapper

asp.net - mvc - ¿Para qué sirve Automapper?



automapper.net core (3)

¿ Automapper qué Automapper ?

¿Cómo me ayudará con mis capas de dominio y controlador (asp.net mvc)?


Mapear objetos entre capas. Buen ejemplo: Here


Si tiene un objeto de un tipo y desea rellenar las propiedades de un objeto de otro tipo utilizando las propiedades del primer tipo, tiene dos opciones:

  1. Escribir código manualmente para hacer tal mapeo.
  2. Usa una herramienta que manejará esto automáticamente por ti.

AutoMapper es un ejemplo de 2.

El uso más común es aplanar modelos en objetos de transferencia de datos (o, en general, mapear a través de límites de capa). Lo que es muy bueno de AutoMapper es que, para escenarios comunes, no tiene que hacer ninguna configuración ( convención sobre configuración ).


Tal vez un ejemplo ayude aquí ...

Digamos que tienes un esquema de base de datos muy bien normalizado como este:

Orders (OrderID, CustomerID, OrderDate) Customers (CustomerID, Name) OrderDetails (OrderDetID, OrderID, ProductID, Qty) Products (ProductID, ProductName, UnitPrice)

Y digamos que está utilizando un buen mapeador O / R que le devuelve un modelo de dominio bien organizado:

OrderDetail +--ID +--Order |--+--Date |--+--Customer |-----+--ID |-----+--Name +--Product |--+--ID |--+--Name |--+--UnitPrice +--Qty

Ahora le dan un requisito para mostrar todo lo que se ordenó en el último mes. Desea enlazar esto a una cuadrícula plana, por lo que debe escribir una clase plana para enlazar:

public class OrderDetailDto { public int ID { get; set; } public DateTime OrderDate { get; set; } public int OrderCustomerID { get; set; } public string OrderCustomerName { get; set; } public int ProductID { get; set; } public string ProductName { get; set; } public Decimal ProductUnitPrice { get; set; } public int Qty { get; set; } public Decimal TotalPrice { get { return ProductUnitPrice * Qty; } } }

Eso fue bastante indoloro hasta ahora, pero ¿y ahora? ¿Cómo convertimos un grupo de OrderDetail s en un grupo de OrderDetailDto s para el enlace de datos?

Puede poner un constructor en OrderDto que tome OrderDetail y escribir un gran lío de código de mapeo. O podría tener una clase de conversión estática en algún lugar. O bien, podría usar AutoMapper y escribir esto en su lugar:

Mapper.CreateMap<OrderDetail, OrderDetailDto>(); OrderDetailDto[] items = Mapper.Map<OrderDetail[], OrderDetailDto[]>(orderDetails); GridView1.DataSource = items;

Ahí. Acabamos de tomar lo que de otro modo habría sido un asco desagradable de código de mapeo sin sentido y lo hemos reducido en tres líneas (en realidad solo dos para el mapeo real).

¿Eso ayuda a explicar el propósito?