Automapper有什么用?
它将如何帮助我处理我的域和控制器层(asp.net mvc)?
也许一个例子在这里会有所帮助......
假设您有一个很好的标准化数据库模式,如下所示:
订单(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; }
}
}
到目前为止,这很无痛,但现在呢?我们如何将一堆OrderDetail
s 变成一堆OrderDetailDto
s 进行数据绑定?
您可能会在其上放置一个构造函数OrderDto
,OrderDetail
并编写一大堆映射代码。或者您可能在某处有一个静态转换类。或者,您可以使用 AutoMapper,并改为:
Mapper.CreateMap<OrderDetail, OrderDetailDto>();
OrderDetailDto[] items =
Mapper.Map<OrderDetail[], OrderDetailDto[]>(orderDetails);
GridView1.DataSource = items;
那里。我们刚刚采用了原本会令人作呕的毫无意义的映射代码,并将其缩减为三行(实际上只有两行用于实际映射)。
这有助于解释目的吗?
如果您有一个类型的对象,并且想要使用第一种类型的属性填充另一种类型的对象的属性,您有两种选择:
AutoMapper 是 2 的一个例子。
最常见的用途是将模型展平为数据传输对象(或者,一般来说,跨层边界映射)。AutoMapper 的优点在于,对于常见场景,您无需进行任何配置(约定优于配置)。
在图层之间映射对象。好例子:这里