什么是
Automapper?它将如何帮助我的域和控制器层(asp.net mvc)
解决方法
也许一个例子会帮助这里…
假设你有一个很好地规范化的数据库模式,如下所示:
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; } } }
到目前为止这是非常痛苦的,但是现在呢?我们如何将一堆OrderDetails转换成一堆OrderDetailDtos进行数据绑定?
您可以在OrderDto上放置一个构造函数,该构造函数需要一个OrderDetail,并写出一大堆映射代码。或者你可能在某处有一个静态转换类。或者,您可以使用AutoMapper,并写入:
Mapper.CreateMap<OrderDetail,OrderDetailDto>(); OrderDetailDto[] items = Mapper.Map<OrderDetail[],OrderDetailDto[]>(orderDetails); GridView1.DataSource = items;
那里。我们刚刚采取了一个令人厌恶的无意义的映射代码混乱,并将其简化为三行(实际映射中只有两个)。
这有助于解释目的吗?