2012-02-17 171 views
4

我有一個Customers 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); 
    } 

回答

14

這取決於您的CustomerDetailsViewModel的外觀。例如,如果你的Address類看起來是這樣的:

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

CustomerDetailsViewModel包含此約定以下屬性:

當您配置在AutoMapper源/目標類型對, 配置嘗試將源 類型的屬性和方法匹配到目標類型的屬性。如果對於目標類型爲 的任何屬性,在源類型上不存在以「獲取」 爲前綴的屬性,方法或方法,AutoMapper會將目標成員名稱分割爲單獨的單詞(按PascalCase約定)。

(來源:Flattening

然後,如果CustomerDetailsViewModel有屬性:

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

剛剛從CustomerCustomerDetailsViewModel一個映射將正常工作。對於不符合該慣例的會員,您可以使用ForMember

您可以隨時使用ForMember爲每一個地址屬性,以及:

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

就個人而言,我不會太擔心調用.Map兩次。至少這種方式非常清楚,AddressCustomer屬性正在映射。