2011-02-01 2 views
1

У меня есть вложенная модель представления, похожее на это:Как Automapper работает от вложенной модели до плоской модели?

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;} 
} 

Тогда, есть служащий объект домена следующим образом:

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; } 
} 

I 'm пытается сопоставить 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 являются одна и та же. Таким образом, кажется, что должен быть более простой способ сделать это.

Благодаря

ответ

2

Вы можете оформить в flattening sample в документации. И вот пример:

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.

+0

Это должно быть отмечено как ответ. Идеально подходит. Я не знал, как это работает, и он решил аналогичную проблему, с которой я столкнулся. – julealgon

Смежные вопросы