什么是Automapper?

时间:2010-01-19 03:45:03

标签: asp.net .net asp.net-mvc automapper

Automapper的内容是什么?

它对我的域和控制器层(asp.net mvc)有什么帮助?

3 个答案:

答案 0 :(得分:30)

也许一个例子在这里会有所帮助......

假设你有一个很好的规范化数据库模式,如下所示:

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

让我们假设您正在使用一个漂亮的O / R映射器,它可以帮助您恢复组织良好的域模型:

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

现在,您需要显示上个月订购的所有内容。您希望将其绑定到平面网格,因此您要尽职尽责地编写要绑定的平面类:

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; }
    }
}
到目前为止,这是非常轻松的,但现在呢?我们如何将一堆OrderDetail转换成一堆OrderDetailDto用于数据绑定?

你可能会在OrderDto上放置一个OrderDetail的构造函数,并编写大量的映射代码。或者你可能在某个地方有一个静态转换类。或者,您可以使用AutoMapper,并改为编写:

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

有。我们刚刚采取了原本令人厌恶的无意义映射代码并将其缩减为三行(实际映射只有两行)。

这有助于解释目的吗?

答案 1 :(得分:3)

如果您有一种类型的对象,并且想要使用第一种类型的属性填充另一种类型的对象的属性,则有两种选择:

  1. 手动编写代码以执行此类映射。
  2. 使用可自动为您处理此问题的工具。
  3. AutoMapper是2的一个例子。

    最常见的用途是将模型展平为数据传输对象(或者,通常是跨层边界的映射)。 AutoMapper的优点在于,对于常见场景,您无需进行任何配置(convention over configuration)。

答案 2 :(得分:0)

在图层之间映射对象。很好的例子:Here