20

Automapper有什么用?

它将如何帮助我处理我的域和控制器层(asp.net mvc)?

4

3 回答 3

31

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

假设您有一个很好的标准化数据库模式,如下所示:

订单(OrderID、CustomerID、OrderDate)  
客户(客户 ID、姓名)  
OrderDetails(OrderDetID、OrderID、ProductID、Qty)  
产品(ProductID、ProductName、UnitPrice)  

假设您正在使用一个很好的 O/R 映射器,它可以为您提供一个组织良好的域模型:

订单详情
+--身份证
+--订购
|--+--日期
|--+--客户
|-----+--标识
|-----+--名称
+--产品
|--+--ID
|--+--名称
|--+--单价
+--数量

现在,您需要显示上个月订购的所有商品。你想把它绑定到一个平面网格,所以你尽职尽责地编写一个平面类来绑定:

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; }
    }
}

到目前为止,这很无痛,但现在呢?我们如何将一堆OrderDetails 变成一堆OrderDetailDtos 进行数据绑定?

您可能会在其上放置一个构造函数OrderDtoOrderDetail并编写一大堆映射代码。或者您可能在某处有一个静态转换类。或者,您可以使用 AutoMapper,并改为:

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

那里。我们刚刚采用了原本会令人作呕的毫无意义的映射代码,并将其缩减为三行(实际上只有两行用于实际映射)。

这有助于解释目的吗?

于 2010-01-19T04:06:19.797 回答
3

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

  1. 手动编写代码来做这样的映射。
  2. 使用会自动为您处理此问题的工具。

AutoMapper 是 2 的一个例子。

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

于 2010-01-19T03:54:38.343 回答
0

在图层之间映射对象。好例子:这里

于 2010-01-19T03:55:59.867 回答