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

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

18 голосов
/ 19 января 2010

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

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

Ответы [ 3 ]

30 голосов
/ 19 января 2010

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

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

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

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

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;

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

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

3 голосов
/ 19 января 2010

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

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

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

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

0 голосов
/ 19 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...