Automapper的内容是什么?
它对我的域和控制器层(asp.net mvc)有什么帮助?
答案 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)
如果您有一种类型的对象,并且想要使用第一种类型的属性填充另一种类型的对象的属性,则有两种选择:
AutoMapper是2的一个例子。
最常见的用途是将模型展平为数据传输对象(或者,通常是跨层边界的映射)。 AutoMapper的优点在于,对于常见场景,您无需进行任何配置(convention over configuration)。
答案 2 :(得分:0)
在图层之间映射对象。很好的例子:Here