Для чего нужен Automapper?

Для чего нужен Automapper?

Как это поможет мне с моими уровнями домена и контроллера (asp.net mvc)?

3 ответа

Решение

Может быть, пример поможет здесь...

Допустим, у вас есть хорошо нормализованная схема базы данных, подобная этой:

Заказы (OrderID, CustomerID, OrderDate)  
Клиенты (CustomerID, Имя)  
OrderDetails (OrderDetID, OrderID, ProductID, Кол-во)  
Продукты (ProductID, ProductName, UnitPrice)  

И скажем, вы используете хороший O/R mapper, который возвращает вам хорошо организованную модель домена:

OrderDetail
+ - ID
+- Заказать
|- + - Дата
|- + - Клиент
|-----+-ID
|-----+- Имя
+ - продукт
|- + -ID
|- + - Имя
|- + -UnitPrice
+- Кол-во

Теперь вам нужно отобразить все, что было заказано за последний месяц. Вы хотите связать это с плоской сеткой, поэтому вы покорно пишете плоский класс для связывания:

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в кучу OrderDetailDtos для привязки данных?

Вы можете поставить конструктор OrderDto это занимает OrderDetailи написать большой беспорядок кода сопоставления. Или у вас может быть где-то класс статического преобразования. Или вы можете использовать AutoMapper и написать вместо этого:

Mapper.CreateMap<OrderDetail, OrderDetailDto>();
OrderDetailDto[] items =
    Mapper.Map<OrderDetail[], OrderDetailDto[]>(orderDetails);
GridView1.DataSource = items;

Там. Мы просто взяли то, что в противном случае было бы отвратительным беспорядком бессмысленного кода отображения, и сократили его до трех строк (на самом деле только две для реального отображения).

Это помогает объяснить цель?

Если у вас есть объект одного типа, и вы хотите заполнить свойства объекта другого типа, используя свойства первого типа, у вас есть два варианта:

  1. Вручную написать код, чтобы сделать такое отображение.
  2. Используйте инструмент, который автоматически обработает это для вас.

AutoMapper является примером 2.

Наиболее распространенное использование состоит в том, чтобы сгладить модели в объекты передачи данных (или, в общем, отображение через границы слоя). Что очень хорошо в AutoMapper, так это то, что для обычных сценариев вам не нужно ничего настраивать ( соглашение по конфигурации).

Карта объектов между слоями. Хороший пример: здесь

Другие вопросы по тегам