Для чего нужен 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
в кучу OrderDetailDto
s для привязки данных?
Вы можете поставить конструктор OrderDto
это занимает OrderDetail
и написать большой беспорядок кода сопоставления. Или у вас может быть где-то класс статического преобразования. Или вы можете использовать AutoMapper и написать вместо этого:
Mapper.CreateMap<OrderDetail, OrderDetailDto>();
OrderDetailDto[] items =
Mapper.Map<OrderDetail[], OrderDetailDto[]>(orderDetails);
GridView1.DataSource = items;
Там. Мы просто взяли то, что в противном случае было бы отвратительным беспорядком бессмысленного кода отображения, и сократили его до трех строк (на самом деле только две для реального отображения).
Это помогает объяснить цель?
Если у вас есть объект одного типа, и вы хотите заполнить свойства объекта другого типа, используя свойства первого типа, у вас есть два варианта:
- Вручную написать код, чтобы сделать такое отображение.
- Используйте инструмент, который автоматически обработает это для вас.
AutoMapper является примером 2.
Наиболее распространенное использование состоит в том, чтобы сгладить модели в объекты передачи данных (или, в общем, отображение через границы слоя). Что очень хорошо в AutoMapper, так это то, что для обычных сценариев вам не нужно ничего настраивать ( соглашение по конфигурации).