Использование автомаппера для отображения вложенных объектов - PullRequest
4 голосов
/ 18 февраля 2012

У меня есть класс Customer EF POCO, который содержит ссылку на таблицу адресов.

Кажется, что следующий код работает, но я не уверен, что это самый чистый способ сделать это. Есть ли лучший способ отобразить это, используя только один вызов Map?

    [HttpGet]
    public ActionResult Details(string ID)
    {
        BusinessLogic.Customers blCustomers = new BusinessLogic.Customers("CSU");
        DataModels.Customer customer = blCustomers.GetCustomer(ID);

        CustomerDetailsViewModel model = new CustomerDetailsViewModel();

        Mapper.CreateMap<DataModels.Customer, CustomerDetailsViewModel>();
        Mapper.CreateMap<DataModels.Address, CustomerDetailsViewModel>();
        Mapper.Map(customer, model);
        Mapper.Map(customer.Address, model);

        return View(model);
    }

1 Ответ

14 голосов
/ 18 февраля 2012

Зависит от того, как выглядит CustomerDetailsViewModel. Например, если ваш класс Address выглядит примерно так:

public class Address 
{
    public string Street { get; set; }
    public string City { get; set; }
}

и CustomerDetailsViewModel содержит свойства, следующие этому соглашению:

Когда вы конфигурируете пару типа источник / назначение в AutoMapper, Конфигуратор пытается сопоставить свойства и методы источника введите свойства типа назначения. Если для какой-либо собственности на тип назначения: свойство, метод или метод с префиксом «Get» не существует в типе источника, AutoMapper разделяет место назначения имя члена в отдельные слова (согласно соглашениям PascalCase).

(Источник: Уплощение )

Тогда, если CustomerDetailsViewModel имеет свойства:

public string AddressStreet { get; set; }
public string AddressCity { get; set; }

Будет работать только одно отображение от Customer до CustomerDetailsViewModel. Для участников, которые не соответствуют этому соглашению, вы можете использовать ForMember.

Вы также всегда можете использовать ForMember для каждого свойства адреса:

Mapper.CreateMap<DataModels.Customer, CustomerDetailsViewModel>()
    .ForMember(dest => dest.Street, opt => opt.MapFrom(src => src.Address.Street));
    /* etc, for other address properties */

Лично я бы не слишком беспокоился о том, чтобы позвонить .Map дважды. По крайней мере, так ясно, что сопоставляются свойства Address и Customer.

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