使用Automapper为成员创建地图

时间:2016-01-18 22:32:48

标签: c# automapper

我开始使用AutoMapper并提出了一个问题。我遇到了这样的示例代码:

Automapper.Mapper.CreateMap<Book, BookViewModel>()
    .ForMember(dest => dest.Author,
               opts => opts.MapFrom(src => src.Author.Name));

因此,这可以让我将图书转换为图书模型,然后将src映射到src.author.name属性,因为没有1-1映射。

要确认,它自行反向工作,这意味着我现在需要明确地这样做:

Mapper.Mapper.CreateMap<BookViewModel, Book>()
    .ForMember(dest => dest.Author.Name,
               opts => opts.MapFrom(src => src.Author));

这是对的吗?所以为了进一步证实,如果我有50个视图模型和视图,我真的需要100个(一个用于输入,一个用于输出,再加上.ForMember表达式中的任何其他代码行)

这是真的吗?这是一种常见的做法(即,您可能会看到数百行代码来处理多个DTO的字段映射,其中的属性与1-1不匹配)?

2 个答案:

答案 0 :(得分:0)

CreateMap为AutoMapper创建一个映射,以便稍后在需要时使用。在应用程序的生命周期中只需要一次。为了使用您已定义的映射,您只需要调用Automapper.Map方法。因此,您不必一次又一次地创建映射。

示例:

var myBookViewModel = Automapper.Map<Book, BookViewModel>(myBook);

你说的是,定义Book to BookViewModel的映射器不会让Automapper为BookViewModel创建一个自动预订的映射器。你必须创建映射器。

答案 1 :(得分:0)

本质上,您基本上需要指定来回配置以处理每个DTO映射。如果没有确定性模式,就无法猜测当成员和成员之间的映射如何在复杂对象之间起作用。名称不同,或者当您想要的属性进一步在其他对象中时,就像在您的示例中一样。

然而,如果您遵循一些基本模式,Automapper相当聪明。在您的情况下,如果您将DTO属性名称更改为AuthorName而不是Author,则CreateMap将正确映射而无需手动指定映射(他们称之为&#34;展平& #34)。 Automapper将even map methods to properties if they follow a GetProperty() => Property { get; set; } pattern。重命名DTO属性以遵循此模式可能会为您节省大量的行。有关简化映射的其他方法,请查看他们的starters guide