什么是Automapper?

Qui*_*Par 18 .net asp.net asp.net-mvc automapper

什么是Automapper

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

Aar*_*ght 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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是非常轻松的,但现在呢?我们如何将一堆OrderDetails变成一堆OrderDetailDtos用于数据绑定?

你可能把一个构造函数OrderDto,它接受一个OrderDetail,写的映射代码弄得一塌糊涂.或者你可能在某个地方有一个静态转换类.或者,您可以使用AutoMapper,并改为编写:

Mapper.CreateMap<OrderDetail, OrderDetailDto>();
OrderDetailDto[] items =
    Mapper.Map<OrderDetail[], OrderDetailDto[]>(orderDetails);
GridView1.DataSource = items;
Run Code Online (Sandbox Code Playgroud)

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

这有助于解释目的吗?