What's Automapper for?

前端 未结 3 613
自闭症患者
自闭症患者 2021-02-05 08:15

What’s Automapper for?

How will it help me with my domain and controller layers (asp.net mvc)?

3条回答
  •  我寻月下人不归
    2021-02-05 08:58

    Maybe an example will help here...

    Let's say you have a nicely-normalized database schema like this:

    Orders       (OrderID, CustomerID, OrderDate)  
    Customers    (CustomerID, Name)  
    OrderDetails (OrderDetID, OrderID, ProductID, Qty)  
    Products     (ProductID, ProductName, UnitPrice)  
    

    And let's say you're using a nice O/R mapper that hands you back a well-organized domain model:

    OrderDetail
    +--ID
    +--Order
    |--+--Date
    |--+--Customer
    |-----+--ID
    |-----+--Name
    +--Product
    |--+--ID
    |--+--Name
    |--+--UnitPrice
    +--Qty
    

    Now you're given a requirement to display everything that's been ordered in the last month. You want to bind this to a flat grid, so you dutifully write a flat class to bind:

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

    That was pretty painless so far, but what now? How do we turn a bunch of OrderDetails into a bunch of OrderDetailDtos for data binding?

    You might put a constructor on OrderDto that takes an OrderDetail, and write a big mess of mapping code. Or you might have a static conversion class somewhere. Or, you could use AutoMapper, and write this instead:

    Mapper.CreateMap();
    OrderDetailDto[] items =
        Mapper.Map(orderDetails);
    GridView1.DataSource = items;
    

    There. We've just taken what would otherwise have been a disgusting mess of pointless mapping code and reduced it into three lines (really just two for the actual mapping).

    Does that help explain the purpose?

提交回复
热议问题