2010-01-19 20 views
16

¿Qué es Automapper? ¿Cómo me va a ayudar con mi dominio y capa de controlador (asp.net mvc)¿Para qué sirve Automapper?

+1

Posible duplicado/pregunta relacionada (pero incluye un buen ejemplo) es

+1

Aquí hay una buena explicación: http: // www. kunal-chowdhury.com/2013/01/what-is-automapper-and-how-to-map-objects.html – JoshYates1980

Respuesta

28

Tal vez un ejemplo ayudará aquí ...

Digamos que usted tiene un esquema de base de bien normalizada así:

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

Y digamos que usted está usando un buen O/R asignador de que las manos hacia atrás un modelo de dominio bien organizada:

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

Ahora te dan un requisito para mostrar todo lo que ha sido ordenado en º e el mes pasado. Desea vincular esto a una rejilla plana, por lo que diligentemente escribe una clase plana para unir:

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 rápido hasta ahora, pero lo que ahora? ¿Cómo podemos convertir un grupo de OrderDetail en un grupo de OrderDetailDto para el enlace de datos?

Puede poner un constructor en OrderDto que toma un OrderDetail, y escribir un gran lío de código de mapeo. O puede que tenga una clase de conversión estática en alguna parte. 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; 

Allí. Acabamos de tomar lo que de otra manera habría sido un lío asqueroso de código de mapeo sin sentido y lo hemos reducido a tres líneas (en realidad solo dos para el mapeo real).

¿Eso ayuda a explicar el propósito?

+0

Casi todo. Si agrega más sobre el poder de Automapper, estoy seguro de que la gente votará a favor ... –

3

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

  1. Escriba manualmente el código para realizar dicha asignación.
  2. Utilice una herramienta que se encargará automáticamente de esto.

AutoMapper es un ejemplo de 2.

El uso más común es aplanar modelos en un objeto de transferencia de datos (o, en general, la cartografía a través de límites de capa). Lo que es muy bueno de AutoMapper es que para escenarios comunes no tienes que hacer ninguna configuración (convention over configuration).