也许一个例子会有所帮助......
假设您有一个很好标准化的数据库模式,如下所示:
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
s 用于数据绑定?
你可以放一个构造函数OrderDto
这需要一个OrderDetail
,并编写了一大堆乱七八糟的映射代码。或者你可能在某处有一个静态转换类。或者,您可以使用 AutoMapper,并编写如下:
Mapper.CreateMap<OrderDetail, OrderDetailDto>();
OrderDetailDto[] items =
Mapper.Map<OrderDetail[], OrderDetailDto[]>(orderDetails);
GridView1.DataSource = items;
那里。我们刚刚将原本是一堆令人厌恶的毫无意义的映射代码简化为三行(实际上只有两行用于实际映射)。
这有助于解释目的吗?