Как Automapper работает от вложенной модели до плоской модели? - PullRequest
1 голос
/ 01 февраля 2011

У меня есть модель с вложенным представлением, похожая на эту:

public class EmployeeViewModel
{      
    //...

    public string EmployeeFirstName { get; set; }

    public string EmployeeLastName { get; set; }

    public AddressViewModel{ get; set; }
}

AddressViewModel выглядит следующим образом:

public class AddressViewModel
{
     public string Street {get; set;}
     public string City {get; set;}
     public string State {get; set;}
     public string Zip {get; set;}
}

Затем есть объект домена Employee, подобный этому:

public class Employee
{
    public string EmployeeFirstName { get; set; }

    public string EmployeeLastName { get; set; }

    public string Street { get; set; }

    public string City { get; set; }

    public string State { get; set; }

    public string Zip { get; set; }
}

Я пытаюсь сопоставить EmployeeViewModel с объектом домена Employee.Это то, что я придумал, и это работает, но мне было интересно, есть ли более простой способ сделать это:

Mapper.CreateMap<EmployeeViewModel, Employee>().ForMember(destination => destination.Street, opt => opt.MapFrom(src => src.AddressViewModel.Street))
            .ForMember(destination => destination.City, opt => opt.MapFrom(src => src.AddressViewModel.City))
            .ForMember(destination => destination.State, opt => opt.MapFrom(src => src.AddressViewModel.State))
            .ForMember(destination => destination.Zip, opt => opt.MapFrom(src => src.AddressViewModel.Zip));

Как видите, имена свойств в объекте домена Employee и в AddressViewModelподобные.Так что, похоже, должен быть более простой способ сделать это.

Спасибо

1 Ответ

2 голосов
/ 01 февраля 2011

Вы можете проверить образец сплющивания в документации.И вот пример:

public class AddressViewModel
{
    public string Street { get; set; }
}

public class EmployeeViewModel
{      
    public string EmployeeFirstName { get; set; }
    public AddressViewModel Address { get; set; }
}

public class Employee
{
    public string EmployeeFirstName { get; set; }
    public string AddressStreet { get; set; }
}


class Program
{
    static void Main()
    {
        Mapper.CreateMap<EmployeeViewModel, Employee>();
        var result = Mapper.Map<EmployeeViewModel, Employee>(new EmployeeViewModel
        {
            EmployeeFirstName = "first name",
            Address = new AddressViewModel
            {
                Street = "some street"
            }
        });
        Console.WriteLine(result.EmployeeFirstName);
        Console.WriteLine(result.AddressStreet);
    }
}

Обратите внимание, как для сглаживания работать из коробки целевое свойство называется AddressStreet.

...