使用automapper映射嵌套对象

Sco*_*tie 4 asp.net-mvc entity-framework automapper

我有一个Customers EF POCO类,其中包含对Address表的引用.

以下代码似乎有效,但我不确定这是最干净的方法.有没有更好的方法只使用一次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);
    }
Run Code Online (Sandbox Code Playgroud)

And*_*ker 14

这取决于你的CustomerDetailsViewModel样子.例如,如果您的Address类看起来像这样:

public class Address 
{
    public string Street { get; set; }
    public string City { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

CustomerDetailsViewModel包含遵循此约定的属性:

在AutoMapper中配置源/目标类型对时,配置程序会尝试将源类型上的属性和方法与目标类型上的属性进行匹配.如果对于目标类型的任何属性,源类型上不存在属性,方法或前缀为"Get"的方法,则AutoMapper会将目标成员名称拆分为单个单词(通过PascalCase约定).

(来源:扁平化)

然后,如果CustomerDetailsViewModel有属性:

public string AddressStreet { get; set; }
public string AddressCity { get; set; }
Run Code Online (Sandbox Code Playgroud)

只需一个映射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 */
Run Code Online (Sandbox Code Playgroud)

就个人而言,我不会太担心.Map两次打电话.至少就是这样,很明显两者AddressCustomer属性都被映射.