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

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

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


person Quintin Par    schedule 19.01.2010    source источник
comment
Возможный дублирующий / связанный вопрос (но включает хороший пример): ‹http://stackoverflow.com/questions/5036341/help-me-understand-automapper  -  person Steve Rathbone    schedule 20.12.2011
comment
Вот хорошее объяснение: kunal-chowdhury.com/2013/01/   -  person JoshYates1980    schedule 22.12.2014


Ответы (3)


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

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

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

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

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

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

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

person Aaronaught    schedule 19.01.2010
comment
Почти все. Если вы добавите больше о мощи Automapper, я уверен, что люди проголосуют за ... - person Quintin Par; 19.01.2010

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

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

AutoMapper - это пример 2.

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

person jason    schedule 19.01.2010

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

person ozczecho    schedule 19.01.2010